From 37f9cdc9c3ea73718633608d9461a42686114a9a Mon Sep 17 00:00:00 2001 From: monoid Date: Thu, 8 Aug 2024 15:55:20 +0000 Subject: [PATCH] deploy: db96111c37ed615b50592ba2a6c9954386a42cfc --- .lock | 0 .nojekyll | 0 CNAME | 1 + air/all.html | 1 + air/beautify/fn.beautify.html | 1 + air/beautify/fn.build_output.html | 1 + air/beautify/fn.read_script.html | 1 + air/beautify/index.html | 1 + air/beautify/sidebar-items.js | 1 + air/beautify/struct.Args.html | 52 + air/data/enum.Mode.html | 34 + air/data/fn.create_runner.html | 5 + air/data/fn.init_tracing.html | 1 + air/data/fn.to_human_readable_data.html | 3 + air/data/index.html | 1 + air/data/sidebar-items.js | 1 + air/data/struct.Args.html | 51 + air/data/struct.ModeArgs.html | 45 + air/enum.Subcommand.html | 44 + air/fn.main.html | 1 + air/index.html | 1 + air/sidebar-items.js | 1 + air/struct.Cli.html | 49 + air/trace/index.html | 1 + air/trace/run/data/anomaly/fn.load.html | 1 + air/trace/run/data/anomaly/index.html | 1 + air/trace/run/data/anomaly/sidebar-items.js | 1 + .../data/anomaly/struct.AnomalyDataArgs.html | 49 + air/trace/run/data/index.html | 1 + .../run/data/plain/constant.DEFAULT_DATA.html | 1 + air/trace/run/data/plain/fn.load.html | 1 + .../run/data/plain/fn.print_air_prompt.html | 1 + .../data/plain/fn.read_air_with_prompt.html | 1 + air/trace/run/data/plain/index.html | 1 + air/trace/run/data/plain/sidebar-items.js | 1 + .../run/data/plain/struct.PlainDataArgs.html | 52 + air/trace/run/data/sidebar-items.js | 1 + air/trace/run/data/struct.ExecutionData.html | 37 + air/trace/run/enum.Mode.html | 34 + air/trace/run/enum.Source.html | 42 + air/trace/run/fn.create_runner.html | 7 + air/trace/run/fn.init_tracing.html | 1 + air/trace/run/fn.load_data.html | 1 + air/trace/run/fn.load_data_or_default.html | 4 + air/trace/run/fn.load_keypair_ed25519.html | 1 + air/trace/run/fn.read_call_results.html | 1 + air/trace/run/fn.run.html | 1 + air/trace/run/index.html | 1 + .../native/fn.create_native_avm_runner.html | 3 + air/trace/run/native/index.html | 1 + air/trace/run/native/sidebar-items.js | 1 + .../run/native/struct.NativeAvmRunner.html | 50 + air/trace/run/runner/index.html | 1 + air/trace/run/runner/sidebar-items.js | 1 + .../run/runner/struct.TestInitParameters.html | 44 + air/trace/run/runner/trait.AirRunner.html | 32 + .../run/runner/trait.DataToHumanReadable.html | 10 + air/trace/run/sidebar-items.js | 1 + air/trace/run/struct.Args.html | 60 + air/trace/run/struct.Keys.html | 42 + air/trace/run/struct.ModeArgs.html | 45 + .../run/wasm/fn.create_wasm_avm_runner.html | 5 + air/trace/run/wasm/index.html | 1 + air/trace/run/wasm/sidebar-items.js | 1 + air/trace/run/wasm/struct.WasmAvmRunner.html | 48 + air/trace/sidebar-items.js | 1 + air/trace/stats/fn.print_log_record.html | 1 + air/trace/stats/fn.read_logs.html | 1 + air/trace/stats/fn.stats.html | 1 + air/trace/stats/index.html | 1 + air/trace/stats/log_data/enum.Message.html | 38 + .../stats/log_data/fn.format_argument.html | 1 + air/trace/stats/log_data/index.html | 1 + air/trace/stats/log_data/sidebar-items.js | 1 + .../stats/log_data/struct.CloseMessage.html | 37 + air/trace/stats/log_data/struct.LogKey.html | 56 + .../stats/log_data/struct.LogRecord.html | 37 + air/trace/stats/log_data/struct.LogValue.html | 38 + air/trace/stats/log_data/struct.Span.html | 37 + air/trace/stats/report/index.html | 1 + air/trace/stats/report/sidebar-items.js | 1 + .../stats/report/struct.StatsReport.html | 37 + air/trace/stats/sidebar-items.js | 1 + air/trace/stats/struct.Args.html | 51 + .../utils/fn.parse_tracing_duration.html | 1 + air/trace/utils/fn.unix_timestamp_now.html | 1 + air/trace/utils/index.html | 1 + air/trace/utils/sidebar-items.js | 1 + air_beautifier/all.html | 1 + .../constant.DEFAULT_INDENT_STEP.html | 11 + .../beautifier/enum.BeautifyError.html | 11 + .../beautifier/struct.Beautifier.html | 11 + .../constant.DEFAULT_INDENT_STEP.html | 1 + air_beautifier/enum.BeautifyError.html | 21 + air_beautifier/fn.beautify.html | 6 + air_beautifier/fn.beautify_to_string.html | 3 + air_beautifier/index.html | 2 + air_beautifier/sidebar-items.js | 1 + air_beautifier/struct.Beautifier.html | 32 + air_beautify_wasm/all.html | 1 + air_beautify_wasm/fn.beautify.html | 1 + air_beautify_wasm/fn.beautify_raw.html | 1 + air_beautify_wasm/index.html | 1 + air_beautify_wasm/sidebar-items.js | 1 + air_execution_info_collector/all.html | 1 + air_execution_info_collector/index.html | 3 + .../struct.ApTracker.html | 11 + .../struct.CallTracker.html | 11 + .../struct.FoldTracker.html | 11 + .../struct.InstructionTracker.html | 11 + .../struct.NewTracker.html | 11 + .../struct.ParTracker.html | 11 + air_execution_info_collector/sidebar-items.js | 1 + .../struct.ApTracker.html | 21 + .../struct.CallTracker.html | 21 + .../struct.FoldTracker.html | 21 + .../struct.InstructionTracker.html | 33 + .../struct.NewTracker.html | 23 + .../struct.ParTracker.html | 21 + air_interpreter_cid/all.html | 1 + .../enum.CidCalculationError.html | 23 + .../enum.CidVerificationError.html | 30 + .../fn.raw_value_to_json_cid.html | 1 + air_interpreter_cid/fn.value_to_json_cid.html | 4 + air_interpreter_cid/fn.verify_raw_value.html | 4 + air_interpreter_cid/fn.verify_value.html | 4 + air_interpreter_cid/index.html | 3 + air_interpreter_cid/sidebar-items.js | 1 + air_interpreter_cid/struct.ArchivedCID.html | 31 + air_interpreter_cid/struct.CID.html | 70 + air_interpreter_cid/struct.CIDResolver.html | 23 + air_interpreter_cid/type.CidRef.html | 4 + .../verify/enum.CidVerificationError.html | 11 + .../verify/fn.verify_raw_value.html | 11 + .../verify/fn.verify_value.html | 11 + air_interpreter_client/all.html | 1 + .../constant.DEFAULT_LOG_LEVEL.html | 1 + air_interpreter_client/fn.ast.html | 1 + air_interpreter_client/fn.invoke.html | 8 + air_interpreter_client/fn.main.html | 1 + air_interpreter_client/index.html | 1 + air_interpreter_client/sidebar-items.js | 1 + air_interpreter_data/all.html | 1 + .../cid_info/struct.ArchivedCidInfo.html | 11 + .../cid_info/struct.CidInfo.html | 11 + .../cid_info/struct.CidInfoResolver.html | 11 + .../enum.CidStoreVerificationError.html | 11 + .../cid_store/struct.ArchivedCidStore.html | 11 + .../cid_store/struct.CidStore.html | 11 + .../cid_store/struct.CidStoreResolver.html | 11 + .../cid_store/struct.CidTracker.html | 11 + .../enum.ArchivedCallResult.html | 49 + .../enum.ArchivedCanonResult.html | 43 + .../enum.ArchivedExecutedState.html | 61 + .../enum.ArchivedProvenance.html | 49 + air_interpreter_data/enum.ArchivedSender.html | 47 + .../enum.ArchivedValueRef.html | 53 + air_interpreter_data/enum.CallResult.html | 89 + .../enum.CallResultResolver.html | 39 + air_interpreter_data/enum.CanonResult.html | 75 + .../enum.CanonResultResolver.html | 35 + .../enum.CidStoreVerificationError.html | 34 + .../enum.DataDeserializationError.html | 30 + air_interpreter_data/enum.ExecutedState.html | 92 + .../enum.ExecutedStateResolver.html | 47 + air_interpreter_data/enum.Provenance.html | 78 + .../enum.ProvenanceResolver.html | 41 + air_interpreter_data/enum.Sender.html | 77 + air_interpreter_data/enum.SenderResolver.html | 39 + air_interpreter_data/enum.ValueRef.html | 85 + .../enum.ValueRefResolver.html | 43 + .../enum.ArchivedCallResult.html | 11 + .../enum.ArchivedCanonResult.html | 11 + .../enum.ArchivedExecutedState.html | 11 + .../enum.ArchivedProvenance.html | 11 + .../executed_state/enum.ArchivedSender.html | 11 + .../executed_state/enum.ArchivedValueRef.html | 11 + .../executed_state/enum.CallResult.html | 11 + .../enum.CallResultResolver.html | 11 + .../executed_state/enum.CanonResult.html | 11 + .../enum.CanonResultResolver.html | 11 + .../executed_state/enum.ExecutedState.html | 11 + .../enum.ExecutedStateResolver.html | 11 + .../executed_state/enum.Provenance.html | 11 + .../enum.ProvenanceResolver.html | 11 + .../executed_state/enum.Sender.html | 11 + .../executed_state/enum.SenderResolver.html | 11 + .../executed_state/enum.ValueRef.html | 11 + .../executed_state/enum.ValueRefResolver.html | 11 + .../executed_state/struct.ApResult.html | 11 + .../struct.ApResultResolver.html | 11 + .../struct.ArchivedApResult.html | 11 + .../struct.ArchivedCallServiceFailed.html | 11 + .../struct.ArchivedCanonCidAggregate.html | 11 + ...truct.ArchivedCanonResultCidAggregate.html | 11 + .../struct.ArchivedFoldResult.html | 11 + .../struct.ArchivedFoldSubTraceLore.html | 11 + .../struct.ArchivedParResult.html | 11 + ...uct.ArchivedServiceResultCidAggregate.html | 11 + .../struct.ArchivedSubTraceDesc.html | 11 + .../struct.CallServiceFailed.html | 11 + .../struct.CallServiceFailedResolver.html | 11 + .../struct.CanonCidAggregate.html | 11 + .../struct.CanonCidAggregateResolver.html | 11 + .../struct.CanonResultCidAggregate.html | 11 + ...truct.CanonResultCidAggregateResolver.html | 11 + .../executed_state/struct.FoldResult.html | 11 + .../struct.FoldResultResolver.html | 11 + .../struct.FoldSubTraceLore.html | 11 + .../struct.FoldSubTraceLoreResolver.html | 11 + .../executed_state/struct.ParResult.html | 11 + .../struct.ParResultResolver.html | 11 + .../struct.ServiceResultCidAggregate.html | 11 + ...uct.ServiceResultCidAggregateResolver.html | 11 + .../executed_state/struct.SubTraceDesc.html | 11 + .../struct.SubTraceDescResolver.html | 11 + .../executed_state/type.FoldLore.html | 11 + air_interpreter_data/fn.data_version.html | 1 + .../struct.ArchivedGenerationIdx.html | 11 + .../generation_idx/struct.GenerationIdx.html | 11 + .../struct.GenerationIdxResolver.html | 11 + air_interpreter_data/index.html | 17 + .../enum.DataDeserializationError.html | 11 + .../errors/enum.DataVerifierError.html | 11 + .../struct.InterpreterDataEnvelopeRepr.html | 11 + .../type.InterpreterDataEnvelopeFormat.html | 11 + .../struct.ArchivedInterpreterData.html | 11 + .../struct.InterpreterData.html | 11 + .../struct.InterpreterDataEnvelope.html | 11 + .../struct.InterpreterDataResolver.html | 11 + .../interpreter_data/struct.Versions.html | 11 + .../interpreter_data/verification/index.html | 11 + .../verification/struct.DataVerifier.html | 11 + .../raw_value/struct.ArchivedRawValue.html | 11 + .../raw_value/struct.RawValue.html | 11 + .../raw_value/struct.RawValueResolver.html | 11 + air_interpreter_data/sidebar-items.js | 1 + air_interpreter_data/struct.ApResult.html | 66 + .../struct.ApResultResolver.html | 27 + .../struct.ArchivedApResult.html | 36 + .../struct.ArchivedCallServiceFailed.html | 41 + .../struct.ArchivedCanonCidAggregate.html | 46 + ...truct.ArchivedCanonResultCidAggregate.html | 41 + .../struct.ArchivedCidInfo.html | 56 + .../struct.ArchivedCidStore.html | 34 + .../struct.ArchivedExecutionTrace.html | 34 + .../struct.ArchivedFoldResult.html | 36 + .../struct.ArchivedFoldSubTraceLore.html | 41 + .../struct.ArchivedGenerationIdx.html | 34 + .../struct.ArchivedInterpreterData.html | 51 + .../struct.ArchivedParResult.html | 38 + .../struct.ArchivedRawValue.html | 36 + ...uct.ArchivedServiceResultCidAggregate.html | 46 + .../struct.ArchivedSubTraceDesc.html | 41 + .../struct.ArchivedTracePos.html | 34 + .../struct.CallServiceFailed.html | 74 + .../struct.CallServiceFailedResolver.html | 28 + .../struct.CanonCidAggregate.html | 83 + .../struct.CanonCidAggregateResolver.html | 29 + .../struct.CanonResultCidAggregate.html | 76 + ...truct.CanonResultCidAggregateResolver.html | 28 + air_interpreter_data/struct.CidInfo.html | 90 + .../struct.CidInfoResolver.html | 31 + air_interpreter_data/struct.CidStore.html | 75 + .../struct.CidStoreResolver.html | 28 + air_interpreter_data/struct.CidTracker.html | 38 + .../struct.ExecutionTrace.html | 1153 + .../struct.ExecutionTraceResolver.html | 28 + air_interpreter_data/struct.FoldResult.html | 65 + .../struct.FoldResultResolver.html | 27 + .../struct.FoldSubTraceLore.html | 93 + .../struct.FoldSubTraceLoreResolver.html | 28 + .../struct.GenerationIdx.html | 82 + .../struct.GenerationIdxResolver.html | 28 + .../struct.InterpreterData.html | 93 + .../struct.InterpreterDataEnvelope.html | 49 + .../struct.InterpreterDataEnvelopeRepr.html | 25 + .../struct.InterpreterDataResolver.html | 30 + air_interpreter_data/struct.ParResult.html | 65 + .../struct.ParResultResolver.html | 27 + air_interpreter_data/struct.RawValue.html | 67 + .../struct.RawValueResolver.html | 28 + .../struct.ServiceResultCidAggregate.html | 85 + ...uct.ServiceResultCidAggregateResolver.html | 29 + air_interpreter_data/struct.SubTraceDesc.html | 77 + .../struct.SubTraceDescResolver.html | 28 + air_interpreter_data/struct.TracePos.html | 76 + .../struct.TracePosResolver.html | 28 + air_interpreter_data/struct.Versions.html | 35 + .../trace/struct.ArchivedExecutionTrace.html | 11 + .../trace/struct.ExecutionTrace.html | 11 + .../trace/struct.ExecutionTraceResolver.html | 11 + air_interpreter_data/trace/type.TraceLen.html | 11 + .../trace_pos/struct.ArchivedTracePos.html | 11 + .../trace_pos/struct.TracePos.html | 11 + .../trace_pos/struct.TracePosResolver.html | 11 + .../trace_pos/type.PosType.html | 11 + air_interpreter_data/type.FoldLore.html | 3 + .../type.InterpreterDataEnvelopeFormat.html | 1 + air_interpreter_data/type.PosType.html | 1 + air_interpreter_data/type.TraceLen.html | 1 + .../verification/enum.DataVerifierError.html | 44 + air_interpreter_data/verification/index.html | 1 + .../verification/sidebar-items.js | 1 + .../verification/struct.DataVerifier.html | 37 + air_interpreter_interface/all.html | 1 + .../struct.CallArgumentsRepr.html | 11 + .../struct.CallRequestParams.html | 11 + .../struct.CallRequestsRepr.html | 11 + .../struct.SerializedCallArguments.html | 11 + .../struct.SerializedCallRequests.html | 11 + .../struct.SerializedTetraplets.html | 11 + .../struct.TetrapletsRepr.html | 11 + .../type.CallArgumentsDeserializeError.html | 11 + .../type.CallArgumentsFormat.html | 11 + .../type.CallRequests.html | 11 + .../type.CallRequestsDeserializeError.html | 11 + .../type.CallRequestsFormat.html | 11 + .../type.TetrapletDeserializeError.html | 11 + .../type.TetrapletsFormat.html | 11 + .../constant.CALL_SERVICE_SUCCESS.html | 11 + .../struct.CallResultsRepr.html | 11 + .../struct.CallServiceResult.html | 11 + .../struct.SerializedCallResults.html | 11 + .../call_service_result/type.CallResults.html | 11 + .../type.CallResultsDeserializeError.html | 11 + .../type.CallResultsFormat.html | 11 + .../type.CallResultsSerializeError.html | 11 + .../constant.CALL_SERVICE_SUCCESS.html | 1 + .../constant.INTERPRETER_SUCCESS.html | 1 + .../fn.try_as_string.html | 1 + air_interpreter_interface/index.html | 9 + .../constant.INTERPRETER_SUCCESS.html | 11 + .../interpreter_outcome/fn.try_as_string.html | 11 + .../struct.InterpreterOutcome.html | 11 + .../struct.SoftLimitsTriggering.html | 11 + .../static.MAX_AIR_SIZE.html | 11 + .../static.MAX_CALL_RESULT_SIZE.html | 11 + .../static.MAX_PARTICLE_SIZE.html | 11 + .../run_parameters/struct.RunParameters.html | 11 + air_interpreter_interface/sidebar-items.js | 1 + .../static.MAX_AIR_SIZE.html | 14 + .../static.MAX_CALL_RESULT_SIZE.html | 1 + .../static.MAX_PARTICLE_SIZE.html | 1 + .../struct.CallArgumentsRepr.html | 29 + .../struct.CallRequestParams.html | 42 + .../struct.CallRequestsRepr.html | 29 + .../struct.CallResultsRepr.html | 29 + .../struct.CallServiceResult.html | 32 + .../struct.InterpreterOutcome.html | 52 + .../struct.RunParameters.html | 66 + .../struct.SerializedCallArguments.html | 1116 + .../struct.SerializedCallRequests.html | 1116 + .../struct.SerializedCallResults.html | 1116 + .../struct.SerializedTetraplets.html | 1116 + .../struct.SoftLimitsTriggering.html | 36 + .../struct.TetrapletsRepr.html | 32 + .../type.CallArgumentsDeserializeError.html | 1 + .../type.CallArgumentsFormat.html | 1 + .../type.CallRequests.html | 1 + .../type.CallRequestsDeserializeError.html | 1 + .../type.CallRequestsFormat.html | 1 + .../type.CallResults.html | 3 + .../type.CallResultsDeserializeError.html | 1 + .../type.CallResultsFormat.html | 1 + .../type.CallResultsSerializeError.html | 1 + .../type.TetrapletDeserializeError.html | 1 + .../type.TetrapletsFormat.html | 1 + air_interpreter_sede/all.html | 1 + air_interpreter_sede/format/trait.Format.html | 11 + air_interpreter_sede/index.html | 2 + .../macro.define_simple_representation!.html | 11 + .../macro.define_simple_representation.html | 3 + .../macro.derive_serialized_type!.html | 11 + .../macro.derive_serialized_type.html | 4 + .../multiformat/enum.DecodeError.html | 25 + .../multiformat/enum.EncodeError.html | 22 + .../multiformat/fn.decode_multiformat.html | 5 + .../multiformat/fn.encode_multiformat.html | 5 + .../fn.parse_multiformat_bytes.html | 3 + .../multiformat/fn.write_multiformat.html | 6 + air_interpreter_sede/multiformat/index.html | 1 + .../multiformat/sidebar-items.js | 1 + .../multiformat/type.SerializationCodec.html | 1 + .../trait.FromSerialiedBorrow.html | 11 + .../representation/trait.FromSerialized.html | 11 + .../representation/trait.Representation.html | 11 + .../representation/trait.ToSerialized.html | 11 + .../representation/trait.ToWriter.html | 11 + .../rmp_serde/struct.RmpSerdeFormat.html | 11 + .../rmp_serde/struct.RmpSerdeMultiformat.html | 11 + air_interpreter_sede/sidebar-items.js | 1 + .../struct.MsgPackFormat.html | 19 + .../struct.MsgPackMultiformat.html | 19 + .../struct.RmpSerdeFormat.html | 19 + .../struct.RmpSerdeMultiformat.html | 19 + air_interpreter_sede/trait.Format.html | 23 + .../trait.FromSerialiedBorrow.html | 11 + .../trait.FromSerialized.html | 5 + .../trait.Representation.html | 12 + air_interpreter_sede/trait.ToSerialized.html | 11 + air_interpreter_sede/trait.ToWriter.html | 13 + air_interpreter_server/all.html | 1 + air_interpreter_server/ast/fn.ast.html | 2 + air_interpreter_server/ast/index.html | 1 + air_interpreter_server/ast/sidebar-items.js | 1 + air_interpreter_server/fn.ast.html | 1 + air_interpreter_server/fn.invoke.html | 7 + air_interpreter_server/fn.invoke_tracing.html | 9 + air_interpreter_server/fn.main.html | 1 + .../fn.to_human_readable_data.html | 2 + air_interpreter_server/index.html | 1 + .../logger/fn.init_logger.html | 1 + .../logger/fn.json_output_mode.html | 1 + air_interpreter_server/logger/index.html | 1 + .../logger/sidebar-items.js | 1 + air_interpreter_server/sidebar-items.js | 1 + air_interpreter_signatures/all.html | 1 + air_interpreter_signatures/enum.KeyError.html | 30 + .../enum.KeyFormat.html | 42 + .../enum.VerificationError.html | 31 + air_interpreter_signatures/fn.sign_cids.html | 5 + air_interpreter_signatures/index.html | 1 + air_interpreter_signatures/sidebar-items.js | 1 + .../stores/struct.ArchivedSignatureStore.html | 11 + .../stores/struct.SignatureStore.html | 11 + .../stores/struct.SignatureStoreResolver.html | 11 + .../struct.ArchivedPublicKey.html | 45 + .../struct.ArchivedSignature.html | 34 + .../struct.ArchivedSignatureStore.html | 34 + .../struct.KeyPair.html | 30 + .../struct.PeerCidTracker.html | 30 + .../struct.PublicKey.html | 75 + .../struct.PublicKeyResolver.html | 28 + .../struct.Signature.html | 65 + .../struct.SignatureResolver.html | 28 + .../struct.SignatureStore.html | 81 + .../struct.SignatureStoreResolver.html | 28 + .../trackers/fn.sign_cids.html | 11 + .../trackers/struct.PeerCidTracker.html | 11 + air_interpreter_value/all.html | 1 + air_interpreter_value/enum.JValue.html | 323 + air_interpreter_value/index.html | 1 + air_interpreter_value/sidebar-items.js | 1 + air_interpreter_value/type.JsonString.html | 1 + air_interpreter_value/type.Map.html | 1 + air_interpreter_value/value/enum.JValue.html | 11 + air_lambda_ast/all.html | 1 + air_lambda_ast/ast/enum.Functor.html | 11 + air_lambda_ast/ast/enum.LambdaAST.html | 11 + air_lambda_ast/ast/enum.ValueAccessor.html | 11 + air_lambda_ast/enum.Functor.html | 24 + air_lambda_ast/enum.LambdaAST.html | 27 + air_lambda_ast/enum.ValueAccessor.html | 31 + air_lambda_ast/index.html | 1 + air_lambda_ast/sidebar-items.js | 1 + air_lambda_parser/all.html | 1 + air_lambda_parser/enum.Functor.html | 29 + air_lambda_parser/enum.LambdaAST.html | 33 + air_lambda_parser/enum.LambdaParserError.html | 21 + air_lambda_parser/enum.LexerError.html | 19 + air_lambda_parser/enum.ValueAccessor.html | 37 + air_lambda_parser/fn.parse.html | 2 + air_lambda_parser/index.html | 1 + .../parser/errors/enum.LambdaParserError.html | 11 + .../parser/lambda_parser/fn.parse.html | 11 + .../parser/lexer/errors/enum.LexerError.html | 11 + .../struct.LambdaASTLexer.html | 11 + air_lambda_parser/sidebar-items.js | 1 + air_lambda_parser/struct.LambdaASTLexer.html | 573 + air_log_targets/all.html | 1 + air_log_targets/constant.DATA_CACHE.html | 2 + .../constant.EXECUTED_STATE_CHANGING.html | 2 + .../constant.EXECUTED_TRACE_MERGE.html | 2 + air_log_targets/constant.INSTRUCTION.html | 2 + air_log_targets/constant.JOIN_BEHAVIOUR.html | 2 + .../constant.NEW_EXECUTED_TRACE.html | 2 + air_log_targets/constant.NEXT_PEER_PKS.html | 2 + air_log_targets/constant.RUN_PARAMS.html | 2 + .../constant.SUBGRAPH_COMPLETE.html | 2 + .../constant.SUBGRAPH_ELEMENTS.html | 2 + air_log_targets/constant.TARGET_MAP.html | 2 + air_log_targets/index.html | 1 + air_log_targets/sidebar-items.js | 1 + air_parser/all.html | 1 + air_parser/ast/enum.ApArgument.html | 40 + air_parser/ast/enum.ApResult.html | 27 + air_parser/ast/enum.CallOutputValue.html | 26 + air_parser/ast/enum.Fail.html | 33 + air_parser/ast/enum.FoldScalarIterable.html | 31 + air_parser/ast/enum.ImmutableValue.html | 37 + air_parser/ast/enum.ImmutableVariable.html | 29 + .../ast/enum.ImmutableVariableWithLambda.html | 37 + air_parser/ast/enum.Instruction.html | 41 + air_parser/ast/enum.NewArgument.html | 30 + air_parser/ast/enum.Number.html | 27 + .../ast/enum.ResolvableToPeerIdVariable.html | 32 + .../ast/enum.ResolvableToStringVariable.html | 31 + air_parser/ast/enum.StreamMapKeyClause.html | 30 + air_parser/ast/index.html | 4 + .../enum.ApArgument.html | 11 + .../instruction_arguments/enum.ApResult.html | 11 + .../enum.CallOutputValue.html | 11 + .../enum.FoldScalarIterable.html | 11 + .../enum.ImmutableValue.html | 11 + .../enum.NewArgument.html | 11 + .../instruction_arguments/enum.Number.html | 11 + .../enum.ResolvableToPeerIdVariable.html | 11 + .../enum.ResolvableToStringVariable.html | 11 + .../enum.StreamMapKeyClause.html | 11 + .../instruction_arguments/struct.Triplet.html | 11 + air_parser/ast/instructions/enum.Fail.html | 11 + .../ast/instructions/enum.Instruction.html | 11 + air_parser/ast/instructions/struct.Ap.html | 11 + air_parser/ast/instructions/struct.ApMap.html | 11 + air_parser/ast/instructions/struct.Call.html | 11 + air_parser/ast/instructions/struct.Canon.html | 11 + .../ast/instructions/struct.CanonMap.html | 11 + .../struct.CanonStreamMapScalar.html | 11 + .../ast/instructions/struct.FoldScalar.html | 11 + .../ast/instructions/struct.FoldStream.html | 11 + .../instructions/struct.FoldStreamMap.html | 11 + air_parser/ast/instructions/struct.Match.html | 11 + .../ast/instructions/struct.MisMatch.html | 11 + air_parser/ast/instructions/struct.Never.html | 11 + air_parser/ast/instructions/struct.New.html | 11 + air_parser/ast/instructions/struct.Next.html | 11 + air_parser/ast/instructions/struct.Null.html | 11 + air_parser/ast/instructions/struct.Par.html | 11 + air_parser/ast/instructions/struct.Seq.html | 11 + air_parser/ast/instructions/struct.Xor.html | 11 + .../trait.PeerIDErrorLogable.html | 11 + air_parser/ast/sidebar-items.js | 1 + air_parser/ast/struct.Ap.html | 24 + air_parser/ast/struct.ApMap.html | 29 + air_parser/ast/struct.Call.html | 29 + air_parser/ast/struct.Canon.html | 29 + air_parser/ast/struct.CanonMap.html | 29 + air_parser/ast/struct.CanonStream.html | 28 + air_parser/ast/struct.CanonStreamMap.html | 28 + .../ast/struct.CanonStreamMapScalar.html | 29 + .../ast/struct.CanonStreamMapWithLambda.html | 29 + .../ast/struct.CanonStreamWithLambda.html | 29 + air_parser/ast/struct.FoldScalar.html | 33 + air_parser/ast/struct.FoldStream.html | 33 + air_parser/ast/struct.FoldStreamMap.html | 33 + .../ast/struct.InstructionErrorAST.html | 26 + air_parser/ast/struct.Match.html | 29 + air_parser/ast/struct.MisMatch.html | 29 + air_parser/ast/struct.Never.html | 21 + air_parser/ast/struct.New.html | 29 + air_parser/ast/struct.Next.html | 23 + air_parser/ast/struct.Null.html | 21 + air_parser/ast/struct.Par.html | 24 + air_parser/ast/struct.Scalar.html | 28 + air_parser/ast/struct.ScalarWithLambda.html | 29 + air_parser/ast/struct.Seq.html | 24 + air_parser/ast/struct.Span.html | 34 + air_parser/ast/struct.Stream.html | 28 + air_parser/ast/struct.StreamMap.html | 28 + air_parser/ast/struct.Triplet.html | 30 + air_parser/ast/struct.Xor.html | 24 + air_parser/ast/trait.PeerIDErrorLogable.html | 4 + .../ast/values/enum.ImmutableVariable.html | 11 + .../enum.ImmutableVariableWithLambda.html | 11 + air_parser/ast/values/struct.CanonStream.html | 11 + .../ast/values/struct.CanonStreamMap.html | 11 + .../struct.CanonStreamMapWithLambda.html | 11 + .../values/struct.CanonStreamWithLambda.html | 11 + .../values/struct.InstructionErrorAST.html | 11 + air_parser/ast/values/struct.Scalar.html | 11 + .../ast/values/struct.ScalarWithLambda.html | 11 + air_parser/ast/values/struct.Stream.html | 11 + air_parser/ast/values/struct.StreamMap.html | 11 + air_parser/fn.parse.html | 2 + air_parser/index.html | 1 + air_parser/macro.make_user_error!.html | 11 + air_parser/macro.make_user_error.html | 3 + .../air/__parse__AIR/struct.AIRParser.html | 11 + air_parser/parser/air_parser/fn.parse.html | 11 + .../lexer/air_lexer/struct.AIRLexer.html | 11 + .../parser/lexer/text_pos/struct.AirPos.html | 11 + air_parser/parser/span/struct.Span.html | 11 + .../validator/struct.VariableValidator.html | 11 + air_parser/sidebar-items.js | 1 + air_parser/struct.AIRLexer.html | 578 + air_parser/struct.AIRParser.html | 22 + air_parser/struct.AirPos.html | 35 + air_parser/struct.VariableValidator.html | 23 + air_test_framework/all.html | 1 + .../asserts/enum.ServiceDefinition.html | 65 + .../asserts/enum.ServiceTagName.html | 62 + air_test_framework/asserts/index.html | 1 + air_test_framework/asserts/sidebar-items.js | 1 + air_test_framework/ephemeral/index.html | 1 + .../neighborhood/enum.AlterState.html | 47 + .../ephemeral/neighborhood/index.html | 2 + .../ephemeral/neighborhood/sidebar-items.js | 1 + .../neighborhood/struct.Neighborhood.html | 39 + .../neighborhood/struct.PeerEnv.html | 39 + air_test_framework/ephemeral/sidebar-items.js | 1 + .../ephemeral/struct.Network.html | 72 + air_test_framework/ephemeral/struct.Peer.html | 37 + .../ephemeral/struct.PeerId.html | 1268 + air_test_framework/ephemeral/type.Data.html | 1 + air_test_framework/execution/index.html | 2 + air_test_framework/execution/sidebar-items.js | 1 + .../execution/struct.AirScriptExecutor.html | 74 + air_test_framework/index.html | 1 + .../services/enum.FunctionOutcome.html | 37 + air_test_framework/services/index.html | 2 + air_test_framework/services/sidebar-items.js | 1 + .../services/struct.MarineServiceHandle.html | 37 + .../services/trait.MarineService.html | 16 + air_test_framework/services/type.JValue.html | 31 + air_test_framework/sidebar-items.js | 1 + air_test_framework/transform/index.html | 1 + air_test_framework/transform/sidebar-items.js | 1 + .../transform/walker/index.html | 3 + .../transform/walker/sidebar-items.js | 1 + .../walker/struct.TransformedAirScript.html | 1260 + air_test_utils/all.html | 1 + air_test_utils/avm_runner/index.html | 1 + air_test_utils/avm_runner/sidebar-items.js | 1 + .../avm_runner/struct.AVMRunner.html | 73 + .../avm_runner/struct.RawAVMOutcome.html | 61 + .../enum.VariableOptionSource.html | 36 + .../call_services/fn.echo_call_service.html | 1 + .../fn.fallible_call_service.html | 3 + .../fn.fallible_call_service_by_arg.html | 3 + .../fn.return_string_call_service.html | 3 + .../fn.set_variable_call_service.html | 1 + .../fn.set_variables_call_service.html | 4 + .../fn.tetraplet_host_function.html | 3 + .../call_services/fn.unit_call_service.html | 1 + air_test_utils/call_services/index.html | 1 + air_test_utils/call_services/sidebar-items.js | 1 + .../call_services/type.ArgTetraplets.html | 1 + .../constant.CALL_SERVICE_SUCCESS.html | 1 + air_test_utils/enum.AVMError.html | 62 + air_test_utils/enum.ArchivedCallResult.html | 56 + air_test_utils/enum.ArchivedCanonResult.html | 50 + .../enum.ArchivedExecutedState.html | 68 + air_test_utils/enum.ArchivedProvenance.html | 56 + air_test_utils/enum.ArchivedSender.html | 54 + air_test_utils/enum.ArchivedValueRef.html | 60 + air_test_utils/enum.CallResult.html | 113 + air_test_utils/enum.CallResultResolver.html | 45 + air_test_utils/enum.CallSeDeErrors.html | 58 + air_test_utils/enum.CanonResult.html | 99 + air_test_utils/enum.CanonResultResolver.html | 41 + .../enum.CidStoreVerificationError.html | 40 + .../enum.DataDeserializationError.html | 36 + air_test_utils/enum.ExecutedState.html | 116 + .../enum.ExecutedStateResolver.html | 53 + air_test_utils/enum.HostImportError.html | 44 + air_test_utils/enum.IType.html | 97 + air_test_utils/enum.IValue.html | 71 + air_test_utils/enum.Provenance.html | 102 + air_test_utils/enum.ProvenanceResolver.html | 47 + air_test_utils/enum.RunnerError.html | 54 + air_test_utils/enum.Sender.html | 101 + air_test_utils/enum.SenderResolver.html | 45 + air_test_utils/enum.ValueRef.html | 109 + air_test_utils/enum.ValueRefResolver.html | 49 + .../executed_state/fn._failure_to_value.html | 1 + air_test_utils/executed_state/fn.ap.html | 1 + air_test_utils/executed_state/fn.canon.html | 3 + .../executed_state/fn.canon_request.html | 1 + .../executed_state/fn.canon_tracked.html | 4 + .../fn.extract_canon_result_cid.html | 3 + .../fn.extract_service_result_cid.html | 3 + air_test_utils/executed_state/fn.fold.html | 1 + air_test_utils/executed_state/fn.par.html | 1 + .../executed_state/fn.request_sent_by.html | 1 + .../fn.simple_value_aggregate_cid.html | 4 + .../executed_state/fn.subtrace_desc.html | 4 + .../executed_state/fn.subtrace_lore.html | 5 + .../fn.value_aggregate_cid.html | 6 + air_test_utils/executed_state/index.html | 2 + .../executed_state/sidebar-items.js | 1 + .../struct.CanonResultAlike.html | 37 + .../struct.ExecutedCallBuilder.html | 35 + .../struct.ValueAggregateAlike.html | 38 + air_test_utils/fn.check_error.html | 4 + air_test_utils/fn.data_from_result.html | 1 + air_test_utils/fn.data_version.html | 1 + air_test_utils/fn.env_from_result.html | 1 + air_test_utils/fn.into_raw_result.html | 3 + .../fn.is_interpreter_succeded.html | 1 + air_test_utils/fn.print_trace.html | 1 + air_test_utils/fn.raw_data_from_trace.html | 4 + .../fn.raw_data_from_trace_with_canon.html | 4 + air_test_utils/fn.trace_from_result.html | 1 + air_test_utils/index.html | 18 + air_test_utils/key_utils/fn.at.html | 1 + .../key_utils/fn.derive_dummy_keypair.html | 5 + air_test_utils/key_utils/index.html | 1 + air_test_utils/key_utils/sidebar-items.js | 1 + air_test_utils/macro._trace_value_body!.html | 11 + air_test_utils/macro._trace_value_body.html | 4 + air_test_utils/macro.assert_error_eq!.html | 11 + air_test_utils/macro.assert_error_eq.html | 4 + air_test_utils/macro.assert_next_pks!.html | 11 + air_test_utils/macro.assert_next_pks.html | 3 + air_test_utils/macro.call_vm!.html | 11 + air_test_utils/macro.call_vm.html | 3 + air_test_utils/macro.checked_call_vm!.html | 11 + air_test_utils/macro.checked_call_vm.html | 3 + air_test_utils/macro.failed!.html | 11 + air_test_utils/macro.failed.html | 4 + air_test_utils/macro.rc!.html | 11 + air_test_utils/macro.rc.html | 3 + air_test_utils/macro.scalar!.html | 11 + air_test_utils/macro.scalar.html | 4 + air_test_utils/macro.scalar_tracked!.html | 11 + air_test_utils/macro.scalar_tracked.html | 4 + air_test_utils/macro.stream!.html | 11 + air_test_utils/macro.stream.html | 4 + air_test_utils/macro.stream_tracked!.html | 11 + air_test_utils/macro.stream_tracked.html | 4 + air_test_utils/macro.unused!.html | 11 + air_test_utils/macro.unused.html | 5 + air_test_utils/native_test_runner/index.html | 1 + .../native_test_runner/sidebar-items.js | 1 + .../struct.NativeAirRunner.html | 46 + air_test_utils/ne_vec/index.html | 2 + air_test_utils/ne_vec/sidebar-items.js | 1 + air_test_utils/ne_vec/struct.NEVec.html | 2534 ++ air_test_utils/prelude/enum.JValue.html | 338 + air_test_utils/prelude/index.html | 1 + air_test_utils/prelude/macro.json!.html | 11 + air_test_utils/prelude/macro.json.html | 41 + air_test_utils/prelude/sidebar-items.js | 1 + air_test_utils/raw_outcome/index.html | 1 + air_test_utils/raw_outcome/sidebar-items.js | 1 + .../raw_outcome/struct.RawAVMOutcome.html | 61 + air_test_utils/sidebar-items.js | 1 + air_test_utils/struct.AVM.html | 52 + air_test_utils/struct.AVMConfig.html | 40 + air_test_utils/struct.AVMMemoryStats.html | 41 + air_test_utils/struct.AVMOutcome.html | 70 + air_test_utils/struct.AVMRuntimeLimits.html | 44 + air_test_utils/struct.AnomalyData.html | 70 + air_test_utils/struct.ApResult.html | 93 + air_test_utils/struct.ApResultResolver.html | 33 + .../struct.AquaVMRuntimeLimits.html | 47 + air_test_utils/struct.ArchivedApResult.html | 43 + .../struct.ArchivedCallServiceFailed.html | 48 + .../struct.ArchivedCanonCidAggregate.html | 53 + ...truct.ArchivedCanonResultCidAggregate.html | 48 + air_test_utils/struct.ArchivedCidInfo.html | 63 + air_test_utils/struct.ArchivedCidStore.html | 41 + .../struct.ArchivedExecutionTrace.html | 41 + air_test_utils/struct.ArchivedFoldResult.html | 43 + .../struct.ArchivedFoldSubTraceLore.html | 48 + .../struct.ArchivedGenerationIdx.html | 41 + .../struct.ArchivedInterpreterData.html | 58 + air_test_utils/struct.ArchivedParResult.html | 45 + air_test_utils/struct.ArchivedRawValue.html | 43 + ...uct.ArchivedServiceResultCidAggregate.html | 53 + .../struct.ArchivedSubTraceDesc.html | 48 + air_test_utils/struct.ArchivedTracePos.html | 41 + air_test_utils/struct.CallRequestParams.html | 67 + air_test_utils/struct.CallServiceFailed.html | 98 + .../struct.CallServiceFailedResolver.html | 34 + air_test_utils/struct.CallServiceResult.html | 58 + air_test_utils/struct.CanonCidAggregate.html | 107 + .../struct.CanonCidAggregateResolver.html | 35 + .../struct.CanonResultCidAggregate.html | 100 + ...truct.CanonResultCidAggregateResolver.html | 34 + air_test_utils/struct.CidInfo.html | 117 + air_test_utils/struct.CidInfoResolver.html | 37 + air_test_utils/struct.CidStore.html | 104 + air_test_utils/struct.CidStoreResolver.html | 34 + air_test_utils/struct.CidTracker.html | 47 + air_test_utils/struct.ErrorAVMOutcome.html | 55 + air_test_utils/struct.ExecutionTrace.html | 1180 + .../struct.ExecutionTraceResolver.html | 34 + air_test_utils/struct.FoldResult.html | 92 + air_test_utils/struct.FoldResultResolver.html | 33 + air_test_utils/struct.FoldSubTraceLore.html | 117 + .../struct.FoldSubTraceLoreResolver.html | 34 + air_test_utils/struct.GenerationIdx.html | 135 + .../struct.GenerationIdxResolver.html | 34 + air_test_utils/struct.InterpreterData.html | 111 + .../struct.InterpreterDataEnvelope.html | 61 + .../struct.InterpreterDataEnvelopeRepr.html | 34 + .../struct.InterpreterDataResolver.html | 36 + air_test_utils/struct.ParResult.html | 87 + air_test_utils/struct.ParResultResolver.html | 33 + air_test_utils/struct.ParticleParameters.html | 54 + air_test_utils/struct.RawAVMOutcome.html | 61 + air_test_utils/struct.RawValue.html | 94 + air_test_utils/struct.RawValueResolver.html | 34 + air_test_utils/struct.SecurityTetraplet.html | 114 + .../struct.ServiceResultCidAggregate.html | 109 + ...uct.ServiceResultCidAggregateResolver.html | 35 + .../struct.SoftLimitsTriggering.html | 61 + air_test_utils/struct.SubTraceDesc.html | 101 + .../struct.SubTraceDescResolver.html | 34 + air_test_utils/struct.TracePos.html | 137 + air_test_utils/struct.TracePosResolver.html | 34 + air_test_utils/struct.Versions.html | 49 + air_test_utils/test_runner/fn.create_avm.html | 4 + .../test_runner/fn.create_avm_with_key.html | 5 + .../test_runner/fn.create_custom_avm.html | 4 + air_test_utils/test_runner/index.html | 1 + air_test_utils/test_runner/sidebar-items.js | 1 + .../struct.TestInitParameters.html | 45 + .../test_runner/struct.TestRunParameters.html | 44 + .../test_runner/struct.TestRunner.html | 54 + .../test_runner/trait.AirRunner.html | 36 + air_test_utils/trait.DataStore.html | 69 + air_test_utils/type.AVMDataStore.html | 1 + air_test_utils/type.AVMResult.html | 6 + air_test_utils/type.CallRequests.html | 1 + air_test_utils/type.CallResults.html | 1 + air_test_utils/type.CallServiceClosure.html | 1 + air_test_utils/type.FoldLore.html | 3 + air_test_utils/type.HostExportedFunc.html | 1 + air_test_utils/type.HostImportDescriptor.html | 11 + .../type.InterpreterDataEnvelopeFormat.html | 1 + air_test_utils/type.PosType.html | 1 + air_test_utils/type.RunnerResult.html | 6 + air_test_utils/type.TraceLen.html | 1 + .../verification/enum.DataVerifierError.html | 50 + air_test_utils/verification/index.html | 1 + air_test_utils/verification/sidebar-items.js | 1 + .../verification/struct.DataVerifier.html | 46 + air_test_utils/wasm_test_runner/index.html | 1 + .../wasm_test_runner/sidebar-items.js | 1 + .../struct.ReleaseWasmAirRunner.html | 47 + .../struct.WasmAirRunner.html | 46 + air_trace_handler/all.html | 1 + .../data_keeper/errors/enum.KeeperError.html | 11 + .../enum.GenerationCompactificationError.html | 33 + .../enum.IntConversionError.html | 29 + air_trace_handler/enum.KeeperError.html | 55 + air_trace_handler/enum.StateFSMError.html | 46 + air_trace_handler/enum.SubgraphType.html | 34 + air_trace_handler/enum.TraceHandlerError.html | 32 + .../enum.GenerationCompactificationError.html | 11 + .../errors/enum.IntConversionError.html | 11 + .../errors/enum.TraceHandlerError.html | 11 + .../handler/struct.TraceHandler.html | 11 + air_trace_handler/index.html | 1 + .../merger/ap_merger/enum.MergerApResult.html | 11 + .../merger/ap_merger/struct.MetApResult.html | 11 + .../call_merger/enum.MergerCallResult.html | 11 + .../call_merger/struct.MetCallResult.html | 11 + .../canon_merger/enum.MergerCanonResult.html | 11 + .../merger/enum.ApResultError.html | 30 + .../merger/enum.CallResultError.html | 37 + .../merger/enum.CanonResultError.html | 32 + air_trace_handler/merger/enum.DataType.html | 32 + .../merger/enum.FoldResultError.html | 36 + .../merger/enum.MergeCtxType.html | 32 + air_trace_handler/merger/enum.MergeError.html | 39 + .../merger/enum.MergerApResult.html | 33 + .../merger/enum.MergerCallResult.html | 33 + .../merger/enum.MergerCanonResult.html | 33 + .../merger/enum.PreparationScheme.html | 32 + .../merger/enum.ValueSource.html | 31 + .../merger/errors/enum.ApResultError.html | 11 + .../merger/errors/enum.CallResultError.html | 11 + .../merger/errors/enum.CanonResultError.html | 11 + .../merger/errors/enum.DataType.html | 11 + .../merger/errors/enum.FoldResultError.html | 11 + .../merger/errors/enum.MergeError.html | 11 + .../struct.ResolvedFold.html | 11 + .../struct.ResolvedSubTraceDescs.html | 11 + .../fold_merger/struct.MergerFoldResult.html | 11 + air_trace_handler/merger/index.html | 1 + .../par_merger/struct.MergerParResult.html | 11 + .../enum.PreparationScheme.html | 11 + air_trace_handler/merger/sidebar-items.js | 1 + .../merger/struct.MergerFoldResult.html | 30 + .../merger/struct.MergerParResult.html | 31 + .../merger/struct.MetApResult.html | 30 + .../merger/struct.MetCallResult.html | 31 + .../merger/struct.ResolvedFold.html | 35 + .../merger/struct.ResolvedSubTraceDescs.html | 32 + air_trace_handler/sidebar-items.js | 1 + .../errors/enum.StateFSMError.html | 11 + .../par_fsm/enum.SubgraphType.html | 11 + air_trace_handler/struct.TraceHandler.html | 44 + .../type.TraceHandlerResult.html | 6 + air_utils/all.html | 1 + air_utils/index.html | 1 + air_utils/macro.auto_checked_add!.html | 11 + air_utils/macro.auto_checked_add.html | 3 + air_utils/macro.farewell_if_fail!.html | 11 + air_utils/macro.farewell_if_fail.html | 3 + air_utils/macro.measure!.html | 11 + air_utils/macro.measure.html | 6 + air_utils/sidebar-items.js | 1 + avm_data_store/all.html | 1 + avm_data_store/index.html | 1 + avm_data_store/sidebar-items.js | 1 + avm_data_store/struct.AnomalyData.html | 49 + avm_data_store/trait.DataStore.html | 69 + avm_interface/all.html | 1 + .../struct.CallRequestParams.html | 11 + .../type.CallRequests.html | 11 + .../constant.CALL_SERVICE_SUCCESS.html | 11 + .../fn.into_raw_result.html | 11 + .../struct.CallServiceResult.html | 11 + .../call_service_result/type.CallResults.html | 11 + .../constant.CALL_SERVICE_SUCCESS.html | 1 + avm_interface/enum.CallSeDeErrors.html | 51 + avm_interface/fn.into_raw_result.html | 1 + avm_interface/index.html | 2 + avm_interface/outcome/struct.AVMOutcome.html | 11 + .../outcome/struct.ErrorAVMOutcome.html | 11 + .../struct.ParticleParameters.html | 11 + avm_interface/raw_outcome/index.html | 1 + avm_interface/raw_outcome/sidebar-items.js | 1 + .../raw_outcome/struct.RawAVMOutcome.html | 41 + avm_interface/sidebar-items.js | 1 + avm_interface/struct.AVMOutcome.html | 50 + avm_interface/struct.CallRequestParams.html | 47 + avm_interface/struct.CallServiceResult.html | 38 + avm_interface/struct.ErrorAVMOutcome.html | 35 + avm_interface/struct.ParticleParameters.html | 42 + .../struct.SoftLimitsTriggering.html | 46 + avm_interface/type.CallRequests.html | 1 + avm_interface/type.CallResults.html | 1 + avm_server/all.html | 1 + avm_server/avm/struct.AVM.html | 11 + avm_server/avm_runner/index.html | 1 + avm_server/avm_runner/sidebar-items.js | 1 + avm_server/avm_runner/struct.AVMRunner.html | 71 + .../avm_runner/struct.RawAVMOutcome.html | 61 + avm_server/config/struct.AVMConfig.html | 11 + avm_server/constant.CALL_SERVICE_SUCCESS.html | 1 + avm_server/enum.AVMError.html | 61 + avm_server/enum.CallSeDeErrors.html | 58 + avm_server/enum.HostImportError.html | 44 + avm_server/enum.IType.html | 97 + avm_server/enum.IValue.html | 71 + avm_server/enum.RunnerError.html | 54 + avm_server/errors/enum.AVMError.html | 11 + avm_server/errors/enum.CallSeDeErrors.html | 11 + avm_server/errors/enum.RunnerError.html | 11 + avm_server/fn.into_raw_result.html | 3 + avm_server/index.html | 2 + avm_server/ne_vec/index.html | 2 + avm_server/ne_vec/sidebar-items.js | 1 + avm_server/ne_vec/struct.NEVec.html | 2534 ++ avm_server/raw_outcome/index.html | 1 + avm_server/raw_outcome/sidebar-items.js | 1 + .../raw_outcome/struct.RawAVMOutcome.html | 61 + avm_server/runner/struct.AVMMemoryStats.html | 11 + avm_server/runner/struct.AVMRunner.html | 11 + .../runner/struct.AVMRuntimeLimits.html | 11 + .../runner/struct.AquaVMRuntimeLimits.html | 11 + avm_server/sidebar-items.js | 1 + avm_server/struct.AVM.html | 47 + avm_server/struct.AVMConfig.html | 40 + avm_server/struct.AVMMemoryStats.html | 41 + avm_server/struct.AVMOutcome.html | 70 + avm_server/struct.AVMRuntimeLimits.html | 44 + avm_server/struct.AnomalyData.html | 70 + avm_server/struct.AquaVMRuntimeLimits.html | 47 + avm_server/struct.CallRequestParams.html | 67 + avm_server/struct.CallServiceResult.html | 58 + avm_server/struct.ErrorAVMOutcome.html | 55 + avm_server/struct.ParticleParameters.html | 54 + avm_server/struct.SecurityTetraplet.html | 114 + avm_server/struct.SoftLimitsTriggering.html | 61 + avm_server/trait.DataStore.html | 69 + avm_server/type.AVMDataStore.html | 1 + avm_server/type.AVMResult.html | 6 + avm_server/type.CallRequests.html | 1 + avm_server/type.CallResults.html | 1 + avm_server/type.HostExportedFunc.html | 1 + avm_server/type.HostImportDescriptor.html | 11 + avm_server/type.RunnerResult.html | 6 + crates.js | 1 + help.html | 1 + index.html | 1 + polyplets/all.html | 1 + polyplets/index.html | 4 + polyplets/sidebar-items.js | 1 + polyplets/struct.ResolvedTriplet.html | 39 + polyplets/struct.SecurityTetraplet.html | 94 + polyplets/triplet/struct.ResolvedTriplet.html | 11 + search-index.js | 28 + search.desc/air/air-desc-0-.js | 1 + .../air_beautifier/air_beautifier-desc-0-.js | 1 + .../air_beautify_wasm-desc-0-.js | 1 + .../air_execution_info_collector-desc-0-.js | 1 + .../air_interpreter_cid-desc-0-.js | 1 + .../air_interpreter_client-desc-0-.js | 1 + .../air_interpreter_data-desc-0-.js | 1 + .../air_interpreter_interface-desc-0-.js | 1 + .../air_interpreter_sede-desc-0-.js | 1 + .../air_interpreter_server-desc-0-.js | 1 + .../air_interpreter_signatures-desc-0-.js | 1 + .../air_interpreter_value-desc-0-.js | 1 + .../air_lambda_ast/air_lambda_ast-desc-0-.js | 1 + .../air_lambda_parser-desc-0-.js | 1 + .../air_log_targets-desc-0-.js | 1 + search.desc/air_parser/air_parser-desc-0-.js | 1 + .../air_test_framework-desc-0-.js | 1 + .../air_test_utils/air_test_utils-desc-0-.js | 1 + .../air_trace_handler-desc-0-.js | 1 + search.desc/air_utils/air_utils-desc-0-.js | 1 + .../avm_data_store/avm_data_store-desc-0-.js | 1 + .../avm_interface/avm_interface-desc-0-.js | 1 + search.desc/avm_server/avm_server-desc-0-.js | 1 + search.desc/polyplets/polyplets-desc-0-.js | 1 + settings.html | 1 + src-files.js | 27 + src/air/beautify/mod.rs.html | 163 + src/air/data.rs.html | 257 + .../errors/catchable_errors.rs.html | 319 + .../errors/error_effectable.rs.html | 53 + .../errors/execution_errors.rs.html | 223 + .../execution_step/errors/joinable.rs.html | 61 + src/air/execution_step/errors/mod.rs.html | 67 + .../errors/uncatchable_errors.rs.html | 307 + .../execution_context/cid_state.rs.html | 379 + .../execution_context/context.rs.html | 531 + .../error_descriptor.rs.html | 173 + .../instruction_error/errors.rs.html | 85 + .../instruction_error/errors_utils.rs.html | 153 + .../instruction_error_definition.rs.html | 317 + .../last_error_descriptor.rs.html | 185 + .../instruction_error/mod.rs.html | 81 + .../execution_context/mod.rs.html | 69 + .../scalar_variables.rs.html | 547 + .../values_sparse_matrix.rs.html | 641 + .../stream_maps_variables.rs.html | 403 + .../stream_maps_variables/errors.rs.html | 105 + .../stream_map_key.rs.html | 251 + .../streams_variables.rs.html | 275 + .../stream_descriptor.rs.html | 155 + .../stream_value_descriptor.rs.html | 83 + .../execution_step/instructions/ap.rs.html | 199 + .../ap/apply_to_arguments.rs.html | 433 + .../instructions/ap/utils.rs.html | 117 + .../instructions/ap_map.rs.html | 197 + .../execution_step/instructions/call.rs.html | 175 + .../call/call_result_setter.rs.html | 289 + .../call/prev_result_handler.rs.html | 575 + .../instructions/call/resolved_call.rs.html | 537 + .../instructions/call/triplet.rs.html | 197 + .../instructions/call/verifier.rs.html | 93 + .../execution_step/instructions/canon.rs.html | 201 + .../instructions/canon_map.rs.html | 207 + .../canon_stream_map_scalar.rs.html | 257 + .../instructions/canon_utils/mod.rs.html | 383 + .../compare_matchable/mod.rs.html | 73 + .../execution_step/instructions/fail.rs.html | 327 + .../instructions/fold/fold_state.rs.html | 111 + .../instructions/fold/mod.rs.html | 63 + .../instructions/fold/utils.rs.html | 457 + .../instructions/fold_scalar.rs.html | 199 + .../instructions/fold_stream.rs.html | 119 + .../fold_stream/completeness_updater.rs.html | 81 + .../stream_execute_helpers.rs.html | 297 + .../instructions/fold_stream_map.rs.html | 121 + .../instructions/match_.rs.html | 95 + .../instructions/mismatch.rs.html | 95 + .../execution_step/instructions/mod.rs.html | 317 + .../execution_step/instructions/never.rs.html | 69 + .../execution_step/instructions/new.rs.html | 163 + .../execution_step/instructions/next.rs.html | 243 + .../execution_step/instructions/null.rs.html | 67 + .../execution_step/instructions/par.rs.html | 237 + .../par/completeness_updater.rs.html | 99 + .../execution_step/instructions/seq.rs.html | 81 + .../execution_step/instructions/xor.rs.html | 141 + .../lambda_applier/applier.rs.html | 637 + .../lambda_applier/errors.rs.html | 127 + .../execution_step/lambda_applier/mod.rs.html | 85 + .../lambda_applier/utils.rs.html | 275 + src/air/execution_step/mod.rs.html | 129 + src/air/execution_step/resolver/mod.rs.html | 63 + .../resolver/resolvable_impl.rs.html | 417 + .../value_types/canon_stream.rs.html | 239 + .../value_types/canon_stream_map.rs.html | 509 + .../value_types/iterable.rs.html | 253 + .../value_types/iterable/canon_stream.rs.html | 145 + .../iterable/canon_stream_map.rs.html | 139 + .../iterable/lambda_result.rs.html | 153 + .../iterable/resolved_call.rs.html | 165 + .../iterable/vec_resolved_call.rs.html | 145 + .../value_types/jvaluable.rs.html | 119 + .../jvaluable/canon_stream.rs.html | 165 + .../jvaluable/canon_stream_map.rs.html | 121 + .../cell_vec_resolved_call_result.rs.html | 137 + .../jvaluable/iterable_item.rs.html | 169 + .../jvaluable/resolved_call_result.rs.html | 119 + .../execution_step/value_types/mod.rs.html | 103 + .../execution_step/value_types/scalar.rs.html | 523 + .../value_types/scalar/values.rs.html | 189 + .../value_types/stream/mod.rs.html | 61 + .../stream/recursive_stream.rs.html | 509 + .../stream/stream_definition.rs.html | 1207 + .../value_types/stream/values_matrix.rs.html | 379 + .../value_types/stream_map.rs.html | 695 + .../execution_step/value_types/utils.rs.html | 69 + src/air/farewell_step/errors.rs.html | 107 + src/air/farewell_step/mod.rs.html | 55 + src/air/farewell_step/outcome.rs.html | 447 + src/air/human_readable_data.rs.html | 89 + src/air/lib.rs.html | 177 + src/air/main.rs.html | 139 + src/air/preparation_step/errors.rs.html | 319 + .../interpreter_versions.rs.html | 91 + src/air/preparation_step/mod.rs.html | 69 + src/air/preparation_step/preparation.rs.html | 393 + .../sizes_limits_check.rs.html | 133 + src/air/runner.rs.html | 323 + src/air/signing_step.rs.html | 107 + src/air/trace/mod.rs.html | 45 + src/air/trace/run.rs.html | 679 + src/air/trace/run/data/anomaly.rs.html | 113 + src/air/trace/run/data/mod.rs.html | 67 + src/air/trace/run/data/plain.rs.html | 275 + src/air/trace/run/native.rs.html | 235 + src/air/trace/run/runner.rs.html | 223 + src/air/trace/run/wasm.rs.html | 233 + src/air/trace/stats.rs.html | 231 + src/air/trace/stats/log_data.rs.html | 241 + src/air/trace/stats/report.rs.html | 125 + src/air/trace/utils.rs.html | 89 + src/air/utils/error_codes.rs.html | 49 + src/air/utils/mod.rs.html | 49 + src/air/utils/to_error_code.rs.html | 85 + src/air/verification_step.rs.html | 109 + src/air_beautifier/beautifier.rs.html | 575 + src/air_beautifier/lib.rs.html | 129 + src/air_beautifier/virtual.rs.html | 175 + src/air_beautify_wasm/lib.rs.html | 69 + .../instructions_tracker.rs.html | 305 + src/air_execution_info_collector/lib.rs.html | 69 + src/air_interpreter_cid/lib.rs.html | 431 + src/air_interpreter_cid/verify.rs.html | 587 + src/air_interpreter_client/ast.rs.html | 67 + src/air_interpreter_client/logger.rs.html | 81 + .../wasm_bindgen.rs.html | 161 + src/air_interpreter_data/cid_info.rs.html | 253 + src/air_interpreter_data/cid_store.rs.html | 569 + .../executed_state.rs.html | 613 + .../executed_state/impls.rs.html | 491 + .../executed_state/se_de.rs.html | 143 + .../generation_idx.rs.html | 197 + .../interpreter_data.rs.html | 377 + .../interpreter_data/errors.rs.html | 107 + .../interpreter_data/repr.rs.html | 99 + .../interpreter_data/verification.rs.html | 567 + src/air_interpreter_data/lib.rs.html | 131 + src/air_interpreter_data/raw_value.rs.html | 151 + src/air_interpreter_data/rkyv.rs.html | 193 + src/air_interpreter_data/trace.rs.html | 211 + src/air_interpreter_data/trace_pos.rs.html | 119 + .../call_request_parameters.rs.html | 249 + .../call_service_result.rs.html | 165 + .../interpreter_outcome.rs.html | 459 + src/air_interpreter_interface/lib.rs.html | 85 + .../run_args_memory_limits.rs.html | 71 + .../run_parameters.rs.html | 245 + src/air_interpreter_sede/format.rs.html | 109 + src/air_interpreter_sede/lib.rs.html | 111 + src/air_interpreter_sede/multiformat.rs.html | 195 + .../representation.rs.html | 229 + src/air_interpreter_sede/rmp_serde.rs.html | 205 + .../serialized_type.rs.html | 209 + src/air_interpreter_server/ast.rs.html | 67 + src/air_interpreter_server/logger.rs.html | 81 + src/air_interpreter_server/marine.rs.html | 205 + src/air_interpreter_signatures/lib.rs.html | 469 + src/air_interpreter_signatures/sede.rs.html | 181 + src/air_interpreter_signatures/stores.rs.html | 149 + .../trackers.rs.html | 135 + src/air_interpreter_value/lib.rs.html | 153 + src/air_interpreter_value/value/de.rs.html | 371 + src/air_interpreter_value/value/from.rs.html | 771 + src/air_interpreter_value/value/index.rs.html | 309 + src/air_interpreter_value/value/mod.rs.html | 867 + .../value/partial_eq.rs.html | 295 + src/air_interpreter_value/value/ser.rs.html | 153 + src/air_lambda_ast/ast.rs.html | 119 + src/air_lambda_ast/ast/impls.rs.html | 77 + src/air_lambda_ast/ast/traits.rs.html | 115 + src/air_lambda_ast/lib.rs.html | 69 + src/air_lambda_parser/lib.rs.html | 81 + src/air_lambda_parser/parser/errors.rs.html | 131 + .../parser/lambda_parser.rs.html | 135 + .../parser/lexer/errors.rs.html | 63 + .../parser/lexer/lambda_ast_lexer.rs.html | 297 + .../parser/lexer/mod.rs.html | 65 + .../parser/lexer/token.rs.html | 81 + .../parser/lexer/utils.rs.html | 47 + src/air_lambda_parser/parser/mod.rs.html | 89 + .../parser/va_lambda.rs.html | 4053 ++++ src/air_log_targets/lib.rs.html | 125 + .../ast/instruction_arguments.rs.html | 339 + .../ast/instruction_arguments/impls.rs.html | 129 + .../ast/instruction_arguments/traits.rs.html | 449 + src/air_parser/ast/instructions.rs.html | 415 + src/air_parser/ast/instructions/impls.rs.html | 411 + .../ast/instructions/traits.rs.html | 477 + src/air_parser/ast/mod.rs.html | 63 + src/air_parser/ast/values.rs.html | 237 + src/air_parser/ast/values/impls.rs.html | 331 + src/air_parser/ast/values/traits.rs.html | 187 + src/air_parser/lib.rs.html | 83 + src/air_parser/parser/air.rs.html | 19301 ++++++++++++++++ src/air_parser/parser/air_parser.rs.html | 257 + src/air_parser/parser/air_utils/mod.rs.html | 67 + src/air_parser/parser/errors.rs.html | 289 + src/air_parser/parser/lexer/air_lexer.rs.html | 541 + .../parser/lexer/call_variable_parser.rs.html | 905 + src/air_parser/parser/lexer/errors.rs.html | 389 + src/air_parser/parser/lexer/mod.rs.html | 81 + src/air_parser/parser/lexer/text_pos.rs.html | 157 + src/air_parser/parser/lexer/token.rs.html | 215 + src/air_parser/parser/lexer/utils.rs.html | 85 + src/air_parser/parser/mod.rs.html | 89 + src/air_parser/parser/span.rs.html | 155 + src/air_parser/parser/validator.rs.html | 1711 ++ .../asserts/behavior.rs.html | 271 + src/air_test_framework/asserts/json.rs.html | 467 + src/air_test_framework/asserts/mod.rs.html | 353 + src/air_test_framework/asserts/parser.rs.html | 557 + src/air_test_framework/ephemeral/mod.rs.html | 689 + .../ephemeral/neighborhood.rs.html | 1141 + src/air_test_framework/execution/mod.rs.html | 2177 ++ src/air_test_framework/lib.rs.html | 59 + src/air_test_framework/queue.rs.html | 269 + src/air_test_framework/services/mod.rs.html | 263 + .../services/results.rs.html | 179 + src/air_test_framework/transform/mod.rs.html | 369 + .../transform/parser.rs.html | 2107 ++ .../transform/walker.rs.html | 749 + src/air_test_utils/call_services.rs.html | 323 + src/air_test_utils/executed_state.rs.html | 889 + src/air_test_utils/key_utils.rs.html | 97 + src/air_test_utils/lib.rs.html | 513 + src/air_test_utils/native_test_runner.rs.html | 239 + src/air_test_utils/test_runner.rs.html | 809 + src/air_test_utils/wasm_test_runner.rs.html | 453 + .../data_keeper/errors.rs.html | 121 + .../data_keeper/keeper.rs.html | 149 + .../data_keeper/merge_ctx.rs.html | 123 + src/air_trace_handler/data_keeper/mod.rs.html | 69 + .../data_keeper/trace_slider.rs.html | 249 + src/air_trace_handler/errors.rs.html | 143 + src/air_trace_handler/handler.rs.html | 403 + src/air_trace_handler/lib.rs.html | 117 + .../merger/ap_merger.rs.html | 191 + .../merger/call_merger.rs.html | 241 + .../merger/call_merger/utils.rs.html | 159 + .../merger/canon_merger.rs.html | 171 + src/air_trace_handler/merger/errors.rs.html | 345 + .../merger/fold_merger.rs.html | 181 + .../fold_merger/fold_lore_resolver.rs.html | 627 + src/air_trace_handler/merger/mod.rs.html | 167 + .../merger/par_merger.rs.html | 131 + .../merger/position_mapping.rs.html | 105 + .../state_automata/errors.rs.html | 129 + .../state_automata/fold_fsm.rs.html | 311 + .../fold_fsm/lore_applier.rs.html | 155 + .../state_automata/fold_fsm/lore_ctor.rs.html | 299 + .../fold_fsm/lore_ctor_queue.rs.html | 213 + .../fold_fsm/state_handler.rs.html | 143 + .../state_automata/fsm_queue.rs.html | 123 + .../state_automata/mod.rs.html | 99 + .../state_automata/par_fsm.rs.html | 215 + .../par_fsm/par_builder.rs.html | 119 + .../par_fsm/state_handler.rs.html | 173 + .../new_states_calculation.rs.html | 121 + .../state_automata/state_inserter.rs.html | 89 + .../state_automata/utils.rs.html | 135 + src/air_utils/lib.rs.html | 141 + src/avm_data_store/lib.rs.html | 437 + .../call_request_parameters.rs.html | 245 + src/avm_interface/call_service_result.rs.html | 159 + src/avm_interface/lib.rs.html | 175 + src/avm_interface/outcome.rs.html | 241 + src/avm_interface/particle_parameters.rs.html | 101 + src/avm_interface/raw_outcome.rs.html | 145 + src/avm_server/avm.rs.html | 419 + src/avm_server/config.rs.html | 71 + src/avm_server/errors.rs.html | 173 + src/avm_server/lib.rs.html | 135 + src/avm_server/runner.rs.html | 847 + src/polyplets/lib.rs.html | 71 + src/polyplets/triplet.rs.html | 91 + static.files/COPYRIGHT-23e9bde6c69aea69.txt | 50 + .../FiraSans-LICENSE-db4b642586e02d97.txt | 98 + .../FiraSans-Medium-8f9a781e4970d388.woff2 | Bin 0 -> 132780 bytes .../FiraSans-Regular-018c141bf0843ffd.woff2 | Bin 0 -> 129188 bytes .../LICENSE-APACHE-b91fa81cba47b86a.txt | 201 + static.files/LICENSE-MIT-65090b722b3f6c56.txt | 23 + ...anumBarunGothic-0f09457c7a19b7c6.ttf.woff2 | Bin 0 -> 399468 bytes ...umBarunGothic-LICENSE-18c5adf4b52b4041.txt | 103 + ...ourceCodePro-It-1cc31594bf4f1f79.ttf.woff2 | Bin 0 -> 44896 bytes ...SourceCodePro-LICENSE-d180d465a756484a.txt | 97 + ...CodePro-Regular-562dcc5011b6de7d.ttf.woff2 | Bin 0 -> 52228 bytes ...odePro-Semibold-d899c5a5c4aeb14a.ttf.woff2 | Bin 0 -> 52348 bytes ...urceSerif4-Bold-a2c9cd1067f8b328.ttf.woff2 | Bin 0 -> 81540 bytes ...SourceSerif4-It-acdfaf1a8af734b1.ttf.woff2 | Bin 0 -> 59716 bytes .../SourceSerif4-LICENSE-3bb119e13b1258b7.md | 98 + ...eSerif4-Regular-46f98efaafac5295.ttf.woff2 | Bin 0 -> 76260 bytes static.files/favicon-2c020d218678b618.svg | 24 + .../favicon-32x32-422f7d1d52889060.png | Bin 0 -> 1125 bytes static.files/main-d2fab2bf619172d3.js | 11 + static.files/normalize-76eba96aa4d2e634.css | 2 + static.files/noscript-df360f571f6edeae.css | 1 + static.files/rust-logo-151179464ae7ed46.svg | 61 + static.files/rustdoc-c5d6553a23f1e5a6.css | 46 + .../scrape-examples-ef1e698c1d417c0c.js | 1 + static.files/search-d234aafac6c221dd.js | 5 + static.files/settings-4313503d2e1961c2.js | 17 + static.files/src-script-e66d777a5a92e9b2.js | 1 + static.files/storage-118b08c4c78b968e.js | 24 + .../air/trace/run/runner/trait.AirRunner.js | 3 + .../run/runner/trait.DataToHumanReadable.js | 3 + .../utils/to_error_code/trait.ToErrorCode.js | 3 + .../format/trait.Format.js | 3 + .../representation/trait.FromSerialized.js | 4 + .../representation/trait.Representation.js | 4 + .../representation/trait.ToSerialized.js | 3 + .../representation/trait.ToWriter.js | 3 + .../instructions/trait.PeerIDErrorLogable.js | 3 + .../services/trait.MarineService.js | 3 + .../test_runner/trait.AirRunner.js | 3 + trait.impl/alloc/string/trait.ToString.js | 3 + trait.impl/bytecheck/trait.CheckBytes.js | 5 + trait.impl/clap_builder/derive/trait.Args.js | 3 + .../derive/trait.CommandFactory.js | 3 + .../derive/trait.FromArgMatches.js | 3 + .../clap_builder/derive/trait.Parser.js | 3 + .../clap_builder/derive/trait.Subcommand.js | 3 + trait.impl/core/borrow/trait.Borrow.js | 4 + trait.impl/core/clone/trait.Clone.js | 19 + trait.impl/core/cmp/trait.Eq.js | 17 + trait.impl/core/cmp/trait.Ord.js | 5 + trait.impl/core/cmp/trait.PartialEq.js | 17 + trait.impl/core/cmp/trait.PartialOrd.js | 5 + trait.impl/core/convert/trait.AsRef.js | 4 + trait.impl/core/convert/trait.From.js | 17 + trait.impl/core/convert/trait.TryFrom.js | 6 + trait.impl/core/default/trait.Default.js | 15 + trait.impl/core/error/trait.Error.js | 12 + trait.impl/core/fmt/trait.Debug.js | 21 + trait.impl/core/fmt/trait.Display.js | 16 + trait.impl/core/hash/trait.Hash.js | 10 + .../iter/traits/collect/trait.FromIterator.js | 3 + .../iter/traits/collect/trait.IntoIterator.js | 4 + .../iter/traits/iterator/trait.Iterator.js | 4 + trait.impl/core/marker/trait.Copy.js | 12 + trait.impl/core/marker/trait.Freeze.js | 21 + trait.impl/core/marker/trait.Send.js | 21 + .../core/marker/trait.StructuralPartialEq.js | 16 + trait.impl/core/marker/trait.Sync.js | 21 + trait.impl/core/marker/trait.Unpin.js | 21 + trait.impl/core/ops/arith/trait.Add.js | 4 + trait.impl/core/ops/arith/trait.AddAssign.js | 3 + trait.impl/core/ops/arith/trait.Sub.js | 4 + trait.impl/core/ops/deref/trait.Deref.js | 5 + trait.impl/core/ops/index/trait.Index.js | 4 + trait.impl/core/ops/index/trait.IndexMut.js | 3 + .../panic/unwind_safe/trait.RefUnwindSafe.js | 21 + .../panic/unwind_safe/trait.UnwindSafe.js | 21 + trait.impl/core/str/traits/trait.FromStr.js | 3 + .../ops/checked/trait.CheckedAdd.js | 3 + trait.impl/rkyv/trait.Archive.js | 5 + trait.impl/rkyv/trait.Deserialize.js | 5 + trait.impl/rkyv/trait.Serialize.js | 5 + trait.impl/serde/de/trait.Deserialize.js | 14 + trait.impl/serde/ser/trait.Serialize.js | 13 + trait.impl/strum/trait.EnumCount.js | 3 + .../struct.CallArgumentsRepr.js | 3 + .../struct.CallRequestsRepr.js | 3 + .../struct.CallResultsRepr.js | 3 + .../struct.TetrapletsRepr.js | 3 + .../rmp_serde/struct.RmpSerdeFormat.js | 6 + .../rmp_serde/struct.RmpSerdeMultiformat.js | 3 + type.impl/alloc/boxed/struct.Box.js | 4 + .../collections/btree/map/struct.BTreeMap.js | 3 + type.impl/alloc/rc/struct.Rc.js | 3 + type.impl/alloc/vec/struct.Vec.js | 6 + type.impl/core/result/enum.Result.js | 5 + .../config/struct.HostImportDescriptor.js | 4 + type.impl/serde_json/value/enum.Value.js | 3 + .../collections/hash/map/struct.HashMap.js | 6 + type.impl/std/primitive.str.js | 3 + type.impl/std/primitive.u32.js | 6 + 1395 files changed, 134184 insertions(+) create mode 100644 .lock create mode 100644 .nojekyll create mode 100644 CNAME create mode 100644 air/all.html create mode 100644 air/beautify/fn.beautify.html create mode 100644 air/beautify/fn.build_output.html create mode 100644 air/beautify/fn.read_script.html create mode 100644 air/beautify/index.html create mode 100644 air/beautify/sidebar-items.js create mode 100644 air/beautify/struct.Args.html create mode 100644 air/data/enum.Mode.html create mode 100644 air/data/fn.create_runner.html create mode 100644 air/data/fn.init_tracing.html create mode 100644 air/data/fn.to_human_readable_data.html create mode 100644 air/data/index.html create mode 100644 air/data/sidebar-items.js create mode 100644 air/data/struct.Args.html create mode 100644 air/data/struct.ModeArgs.html create mode 100644 air/enum.Subcommand.html create mode 100644 air/fn.main.html create mode 100644 air/index.html create mode 100644 air/sidebar-items.js create mode 100644 air/struct.Cli.html create mode 100644 air/trace/index.html create mode 100644 air/trace/run/data/anomaly/fn.load.html create mode 100644 air/trace/run/data/anomaly/index.html create mode 100644 air/trace/run/data/anomaly/sidebar-items.js create mode 100644 air/trace/run/data/anomaly/struct.AnomalyDataArgs.html create mode 100644 air/trace/run/data/index.html create mode 100644 air/trace/run/data/plain/constant.DEFAULT_DATA.html create mode 100644 air/trace/run/data/plain/fn.load.html create mode 100644 air/trace/run/data/plain/fn.print_air_prompt.html create mode 100644 air/trace/run/data/plain/fn.read_air_with_prompt.html create mode 100644 air/trace/run/data/plain/index.html create mode 100644 air/trace/run/data/plain/sidebar-items.js create mode 100644 air/trace/run/data/plain/struct.PlainDataArgs.html create mode 100644 air/trace/run/data/sidebar-items.js create mode 100644 air/trace/run/data/struct.ExecutionData.html create mode 100644 air/trace/run/enum.Mode.html create mode 100644 air/trace/run/enum.Source.html create mode 100644 air/trace/run/fn.create_runner.html create mode 100644 air/trace/run/fn.init_tracing.html create mode 100644 air/trace/run/fn.load_data.html create mode 100644 air/trace/run/fn.load_data_or_default.html create mode 100644 air/trace/run/fn.load_keypair_ed25519.html create mode 100644 air/trace/run/fn.read_call_results.html create mode 100644 air/trace/run/fn.run.html create mode 100644 air/trace/run/index.html create mode 100644 air/trace/run/native/fn.create_native_avm_runner.html create mode 100644 air/trace/run/native/index.html create mode 100644 air/trace/run/native/sidebar-items.js create mode 100644 air/trace/run/native/struct.NativeAvmRunner.html create mode 100644 air/trace/run/runner/index.html create mode 100644 air/trace/run/runner/sidebar-items.js create mode 100644 air/trace/run/runner/struct.TestInitParameters.html create mode 100644 air/trace/run/runner/trait.AirRunner.html create mode 100644 air/trace/run/runner/trait.DataToHumanReadable.html create mode 100644 air/trace/run/sidebar-items.js create mode 100644 air/trace/run/struct.Args.html create mode 100644 air/trace/run/struct.Keys.html create mode 100644 air/trace/run/struct.ModeArgs.html create mode 100644 air/trace/run/wasm/fn.create_wasm_avm_runner.html create mode 100644 air/trace/run/wasm/index.html create mode 100644 air/trace/run/wasm/sidebar-items.js create mode 100644 air/trace/run/wasm/struct.WasmAvmRunner.html create mode 100644 air/trace/sidebar-items.js create mode 100644 air/trace/stats/fn.print_log_record.html create mode 100644 air/trace/stats/fn.read_logs.html create mode 100644 air/trace/stats/fn.stats.html create mode 100644 air/trace/stats/index.html create mode 100644 air/trace/stats/log_data/enum.Message.html create mode 100644 air/trace/stats/log_data/fn.format_argument.html create mode 100644 air/trace/stats/log_data/index.html create mode 100644 air/trace/stats/log_data/sidebar-items.js create mode 100644 air/trace/stats/log_data/struct.CloseMessage.html create mode 100644 air/trace/stats/log_data/struct.LogKey.html create mode 100644 air/trace/stats/log_data/struct.LogRecord.html create mode 100644 air/trace/stats/log_data/struct.LogValue.html create mode 100644 air/trace/stats/log_data/struct.Span.html create mode 100644 air/trace/stats/report/index.html create mode 100644 air/trace/stats/report/sidebar-items.js create mode 100644 air/trace/stats/report/struct.StatsReport.html create mode 100644 air/trace/stats/sidebar-items.js create mode 100644 air/trace/stats/struct.Args.html create mode 100644 air/trace/utils/fn.parse_tracing_duration.html create mode 100644 air/trace/utils/fn.unix_timestamp_now.html create mode 100644 air/trace/utils/index.html create mode 100644 air/trace/utils/sidebar-items.js create mode 100644 air_beautifier/all.html create mode 100644 air_beautifier/beautifier/constant.DEFAULT_INDENT_STEP.html create mode 100644 air_beautifier/beautifier/enum.BeautifyError.html create mode 100644 air_beautifier/beautifier/struct.Beautifier.html create mode 100644 air_beautifier/constant.DEFAULT_INDENT_STEP.html create mode 100644 air_beautifier/enum.BeautifyError.html create mode 100644 air_beautifier/fn.beautify.html create mode 100644 air_beautifier/fn.beautify_to_string.html create mode 100644 air_beautifier/index.html create mode 100644 air_beautifier/sidebar-items.js create mode 100644 air_beautifier/struct.Beautifier.html create mode 100644 air_beautify_wasm/all.html create mode 100644 air_beautify_wasm/fn.beautify.html create mode 100644 air_beautify_wasm/fn.beautify_raw.html create mode 100644 air_beautify_wasm/index.html create mode 100644 air_beautify_wasm/sidebar-items.js create mode 100644 air_execution_info_collector/all.html create mode 100644 air_execution_info_collector/index.html create mode 100644 air_execution_info_collector/instructions_tracker/struct.ApTracker.html create mode 100644 air_execution_info_collector/instructions_tracker/struct.CallTracker.html create mode 100644 air_execution_info_collector/instructions_tracker/struct.FoldTracker.html create mode 100644 air_execution_info_collector/instructions_tracker/struct.InstructionTracker.html create mode 100644 air_execution_info_collector/instructions_tracker/struct.NewTracker.html create mode 100644 air_execution_info_collector/instructions_tracker/struct.ParTracker.html create mode 100644 air_execution_info_collector/sidebar-items.js create mode 100644 air_execution_info_collector/struct.ApTracker.html create mode 100644 air_execution_info_collector/struct.CallTracker.html create mode 100644 air_execution_info_collector/struct.FoldTracker.html create mode 100644 air_execution_info_collector/struct.InstructionTracker.html create mode 100644 air_execution_info_collector/struct.NewTracker.html create mode 100644 air_execution_info_collector/struct.ParTracker.html create mode 100644 air_interpreter_cid/all.html create mode 100644 air_interpreter_cid/enum.CidCalculationError.html create mode 100644 air_interpreter_cid/enum.CidVerificationError.html create mode 100644 air_interpreter_cid/fn.raw_value_to_json_cid.html create mode 100644 air_interpreter_cid/fn.value_to_json_cid.html create mode 100644 air_interpreter_cid/fn.verify_raw_value.html create mode 100644 air_interpreter_cid/fn.verify_value.html create mode 100644 air_interpreter_cid/index.html create mode 100644 air_interpreter_cid/sidebar-items.js create mode 100644 air_interpreter_cid/struct.ArchivedCID.html create mode 100644 air_interpreter_cid/struct.CID.html create mode 100644 air_interpreter_cid/struct.CIDResolver.html create mode 100644 air_interpreter_cid/type.CidRef.html create mode 100644 air_interpreter_cid/verify/enum.CidVerificationError.html create mode 100644 air_interpreter_cid/verify/fn.verify_raw_value.html create mode 100644 air_interpreter_cid/verify/fn.verify_value.html create mode 100644 air_interpreter_client/all.html create mode 100644 air_interpreter_client/constant.DEFAULT_LOG_LEVEL.html create mode 100644 air_interpreter_client/fn.ast.html create mode 100644 air_interpreter_client/fn.invoke.html create mode 100644 air_interpreter_client/fn.main.html create mode 100644 air_interpreter_client/index.html create mode 100644 air_interpreter_client/sidebar-items.js create mode 100644 air_interpreter_data/all.html create mode 100644 air_interpreter_data/cid_info/struct.ArchivedCidInfo.html create mode 100644 air_interpreter_data/cid_info/struct.CidInfo.html create mode 100644 air_interpreter_data/cid_info/struct.CidInfoResolver.html create mode 100644 air_interpreter_data/cid_store/enum.CidStoreVerificationError.html create mode 100644 air_interpreter_data/cid_store/struct.ArchivedCidStore.html create mode 100644 air_interpreter_data/cid_store/struct.CidStore.html create mode 100644 air_interpreter_data/cid_store/struct.CidStoreResolver.html create mode 100644 air_interpreter_data/cid_store/struct.CidTracker.html create mode 100644 air_interpreter_data/enum.ArchivedCallResult.html create mode 100644 air_interpreter_data/enum.ArchivedCanonResult.html create mode 100644 air_interpreter_data/enum.ArchivedExecutedState.html create mode 100644 air_interpreter_data/enum.ArchivedProvenance.html create mode 100644 air_interpreter_data/enum.ArchivedSender.html create mode 100644 air_interpreter_data/enum.ArchivedValueRef.html create mode 100644 air_interpreter_data/enum.CallResult.html create mode 100644 air_interpreter_data/enum.CallResultResolver.html create mode 100644 air_interpreter_data/enum.CanonResult.html create mode 100644 air_interpreter_data/enum.CanonResultResolver.html create mode 100644 air_interpreter_data/enum.CidStoreVerificationError.html create mode 100644 air_interpreter_data/enum.DataDeserializationError.html create mode 100644 air_interpreter_data/enum.ExecutedState.html create mode 100644 air_interpreter_data/enum.ExecutedStateResolver.html create mode 100644 air_interpreter_data/enum.Provenance.html create mode 100644 air_interpreter_data/enum.ProvenanceResolver.html create mode 100644 air_interpreter_data/enum.Sender.html create mode 100644 air_interpreter_data/enum.SenderResolver.html create mode 100644 air_interpreter_data/enum.ValueRef.html create mode 100644 air_interpreter_data/enum.ValueRefResolver.html create mode 100644 air_interpreter_data/executed_state/enum.ArchivedCallResult.html create mode 100644 air_interpreter_data/executed_state/enum.ArchivedCanonResult.html create mode 100644 air_interpreter_data/executed_state/enum.ArchivedExecutedState.html create mode 100644 air_interpreter_data/executed_state/enum.ArchivedProvenance.html create mode 100644 air_interpreter_data/executed_state/enum.ArchivedSender.html create mode 100644 air_interpreter_data/executed_state/enum.ArchivedValueRef.html create mode 100644 air_interpreter_data/executed_state/enum.CallResult.html create mode 100644 air_interpreter_data/executed_state/enum.CallResultResolver.html create mode 100644 air_interpreter_data/executed_state/enum.CanonResult.html create mode 100644 air_interpreter_data/executed_state/enum.CanonResultResolver.html create mode 100644 air_interpreter_data/executed_state/enum.ExecutedState.html create mode 100644 air_interpreter_data/executed_state/enum.ExecutedStateResolver.html create mode 100644 air_interpreter_data/executed_state/enum.Provenance.html create mode 100644 air_interpreter_data/executed_state/enum.ProvenanceResolver.html create mode 100644 air_interpreter_data/executed_state/enum.Sender.html create mode 100644 air_interpreter_data/executed_state/enum.SenderResolver.html create mode 100644 air_interpreter_data/executed_state/enum.ValueRef.html create mode 100644 air_interpreter_data/executed_state/enum.ValueRefResolver.html create mode 100644 air_interpreter_data/executed_state/struct.ApResult.html create mode 100644 air_interpreter_data/executed_state/struct.ApResultResolver.html create mode 100644 air_interpreter_data/executed_state/struct.ArchivedApResult.html create mode 100644 air_interpreter_data/executed_state/struct.ArchivedCallServiceFailed.html create mode 100644 air_interpreter_data/executed_state/struct.ArchivedCanonCidAggregate.html create mode 100644 air_interpreter_data/executed_state/struct.ArchivedCanonResultCidAggregate.html create mode 100644 air_interpreter_data/executed_state/struct.ArchivedFoldResult.html create mode 100644 air_interpreter_data/executed_state/struct.ArchivedFoldSubTraceLore.html create mode 100644 air_interpreter_data/executed_state/struct.ArchivedParResult.html create mode 100644 air_interpreter_data/executed_state/struct.ArchivedServiceResultCidAggregate.html create mode 100644 air_interpreter_data/executed_state/struct.ArchivedSubTraceDesc.html create mode 100644 air_interpreter_data/executed_state/struct.CallServiceFailed.html create mode 100644 air_interpreter_data/executed_state/struct.CallServiceFailedResolver.html create mode 100644 air_interpreter_data/executed_state/struct.CanonCidAggregate.html create mode 100644 air_interpreter_data/executed_state/struct.CanonCidAggregateResolver.html create mode 100644 air_interpreter_data/executed_state/struct.CanonResultCidAggregate.html create mode 100644 air_interpreter_data/executed_state/struct.CanonResultCidAggregateResolver.html create mode 100644 air_interpreter_data/executed_state/struct.FoldResult.html create mode 100644 air_interpreter_data/executed_state/struct.FoldResultResolver.html create mode 100644 air_interpreter_data/executed_state/struct.FoldSubTraceLore.html create mode 100644 air_interpreter_data/executed_state/struct.FoldSubTraceLoreResolver.html create mode 100644 air_interpreter_data/executed_state/struct.ParResult.html create mode 100644 air_interpreter_data/executed_state/struct.ParResultResolver.html create mode 100644 air_interpreter_data/executed_state/struct.ServiceResultCidAggregate.html create mode 100644 air_interpreter_data/executed_state/struct.ServiceResultCidAggregateResolver.html create mode 100644 air_interpreter_data/executed_state/struct.SubTraceDesc.html create mode 100644 air_interpreter_data/executed_state/struct.SubTraceDescResolver.html create mode 100644 air_interpreter_data/executed_state/type.FoldLore.html create mode 100644 air_interpreter_data/fn.data_version.html create mode 100644 air_interpreter_data/generation_idx/struct.ArchivedGenerationIdx.html create mode 100644 air_interpreter_data/generation_idx/struct.GenerationIdx.html create mode 100644 air_interpreter_data/generation_idx/struct.GenerationIdxResolver.html create mode 100644 air_interpreter_data/index.html create mode 100644 air_interpreter_data/interpreter_data/enum.DataDeserializationError.html create mode 100644 air_interpreter_data/interpreter_data/errors/enum.DataVerifierError.html create mode 100644 air_interpreter_data/interpreter_data/repr/struct.InterpreterDataEnvelopeRepr.html create mode 100644 air_interpreter_data/interpreter_data/repr/type.InterpreterDataEnvelopeFormat.html create mode 100644 air_interpreter_data/interpreter_data/struct.ArchivedInterpreterData.html create mode 100644 air_interpreter_data/interpreter_data/struct.InterpreterData.html create mode 100644 air_interpreter_data/interpreter_data/struct.InterpreterDataEnvelope.html create mode 100644 air_interpreter_data/interpreter_data/struct.InterpreterDataResolver.html create mode 100644 air_interpreter_data/interpreter_data/struct.Versions.html create mode 100644 air_interpreter_data/interpreter_data/verification/index.html create mode 100644 air_interpreter_data/interpreter_data/verification/struct.DataVerifier.html create mode 100644 air_interpreter_data/raw_value/struct.ArchivedRawValue.html create mode 100644 air_interpreter_data/raw_value/struct.RawValue.html create mode 100644 air_interpreter_data/raw_value/struct.RawValueResolver.html create mode 100644 air_interpreter_data/sidebar-items.js create mode 100644 air_interpreter_data/struct.ApResult.html create mode 100644 air_interpreter_data/struct.ApResultResolver.html create mode 100644 air_interpreter_data/struct.ArchivedApResult.html create mode 100644 air_interpreter_data/struct.ArchivedCallServiceFailed.html create mode 100644 air_interpreter_data/struct.ArchivedCanonCidAggregate.html create mode 100644 air_interpreter_data/struct.ArchivedCanonResultCidAggregate.html create mode 100644 air_interpreter_data/struct.ArchivedCidInfo.html create mode 100644 air_interpreter_data/struct.ArchivedCidStore.html create mode 100644 air_interpreter_data/struct.ArchivedExecutionTrace.html create mode 100644 air_interpreter_data/struct.ArchivedFoldResult.html create mode 100644 air_interpreter_data/struct.ArchivedFoldSubTraceLore.html create mode 100644 air_interpreter_data/struct.ArchivedGenerationIdx.html create mode 100644 air_interpreter_data/struct.ArchivedInterpreterData.html create mode 100644 air_interpreter_data/struct.ArchivedParResult.html create mode 100644 air_interpreter_data/struct.ArchivedRawValue.html create mode 100644 air_interpreter_data/struct.ArchivedServiceResultCidAggregate.html create mode 100644 air_interpreter_data/struct.ArchivedSubTraceDesc.html create mode 100644 air_interpreter_data/struct.ArchivedTracePos.html create mode 100644 air_interpreter_data/struct.CallServiceFailed.html create mode 100644 air_interpreter_data/struct.CallServiceFailedResolver.html create mode 100644 air_interpreter_data/struct.CanonCidAggregate.html create mode 100644 air_interpreter_data/struct.CanonCidAggregateResolver.html create mode 100644 air_interpreter_data/struct.CanonResultCidAggregate.html create mode 100644 air_interpreter_data/struct.CanonResultCidAggregateResolver.html create mode 100644 air_interpreter_data/struct.CidInfo.html create mode 100644 air_interpreter_data/struct.CidInfoResolver.html create mode 100644 air_interpreter_data/struct.CidStore.html create mode 100644 air_interpreter_data/struct.CidStoreResolver.html create mode 100644 air_interpreter_data/struct.CidTracker.html create mode 100644 air_interpreter_data/struct.ExecutionTrace.html create mode 100644 air_interpreter_data/struct.ExecutionTraceResolver.html create mode 100644 air_interpreter_data/struct.FoldResult.html create mode 100644 air_interpreter_data/struct.FoldResultResolver.html create mode 100644 air_interpreter_data/struct.FoldSubTraceLore.html create mode 100644 air_interpreter_data/struct.FoldSubTraceLoreResolver.html create mode 100644 air_interpreter_data/struct.GenerationIdx.html create mode 100644 air_interpreter_data/struct.GenerationIdxResolver.html create mode 100644 air_interpreter_data/struct.InterpreterData.html create mode 100644 air_interpreter_data/struct.InterpreterDataEnvelope.html create mode 100644 air_interpreter_data/struct.InterpreterDataEnvelopeRepr.html create mode 100644 air_interpreter_data/struct.InterpreterDataResolver.html create mode 100644 air_interpreter_data/struct.ParResult.html create mode 100644 air_interpreter_data/struct.ParResultResolver.html create mode 100644 air_interpreter_data/struct.RawValue.html create mode 100644 air_interpreter_data/struct.RawValueResolver.html create mode 100644 air_interpreter_data/struct.ServiceResultCidAggregate.html create mode 100644 air_interpreter_data/struct.ServiceResultCidAggregateResolver.html create mode 100644 air_interpreter_data/struct.SubTraceDesc.html create mode 100644 air_interpreter_data/struct.SubTraceDescResolver.html create mode 100644 air_interpreter_data/struct.TracePos.html create mode 100644 air_interpreter_data/struct.TracePosResolver.html create mode 100644 air_interpreter_data/struct.Versions.html create mode 100644 air_interpreter_data/trace/struct.ArchivedExecutionTrace.html create mode 100644 air_interpreter_data/trace/struct.ExecutionTrace.html create mode 100644 air_interpreter_data/trace/struct.ExecutionTraceResolver.html create mode 100644 air_interpreter_data/trace/type.TraceLen.html create mode 100644 air_interpreter_data/trace_pos/struct.ArchivedTracePos.html create mode 100644 air_interpreter_data/trace_pos/struct.TracePos.html create mode 100644 air_interpreter_data/trace_pos/struct.TracePosResolver.html create mode 100644 air_interpreter_data/trace_pos/type.PosType.html create mode 100644 air_interpreter_data/type.FoldLore.html create mode 100644 air_interpreter_data/type.InterpreterDataEnvelopeFormat.html create mode 100644 air_interpreter_data/type.PosType.html create mode 100644 air_interpreter_data/type.TraceLen.html create mode 100644 air_interpreter_data/verification/enum.DataVerifierError.html create mode 100644 air_interpreter_data/verification/index.html create mode 100644 air_interpreter_data/verification/sidebar-items.js create mode 100644 air_interpreter_data/verification/struct.DataVerifier.html create mode 100644 air_interpreter_interface/all.html create mode 100644 air_interpreter_interface/call_request_parameters/struct.CallArgumentsRepr.html create mode 100644 air_interpreter_interface/call_request_parameters/struct.CallRequestParams.html create mode 100644 air_interpreter_interface/call_request_parameters/struct.CallRequestsRepr.html create mode 100644 air_interpreter_interface/call_request_parameters/struct.SerializedCallArguments.html create mode 100644 air_interpreter_interface/call_request_parameters/struct.SerializedCallRequests.html create mode 100644 air_interpreter_interface/call_request_parameters/struct.SerializedTetraplets.html create mode 100644 air_interpreter_interface/call_request_parameters/struct.TetrapletsRepr.html create mode 100644 air_interpreter_interface/call_request_parameters/type.CallArgumentsDeserializeError.html create mode 100644 air_interpreter_interface/call_request_parameters/type.CallArgumentsFormat.html create mode 100644 air_interpreter_interface/call_request_parameters/type.CallRequests.html create mode 100644 air_interpreter_interface/call_request_parameters/type.CallRequestsDeserializeError.html create mode 100644 air_interpreter_interface/call_request_parameters/type.CallRequestsFormat.html create mode 100644 air_interpreter_interface/call_request_parameters/type.TetrapletDeserializeError.html create mode 100644 air_interpreter_interface/call_request_parameters/type.TetrapletsFormat.html create mode 100644 air_interpreter_interface/call_service_result/constant.CALL_SERVICE_SUCCESS.html create mode 100644 air_interpreter_interface/call_service_result/struct.CallResultsRepr.html create mode 100644 air_interpreter_interface/call_service_result/struct.CallServiceResult.html create mode 100644 air_interpreter_interface/call_service_result/struct.SerializedCallResults.html create mode 100644 air_interpreter_interface/call_service_result/type.CallResults.html create mode 100644 air_interpreter_interface/call_service_result/type.CallResultsDeserializeError.html create mode 100644 air_interpreter_interface/call_service_result/type.CallResultsFormat.html create mode 100644 air_interpreter_interface/call_service_result/type.CallResultsSerializeError.html create mode 100644 air_interpreter_interface/constant.CALL_SERVICE_SUCCESS.html create mode 100644 air_interpreter_interface/constant.INTERPRETER_SUCCESS.html create mode 100644 air_interpreter_interface/fn.try_as_string.html create mode 100644 air_interpreter_interface/index.html create mode 100644 air_interpreter_interface/interpreter_outcome/constant.INTERPRETER_SUCCESS.html create mode 100644 air_interpreter_interface/interpreter_outcome/fn.try_as_string.html create mode 100644 air_interpreter_interface/interpreter_outcome/struct.InterpreterOutcome.html create mode 100644 air_interpreter_interface/interpreter_outcome/struct.SoftLimitsTriggering.html create mode 100644 air_interpreter_interface/run_args_memory_limits/static.MAX_AIR_SIZE.html create mode 100644 air_interpreter_interface/run_args_memory_limits/static.MAX_CALL_RESULT_SIZE.html create mode 100644 air_interpreter_interface/run_args_memory_limits/static.MAX_PARTICLE_SIZE.html create mode 100644 air_interpreter_interface/run_parameters/struct.RunParameters.html create mode 100644 air_interpreter_interface/sidebar-items.js create mode 100644 air_interpreter_interface/static.MAX_AIR_SIZE.html create mode 100644 air_interpreter_interface/static.MAX_CALL_RESULT_SIZE.html create mode 100644 air_interpreter_interface/static.MAX_PARTICLE_SIZE.html create mode 100644 air_interpreter_interface/struct.CallArgumentsRepr.html create mode 100644 air_interpreter_interface/struct.CallRequestParams.html create mode 100644 air_interpreter_interface/struct.CallRequestsRepr.html create mode 100644 air_interpreter_interface/struct.CallResultsRepr.html create mode 100644 air_interpreter_interface/struct.CallServiceResult.html create mode 100644 air_interpreter_interface/struct.InterpreterOutcome.html create mode 100644 air_interpreter_interface/struct.RunParameters.html create mode 100644 air_interpreter_interface/struct.SerializedCallArguments.html create mode 100644 air_interpreter_interface/struct.SerializedCallRequests.html create mode 100644 air_interpreter_interface/struct.SerializedCallResults.html create mode 100644 air_interpreter_interface/struct.SerializedTetraplets.html create mode 100644 air_interpreter_interface/struct.SoftLimitsTriggering.html create mode 100644 air_interpreter_interface/struct.TetrapletsRepr.html create mode 100644 air_interpreter_interface/type.CallArgumentsDeserializeError.html create mode 100644 air_interpreter_interface/type.CallArgumentsFormat.html create mode 100644 air_interpreter_interface/type.CallRequests.html create mode 100644 air_interpreter_interface/type.CallRequestsDeserializeError.html create mode 100644 air_interpreter_interface/type.CallRequestsFormat.html create mode 100644 air_interpreter_interface/type.CallResults.html create mode 100644 air_interpreter_interface/type.CallResultsDeserializeError.html create mode 100644 air_interpreter_interface/type.CallResultsFormat.html create mode 100644 air_interpreter_interface/type.CallResultsSerializeError.html create mode 100644 air_interpreter_interface/type.TetrapletDeserializeError.html create mode 100644 air_interpreter_interface/type.TetrapletsFormat.html create mode 100644 air_interpreter_sede/all.html create mode 100644 air_interpreter_sede/format/trait.Format.html create mode 100644 air_interpreter_sede/index.html create mode 100644 air_interpreter_sede/macro.define_simple_representation!.html create mode 100644 air_interpreter_sede/macro.define_simple_representation.html create mode 100644 air_interpreter_sede/macro.derive_serialized_type!.html create mode 100644 air_interpreter_sede/macro.derive_serialized_type.html create mode 100644 air_interpreter_sede/multiformat/enum.DecodeError.html create mode 100644 air_interpreter_sede/multiformat/enum.EncodeError.html create mode 100644 air_interpreter_sede/multiformat/fn.decode_multiformat.html create mode 100644 air_interpreter_sede/multiformat/fn.encode_multiformat.html create mode 100644 air_interpreter_sede/multiformat/fn.parse_multiformat_bytes.html create mode 100644 air_interpreter_sede/multiformat/fn.write_multiformat.html create mode 100644 air_interpreter_sede/multiformat/index.html create mode 100644 air_interpreter_sede/multiformat/sidebar-items.js create mode 100644 air_interpreter_sede/multiformat/type.SerializationCodec.html create mode 100644 air_interpreter_sede/representation/trait.FromSerialiedBorrow.html create mode 100644 air_interpreter_sede/representation/trait.FromSerialized.html create mode 100644 air_interpreter_sede/representation/trait.Representation.html create mode 100644 air_interpreter_sede/representation/trait.ToSerialized.html create mode 100644 air_interpreter_sede/representation/trait.ToWriter.html create mode 100644 air_interpreter_sede/rmp_serde/struct.RmpSerdeFormat.html create mode 100644 air_interpreter_sede/rmp_serde/struct.RmpSerdeMultiformat.html create mode 100644 air_interpreter_sede/sidebar-items.js create mode 100644 air_interpreter_sede/struct.MsgPackFormat.html create mode 100644 air_interpreter_sede/struct.MsgPackMultiformat.html create mode 100644 air_interpreter_sede/struct.RmpSerdeFormat.html create mode 100644 air_interpreter_sede/struct.RmpSerdeMultiformat.html create mode 100644 air_interpreter_sede/trait.Format.html create mode 100644 air_interpreter_sede/trait.FromSerialiedBorrow.html create mode 100644 air_interpreter_sede/trait.FromSerialized.html create mode 100644 air_interpreter_sede/trait.Representation.html create mode 100644 air_interpreter_sede/trait.ToSerialized.html create mode 100644 air_interpreter_sede/trait.ToWriter.html create mode 100644 air_interpreter_server/all.html create mode 100644 air_interpreter_server/ast/fn.ast.html create mode 100644 air_interpreter_server/ast/index.html create mode 100644 air_interpreter_server/ast/sidebar-items.js create mode 100644 air_interpreter_server/fn.ast.html create mode 100644 air_interpreter_server/fn.invoke.html create mode 100644 air_interpreter_server/fn.invoke_tracing.html create mode 100644 air_interpreter_server/fn.main.html create mode 100644 air_interpreter_server/fn.to_human_readable_data.html create mode 100644 air_interpreter_server/index.html create mode 100644 air_interpreter_server/logger/fn.init_logger.html create mode 100644 air_interpreter_server/logger/fn.json_output_mode.html create mode 100644 air_interpreter_server/logger/index.html create mode 100644 air_interpreter_server/logger/sidebar-items.js create mode 100644 air_interpreter_server/sidebar-items.js create mode 100644 air_interpreter_signatures/all.html create mode 100644 air_interpreter_signatures/enum.KeyError.html create mode 100644 air_interpreter_signatures/enum.KeyFormat.html create mode 100644 air_interpreter_signatures/enum.VerificationError.html create mode 100644 air_interpreter_signatures/fn.sign_cids.html create mode 100644 air_interpreter_signatures/index.html create mode 100644 air_interpreter_signatures/sidebar-items.js create mode 100644 air_interpreter_signatures/stores/struct.ArchivedSignatureStore.html create mode 100644 air_interpreter_signatures/stores/struct.SignatureStore.html create mode 100644 air_interpreter_signatures/stores/struct.SignatureStoreResolver.html create mode 100644 air_interpreter_signatures/struct.ArchivedPublicKey.html create mode 100644 air_interpreter_signatures/struct.ArchivedSignature.html create mode 100644 air_interpreter_signatures/struct.ArchivedSignatureStore.html create mode 100644 air_interpreter_signatures/struct.KeyPair.html create mode 100644 air_interpreter_signatures/struct.PeerCidTracker.html create mode 100644 air_interpreter_signatures/struct.PublicKey.html create mode 100644 air_interpreter_signatures/struct.PublicKeyResolver.html create mode 100644 air_interpreter_signatures/struct.Signature.html create mode 100644 air_interpreter_signatures/struct.SignatureResolver.html create mode 100644 air_interpreter_signatures/struct.SignatureStore.html create mode 100644 air_interpreter_signatures/struct.SignatureStoreResolver.html create mode 100644 air_interpreter_signatures/trackers/fn.sign_cids.html create mode 100644 air_interpreter_signatures/trackers/struct.PeerCidTracker.html create mode 100644 air_interpreter_value/all.html create mode 100644 air_interpreter_value/enum.JValue.html create mode 100644 air_interpreter_value/index.html create mode 100644 air_interpreter_value/sidebar-items.js create mode 100644 air_interpreter_value/type.JsonString.html create mode 100644 air_interpreter_value/type.Map.html create mode 100644 air_interpreter_value/value/enum.JValue.html create mode 100644 air_lambda_ast/all.html create mode 100644 air_lambda_ast/ast/enum.Functor.html create mode 100644 air_lambda_ast/ast/enum.LambdaAST.html create mode 100644 air_lambda_ast/ast/enum.ValueAccessor.html create mode 100644 air_lambda_ast/enum.Functor.html create mode 100644 air_lambda_ast/enum.LambdaAST.html create mode 100644 air_lambda_ast/enum.ValueAccessor.html create mode 100644 air_lambda_ast/index.html create mode 100644 air_lambda_ast/sidebar-items.js create mode 100644 air_lambda_parser/all.html create mode 100644 air_lambda_parser/enum.Functor.html create mode 100644 air_lambda_parser/enum.LambdaAST.html create mode 100644 air_lambda_parser/enum.LambdaParserError.html create mode 100644 air_lambda_parser/enum.LexerError.html create mode 100644 air_lambda_parser/enum.ValueAccessor.html create mode 100644 air_lambda_parser/fn.parse.html create mode 100644 air_lambda_parser/index.html create mode 100644 air_lambda_parser/parser/errors/enum.LambdaParserError.html create mode 100644 air_lambda_parser/parser/lambda_parser/fn.parse.html create mode 100644 air_lambda_parser/parser/lexer/errors/enum.LexerError.html create mode 100644 air_lambda_parser/parser/lexer/lambda_ast_lexer/struct.LambdaASTLexer.html create mode 100644 air_lambda_parser/sidebar-items.js create mode 100644 air_lambda_parser/struct.LambdaASTLexer.html create mode 100644 air_log_targets/all.html create mode 100644 air_log_targets/constant.DATA_CACHE.html create mode 100644 air_log_targets/constant.EXECUTED_STATE_CHANGING.html create mode 100644 air_log_targets/constant.EXECUTED_TRACE_MERGE.html create mode 100644 air_log_targets/constant.INSTRUCTION.html create mode 100644 air_log_targets/constant.JOIN_BEHAVIOUR.html create mode 100644 air_log_targets/constant.NEW_EXECUTED_TRACE.html create mode 100644 air_log_targets/constant.NEXT_PEER_PKS.html create mode 100644 air_log_targets/constant.RUN_PARAMS.html create mode 100644 air_log_targets/constant.SUBGRAPH_COMPLETE.html create mode 100644 air_log_targets/constant.SUBGRAPH_ELEMENTS.html create mode 100644 air_log_targets/constant.TARGET_MAP.html create mode 100644 air_log_targets/index.html create mode 100644 air_log_targets/sidebar-items.js create mode 100644 air_parser/all.html create mode 100644 air_parser/ast/enum.ApArgument.html create mode 100644 air_parser/ast/enum.ApResult.html create mode 100644 air_parser/ast/enum.CallOutputValue.html create mode 100644 air_parser/ast/enum.Fail.html create mode 100644 air_parser/ast/enum.FoldScalarIterable.html create mode 100644 air_parser/ast/enum.ImmutableValue.html create mode 100644 air_parser/ast/enum.ImmutableVariable.html create mode 100644 air_parser/ast/enum.ImmutableVariableWithLambda.html create mode 100644 air_parser/ast/enum.Instruction.html create mode 100644 air_parser/ast/enum.NewArgument.html create mode 100644 air_parser/ast/enum.Number.html create mode 100644 air_parser/ast/enum.ResolvableToPeerIdVariable.html create mode 100644 air_parser/ast/enum.ResolvableToStringVariable.html create mode 100644 air_parser/ast/enum.StreamMapKeyClause.html create mode 100644 air_parser/ast/index.html create mode 100644 air_parser/ast/instruction_arguments/enum.ApArgument.html create mode 100644 air_parser/ast/instruction_arguments/enum.ApResult.html create mode 100644 air_parser/ast/instruction_arguments/enum.CallOutputValue.html create mode 100644 air_parser/ast/instruction_arguments/enum.FoldScalarIterable.html create mode 100644 air_parser/ast/instruction_arguments/enum.ImmutableValue.html create mode 100644 air_parser/ast/instruction_arguments/enum.NewArgument.html create mode 100644 air_parser/ast/instruction_arguments/enum.Number.html create mode 100644 air_parser/ast/instruction_arguments/enum.ResolvableToPeerIdVariable.html create mode 100644 air_parser/ast/instruction_arguments/enum.ResolvableToStringVariable.html create mode 100644 air_parser/ast/instruction_arguments/enum.StreamMapKeyClause.html create mode 100644 air_parser/ast/instruction_arguments/struct.Triplet.html create mode 100644 air_parser/ast/instructions/enum.Fail.html create mode 100644 air_parser/ast/instructions/enum.Instruction.html create mode 100644 air_parser/ast/instructions/struct.Ap.html create mode 100644 air_parser/ast/instructions/struct.ApMap.html create mode 100644 air_parser/ast/instructions/struct.Call.html create mode 100644 air_parser/ast/instructions/struct.Canon.html create mode 100644 air_parser/ast/instructions/struct.CanonMap.html create mode 100644 air_parser/ast/instructions/struct.CanonStreamMapScalar.html create mode 100644 air_parser/ast/instructions/struct.FoldScalar.html create mode 100644 air_parser/ast/instructions/struct.FoldStream.html create mode 100644 air_parser/ast/instructions/struct.FoldStreamMap.html create mode 100644 air_parser/ast/instructions/struct.Match.html create mode 100644 air_parser/ast/instructions/struct.MisMatch.html create mode 100644 air_parser/ast/instructions/struct.Never.html create mode 100644 air_parser/ast/instructions/struct.New.html create mode 100644 air_parser/ast/instructions/struct.Next.html create mode 100644 air_parser/ast/instructions/struct.Null.html create mode 100644 air_parser/ast/instructions/struct.Par.html create mode 100644 air_parser/ast/instructions/struct.Seq.html create mode 100644 air_parser/ast/instructions/struct.Xor.html create mode 100644 air_parser/ast/instructions/trait.PeerIDErrorLogable.html create mode 100644 air_parser/ast/sidebar-items.js create mode 100644 air_parser/ast/struct.Ap.html create mode 100644 air_parser/ast/struct.ApMap.html create mode 100644 air_parser/ast/struct.Call.html create mode 100644 air_parser/ast/struct.Canon.html create mode 100644 air_parser/ast/struct.CanonMap.html create mode 100644 air_parser/ast/struct.CanonStream.html create mode 100644 air_parser/ast/struct.CanonStreamMap.html create mode 100644 air_parser/ast/struct.CanonStreamMapScalar.html create mode 100644 air_parser/ast/struct.CanonStreamMapWithLambda.html create mode 100644 air_parser/ast/struct.CanonStreamWithLambda.html create mode 100644 air_parser/ast/struct.FoldScalar.html create mode 100644 air_parser/ast/struct.FoldStream.html create mode 100644 air_parser/ast/struct.FoldStreamMap.html create mode 100644 air_parser/ast/struct.InstructionErrorAST.html create mode 100644 air_parser/ast/struct.Match.html create mode 100644 air_parser/ast/struct.MisMatch.html create mode 100644 air_parser/ast/struct.Never.html create mode 100644 air_parser/ast/struct.New.html create mode 100644 air_parser/ast/struct.Next.html create mode 100644 air_parser/ast/struct.Null.html create mode 100644 air_parser/ast/struct.Par.html create mode 100644 air_parser/ast/struct.Scalar.html create mode 100644 air_parser/ast/struct.ScalarWithLambda.html create mode 100644 air_parser/ast/struct.Seq.html create mode 100644 air_parser/ast/struct.Span.html create mode 100644 air_parser/ast/struct.Stream.html create mode 100644 air_parser/ast/struct.StreamMap.html create mode 100644 air_parser/ast/struct.Triplet.html create mode 100644 air_parser/ast/struct.Xor.html create mode 100644 air_parser/ast/trait.PeerIDErrorLogable.html create mode 100644 air_parser/ast/values/enum.ImmutableVariable.html create mode 100644 air_parser/ast/values/enum.ImmutableVariableWithLambda.html create mode 100644 air_parser/ast/values/struct.CanonStream.html create mode 100644 air_parser/ast/values/struct.CanonStreamMap.html create mode 100644 air_parser/ast/values/struct.CanonStreamMapWithLambda.html create mode 100644 air_parser/ast/values/struct.CanonStreamWithLambda.html create mode 100644 air_parser/ast/values/struct.InstructionErrorAST.html create mode 100644 air_parser/ast/values/struct.Scalar.html create mode 100644 air_parser/ast/values/struct.ScalarWithLambda.html create mode 100644 air_parser/ast/values/struct.Stream.html create mode 100644 air_parser/ast/values/struct.StreamMap.html create mode 100644 air_parser/fn.parse.html create mode 100644 air_parser/index.html create mode 100644 air_parser/macro.make_user_error!.html create mode 100644 air_parser/macro.make_user_error.html create mode 100644 air_parser/parser/air/__parse__AIR/struct.AIRParser.html create mode 100644 air_parser/parser/air_parser/fn.parse.html create mode 100644 air_parser/parser/lexer/air_lexer/struct.AIRLexer.html create mode 100644 air_parser/parser/lexer/text_pos/struct.AirPos.html create mode 100644 air_parser/parser/span/struct.Span.html create mode 100644 air_parser/parser/validator/struct.VariableValidator.html create mode 100644 air_parser/sidebar-items.js create mode 100644 air_parser/struct.AIRLexer.html create mode 100644 air_parser/struct.AIRParser.html create mode 100644 air_parser/struct.AirPos.html create mode 100644 air_parser/struct.VariableValidator.html create mode 100644 air_test_framework/all.html create mode 100644 air_test_framework/asserts/enum.ServiceDefinition.html create mode 100644 air_test_framework/asserts/enum.ServiceTagName.html create mode 100644 air_test_framework/asserts/index.html create mode 100644 air_test_framework/asserts/sidebar-items.js create mode 100644 air_test_framework/ephemeral/index.html create mode 100644 air_test_framework/ephemeral/neighborhood/enum.AlterState.html create mode 100644 air_test_framework/ephemeral/neighborhood/index.html create mode 100644 air_test_framework/ephemeral/neighborhood/sidebar-items.js create mode 100644 air_test_framework/ephemeral/neighborhood/struct.Neighborhood.html create mode 100644 air_test_framework/ephemeral/neighborhood/struct.PeerEnv.html create mode 100644 air_test_framework/ephemeral/sidebar-items.js create mode 100644 air_test_framework/ephemeral/struct.Network.html create mode 100644 air_test_framework/ephemeral/struct.Peer.html create mode 100644 air_test_framework/ephemeral/struct.PeerId.html create mode 100644 air_test_framework/ephemeral/type.Data.html create mode 100644 air_test_framework/execution/index.html create mode 100644 air_test_framework/execution/sidebar-items.js create mode 100644 air_test_framework/execution/struct.AirScriptExecutor.html create mode 100644 air_test_framework/index.html create mode 100644 air_test_framework/services/enum.FunctionOutcome.html create mode 100644 air_test_framework/services/index.html create mode 100644 air_test_framework/services/sidebar-items.js create mode 100644 air_test_framework/services/struct.MarineServiceHandle.html create mode 100644 air_test_framework/services/trait.MarineService.html create mode 100644 air_test_framework/services/type.JValue.html create mode 100644 air_test_framework/sidebar-items.js create mode 100644 air_test_framework/transform/index.html create mode 100644 air_test_framework/transform/sidebar-items.js create mode 100644 air_test_framework/transform/walker/index.html create mode 100644 air_test_framework/transform/walker/sidebar-items.js create mode 100644 air_test_framework/transform/walker/struct.TransformedAirScript.html create mode 100644 air_test_utils/all.html create mode 100644 air_test_utils/avm_runner/index.html create mode 100644 air_test_utils/avm_runner/sidebar-items.js create mode 100644 air_test_utils/avm_runner/struct.AVMRunner.html create mode 100644 air_test_utils/avm_runner/struct.RawAVMOutcome.html create mode 100644 air_test_utils/call_services/enum.VariableOptionSource.html create mode 100644 air_test_utils/call_services/fn.echo_call_service.html create mode 100644 air_test_utils/call_services/fn.fallible_call_service.html create mode 100644 air_test_utils/call_services/fn.fallible_call_service_by_arg.html create mode 100644 air_test_utils/call_services/fn.return_string_call_service.html create mode 100644 air_test_utils/call_services/fn.set_variable_call_service.html create mode 100644 air_test_utils/call_services/fn.set_variables_call_service.html create mode 100644 air_test_utils/call_services/fn.tetraplet_host_function.html create mode 100644 air_test_utils/call_services/fn.unit_call_service.html create mode 100644 air_test_utils/call_services/index.html create mode 100644 air_test_utils/call_services/sidebar-items.js create mode 100644 air_test_utils/call_services/type.ArgTetraplets.html create mode 100644 air_test_utils/constant.CALL_SERVICE_SUCCESS.html create mode 100644 air_test_utils/enum.AVMError.html create mode 100644 air_test_utils/enum.ArchivedCallResult.html create mode 100644 air_test_utils/enum.ArchivedCanonResult.html create mode 100644 air_test_utils/enum.ArchivedExecutedState.html create mode 100644 air_test_utils/enum.ArchivedProvenance.html create mode 100644 air_test_utils/enum.ArchivedSender.html create mode 100644 air_test_utils/enum.ArchivedValueRef.html create mode 100644 air_test_utils/enum.CallResult.html create mode 100644 air_test_utils/enum.CallResultResolver.html create mode 100644 air_test_utils/enum.CallSeDeErrors.html create mode 100644 air_test_utils/enum.CanonResult.html create mode 100644 air_test_utils/enum.CanonResultResolver.html create mode 100644 air_test_utils/enum.CidStoreVerificationError.html create mode 100644 air_test_utils/enum.DataDeserializationError.html create mode 100644 air_test_utils/enum.ExecutedState.html create mode 100644 air_test_utils/enum.ExecutedStateResolver.html create mode 100644 air_test_utils/enum.HostImportError.html create mode 100644 air_test_utils/enum.IType.html create mode 100644 air_test_utils/enum.IValue.html create mode 100644 air_test_utils/enum.Provenance.html create mode 100644 air_test_utils/enum.ProvenanceResolver.html create mode 100644 air_test_utils/enum.RunnerError.html create mode 100644 air_test_utils/enum.Sender.html create mode 100644 air_test_utils/enum.SenderResolver.html create mode 100644 air_test_utils/enum.ValueRef.html create mode 100644 air_test_utils/enum.ValueRefResolver.html create mode 100644 air_test_utils/executed_state/fn._failure_to_value.html create mode 100644 air_test_utils/executed_state/fn.ap.html create mode 100644 air_test_utils/executed_state/fn.canon.html create mode 100644 air_test_utils/executed_state/fn.canon_request.html create mode 100644 air_test_utils/executed_state/fn.canon_tracked.html create mode 100644 air_test_utils/executed_state/fn.extract_canon_result_cid.html create mode 100644 air_test_utils/executed_state/fn.extract_service_result_cid.html create mode 100644 air_test_utils/executed_state/fn.fold.html create mode 100644 air_test_utils/executed_state/fn.par.html create mode 100644 air_test_utils/executed_state/fn.request_sent_by.html create mode 100644 air_test_utils/executed_state/fn.simple_value_aggregate_cid.html create mode 100644 air_test_utils/executed_state/fn.subtrace_desc.html create mode 100644 air_test_utils/executed_state/fn.subtrace_lore.html create mode 100644 air_test_utils/executed_state/fn.value_aggregate_cid.html create mode 100644 air_test_utils/executed_state/index.html create mode 100644 air_test_utils/executed_state/sidebar-items.js create mode 100644 air_test_utils/executed_state/struct.CanonResultAlike.html create mode 100644 air_test_utils/executed_state/struct.ExecutedCallBuilder.html create mode 100644 air_test_utils/executed_state/struct.ValueAggregateAlike.html create mode 100644 air_test_utils/fn.check_error.html create mode 100644 air_test_utils/fn.data_from_result.html create mode 100644 air_test_utils/fn.data_version.html create mode 100644 air_test_utils/fn.env_from_result.html create mode 100644 air_test_utils/fn.into_raw_result.html create mode 100644 air_test_utils/fn.is_interpreter_succeded.html create mode 100644 air_test_utils/fn.print_trace.html create mode 100644 air_test_utils/fn.raw_data_from_trace.html create mode 100644 air_test_utils/fn.raw_data_from_trace_with_canon.html create mode 100644 air_test_utils/fn.trace_from_result.html create mode 100644 air_test_utils/index.html create mode 100644 air_test_utils/key_utils/fn.at.html create mode 100644 air_test_utils/key_utils/fn.derive_dummy_keypair.html create mode 100644 air_test_utils/key_utils/index.html create mode 100644 air_test_utils/key_utils/sidebar-items.js create mode 100644 air_test_utils/macro._trace_value_body!.html create mode 100644 air_test_utils/macro._trace_value_body.html create mode 100644 air_test_utils/macro.assert_error_eq!.html create mode 100644 air_test_utils/macro.assert_error_eq.html create mode 100644 air_test_utils/macro.assert_next_pks!.html create mode 100644 air_test_utils/macro.assert_next_pks.html create mode 100644 air_test_utils/macro.call_vm!.html create mode 100644 air_test_utils/macro.call_vm.html create mode 100644 air_test_utils/macro.checked_call_vm!.html create mode 100644 air_test_utils/macro.checked_call_vm.html create mode 100644 air_test_utils/macro.failed!.html create mode 100644 air_test_utils/macro.failed.html create mode 100644 air_test_utils/macro.rc!.html create mode 100644 air_test_utils/macro.rc.html create mode 100644 air_test_utils/macro.scalar!.html create mode 100644 air_test_utils/macro.scalar.html create mode 100644 air_test_utils/macro.scalar_tracked!.html create mode 100644 air_test_utils/macro.scalar_tracked.html create mode 100644 air_test_utils/macro.stream!.html create mode 100644 air_test_utils/macro.stream.html create mode 100644 air_test_utils/macro.stream_tracked!.html create mode 100644 air_test_utils/macro.stream_tracked.html create mode 100644 air_test_utils/macro.unused!.html create mode 100644 air_test_utils/macro.unused.html create mode 100644 air_test_utils/native_test_runner/index.html create mode 100644 air_test_utils/native_test_runner/sidebar-items.js create mode 100644 air_test_utils/native_test_runner/struct.NativeAirRunner.html create mode 100644 air_test_utils/ne_vec/index.html create mode 100644 air_test_utils/ne_vec/sidebar-items.js create mode 100644 air_test_utils/ne_vec/struct.NEVec.html create mode 100644 air_test_utils/prelude/enum.JValue.html create mode 100644 air_test_utils/prelude/index.html create mode 100644 air_test_utils/prelude/macro.json!.html create mode 100644 air_test_utils/prelude/macro.json.html create mode 100644 air_test_utils/prelude/sidebar-items.js create mode 100644 air_test_utils/raw_outcome/index.html create mode 100644 air_test_utils/raw_outcome/sidebar-items.js create mode 100644 air_test_utils/raw_outcome/struct.RawAVMOutcome.html create mode 100644 air_test_utils/sidebar-items.js create mode 100644 air_test_utils/struct.AVM.html create mode 100644 air_test_utils/struct.AVMConfig.html create mode 100644 air_test_utils/struct.AVMMemoryStats.html create mode 100644 air_test_utils/struct.AVMOutcome.html create mode 100644 air_test_utils/struct.AVMRuntimeLimits.html create mode 100644 air_test_utils/struct.AnomalyData.html create mode 100644 air_test_utils/struct.ApResult.html create mode 100644 air_test_utils/struct.ApResultResolver.html create mode 100644 air_test_utils/struct.AquaVMRuntimeLimits.html create mode 100644 air_test_utils/struct.ArchivedApResult.html create mode 100644 air_test_utils/struct.ArchivedCallServiceFailed.html create mode 100644 air_test_utils/struct.ArchivedCanonCidAggregate.html create mode 100644 air_test_utils/struct.ArchivedCanonResultCidAggregate.html create mode 100644 air_test_utils/struct.ArchivedCidInfo.html create mode 100644 air_test_utils/struct.ArchivedCidStore.html create mode 100644 air_test_utils/struct.ArchivedExecutionTrace.html create mode 100644 air_test_utils/struct.ArchivedFoldResult.html create mode 100644 air_test_utils/struct.ArchivedFoldSubTraceLore.html create mode 100644 air_test_utils/struct.ArchivedGenerationIdx.html create mode 100644 air_test_utils/struct.ArchivedInterpreterData.html create mode 100644 air_test_utils/struct.ArchivedParResult.html create mode 100644 air_test_utils/struct.ArchivedRawValue.html create mode 100644 air_test_utils/struct.ArchivedServiceResultCidAggregate.html create mode 100644 air_test_utils/struct.ArchivedSubTraceDesc.html create mode 100644 air_test_utils/struct.ArchivedTracePos.html create mode 100644 air_test_utils/struct.CallRequestParams.html create mode 100644 air_test_utils/struct.CallServiceFailed.html create mode 100644 air_test_utils/struct.CallServiceFailedResolver.html create mode 100644 air_test_utils/struct.CallServiceResult.html create mode 100644 air_test_utils/struct.CanonCidAggregate.html create mode 100644 air_test_utils/struct.CanonCidAggregateResolver.html create mode 100644 air_test_utils/struct.CanonResultCidAggregate.html create mode 100644 air_test_utils/struct.CanonResultCidAggregateResolver.html create mode 100644 air_test_utils/struct.CidInfo.html create mode 100644 air_test_utils/struct.CidInfoResolver.html create mode 100644 air_test_utils/struct.CidStore.html create mode 100644 air_test_utils/struct.CidStoreResolver.html create mode 100644 air_test_utils/struct.CidTracker.html create mode 100644 air_test_utils/struct.ErrorAVMOutcome.html create mode 100644 air_test_utils/struct.ExecutionTrace.html create mode 100644 air_test_utils/struct.ExecutionTraceResolver.html create mode 100644 air_test_utils/struct.FoldResult.html create mode 100644 air_test_utils/struct.FoldResultResolver.html create mode 100644 air_test_utils/struct.FoldSubTraceLore.html create mode 100644 air_test_utils/struct.FoldSubTraceLoreResolver.html create mode 100644 air_test_utils/struct.GenerationIdx.html create mode 100644 air_test_utils/struct.GenerationIdxResolver.html create mode 100644 air_test_utils/struct.InterpreterData.html create mode 100644 air_test_utils/struct.InterpreterDataEnvelope.html create mode 100644 air_test_utils/struct.InterpreterDataEnvelopeRepr.html create mode 100644 air_test_utils/struct.InterpreterDataResolver.html create mode 100644 air_test_utils/struct.ParResult.html create mode 100644 air_test_utils/struct.ParResultResolver.html create mode 100644 air_test_utils/struct.ParticleParameters.html create mode 100644 air_test_utils/struct.RawAVMOutcome.html create mode 100644 air_test_utils/struct.RawValue.html create mode 100644 air_test_utils/struct.RawValueResolver.html create mode 100644 air_test_utils/struct.SecurityTetraplet.html create mode 100644 air_test_utils/struct.ServiceResultCidAggregate.html create mode 100644 air_test_utils/struct.ServiceResultCidAggregateResolver.html create mode 100644 air_test_utils/struct.SoftLimitsTriggering.html create mode 100644 air_test_utils/struct.SubTraceDesc.html create mode 100644 air_test_utils/struct.SubTraceDescResolver.html create mode 100644 air_test_utils/struct.TracePos.html create mode 100644 air_test_utils/struct.TracePosResolver.html create mode 100644 air_test_utils/struct.Versions.html create mode 100644 air_test_utils/test_runner/fn.create_avm.html create mode 100644 air_test_utils/test_runner/fn.create_avm_with_key.html create mode 100644 air_test_utils/test_runner/fn.create_custom_avm.html create mode 100644 air_test_utils/test_runner/index.html create mode 100644 air_test_utils/test_runner/sidebar-items.js create mode 100644 air_test_utils/test_runner/struct.TestInitParameters.html create mode 100644 air_test_utils/test_runner/struct.TestRunParameters.html create mode 100644 air_test_utils/test_runner/struct.TestRunner.html create mode 100644 air_test_utils/test_runner/trait.AirRunner.html create mode 100644 air_test_utils/trait.DataStore.html create mode 100644 air_test_utils/type.AVMDataStore.html create mode 100644 air_test_utils/type.AVMResult.html create mode 100644 air_test_utils/type.CallRequests.html create mode 100644 air_test_utils/type.CallResults.html create mode 100644 air_test_utils/type.CallServiceClosure.html create mode 100644 air_test_utils/type.FoldLore.html create mode 100644 air_test_utils/type.HostExportedFunc.html create mode 100644 air_test_utils/type.HostImportDescriptor.html create mode 100644 air_test_utils/type.InterpreterDataEnvelopeFormat.html create mode 100644 air_test_utils/type.PosType.html create mode 100644 air_test_utils/type.RunnerResult.html create mode 100644 air_test_utils/type.TraceLen.html create mode 100644 air_test_utils/verification/enum.DataVerifierError.html create mode 100644 air_test_utils/verification/index.html create mode 100644 air_test_utils/verification/sidebar-items.js create mode 100644 air_test_utils/verification/struct.DataVerifier.html create mode 100644 air_test_utils/wasm_test_runner/index.html create mode 100644 air_test_utils/wasm_test_runner/sidebar-items.js create mode 100644 air_test_utils/wasm_test_runner/struct.ReleaseWasmAirRunner.html create mode 100644 air_test_utils/wasm_test_runner/struct.WasmAirRunner.html create mode 100644 air_trace_handler/all.html create mode 100644 air_trace_handler/data_keeper/errors/enum.KeeperError.html create mode 100644 air_trace_handler/enum.GenerationCompactificationError.html create mode 100644 air_trace_handler/enum.IntConversionError.html create mode 100644 air_trace_handler/enum.KeeperError.html create mode 100644 air_trace_handler/enum.StateFSMError.html create mode 100644 air_trace_handler/enum.SubgraphType.html create mode 100644 air_trace_handler/enum.TraceHandlerError.html create mode 100644 air_trace_handler/errors/enum.GenerationCompactificationError.html create mode 100644 air_trace_handler/errors/enum.IntConversionError.html create mode 100644 air_trace_handler/errors/enum.TraceHandlerError.html create mode 100644 air_trace_handler/handler/struct.TraceHandler.html create mode 100644 air_trace_handler/index.html create mode 100644 air_trace_handler/merger/ap_merger/enum.MergerApResult.html create mode 100644 air_trace_handler/merger/ap_merger/struct.MetApResult.html create mode 100644 air_trace_handler/merger/call_merger/enum.MergerCallResult.html create mode 100644 air_trace_handler/merger/call_merger/struct.MetCallResult.html create mode 100644 air_trace_handler/merger/canon_merger/enum.MergerCanonResult.html create mode 100644 air_trace_handler/merger/enum.ApResultError.html create mode 100644 air_trace_handler/merger/enum.CallResultError.html create mode 100644 air_trace_handler/merger/enum.CanonResultError.html create mode 100644 air_trace_handler/merger/enum.DataType.html create mode 100644 air_trace_handler/merger/enum.FoldResultError.html create mode 100644 air_trace_handler/merger/enum.MergeCtxType.html create mode 100644 air_trace_handler/merger/enum.MergeError.html create mode 100644 air_trace_handler/merger/enum.MergerApResult.html create mode 100644 air_trace_handler/merger/enum.MergerCallResult.html create mode 100644 air_trace_handler/merger/enum.MergerCanonResult.html create mode 100644 air_trace_handler/merger/enum.PreparationScheme.html create mode 100644 air_trace_handler/merger/enum.ValueSource.html create mode 100644 air_trace_handler/merger/errors/enum.ApResultError.html create mode 100644 air_trace_handler/merger/errors/enum.CallResultError.html create mode 100644 air_trace_handler/merger/errors/enum.CanonResultError.html create mode 100644 air_trace_handler/merger/errors/enum.DataType.html create mode 100644 air_trace_handler/merger/errors/enum.FoldResultError.html create mode 100644 air_trace_handler/merger/errors/enum.MergeError.html create mode 100644 air_trace_handler/merger/fold_merger/fold_lore_resolver/struct.ResolvedFold.html create mode 100644 air_trace_handler/merger/fold_merger/fold_lore_resolver/struct.ResolvedSubTraceDescs.html create mode 100644 air_trace_handler/merger/fold_merger/struct.MergerFoldResult.html create mode 100644 air_trace_handler/merger/index.html create mode 100644 air_trace_handler/merger/par_merger/struct.MergerParResult.html create mode 100644 air_trace_handler/merger/position_mapping/enum.PreparationScheme.html create mode 100644 air_trace_handler/merger/sidebar-items.js create mode 100644 air_trace_handler/merger/struct.MergerFoldResult.html create mode 100644 air_trace_handler/merger/struct.MergerParResult.html create mode 100644 air_trace_handler/merger/struct.MetApResult.html create mode 100644 air_trace_handler/merger/struct.MetCallResult.html create mode 100644 air_trace_handler/merger/struct.ResolvedFold.html create mode 100644 air_trace_handler/merger/struct.ResolvedSubTraceDescs.html create mode 100644 air_trace_handler/sidebar-items.js create mode 100644 air_trace_handler/state_automata/errors/enum.StateFSMError.html create mode 100644 air_trace_handler/state_automata/par_fsm/enum.SubgraphType.html create mode 100644 air_trace_handler/struct.TraceHandler.html create mode 100644 air_trace_handler/type.TraceHandlerResult.html create mode 100644 air_utils/all.html create mode 100644 air_utils/index.html create mode 100644 air_utils/macro.auto_checked_add!.html create mode 100644 air_utils/macro.auto_checked_add.html create mode 100644 air_utils/macro.farewell_if_fail!.html create mode 100644 air_utils/macro.farewell_if_fail.html create mode 100644 air_utils/macro.measure!.html create mode 100644 air_utils/macro.measure.html create mode 100644 air_utils/sidebar-items.js create mode 100644 avm_data_store/all.html create mode 100644 avm_data_store/index.html create mode 100644 avm_data_store/sidebar-items.js create mode 100644 avm_data_store/struct.AnomalyData.html create mode 100644 avm_data_store/trait.DataStore.html create mode 100644 avm_interface/all.html create mode 100644 avm_interface/call_request_parameters/struct.CallRequestParams.html create mode 100644 avm_interface/call_request_parameters/type.CallRequests.html create mode 100644 avm_interface/call_service_result/constant.CALL_SERVICE_SUCCESS.html create mode 100644 avm_interface/call_service_result/fn.into_raw_result.html create mode 100644 avm_interface/call_service_result/struct.CallServiceResult.html create mode 100644 avm_interface/call_service_result/type.CallResults.html create mode 100644 avm_interface/constant.CALL_SERVICE_SUCCESS.html create mode 100644 avm_interface/enum.CallSeDeErrors.html create mode 100644 avm_interface/fn.into_raw_result.html create mode 100644 avm_interface/index.html create mode 100644 avm_interface/outcome/struct.AVMOutcome.html create mode 100644 avm_interface/outcome/struct.ErrorAVMOutcome.html create mode 100644 avm_interface/particle_parameters/struct.ParticleParameters.html create mode 100644 avm_interface/raw_outcome/index.html create mode 100644 avm_interface/raw_outcome/sidebar-items.js create mode 100644 avm_interface/raw_outcome/struct.RawAVMOutcome.html create mode 100644 avm_interface/sidebar-items.js create mode 100644 avm_interface/struct.AVMOutcome.html create mode 100644 avm_interface/struct.CallRequestParams.html create mode 100644 avm_interface/struct.CallServiceResult.html create mode 100644 avm_interface/struct.ErrorAVMOutcome.html create mode 100644 avm_interface/struct.ParticleParameters.html create mode 100644 avm_interface/struct.SoftLimitsTriggering.html create mode 100644 avm_interface/type.CallRequests.html create mode 100644 avm_interface/type.CallResults.html create mode 100644 avm_server/all.html create mode 100644 avm_server/avm/struct.AVM.html create mode 100644 avm_server/avm_runner/index.html create mode 100644 avm_server/avm_runner/sidebar-items.js create mode 100644 avm_server/avm_runner/struct.AVMRunner.html create mode 100644 avm_server/avm_runner/struct.RawAVMOutcome.html create mode 100644 avm_server/config/struct.AVMConfig.html create mode 100644 avm_server/constant.CALL_SERVICE_SUCCESS.html create mode 100644 avm_server/enum.AVMError.html create mode 100644 avm_server/enum.CallSeDeErrors.html create mode 100644 avm_server/enum.HostImportError.html create mode 100644 avm_server/enum.IType.html create mode 100644 avm_server/enum.IValue.html create mode 100644 avm_server/enum.RunnerError.html create mode 100644 avm_server/errors/enum.AVMError.html create mode 100644 avm_server/errors/enum.CallSeDeErrors.html create mode 100644 avm_server/errors/enum.RunnerError.html create mode 100644 avm_server/fn.into_raw_result.html create mode 100644 avm_server/index.html create mode 100644 avm_server/ne_vec/index.html create mode 100644 avm_server/ne_vec/sidebar-items.js create mode 100644 avm_server/ne_vec/struct.NEVec.html create mode 100644 avm_server/raw_outcome/index.html create mode 100644 avm_server/raw_outcome/sidebar-items.js create mode 100644 avm_server/raw_outcome/struct.RawAVMOutcome.html create mode 100644 avm_server/runner/struct.AVMMemoryStats.html create mode 100644 avm_server/runner/struct.AVMRunner.html create mode 100644 avm_server/runner/struct.AVMRuntimeLimits.html create mode 100644 avm_server/runner/struct.AquaVMRuntimeLimits.html create mode 100644 avm_server/sidebar-items.js create mode 100644 avm_server/struct.AVM.html create mode 100644 avm_server/struct.AVMConfig.html create mode 100644 avm_server/struct.AVMMemoryStats.html create mode 100644 avm_server/struct.AVMOutcome.html create mode 100644 avm_server/struct.AVMRuntimeLimits.html create mode 100644 avm_server/struct.AnomalyData.html create mode 100644 avm_server/struct.AquaVMRuntimeLimits.html create mode 100644 avm_server/struct.CallRequestParams.html create mode 100644 avm_server/struct.CallServiceResult.html create mode 100644 avm_server/struct.ErrorAVMOutcome.html create mode 100644 avm_server/struct.ParticleParameters.html create mode 100644 avm_server/struct.SecurityTetraplet.html create mode 100644 avm_server/struct.SoftLimitsTriggering.html create mode 100644 avm_server/trait.DataStore.html create mode 100644 avm_server/type.AVMDataStore.html create mode 100644 avm_server/type.AVMResult.html create mode 100644 avm_server/type.CallRequests.html create mode 100644 avm_server/type.CallResults.html create mode 100644 avm_server/type.HostExportedFunc.html create mode 100644 avm_server/type.HostImportDescriptor.html create mode 100644 avm_server/type.RunnerResult.html create mode 100644 crates.js create mode 100644 help.html create mode 100644 index.html create mode 100644 polyplets/all.html create mode 100644 polyplets/index.html create mode 100644 polyplets/sidebar-items.js create mode 100644 polyplets/struct.ResolvedTriplet.html create mode 100644 polyplets/struct.SecurityTetraplet.html create mode 100644 polyplets/triplet/struct.ResolvedTriplet.html create mode 100644 search-index.js create mode 100644 search.desc/air/air-desc-0-.js create mode 100644 search.desc/air_beautifier/air_beautifier-desc-0-.js create mode 100644 search.desc/air_beautify_wasm/air_beautify_wasm-desc-0-.js create mode 100644 search.desc/air_execution_info_collector/air_execution_info_collector-desc-0-.js create mode 100644 search.desc/air_interpreter_cid/air_interpreter_cid-desc-0-.js create mode 100644 search.desc/air_interpreter_client/air_interpreter_client-desc-0-.js create mode 100644 search.desc/air_interpreter_data/air_interpreter_data-desc-0-.js create mode 100644 search.desc/air_interpreter_interface/air_interpreter_interface-desc-0-.js create mode 100644 search.desc/air_interpreter_sede/air_interpreter_sede-desc-0-.js create mode 100644 search.desc/air_interpreter_server/air_interpreter_server-desc-0-.js create mode 100644 search.desc/air_interpreter_signatures/air_interpreter_signatures-desc-0-.js create mode 100644 search.desc/air_interpreter_value/air_interpreter_value-desc-0-.js create mode 100644 search.desc/air_lambda_ast/air_lambda_ast-desc-0-.js create mode 100644 search.desc/air_lambda_parser/air_lambda_parser-desc-0-.js create mode 100644 search.desc/air_log_targets/air_log_targets-desc-0-.js create mode 100644 search.desc/air_parser/air_parser-desc-0-.js create mode 100644 search.desc/air_test_framework/air_test_framework-desc-0-.js create mode 100644 search.desc/air_test_utils/air_test_utils-desc-0-.js create mode 100644 search.desc/air_trace_handler/air_trace_handler-desc-0-.js create mode 100644 search.desc/air_utils/air_utils-desc-0-.js create mode 100644 search.desc/avm_data_store/avm_data_store-desc-0-.js create mode 100644 search.desc/avm_interface/avm_interface-desc-0-.js create mode 100644 search.desc/avm_server/avm_server-desc-0-.js create mode 100644 search.desc/polyplets/polyplets-desc-0-.js create mode 100644 settings.html create mode 100644 src-files.js create mode 100644 src/air/beautify/mod.rs.html create mode 100644 src/air/data.rs.html create mode 100644 src/air/execution_step/errors/catchable_errors.rs.html create mode 100644 src/air/execution_step/errors/error_effectable.rs.html create mode 100644 src/air/execution_step/errors/execution_errors.rs.html create mode 100644 src/air/execution_step/errors/joinable.rs.html create mode 100644 src/air/execution_step/errors/mod.rs.html create mode 100644 src/air/execution_step/errors/uncatchable_errors.rs.html create mode 100644 src/air/execution_step/execution_context/cid_state.rs.html create mode 100644 src/air/execution_step/execution_context/context.rs.html create mode 100644 src/air/execution_step/execution_context/instruction_error/error_descriptor.rs.html create mode 100644 src/air/execution_step/execution_context/instruction_error/errors.rs.html create mode 100644 src/air/execution_step/execution_context/instruction_error/errors_utils.rs.html create mode 100644 src/air/execution_step/execution_context/instruction_error/instruction_error_definition.rs.html create mode 100644 src/air/execution_step/execution_context/instruction_error/last_error_descriptor.rs.html create mode 100644 src/air/execution_step/execution_context/instruction_error/mod.rs.html create mode 100644 src/air/execution_step/execution_context/mod.rs.html create mode 100644 src/air/execution_step/execution_context/scalar_variables.rs.html create mode 100644 src/air/execution_step/execution_context/scalar_variables/values_sparse_matrix.rs.html create mode 100644 src/air/execution_step/execution_context/stream_maps_variables.rs.html create mode 100644 src/air/execution_step/execution_context/stream_maps_variables/errors.rs.html create mode 100644 src/air/execution_step/execution_context/stream_maps_variables/stream_map_key.rs.html create mode 100644 src/air/execution_step/execution_context/streams_variables.rs.html create mode 100644 src/air/execution_step/execution_context/streams_variables/stream_descriptor.rs.html create mode 100644 src/air/execution_step/execution_context/streams_variables/stream_value_descriptor.rs.html create mode 100644 src/air/execution_step/instructions/ap.rs.html create mode 100644 src/air/execution_step/instructions/ap/apply_to_arguments.rs.html create mode 100644 src/air/execution_step/instructions/ap/utils.rs.html create mode 100644 src/air/execution_step/instructions/ap_map.rs.html create mode 100644 src/air/execution_step/instructions/call.rs.html create mode 100644 src/air/execution_step/instructions/call/call_result_setter.rs.html create mode 100644 src/air/execution_step/instructions/call/prev_result_handler.rs.html create mode 100644 src/air/execution_step/instructions/call/resolved_call.rs.html create mode 100644 src/air/execution_step/instructions/call/triplet.rs.html create mode 100644 src/air/execution_step/instructions/call/verifier.rs.html create mode 100644 src/air/execution_step/instructions/canon.rs.html create mode 100644 src/air/execution_step/instructions/canon_map.rs.html create mode 100644 src/air/execution_step/instructions/canon_stream_map_scalar.rs.html create mode 100644 src/air/execution_step/instructions/canon_utils/mod.rs.html create mode 100644 src/air/execution_step/instructions/compare_matchable/mod.rs.html create mode 100644 src/air/execution_step/instructions/fail.rs.html create mode 100644 src/air/execution_step/instructions/fold/fold_state.rs.html create mode 100644 src/air/execution_step/instructions/fold/mod.rs.html create mode 100644 src/air/execution_step/instructions/fold/utils.rs.html create mode 100644 src/air/execution_step/instructions/fold_scalar.rs.html create mode 100644 src/air/execution_step/instructions/fold_stream.rs.html create mode 100644 src/air/execution_step/instructions/fold_stream/completeness_updater.rs.html create mode 100644 src/air/execution_step/instructions/fold_stream/stream_execute_helpers.rs.html create mode 100644 src/air/execution_step/instructions/fold_stream_map.rs.html create mode 100644 src/air/execution_step/instructions/match_.rs.html create mode 100644 src/air/execution_step/instructions/mismatch.rs.html create mode 100644 src/air/execution_step/instructions/mod.rs.html create mode 100644 src/air/execution_step/instructions/never.rs.html create mode 100644 src/air/execution_step/instructions/new.rs.html create mode 100644 src/air/execution_step/instructions/next.rs.html create mode 100644 src/air/execution_step/instructions/null.rs.html create mode 100644 src/air/execution_step/instructions/par.rs.html create mode 100644 src/air/execution_step/instructions/par/completeness_updater.rs.html create mode 100644 src/air/execution_step/instructions/seq.rs.html create mode 100644 src/air/execution_step/instructions/xor.rs.html create mode 100644 src/air/execution_step/lambda_applier/applier.rs.html create mode 100644 src/air/execution_step/lambda_applier/errors.rs.html create mode 100644 src/air/execution_step/lambda_applier/mod.rs.html create mode 100644 src/air/execution_step/lambda_applier/utils.rs.html create mode 100644 src/air/execution_step/mod.rs.html create mode 100644 src/air/execution_step/resolver/mod.rs.html create mode 100644 src/air/execution_step/resolver/resolvable_impl.rs.html create mode 100644 src/air/execution_step/value_types/canon_stream.rs.html create mode 100644 src/air/execution_step/value_types/canon_stream_map.rs.html create mode 100644 src/air/execution_step/value_types/iterable.rs.html create mode 100644 src/air/execution_step/value_types/iterable/canon_stream.rs.html create mode 100644 src/air/execution_step/value_types/iterable/canon_stream_map.rs.html create mode 100644 src/air/execution_step/value_types/iterable/lambda_result.rs.html create mode 100644 src/air/execution_step/value_types/iterable/resolved_call.rs.html create mode 100644 src/air/execution_step/value_types/iterable/vec_resolved_call.rs.html create mode 100644 src/air/execution_step/value_types/jvaluable.rs.html create mode 100644 src/air/execution_step/value_types/jvaluable/canon_stream.rs.html create mode 100644 src/air/execution_step/value_types/jvaluable/canon_stream_map.rs.html create mode 100644 src/air/execution_step/value_types/jvaluable/cell_vec_resolved_call_result.rs.html create mode 100644 src/air/execution_step/value_types/jvaluable/iterable_item.rs.html create mode 100644 src/air/execution_step/value_types/jvaluable/resolved_call_result.rs.html create mode 100644 src/air/execution_step/value_types/mod.rs.html create mode 100644 src/air/execution_step/value_types/scalar.rs.html create mode 100644 src/air/execution_step/value_types/scalar/values.rs.html create mode 100644 src/air/execution_step/value_types/stream/mod.rs.html create mode 100644 src/air/execution_step/value_types/stream/recursive_stream.rs.html create mode 100644 src/air/execution_step/value_types/stream/stream_definition.rs.html create mode 100644 src/air/execution_step/value_types/stream/values_matrix.rs.html create mode 100644 src/air/execution_step/value_types/stream_map.rs.html create mode 100644 src/air/execution_step/value_types/utils.rs.html create mode 100644 src/air/farewell_step/errors.rs.html create mode 100644 src/air/farewell_step/mod.rs.html create mode 100644 src/air/farewell_step/outcome.rs.html create mode 100644 src/air/human_readable_data.rs.html create mode 100644 src/air/lib.rs.html create mode 100644 src/air/main.rs.html create mode 100644 src/air/preparation_step/errors.rs.html create mode 100644 src/air/preparation_step/interpreter_versions.rs.html create mode 100644 src/air/preparation_step/mod.rs.html create mode 100644 src/air/preparation_step/preparation.rs.html create mode 100644 src/air/preparation_step/sizes_limits_check.rs.html create mode 100644 src/air/runner.rs.html create mode 100644 src/air/signing_step.rs.html create mode 100644 src/air/trace/mod.rs.html create mode 100644 src/air/trace/run.rs.html create mode 100644 src/air/trace/run/data/anomaly.rs.html create mode 100644 src/air/trace/run/data/mod.rs.html create mode 100644 src/air/trace/run/data/plain.rs.html create mode 100644 src/air/trace/run/native.rs.html create mode 100644 src/air/trace/run/runner.rs.html create mode 100644 src/air/trace/run/wasm.rs.html create mode 100644 src/air/trace/stats.rs.html create mode 100644 src/air/trace/stats/log_data.rs.html create mode 100644 src/air/trace/stats/report.rs.html create mode 100644 src/air/trace/utils.rs.html create mode 100644 src/air/utils/error_codes.rs.html create mode 100644 src/air/utils/mod.rs.html create mode 100644 src/air/utils/to_error_code.rs.html create mode 100644 src/air/verification_step.rs.html create mode 100644 src/air_beautifier/beautifier.rs.html create mode 100644 src/air_beautifier/lib.rs.html create mode 100644 src/air_beautifier/virtual.rs.html create mode 100644 src/air_beautify_wasm/lib.rs.html create mode 100644 src/air_execution_info_collector/instructions_tracker.rs.html create mode 100644 src/air_execution_info_collector/lib.rs.html create mode 100644 src/air_interpreter_cid/lib.rs.html create mode 100644 src/air_interpreter_cid/verify.rs.html create mode 100644 src/air_interpreter_client/ast.rs.html create mode 100644 src/air_interpreter_client/logger.rs.html create mode 100644 src/air_interpreter_client/wasm_bindgen.rs.html create mode 100644 src/air_interpreter_data/cid_info.rs.html create mode 100644 src/air_interpreter_data/cid_store.rs.html create mode 100644 src/air_interpreter_data/executed_state.rs.html create mode 100644 src/air_interpreter_data/executed_state/impls.rs.html create mode 100644 src/air_interpreter_data/executed_state/se_de.rs.html create mode 100644 src/air_interpreter_data/generation_idx.rs.html create mode 100644 src/air_interpreter_data/interpreter_data.rs.html create mode 100644 src/air_interpreter_data/interpreter_data/errors.rs.html create mode 100644 src/air_interpreter_data/interpreter_data/repr.rs.html create mode 100644 src/air_interpreter_data/interpreter_data/verification.rs.html create mode 100644 src/air_interpreter_data/lib.rs.html create mode 100644 src/air_interpreter_data/raw_value.rs.html create mode 100644 src/air_interpreter_data/rkyv.rs.html create mode 100644 src/air_interpreter_data/trace.rs.html create mode 100644 src/air_interpreter_data/trace_pos.rs.html create mode 100644 src/air_interpreter_interface/call_request_parameters.rs.html create mode 100644 src/air_interpreter_interface/call_service_result.rs.html create mode 100644 src/air_interpreter_interface/interpreter_outcome.rs.html create mode 100644 src/air_interpreter_interface/lib.rs.html create mode 100644 src/air_interpreter_interface/run_args_memory_limits.rs.html create mode 100644 src/air_interpreter_interface/run_parameters.rs.html create mode 100644 src/air_interpreter_sede/format.rs.html create mode 100644 src/air_interpreter_sede/lib.rs.html create mode 100644 src/air_interpreter_sede/multiformat.rs.html create mode 100644 src/air_interpreter_sede/representation.rs.html create mode 100644 src/air_interpreter_sede/rmp_serde.rs.html create mode 100644 src/air_interpreter_sede/serialized_type.rs.html create mode 100644 src/air_interpreter_server/ast.rs.html create mode 100644 src/air_interpreter_server/logger.rs.html create mode 100644 src/air_interpreter_server/marine.rs.html create mode 100644 src/air_interpreter_signatures/lib.rs.html create mode 100644 src/air_interpreter_signatures/sede.rs.html create mode 100644 src/air_interpreter_signatures/stores.rs.html create mode 100644 src/air_interpreter_signatures/trackers.rs.html create mode 100644 src/air_interpreter_value/lib.rs.html create mode 100644 src/air_interpreter_value/value/de.rs.html create mode 100644 src/air_interpreter_value/value/from.rs.html create mode 100644 src/air_interpreter_value/value/index.rs.html create mode 100644 src/air_interpreter_value/value/mod.rs.html create mode 100644 src/air_interpreter_value/value/partial_eq.rs.html create mode 100644 src/air_interpreter_value/value/ser.rs.html create mode 100644 src/air_lambda_ast/ast.rs.html create mode 100644 src/air_lambda_ast/ast/impls.rs.html create mode 100644 src/air_lambda_ast/ast/traits.rs.html create mode 100644 src/air_lambda_ast/lib.rs.html create mode 100644 src/air_lambda_parser/lib.rs.html create mode 100644 src/air_lambda_parser/parser/errors.rs.html create mode 100644 src/air_lambda_parser/parser/lambda_parser.rs.html create mode 100644 src/air_lambda_parser/parser/lexer/errors.rs.html create mode 100644 src/air_lambda_parser/parser/lexer/lambda_ast_lexer.rs.html create mode 100644 src/air_lambda_parser/parser/lexer/mod.rs.html create mode 100644 src/air_lambda_parser/parser/lexer/token.rs.html create mode 100644 src/air_lambda_parser/parser/lexer/utils.rs.html create mode 100644 src/air_lambda_parser/parser/mod.rs.html create mode 100644 src/air_lambda_parser/parser/va_lambda.rs.html create mode 100644 src/air_log_targets/lib.rs.html create mode 100644 src/air_parser/ast/instruction_arguments.rs.html create mode 100644 src/air_parser/ast/instruction_arguments/impls.rs.html create mode 100644 src/air_parser/ast/instruction_arguments/traits.rs.html create mode 100644 src/air_parser/ast/instructions.rs.html create mode 100644 src/air_parser/ast/instructions/impls.rs.html create mode 100644 src/air_parser/ast/instructions/traits.rs.html create mode 100644 src/air_parser/ast/mod.rs.html create mode 100644 src/air_parser/ast/values.rs.html create mode 100644 src/air_parser/ast/values/impls.rs.html create mode 100644 src/air_parser/ast/values/traits.rs.html create mode 100644 src/air_parser/lib.rs.html create mode 100644 src/air_parser/parser/air.rs.html create mode 100644 src/air_parser/parser/air_parser.rs.html create mode 100644 src/air_parser/parser/air_utils/mod.rs.html create mode 100644 src/air_parser/parser/errors.rs.html create mode 100644 src/air_parser/parser/lexer/air_lexer.rs.html create mode 100644 src/air_parser/parser/lexer/call_variable_parser.rs.html create mode 100644 src/air_parser/parser/lexer/errors.rs.html create mode 100644 src/air_parser/parser/lexer/mod.rs.html create mode 100644 src/air_parser/parser/lexer/text_pos.rs.html create mode 100644 src/air_parser/parser/lexer/token.rs.html create mode 100644 src/air_parser/parser/lexer/utils.rs.html create mode 100644 src/air_parser/parser/mod.rs.html create mode 100644 src/air_parser/parser/span.rs.html create mode 100644 src/air_parser/parser/validator.rs.html create mode 100644 src/air_test_framework/asserts/behavior.rs.html create mode 100644 src/air_test_framework/asserts/json.rs.html create mode 100644 src/air_test_framework/asserts/mod.rs.html create mode 100644 src/air_test_framework/asserts/parser.rs.html create mode 100644 src/air_test_framework/ephemeral/mod.rs.html create mode 100644 src/air_test_framework/ephemeral/neighborhood.rs.html create mode 100644 src/air_test_framework/execution/mod.rs.html create mode 100644 src/air_test_framework/lib.rs.html create mode 100644 src/air_test_framework/queue.rs.html create mode 100644 src/air_test_framework/services/mod.rs.html create mode 100644 src/air_test_framework/services/results.rs.html create mode 100644 src/air_test_framework/transform/mod.rs.html create mode 100644 src/air_test_framework/transform/parser.rs.html create mode 100644 src/air_test_framework/transform/walker.rs.html create mode 100644 src/air_test_utils/call_services.rs.html create mode 100644 src/air_test_utils/executed_state.rs.html create mode 100644 src/air_test_utils/key_utils.rs.html create mode 100644 src/air_test_utils/lib.rs.html create mode 100644 src/air_test_utils/native_test_runner.rs.html create mode 100644 src/air_test_utils/test_runner.rs.html create mode 100644 src/air_test_utils/wasm_test_runner.rs.html create mode 100644 src/air_trace_handler/data_keeper/errors.rs.html create mode 100644 src/air_trace_handler/data_keeper/keeper.rs.html create mode 100644 src/air_trace_handler/data_keeper/merge_ctx.rs.html create mode 100644 src/air_trace_handler/data_keeper/mod.rs.html create mode 100644 src/air_trace_handler/data_keeper/trace_slider.rs.html create mode 100644 src/air_trace_handler/errors.rs.html create mode 100644 src/air_trace_handler/handler.rs.html create mode 100644 src/air_trace_handler/lib.rs.html create mode 100644 src/air_trace_handler/merger/ap_merger.rs.html create mode 100644 src/air_trace_handler/merger/call_merger.rs.html create mode 100644 src/air_trace_handler/merger/call_merger/utils.rs.html create mode 100644 src/air_trace_handler/merger/canon_merger.rs.html create mode 100644 src/air_trace_handler/merger/errors.rs.html create mode 100644 src/air_trace_handler/merger/fold_merger.rs.html create mode 100644 src/air_trace_handler/merger/fold_merger/fold_lore_resolver.rs.html create mode 100644 src/air_trace_handler/merger/mod.rs.html create mode 100644 src/air_trace_handler/merger/par_merger.rs.html create mode 100644 src/air_trace_handler/merger/position_mapping.rs.html create mode 100644 src/air_trace_handler/state_automata/errors.rs.html create mode 100644 src/air_trace_handler/state_automata/fold_fsm.rs.html create mode 100644 src/air_trace_handler/state_automata/fold_fsm/lore_applier.rs.html create mode 100644 src/air_trace_handler/state_automata/fold_fsm/lore_ctor.rs.html create mode 100644 src/air_trace_handler/state_automata/fold_fsm/lore_ctor_queue.rs.html create mode 100644 src/air_trace_handler/state_automata/fold_fsm/state_handler.rs.html create mode 100644 src/air_trace_handler/state_automata/fsm_queue.rs.html create mode 100644 src/air_trace_handler/state_automata/mod.rs.html create mode 100644 src/air_trace_handler/state_automata/par_fsm.rs.html create mode 100644 src/air_trace_handler/state_automata/par_fsm/par_builder.rs.html create mode 100644 src/air_trace_handler/state_automata/par_fsm/state_handler.rs.html create mode 100644 src/air_trace_handler/state_automata/par_fsm/state_handler/new_states_calculation.rs.html create mode 100644 src/air_trace_handler/state_automata/state_inserter.rs.html create mode 100644 src/air_trace_handler/state_automata/utils.rs.html create mode 100644 src/air_utils/lib.rs.html create mode 100644 src/avm_data_store/lib.rs.html create mode 100644 src/avm_interface/call_request_parameters.rs.html create mode 100644 src/avm_interface/call_service_result.rs.html create mode 100644 src/avm_interface/lib.rs.html create mode 100644 src/avm_interface/outcome.rs.html create mode 100644 src/avm_interface/particle_parameters.rs.html create mode 100644 src/avm_interface/raw_outcome.rs.html create mode 100644 src/avm_server/avm.rs.html create mode 100644 src/avm_server/config.rs.html create mode 100644 src/avm_server/errors.rs.html create mode 100644 src/avm_server/lib.rs.html create mode 100644 src/avm_server/runner.rs.html create mode 100644 src/polyplets/lib.rs.html create mode 100644 src/polyplets/triplet.rs.html create mode 100644 static.files/COPYRIGHT-23e9bde6c69aea69.txt create mode 100644 static.files/FiraSans-LICENSE-db4b642586e02d97.txt create mode 100644 static.files/FiraSans-Medium-8f9a781e4970d388.woff2 create mode 100644 static.files/FiraSans-Regular-018c141bf0843ffd.woff2 create mode 100644 static.files/LICENSE-APACHE-b91fa81cba47b86a.txt create mode 100644 static.files/LICENSE-MIT-65090b722b3f6c56.txt create mode 100644 static.files/NanumBarunGothic-0f09457c7a19b7c6.ttf.woff2 create mode 100644 static.files/NanumBarunGothic-LICENSE-18c5adf4b52b4041.txt create mode 100644 static.files/SourceCodePro-It-1cc31594bf4f1f79.ttf.woff2 create mode 100644 static.files/SourceCodePro-LICENSE-d180d465a756484a.txt create mode 100644 static.files/SourceCodePro-Regular-562dcc5011b6de7d.ttf.woff2 create mode 100644 static.files/SourceCodePro-Semibold-d899c5a5c4aeb14a.ttf.woff2 create mode 100644 static.files/SourceSerif4-Bold-a2c9cd1067f8b328.ttf.woff2 create mode 100644 static.files/SourceSerif4-It-acdfaf1a8af734b1.ttf.woff2 create mode 100644 static.files/SourceSerif4-LICENSE-3bb119e13b1258b7.md create mode 100644 static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2 create mode 100644 static.files/favicon-2c020d218678b618.svg create mode 100644 static.files/favicon-32x32-422f7d1d52889060.png create mode 100644 static.files/main-d2fab2bf619172d3.js create mode 100644 static.files/normalize-76eba96aa4d2e634.css create mode 100644 static.files/noscript-df360f571f6edeae.css create mode 100644 static.files/rust-logo-151179464ae7ed46.svg create mode 100644 static.files/rustdoc-c5d6553a23f1e5a6.css create mode 100644 static.files/scrape-examples-ef1e698c1d417c0c.js create mode 100644 static.files/search-d234aafac6c221dd.js create mode 100644 static.files/settings-4313503d2e1961c2.js create mode 100644 static.files/src-script-e66d777a5a92e9b2.js create mode 100644 static.files/storage-118b08c4c78b968e.js create mode 100644 trait.impl/air/trace/run/runner/trait.AirRunner.js create mode 100644 trait.impl/air/trace/run/runner/trait.DataToHumanReadable.js create mode 100644 trait.impl/air/utils/to_error_code/trait.ToErrorCode.js create mode 100644 trait.impl/air_interpreter_sede/format/trait.Format.js create mode 100644 trait.impl/air_interpreter_sede/representation/trait.FromSerialized.js create mode 100644 trait.impl/air_interpreter_sede/representation/trait.Representation.js create mode 100644 trait.impl/air_interpreter_sede/representation/trait.ToSerialized.js create mode 100644 trait.impl/air_interpreter_sede/representation/trait.ToWriter.js create mode 100644 trait.impl/air_parser/ast/instructions/trait.PeerIDErrorLogable.js create mode 100644 trait.impl/air_test_framework/services/trait.MarineService.js create mode 100644 trait.impl/air_test_utils/test_runner/trait.AirRunner.js create mode 100644 trait.impl/alloc/string/trait.ToString.js create mode 100644 trait.impl/bytecheck/trait.CheckBytes.js create mode 100644 trait.impl/clap_builder/derive/trait.Args.js create mode 100644 trait.impl/clap_builder/derive/trait.CommandFactory.js create mode 100644 trait.impl/clap_builder/derive/trait.FromArgMatches.js create mode 100644 trait.impl/clap_builder/derive/trait.Parser.js create mode 100644 trait.impl/clap_builder/derive/trait.Subcommand.js create mode 100644 trait.impl/core/borrow/trait.Borrow.js create mode 100644 trait.impl/core/clone/trait.Clone.js create mode 100644 trait.impl/core/cmp/trait.Eq.js create mode 100644 trait.impl/core/cmp/trait.Ord.js create mode 100644 trait.impl/core/cmp/trait.PartialEq.js create mode 100644 trait.impl/core/cmp/trait.PartialOrd.js create mode 100644 trait.impl/core/convert/trait.AsRef.js create mode 100644 trait.impl/core/convert/trait.From.js create mode 100644 trait.impl/core/convert/trait.TryFrom.js create mode 100644 trait.impl/core/default/trait.Default.js create mode 100644 trait.impl/core/error/trait.Error.js create mode 100644 trait.impl/core/fmt/trait.Debug.js create mode 100644 trait.impl/core/fmt/trait.Display.js create mode 100644 trait.impl/core/hash/trait.Hash.js create mode 100644 trait.impl/core/iter/traits/collect/trait.FromIterator.js create mode 100644 trait.impl/core/iter/traits/collect/trait.IntoIterator.js create mode 100644 trait.impl/core/iter/traits/iterator/trait.Iterator.js create mode 100644 trait.impl/core/marker/trait.Copy.js create mode 100644 trait.impl/core/marker/trait.Freeze.js create mode 100644 trait.impl/core/marker/trait.Send.js create mode 100644 trait.impl/core/marker/trait.StructuralPartialEq.js create mode 100644 trait.impl/core/marker/trait.Sync.js create mode 100644 trait.impl/core/marker/trait.Unpin.js create mode 100644 trait.impl/core/ops/arith/trait.Add.js create mode 100644 trait.impl/core/ops/arith/trait.AddAssign.js create mode 100644 trait.impl/core/ops/arith/trait.Sub.js create mode 100644 trait.impl/core/ops/deref/trait.Deref.js create mode 100644 trait.impl/core/ops/index/trait.Index.js create mode 100644 trait.impl/core/ops/index/trait.IndexMut.js create mode 100644 trait.impl/core/panic/unwind_safe/trait.RefUnwindSafe.js create mode 100644 trait.impl/core/panic/unwind_safe/trait.UnwindSafe.js create mode 100644 trait.impl/core/str/traits/trait.FromStr.js create mode 100644 trait.impl/num_traits/ops/checked/trait.CheckedAdd.js create mode 100644 trait.impl/rkyv/trait.Archive.js create mode 100644 trait.impl/rkyv/trait.Deserialize.js create mode 100644 trait.impl/rkyv/trait.Serialize.js create mode 100644 trait.impl/serde/de/trait.Deserialize.js create mode 100644 trait.impl/serde/ser/trait.Serialize.js create mode 100644 trait.impl/strum/trait.EnumCount.js create mode 100644 type.impl/air_interpreter_interface/struct.CallArgumentsRepr.js create mode 100644 type.impl/air_interpreter_interface/struct.CallRequestsRepr.js create mode 100644 type.impl/air_interpreter_interface/struct.CallResultsRepr.js create mode 100644 type.impl/air_interpreter_interface/struct.TetrapletsRepr.js create mode 100644 type.impl/air_interpreter_sede/rmp_serde/struct.RmpSerdeFormat.js create mode 100644 type.impl/air_interpreter_sede/rmp_serde/struct.RmpSerdeMultiformat.js create mode 100644 type.impl/alloc/boxed/struct.Box.js create mode 100644 type.impl/alloc/collections/btree/map/struct.BTreeMap.js create mode 100644 type.impl/alloc/rc/struct.Rc.js create mode 100644 type.impl/alloc/vec/struct.Vec.js create mode 100644 type.impl/core/result/enum.Result.js create mode 100644 type.impl/marine_core/config/struct.HostImportDescriptor.js create mode 100644 type.impl/serde_json/value/enum.Value.js create mode 100644 type.impl/std/collections/hash/map/struct.HashMap.js create mode 100644 type.impl/std/primitive.str.js create mode 100644 type.impl/std/primitive.u32.js diff --git a/.lock b/.lock new file mode 100644 index 00000000..e69de29b diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 00000000..e69de29b diff --git a/CNAME b/CNAME new file mode 100644 index 00000000..0e0d1bb6 --- /dev/null +++ b/CNAME @@ -0,0 +1 @@ +air.fluence.dev diff --git a/air/all.html b/air/all.html new file mode 100644 index 00000000..1a31e329 --- /dev/null +++ b/air/all.html @@ -0,0 +1 @@ +List of all items in this crate
\ No newline at end of file diff --git a/air/beautify/fn.beautify.html b/air/beautify/fn.beautify.html new file mode 100644 index 00000000..d15a1c97 --- /dev/null +++ b/air/beautify/fn.beautify.html @@ -0,0 +1 @@ +beautify in air::beautify - Rust

Function air::beautify::beautify

source ·
pub(crate) fn beautify(args: Args) -> Result<()>
\ No newline at end of file diff --git a/air/beautify/fn.build_output.html b/air/beautify/fn.build_output.html new file mode 100644 index 00000000..32a28eef --- /dev/null +++ b/air/beautify/fn.build_output.html @@ -0,0 +1 @@ +build_output in air::beautify - Rust

Function air::beautify::build_output

source ·
fn build_output(args: &Args) -> Result<Box<dyn Write>>
\ No newline at end of file diff --git a/air/beautify/fn.read_script.html b/air/beautify/fn.read_script.html new file mode 100644 index 00000000..66028601 --- /dev/null +++ b/air/beautify/fn.read_script.html @@ -0,0 +1 @@ +read_script in air::beautify - Rust

Function air::beautify::read_script

source ·
fn read_script(args: &Args) -> Result<String>
\ No newline at end of file diff --git a/air/beautify/index.html b/air/beautify/index.html new file mode 100644 index 00000000..21038f2b --- /dev/null +++ b/air/beautify/index.html @@ -0,0 +1 @@ +air::beautify - Rust

Module air::beautify

source ·

Structs§

Functions§

\ No newline at end of file diff --git a/air/beautify/sidebar-items.js b/air/beautify/sidebar-items.js new file mode 100644 index 00000000..e1115afb --- /dev/null +++ b/air/beautify/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"fn":["beautify","build_output","read_script"],"struct":["Args"]}; \ No newline at end of file diff --git a/air/beautify/struct.Args.html b/air/beautify/struct.Args.html new file mode 100644 index 00000000..e9b2cb8c --- /dev/null +++ b/air/beautify/struct.Args.html @@ -0,0 +1,52 @@ +Args in air::beautify - Rust

Struct air::beautify::Args

source ·
pub(crate) struct Args {
+    indent_step: usize,
+    patterns: bool,
+    output: Option<PathBuf>,
+    input: Option<PathBuf>,
+}

Fields§

§indent_step: usize§patterns: bool§output: Option<PathBuf>§input: Option<PathBuf>

Trait Implementations§

source§

impl Args for Args

source§

fn group_id() -> Option<Id>

Report the [ArgGroup::id][crate::ArgGroup::id] for this set of arguments
source§

fn augment_args<'b>(__clap_app: Command) -> Command

Append to [Command] so it can instantiate Self. Read more
source§

fn augment_args_for_update<'b>(__clap_app: Command) -> Command

Append to [Command] so it can update self. Read more
source§

impl CommandFactory for Args

source§

fn command<'b>() -> Command

Build a [Command] that can instantiate Self. Read more
source§

fn command_for_update<'b>() -> Command

Build a [Command] that can update self. Read more
source§

impl FromArgMatches for Args

source§

fn from_arg_matches(__clap_arg_matches: &ArgMatches) -> Result<Self, Error>

Instantiate Self from [ArgMatches], parsing the arguments as needed. Read more
source§

fn from_arg_matches_mut( + __clap_arg_matches: &mut ArgMatches, +) -> Result<Self, Error>

Instantiate Self from [ArgMatches], parsing the arguments as needed. Read more
source§

fn update_from_arg_matches( + &mut self, + __clap_arg_matches: &ArgMatches, +) -> Result<(), Error>

Assign values from ArgMatches to self.
source§

fn update_from_arg_matches_mut( + &mut self, + __clap_arg_matches: &mut ArgMatches, +) -> Result<(), Error>

Assign values from ArgMatches to self.
source§

impl Parser for Args

§

fn parse() -> Self

Parse from std::env::args_os(), exit on error
§

fn try_parse() -> Result<Self, Error>

Parse from std::env::args_os(), return Err on error.
§

fn parse_from<I, T>(itr: I) -> Self
where + I: IntoIterator<Item = T>, + T: Into<OsString> + Clone,

Parse from iterator, exit on error
§

fn try_parse_from<I, T>(itr: I) -> Result<Self, Error>
where + I: IntoIterator<Item = T>, + T: Into<OsString> + Clone,

Parse from iterator, return Err on error.
§

fn update_from<I, T>(&mut self, itr: I)
where + I: IntoIterator<Item = T>, + T: Into<OsString> + Clone,

Update from iterator, exit on error
§

fn try_update_from<I, T>(&mut self, itr: I) -> Result<(), Error>
where + I: IntoIterator<Item = T>, + T: Into<OsString> + Clone,

Update from iterator, return Err on error.

Auto Trait Implementations§

§

impl Freeze for Args

§

impl RefUnwindSafe for Args

§

impl Send for Args

§

impl Sync for Args

§

impl Unpin for Args

§

impl UnwindSafe for Args

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air/data/enum.Mode.html b/air/data/enum.Mode.html new file mode 100644 index 00000000..55f99d28 --- /dev/null +++ b/air/data/enum.Mode.html @@ -0,0 +1,34 @@ +Mode in air::data - Rust

Enum air::data::Mode

source ·
enum Mode {
+    Native,
+    Wasm,
+}

Variants§

§

Native

§

Wasm

Auto Trait Implementations§

§

impl Freeze for Mode

§

impl RefUnwindSafe for Mode

§

impl Send for Mode

§

impl Sync for Mode

§

impl Unpin for Mode

§

impl UnwindSafe for Mode

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air/data/fn.create_runner.html b/air/data/fn.create_runner.html new file mode 100644 index 00000000..84bf5e69 --- /dev/null +++ b/air/data/fn.create_runner.html @@ -0,0 +1,5 @@ +create_runner in air::data - Rust

Function air::data::create_runner

source ·
async fn create_runner(
+    mode: Option<Mode>,
+    _air_interpreter_wasm_path: &Path,
+    _test_init_parameters: TestInitParameters,
+) -> Result<Box<dyn DataToHumanReadable>>
\ No newline at end of file diff --git a/air/data/fn.init_tracing.html b/air/data/fn.init_tracing.html new file mode 100644 index 00000000..938f1f56 --- /dev/null +++ b/air/data/fn.init_tracing.html @@ -0,0 +1 @@ +init_tracing in air::data - Rust

Function air::data::init_tracing

source ·
fn init_tracing(tracing_params: &str)
\ No newline at end of file diff --git a/air/data/fn.to_human_readable_data.html b/air/data/fn.to_human_readable_data.html new file mode 100644 index 00000000..4c1b0592 --- /dev/null +++ b/air/data/fn.to_human_readable_data.html @@ -0,0 +1,3 @@ +to_human_readable_data in air::data - Rust

Function air::data::to_human_readable_data

source ·
pub(crate) async fn to_human_readable_data(
+    args: Args,
+) -> Result<(), Box<dyn Error>>
\ No newline at end of file diff --git a/air/data/index.html b/air/data/index.html new file mode 100644 index 00000000..37d6e0ec --- /dev/null +++ b/air/data/index.html @@ -0,0 +1 @@ +air::data - Rust

Module air::data

source ·

Structs§

Enums§

Functions§

\ No newline at end of file diff --git a/air/data/sidebar-items.js b/air/data/sidebar-items.js new file mode 100644 index 00000000..da4138bb --- /dev/null +++ b/air/data/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"enum":["Mode"],"fn":["create_runner","init_tracing","to_human_readable_data"],"struct":["Args","ModeArgs"]}; \ No newline at end of file diff --git a/air/data/struct.Args.html b/air/data/struct.Args.html new file mode 100644 index 00000000..2e37bf7d --- /dev/null +++ b/air/data/struct.Args.html @@ -0,0 +1,51 @@ +Args in air::data - Rust

Struct air::data::Args

source ·
pub(crate) struct Args {
+    air_interpreter_path: PathBuf,
+    mode: ModeArgs,
+    input: PathBuf,
+}

Fields§

§air_interpreter_path: PathBuf§mode: ModeArgs§input: PathBuf

Trait Implementations§

source§

impl Args for Args

source§

fn group_id() -> Option<Id>

Report the [ArgGroup::id][crate::ArgGroup::id] for this set of arguments
source§

fn augment_args<'b>(__clap_app: Command) -> Command

Append to [Command] so it can instantiate Self. Read more
source§

fn augment_args_for_update<'b>(__clap_app: Command) -> Command

Append to [Command] so it can update self. Read more
source§

impl CommandFactory for Args

source§

fn command<'b>() -> Command

Build a [Command] that can instantiate Self. Read more
source§

fn command_for_update<'b>() -> Command

Build a [Command] that can update self. Read more
source§

impl FromArgMatches for Args

source§

fn from_arg_matches(__clap_arg_matches: &ArgMatches) -> Result<Self, Error>

Instantiate Self from [ArgMatches], parsing the arguments as needed. Read more
source§

fn from_arg_matches_mut( + __clap_arg_matches: &mut ArgMatches, +) -> Result<Self, Error>

Instantiate Self from [ArgMatches], parsing the arguments as needed. Read more
source§

fn update_from_arg_matches( + &mut self, + __clap_arg_matches: &ArgMatches, +) -> Result<(), Error>

Assign values from ArgMatches to self.
source§

fn update_from_arg_matches_mut( + &mut self, + __clap_arg_matches: &mut ArgMatches, +) -> Result<(), Error>

Assign values from ArgMatches to self.
source§

impl Parser for Args

§

fn parse() -> Self

Parse from std::env::args_os(), exit on error
§

fn try_parse() -> Result<Self, Error>

Parse from std::env::args_os(), return Err on error.
§

fn parse_from<I, T>(itr: I) -> Self
where + I: IntoIterator<Item = T>, + T: Into<OsString> + Clone,

Parse from iterator, exit on error
§

fn try_parse_from<I, T>(itr: I) -> Result<Self, Error>
where + I: IntoIterator<Item = T>, + T: Into<OsString> + Clone,

Parse from iterator, return Err on error.
§

fn update_from<I, T>(&mut self, itr: I)
where + I: IntoIterator<Item = T>, + T: Into<OsString> + Clone,

Update from iterator, exit on error
§

fn try_update_from<I, T>(&mut self, itr: I) -> Result<(), Error>
where + I: IntoIterator<Item = T>, + T: Into<OsString> + Clone,

Update from iterator, return Err on error.

Auto Trait Implementations§

§

impl Freeze for Args

§

impl RefUnwindSafe for Args

§

impl Send for Args

§

impl Sync for Args

§

impl Unpin for Args

§

impl UnwindSafe for Args

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air/data/struct.ModeArgs.html b/air/data/struct.ModeArgs.html new file mode 100644 index 00000000..6eb1a134 --- /dev/null +++ b/air/data/struct.ModeArgs.html @@ -0,0 +1,45 @@ +ModeArgs in air::data - Rust

Struct air::data::ModeArgs

source ·
struct ModeArgs {
+    native: bool,
+    wasm: bool,
+}

Fields§

§native: bool§wasm: bool

Trait Implementations§

source§

impl Args for ModeArgs

source§

fn group_id() -> Option<Id>

Report the [ArgGroup::id][crate::ArgGroup::id] for this set of arguments
source§

fn augment_args<'b>(__clap_app: Command) -> Command

Append to [Command] so it can instantiate Self. Read more
source§

fn augment_args_for_update<'b>(__clap_app: Command) -> Command

Append to [Command] so it can update self. Read more
source§

impl Clone for ModeArgs

source§

fn clone(&self) -> ModeArgs

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for ModeArgs

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl From<ModeArgs> for Option<Mode>

source§

fn from(value: ModeArgs) -> Self

Converts to this type from the input type.
source§

impl FromArgMatches for ModeArgs

source§

fn from_arg_matches(__clap_arg_matches: &ArgMatches) -> Result<Self, Error>

Instantiate Self from [ArgMatches], parsing the arguments as needed. Read more
source§

fn from_arg_matches_mut( + __clap_arg_matches: &mut ArgMatches, +) -> Result<Self, Error>

Instantiate Self from [ArgMatches], parsing the arguments as needed. Read more
source§

fn update_from_arg_matches( + &mut self, + __clap_arg_matches: &ArgMatches, +) -> Result<(), Error>

Assign values from ArgMatches to self.
source§

fn update_from_arg_matches_mut( + &mut self, + __clap_arg_matches: &mut ArgMatches, +) -> Result<(), Error>

Assign values from ArgMatches to self.
source§

impl Copy for ModeArgs

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
source§

impl<T> CloneToUninit for T
where + T: Copy,

source§

unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air/enum.Subcommand.html b/air/enum.Subcommand.html new file mode 100644 index 00000000..a674d6d3 --- /dev/null +++ b/air/enum.Subcommand.html @@ -0,0 +1,44 @@ +Subcommand in air - Rust

Enum air::Subcommand

source ·
pub(crate) enum Subcommand {
+    Beautify(Args),
+    Data(Args),
+    Run(Args),
+    Stats(Args),
+}

Variants§

§

Beautify(Args)

§

Data(Args)

§

Run(Args)

§

Stats(Args)

Trait Implementations§

source§

impl FromArgMatches for Subcommand

source§

fn from_arg_matches(__clap_arg_matches: &ArgMatches) -> Result<Self, Error>

Instantiate Self from [ArgMatches], parsing the arguments as needed. Read more
source§

fn from_arg_matches_mut( + __clap_arg_matches: &mut ArgMatches, +) -> Result<Self, Error>

Instantiate Self from [ArgMatches], parsing the arguments as needed. Read more
source§

fn update_from_arg_matches( + &mut self, + __clap_arg_matches: &ArgMatches, +) -> Result<(), Error>

Assign values from ArgMatches to self.
source§

fn update_from_arg_matches_mut<'b>( + &mut self, + __clap_arg_matches: &mut ArgMatches, +) -> Result<(), Error>

Assign values from ArgMatches to self.
source§

impl Subcommand for Subcommand

source§

fn augment_subcommands<'b>(__clap_app: Command) -> Command

Append to [Command] so it can instantiate Self. Read more
source§

fn augment_subcommands_for_update<'b>(__clap_app: Command) -> Command

Append to [Command] so it can update self. Read more
source§

fn has_subcommand(__clap_name: &str) -> bool

Test whether Self can parse a specific subcommand

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air/fn.main.html b/air/fn.main.html new file mode 100644 index 00000000..7124892c --- /dev/null +++ b/air/fn.main.html @@ -0,0 +1 @@ +main in air - Rust

Function air::main

source ·
pub(crate) fn main() -> Result<(), Box<dyn Error>>
\ No newline at end of file diff --git a/air/index.html b/air/index.html new file mode 100644 index 00000000..4f2b5006 --- /dev/null +++ b/air/index.html @@ -0,0 +1 @@ +air - Rust

Crate air

source ·

Modules§

Structs§

Enums§

Functions§

\ No newline at end of file diff --git a/air/sidebar-items.js b/air/sidebar-items.js new file mode 100644 index 00000000..7327a1a4 --- /dev/null +++ b/air/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"enum":["Subcommand"],"fn":["main"],"mod":["beautify","data","trace"],"struct":["Cli"]}; \ No newline at end of file diff --git a/air/struct.Cli.html b/air/struct.Cli.html new file mode 100644 index 00000000..626a9e12 --- /dev/null +++ b/air/struct.Cli.html @@ -0,0 +1,49 @@ +Cli in air - Rust

Struct air::Cli

source ·
pub(crate) struct Cli {
+    pub(crate) subcommand: Subcommand,
+}

Fields§

§subcommand: Subcommand

Trait Implementations§

source§

impl Args for Cli

source§

fn group_id() -> Option<Id>

Report the [ArgGroup::id][crate::ArgGroup::id] for this set of arguments
source§

fn augment_args<'b>(__clap_app: Command) -> Command

Append to [Command] so it can instantiate Self. Read more
source§

fn augment_args_for_update<'b>(__clap_app: Command) -> Command

Append to [Command] so it can update self. Read more
source§

impl CommandFactory for Cli

source§

fn command<'b>() -> Command

Build a [Command] that can instantiate Self. Read more
source§

fn command_for_update<'b>() -> Command

Build a [Command] that can update self. Read more
source§

impl FromArgMatches for Cli

source§

fn from_arg_matches(__clap_arg_matches: &ArgMatches) -> Result<Self, Error>

Instantiate Self from [ArgMatches], parsing the arguments as needed. Read more
source§

fn from_arg_matches_mut( + __clap_arg_matches: &mut ArgMatches, +) -> Result<Self, Error>

Instantiate Self from [ArgMatches], parsing the arguments as needed. Read more
source§

fn update_from_arg_matches( + &mut self, + __clap_arg_matches: &ArgMatches, +) -> Result<(), Error>

Assign values from ArgMatches to self.
source§

fn update_from_arg_matches_mut( + &mut self, + __clap_arg_matches: &mut ArgMatches, +) -> Result<(), Error>

Assign values from ArgMatches to self.
source§

impl Parser for Cli

§

fn parse() -> Self

Parse from std::env::args_os(), exit on error
§

fn try_parse() -> Result<Self, Error>

Parse from std::env::args_os(), return Err on error.
§

fn parse_from<I, T>(itr: I) -> Self
where + I: IntoIterator<Item = T>, + T: Into<OsString> + Clone,

Parse from iterator, exit on error
§

fn try_parse_from<I, T>(itr: I) -> Result<Self, Error>
where + I: IntoIterator<Item = T>, + T: Into<OsString> + Clone,

Parse from iterator, return Err on error.
§

fn update_from<I, T>(&mut self, itr: I)
where + I: IntoIterator<Item = T>, + T: Into<OsString> + Clone,

Update from iterator, exit on error
§

fn try_update_from<I, T>(&mut self, itr: I) -> Result<(), Error>
where + I: IntoIterator<Item = T>, + T: Into<OsString> + Clone,

Update from iterator, return Err on error.

Auto Trait Implementations§

§

impl Freeze for Cli

§

impl RefUnwindSafe for Cli

§

impl Send for Cli

§

impl Sync for Cli

§

impl Unpin for Cli

§

impl UnwindSafe for Cli

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air/trace/index.html b/air/trace/index.html new file mode 100644 index 00000000..8a104713 --- /dev/null +++ b/air/trace/index.html @@ -0,0 +1 @@ +air::trace - Rust

Module air::trace

source ·

Modules§

\ No newline at end of file diff --git a/air/trace/run/data/anomaly/fn.load.html b/air/trace/run/data/anomaly/fn.load.html new file mode 100644 index 00000000..27fc55ab --- /dev/null +++ b/air/trace/run/data/anomaly/fn.load.html @@ -0,0 +1 @@ +load in air::trace::run::data::anomaly - Rust

Function air::trace::run::data::anomaly::load

source ·
pub(crate) fn load(args: &AnomalyDataArgs) -> Result<ExecutionData<'_>>
\ No newline at end of file diff --git a/air/trace/run/data/anomaly/index.html b/air/trace/run/data/anomaly/index.html new file mode 100644 index 00000000..ba8846f3 --- /dev/null +++ b/air/trace/run/data/anomaly/index.html @@ -0,0 +1 @@ +air::trace::run::data::anomaly - Rust

Module air::trace::run::data::anomaly

source ·

Structs§

Functions§

\ No newline at end of file diff --git a/air/trace/run/data/anomaly/sidebar-items.js b/air/trace/run/data/anomaly/sidebar-items.js new file mode 100644 index 00000000..2059341b --- /dev/null +++ b/air/trace/run/data/anomaly/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"fn":["load"],"struct":["AnomalyDataArgs"]}; \ No newline at end of file diff --git a/air/trace/run/data/anomaly/struct.AnomalyDataArgs.html b/air/trace/run/data/anomaly/struct.AnomalyDataArgs.html new file mode 100644 index 00000000..bf7b2a35 --- /dev/null +++ b/air/trace/run/data/anomaly/struct.AnomalyDataArgs.html @@ -0,0 +1,49 @@ +AnomalyDataArgs in air::trace::run::data::anomaly - Rust

Struct air::trace::run::data::anomaly::AnomalyDataArgs

source ·
pub(crate) struct AnomalyDataArgs {
+    anomaly_data_path: PathBuf,
+}

Fields§

§anomaly_data_path: PathBuf

Trait Implementations§

source§

impl Args for AnomalyDataArgs

source§

fn group_id() -> Option<Id>

Report the [ArgGroup::id][crate::ArgGroup::id] for this set of arguments
source§

fn augment_args<'b>(__clap_app: Command) -> Command

Append to [Command] so it can instantiate Self. Read more
source§

fn augment_args_for_update<'b>(__clap_app: Command) -> Command

Append to [Command] so it can update self. Read more
source§

impl CommandFactory for AnomalyDataArgs

source§

fn command<'b>() -> Command

Build a [Command] that can instantiate Self. Read more
source§

fn command_for_update<'b>() -> Command

Build a [Command] that can update self. Read more
source§

impl Debug for AnomalyDataArgs

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl FromArgMatches for AnomalyDataArgs

source§

fn from_arg_matches(__clap_arg_matches: &ArgMatches) -> Result<Self, Error>

Instantiate Self from [ArgMatches], parsing the arguments as needed. Read more
source§

fn from_arg_matches_mut( + __clap_arg_matches: &mut ArgMatches, +) -> Result<Self, Error>

Instantiate Self from [ArgMatches], parsing the arguments as needed. Read more
source§

fn update_from_arg_matches( + &mut self, + __clap_arg_matches: &ArgMatches, +) -> Result<(), Error>

Assign values from ArgMatches to self.
source§

fn update_from_arg_matches_mut( + &mut self, + __clap_arg_matches: &mut ArgMatches, +) -> Result<(), Error>

Assign values from ArgMatches to self.
source§

impl Parser for AnomalyDataArgs

§

fn parse() -> Self

Parse from std::env::args_os(), exit on error
§

fn try_parse() -> Result<Self, Error>

Parse from std::env::args_os(), return Err on error.
§

fn parse_from<I, T>(itr: I) -> Self
where + I: IntoIterator<Item = T>, + T: Into<OsString> + Clone,

Parse from iterator, exit on error
§

fn try_parse_from<I, T>(itr: I) -> Result<Self, Error>
where + I: IntoIterator<Item = T>, + T: Into<OsString> + Clone,

Parse from iterator, return Err on error.
§

fn update_from<I, T>(&mut self, itr: I)
where + I: IntoIterator<Item = T>, + T: Into<OsString> + Clone,

Update from iterator, exit on error
§

fn try_update_from<I, T>(&mut self, itr: I) -> Result<(), Error>
where + I: IntoIterator<Item = T>, + T: Into<OsString> + Clone,

Update from iterator, return Err on error.

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air/trace/run/data/index.html b/air/trace/run/data/index.html new file mode 100644 index 00000000..32769f32 --- /dev/null +++ b/air/trace/run/data/index.html @@ -0,0 +1 @@ +air::trace::run::data - Rust

Module air::trace::run::data

source ·

Modules§

Structs§

\ No newline at end of file diff --git a/air/trace/run/data/plain/constant.DEFAULT_DATA.html b/air/trace/run/data/plain/constant.DEFAULT_DATA.html new file mode 100644 index 00000000..d36cd0bd --- /dev/null +++ b/air/trace/run/data/plain/constant.DEFAULT_DATA.html @@ -0,0 +1 @@ +DEFAULT_DATA in air::trace::run::data::plain - Rust

Constant air::trace::run::data::plain::DEFAULT_DATA

source ·
const DEFAULT_DATA: &[u8] = b"";
\ No newline at end of file diff --git a/air/trace/run/data/plain/fn.load.html b/air/trace/run/data/plain/fn.load.html new file mode 100644 index 00000000..c4127f93 --- /dev/null +++ b/air/trace/run/data/plain/fn.load.html @@ -0,0 +1 @@ +load in air::trace::run::data::plain - Rust

Function air::trace::run::data::plain::load

source ·
pub(crate) fn load(args: &PlainDataArgs) -> Result<ExecutionData<'_>>
\ No newline at end of file diff --git a/air/trace/run/data/plain/fn.print_air_prompt.html b/air/trace/run/data/plain/fn.print_air_prompt.html new file mode 100644 index 00000000..c15bd5a6 --- /dev/null +++ b/air/trace/run/data/plain/fn.print_air_prompt.html @@ -0,0 +1 @@ +print_air_prompt in air::trace::run::data::plain - Rust

Function air::trace::run::data::plain::print_air_prompt

source ·
fn print_air_prompt()
\ No newline at end of file diff --git a/air/trace/run/data/plain/fn.read_air_with_prompt.html b/air/trace/run/data/plain/fn.read_air_with_prompt.html new file mode 100644 index 00000000..ab439b4b --- /dev/null +++ b/air/trace/run/data/plain/fn.read_air_with_prompt.html @@ -0,0 +1 @@ +read_air_with_prompt in air::trace::run::data::plain - Rust

Function air::trace::run::data::plain::read_air_with_prompt

source ·
fn read_air_with_prompt(air_input: Option<&Path>) -> Result<String>
\ No newline at end of file diff --git a/air/trace/run/data/plain/index.html b/air/trace/run/data/plain/index.html new file mode 100644 index 00000000..38944c90 --- /dev/null +++ b/air/trace/run/data/plain/index.html @@ -0,0 +1 @@ +air::trace::run::data::plain - Rust

Module air::trace::run::data::plain

source ·

Structs§

Constants§

Functions§

\ No newline at end of file diff --git a/air/trace/run/data/plain/sidebar-items.js b/air/trace/run/data/plain/sidebar-items.js new file mode 100644 index 00000000..86f554da --- /dev/null +++ b/air/trace/run/data/plain/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"constant":["DEFAULT_DATA"],"fn":["load","print_air_prompt","read_air_with_prompt"],"struct":["PlainDataArgs"]}; \ No newline at end of file diff --git a/air/trace/run/data/plain/struct.PlainDataArgs.html b/air/trace/run/data/plain/struct.PlainDataArgs.html new file mode 100644 index 00000000..07b81095 --- /dev/null +++ b/air/trace/run/data/plain/struct.PlainDataArgs.html @@ -0,0 +1,52 @@ +PlainDataArgs in air::trace::run::data::plain - Rust

Struct air::trace::run::data::plain::PlainDataArgs

source ·
pub(crate) struct PlainDataArgs {
+    init_peer_id: String,
+    timestamp: Option<u64>,
+    ttl: Option<u32>,
+    current_peer_id: String,
+    air_script_path: Option<PathBuf>,
+    prev_data_path: Option<PathBuf>,
+    current_data_path: Option<PathBuf>,
+    particle_id: Option<String>,
+    air_size_limit: Option<u64>,
+    particle_size_limit: Option<u64>,
+    call_result_size_limit: Option<u64>,
+    hard_limit_enabled: bool,
+}

Fields§

§init_peer_id: String§timestamp: Option<u64>§ttl: Option<u32>§current_peer_id: String§air_script_path: Option<PathBuf>§prev_data_path: Option<PathBuf>§current_data_path: Option<PathBuf>§particle_id: Option<String>§air_size_limit: Option<u64>§particle_size_limit: Option<u64>§call_result_size_limit: Option<u64>§hard_limit_enabled: bool

Trait Implementations§

source§

impl Args for PlainDataArgs

source§

fn group_id() -> Option<Id>

Report the [ArgGroup::id][crate::ArgGroup::id] for this set of arguments
source§

fn augment_args<'b>(__clap_app: Command) -> Command

Append to [Command] so it can instantiate Self. Read more
source§

fn augment_args_for_update<'b>(__clap_app: Command) -> Command

Append to [Command] so it can update self. Read more
source§

impl Debug for PlainDataArgs

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl FromArgMatches for PlainDataArgs

source§

fn from_arg_matches(__clap_arg_matches: &ArgMatches) -> Result<Self, Error>

Instantiate Self from [ArgMatches], parsing the arguments as needed. Read more
source§

fn from_arg_matches_mut( + __clap_arg_matches: &mut ArgMatches, +) -> Result<Self, Error>

Instantiate Self from [ArgMatches], parsing the arguments as needed. Read more
source§

fn update_from_arg_matches( + &mut self, + __clap_arg_matches: &ArgMatches, +) -> Result<(), Error>

Assign values from ArgMatches to self.
source§

fn update_from_arg_matches_mut( + &mut self, + __clap_arg_matches: &mut ArgMatches, +) -> Result<(), Error>

Assign values from ArgMatches to self.

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air/trace/run/data/sidebar-items.js b/air/trace/run/data/sidebar-items.js new file mode 100644 index 00000000..bebdeea2 --- /dev/null +++ b/air/trace/run/data/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"mod":["anomaly","plain"],"struct":["ExecutionData"]}; \ No newline at end of file diff --git a/air/trace/run/data/struct.ExecutionData.html b/air/trace/run/data/struct.ExecutionData.html new file mode 100644 index 00000000..12ec36c8 --- /dev/null +++ b/air/trace/run/data/struct.ExecutionData.html @@ -0,0 +1,37 @@ +ExecutionData in air::trace::run::data - Rust

Struct air::trace::run::data::ExecutionData

source ·
pub(crate) struct ExecutionData<'ctx> {
+    pub(crate) air_script: String,
+    pub(crate) current_data: Vec<u8>,
+    pub(crate) prev_data: Vec<u8>,
+    pub(crate) particle: ParticleParameters<'ctx>,
+    pub(crate) test_init_parameters: TestInitParameters,
+}

Fields§

§air_script: String§current_data: Vec<u8>§prev_data: Vec<u8>§particle: ParticleParameters<'ctx>§test_init_parameters: TestInitParameters

Auto Trait Implementations§

§

impl<'ctx> Freeze for ExecutionData<'ctx>

§

impl<'ctx> RefUnwindSafe for ExecutionData<'ctx>

§

impl<'ctx> Send for ExecutionData<'ctx>

§

impl<'ctx> Sync for ExecutionData<'ctx>

§

impl<'ctx> Unpin for ExecutionData<'ctx>

§

impl<'ctx> UnwindSafe for ExecutionData<'ctx>

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air/trace/run/enum.Mode.html b/air/trace/run/enum.Mode.html new file mode 100644 index 00000000..8cc840f1 --- /dev/null +++ b/air/trace/run/enum.Mode.html @@ -0,0 +1,34 @@ +Mode in air::trace::run - Rust

Enum air::trace::run::Mode

source ·
enum Mode {
+    Native,
+    Wasm,
+}

Variants§

§

Native

§

Wasm

Auto Trait Implementations§

§

impl Freeze for Mode

§

impl RefUnwindSafe for Mode

§

impl Send for Mode

§

impl Sync for Mode

§

impl Unpin for Mode

§

impl UnwindSafe for Mode

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air/trace/run/enum.Source.html b/air/trace/run/enum.Source.html new file mode 100644 index 00000000..4b193a42 --- /dev/null +++ b/air/trace/run/enum.Source.html @@ -0,0 +1,42 @@ +Source in air::trace::run - Rust

Enum air::trace::run::Source

source ·
enum Source {
+    Anomaly(AnomalyDataArgs),
+    PlainData(PlainDataArgs),
+}

Variants§

Trait Implementations§

source§

impl Debug for Source

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl FromArgMatches for Source

source§

fn from_arg_matches(__clap_arg_matches: &ArgMatches) -> Result<Self, Error>

Instantiate Self from [ArgMatches], parsing the arguments as needed. Read more
source§

fn from_arg_matches_mut( + __clap_arg_matches: &mut ArgMatches, +) -> Result<Self, Error>

Instantiate Self from [ArgMatches], parsing the arguments as needed. Read more
source§

fn update_from_arg_matches( + &mut self, + __clap_arg_matches: &ArgMatches, +) -> Result<(), Error>

Assign values from ArgMatches to self.
source§

fn update_from_arg_matches_mut<'b>( + &mut self, + __clap_arg_matches: &mut ArgMatches, +) -> Result<(), Error>

Assign values from ArgMatches to self.
source§

impl Subcommand for Source

source§

fn augment_subcommands<'b>(__clap_app: Command) -> Command

Append to [Command] so it can instantiate Self. Read more
source§

fn augment_subcommands_for_update<'b>(__clap_app: Command) -> Command

Append to [Command] so it can update self. Read more
source§

fn has_subcommand(__clap_name: &str) -> bool

Test whether Self can parse a specific subcommand

Auto Trait Implementations§

§

impl Freeze for Source

§

impl RefUnwindSafe for Source

§

impl Send for Source

§

impl Sync for Source

§

impl Unpin for Source

§

impl UnwindSafe for Source

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air/trace/run/fn.create_runner.html b/air/trace/run/fn.create_runner.html new file mode 100644 index 00000000..fd08aeee --- /dev/null +++ b/air/trace/run/fn.create_runner.html @@ -0,0 +1,7 @@ +create_runner in air::trace::run - Rust

Function air::trace::run::create_runner

source ·
async fn create_runner(
+    mode: Option<Mode>,
+    _air_interpreter_wasm_path: &Path,
+    _air_contract_wasm_path: &Path,
+    _max_heap_size: Option<u64>,
+    _test_init_parameters: TestInitParameters,
+) -> Result<Box<dyn AirRunner>>
\ No newline at end of file diff --git a/air/trace/run/fn.init_tracing.html b/air/trace/run/fn.init_tracing.html new file mode 100644 index 00000000..5ae0e04a --- /dev/null +++ b/air/trace/run/fn.init_tracing.html @@ -0,0 +1 @@ +init_tracing in air::trace::run - Rust

Function air::trace::run::init_tracing

source ·
pub fn init_tracing(tracing_params: String, trace_mode: u8)
\ No newline at end of file diff --git a/air/trace/run/fn.load_data.html b/air/trace/run/fn.load_data.html new file mode 100644 index 00000000..ff1e00b9 --- /dev/null +++ b/air/trace/run/fn.load_data.html @@ -0,0 +1 @@ +load_data in air::trace::run - Rust

Function air::trace::run::load_data

source ·
pub(crate) fn load_data(data_path: &Path) -> Result<Vec<u8>>
\ No newline at end of file diff --git a/air/trace/run/fn.load_data_or_default.html b/air/trace/run/fn.load_data_or_default.html new file mode 100644 index 00000000..58c3ac46 --- /dev/null +++ b/air/trace/run/fn.load_data_or_default.html @@ -0,0 +1,4 @@ +load_data_or_default in air::trace::run - Rust

Function air::trace::run::load_data_or_default

source ·
fn load_data_or_default(
+    data_path: Option<impl AsRef<Path>>,
+    default: &[u8],
+) -> Result<Vec<u8>>
\ No newline at end of file diff --git a/air/trace/run/fn.load_keypair_ed25519.html b/air/trace/run/fn.load_keypair_ed25519.html new file mode 100644 index 00000000..c7b2ca3e --- /dev/null +++ b/air/trace/run/fn.load_keypair_ed25519.html @@ -0,0 +1 @@ +load_keypair_ed25519 in air::trace::run - Rust

Function air::trace::run::load_keypair_ed25519

source ·
fn load_keypair_ed25519(path: &PathBuf) -> Result<KeyPair, Error>
\ No newline at end of file diff --git a/air/trace/run/fn.read_call_results.html b/air/trace/run/fn.read_call_results.html new file mode 100644 index 00000000..bb75e582 --- /dev/null +++ b/air/trace/run/fn.read_call_results.html @@ -0,0 +1 @@ +read_call_results in air::trace::run - Rust

Function air::trace::run::read_call_results

source ·
fn read_call_results(call_results_path: Option<&Path>) -> Result<CallResults>
\ No newline at end of file diff --git a/air/trace/run/fn.run.html b/air/trace/run/fn.run.html new file mode 100644 index 00000000..568db8e7 --- /dev/null +++ b/air/trace/run/fn.run.html @@ -0,0 +1 @@ +run in air::trace::run - Rust

Function air::trace::run::run

source ·
pub(crate) async fn run(args: Args) -> Result<()>
\ No newline at end of file diff --git a/air/trace/run/index.html b/air/trace/run/index.html new file mode 100644 index 00000000..e94cab4c --- /dev/null +++ b/air/trace/run/index.html @@ -0,0 +1 @@ +air::trace::run - Rust

Module air::trace::run

source ·

Modules§

Structs§

Enums§

Functions§

\ No newline at end of file diff --git a/air/trace/run/native/fn.create_native_avm_runner.html b/air/trace/run/native/fn.create_native_avm_runner.html new file mode 100644 index 00000000..f7c65f39 --- /dev/null +++ b/air/trace/run/native/fn.create_native_avm_runner.html @@ -0,0 +1,3 @@ +create_native_avm_runner in air::trace::run::native - Rust

Function air::trace::run::native::create_native_avm_runner

source ·
pub(crate) fn create_native_avm_runner(
+    test_init_parameters: TestInitParameters,
+) -> Result<Box<NativeAvmRunner>>
\ No newline at end of file diff --git a/air/trace/run/native/index.html b/air/trace/run/native/index.html new file mode 100644 index 00000000..ddb741b5 --- /dev/null +++ b/air/trace/run/native/index.html @@ -0,0 +1 @@ +air::trace::run::native - Rust

Module air::trace::run::native

source ·

Structs§

Functions§

\ No newline at end of file diff --git a/air/trace/run/native/sidebar-items.js b/air/trace/run/native/sidebar-items.js new file mode 100644 index 00000000..7d7a8003 --- /dev/null +++ b/air/trace/run/native/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"fn":["create_native_avm_runner"],"struct":["NativeAvmRunner"]}; \ No newline at end of file diff --git a/air/trace/run/native/struct.NativeAvmRunner.html b/air/trace/run/native/struct.NativeAvmRunner.html new file mode 100644 index 00000000..4b43a161 --- /dev/null +++ b/air/trace/run/native/struct.NativeAvmRunner.html @@ -0,0 +1,50 @@ +NativeAvmRunner in air::trace::run::native - Rust

Struct air::trace::run::native::NativeAvmRunner

source ·
pub(crate) struct NativeAvmRunner {
+    pub aquavm_runtime_limits: AquaVMRuntimeLimits,
+}

Fields§

§aquavm_runtime_limits: AquaVMRuntimeLimits

Trait Implementations§

source§

impl AirRunner for NativeAvmRunner

source§

fn call_tracing<'this>( + &'this mut self, + air: String, + prev_data: Vec<u8>, + data: Vec<u8>, + init_peer_id: String, + timestamp: u64, + ttl: u32, + current_peer_id: String, + call_results: CallResults, + _tracing_params: String, + _tracing_output_mode: u8, + keypair: &KeyPair, + particle_id: String, +) -> LocalBoxFuture<'this, Result<RawAVMOutcome>>

source§

impl DataToHumanReadable for NativeAvmRunner

source§

fn to_human_readable<'this>( + &'this mut self, + data: Vec<u8>, +) -> LocalBoxFuture<'this, Result<String, Box<dyn StdError>>>

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air/trace/run/runner/index.html b/air/trace/run/runner/index.html new file mode 100644 index 00000000..ecd647f0 --- /dev/null +++ b/air/trace/run/runner/index.html @@ -0,0 +1 @@ +air::trace::run::runner - Rust

Module air::trace::run::runner

source ·

Structs§

  • This struct is used to set limits for the test runner creating AVMRunner.

Traits§

\ No newline at end of file diff --git a/air/trace/run/runner/sidebar-items.js b/air/trace/run/runner/sidebar-items.js new file mode 100644 index 00000000..969d636a --- /dev/null +++ b/air/trace/run/runner/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"struct":["TestInitParameters"],"trait":["AirRunner","DataToHumanReadable"]}; \ No newline at end of file diff --git a/air/trace/run/runner/struct.TestInitParameters.html b/air/trace/run/runner/struct.TestInitParameters.html new file mode 100644 index 00000000..b06e3485 --- /dev/null +++ b/air/trace/run/runner/struct.TestInitParameters.html @@ -0,0 +1,44 @@ +TestInitParameters in air::trace::run::runner - Rust

Struct air::trace::run::runner::TestInitParameters

source ·
pub struct TestInitParameters {
+    pub air_size_limit: Option<u64>,
+    pub particle_size_limit: Option<u64>,
+    pub call_result_size_limit: Option<u64>,
+    pub hard_limit_enabled: bool,
+}
Expand description

This struct is used to set limits for the test runner creating AVMRunner.

+

Fields§

§air_size_limit: Option<u64>§particle_size_limit: Option<u64>§call_result_size_limit: Option<u64>§hard_limit_enabled: bool

Implementations§

source§

impl TestInitParameters

source

pub fn new( + air_size_limit: Option<u64>, + particle_size_limit: Option<u64>, + call_result_size_limit: Option<u64>, + hard_limit_enabled: bool, +) -> Self

source

pub fn no_limits() -> Self

Trait Implementations§

source§

impl Clone for TestInitParameters

source§

fn clone(&self) -> TestInitParameters

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for TestInitParameters

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Default for TestInitParameters

source§

fn default() -> TestInitParameters

Returns the “default value” for a type. Read more
source§

impl From<TestInitParameters> for AVMRuntimeLimits

source§

fn from(value: TestInitParameters) -> Self

Converts to this type from the input type.
source§

impl From<TestInitParameters> for AquaVMRuntimeLimits

source§

fn from(value: TestInitParameters) -> Self

Converts to this type from the input type.

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air/trace/run/runner/trait.AirRunner.html b/air/trace/run/runner/trait.AirRunner.html new file mode 100644 index 00000000..38acd288 --- /dev/null +++ b/air/trace/run/runner/trait.AirRunner.html @@ -0,0 +1,32 @@ +AirRunner in air::trace::run::runner - Rust

Trait air::trace::run::runner::AirRunner

source ·
pub(crate) trait AirRunner {
+    // Required method
+    fn call_tracing<'this>(
+        &'this mut self,
+        air: String,
+        prev_data: Vec<u8>,
+        data: Vec<u8>,
+        init_peer_id: String,
+        timestamp: u64,
+        ttl: u32,
+        current_peer_id: String,
+        call_results: CallResults,
+        tracing_params: String,
+        tracing_output_mode: u8,
+        key_pair: &KeyPair,
+        particle_id: String,
+    ) -> LocalBoxFuture<'this, Result<RawAVMOutcome>>;
+}

Required Methods§

source

fn call_tracing<'this>( + &'this mut self, + air: String, + prev_data: Vec<u8>, + data: Vec<u8>, + init_peer_id: String, + timestamp: u64, + ttl: u32, + current_peer_id: String, + call_results: CallResults, + tracing_params: String, + tracing_output_mode: u8, + key_pair: &KeyPair, + particle_id: String, +) -> LocalBoxFuture<'this, Result<RawAVMOutcome>>

Implementors§

\ No newline at end of file diff --git a/air/trace/run/runner/trait.DataToHumanReadable.html b/air/trace/run/runner/trait.DataToHumanReadable.html new file mode 100644 index 00000000..33fc5000 --- /dev/null +++ b/air/trace/run/runner/trait.DataToHumanReadable.html @@ -0,0 +1,10 @@ +DataToHumanReadable in air::trace::run::runner - Rust

Trait air::trace::run::runner::DataToHumanReadable

source ·
pub(crate) trait DataToHumanReadable {
+    // Required method
+    fn to_human_readable<'this>(
+        &'this mut self,
+        data: Vec<u8>,
+    ) -> LocalBoxFuture<'this, Result<String, Box<dyn StdError>>>;
+}

Required Methods§

source

fn to_human_readable<'this>( + &'this mut self, + data: Vec<u8>, +) -> LocalBoxFuture<'this, Result<String, Box<dyn StdError>>>

Implementors§

\ No newline at end of file diff --git a/air/trace/run/sidebar-items.js b/air/trace/run/sidebar-items.js new file mode 100644 index 00000000..d402c7c3 --- /dev/null +++ b/air/trace/run/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"enum":["Mode","Source"],"fn":["create_runner","init_tracing","load_data","load_data_or_default","load_keypair_ed25519","read_call_results","run"],"mod":["data","native","runner","wasm"],"struct":["Args","Keys","ModeArgs"]}; \ No newline at end of file diff --git a/air/trace/run/struct.Args.html b/air/trace/run/struct.Args.html new file mode 100644 index 00000000..9c835ede --- /dev/null +++ b/air/trace/run/struct.Args.html @@ -0,0 +1,60 @@ +Args in air::trace::run - Rust

Struct air::trace::run::Args

source ·
pub(crate) struct Args {
+    call_results_path: Option<PathBuf>,
+    max_heap_size: Option<u64>,
+    tracing_params: String,
+    runner_tracing_params: String,
+    mode: ModeArgs,
+    air_interpreter_path: PathBuf,
+    air_near_contract_path: PathBuf,
+    repeat: Option<u32>,
+    json: bool,
+    no_fail: bool,
+    keys: Keys,
+    source: Source,
+}

Fields§

§call_results_path: Option<PathBuf>§max_heap_size: Option<u64>§tracing_params: String§runner_tracing_params: String§mode: ModeArgs§air_interpreter_path: PathBuf§air_near_contract_path: PathBuf§repeat: Option<u32>§json: bool§no_fail: bool§keys: Keys§source: Source

Trait Implementations§

source§

impl Args for Args

source§

fn group_id() -> Option<Id>

Report the [ArgGroup::id][crate::ArgGroup::id] for this set of arguments
source§

fn augment_args<'b>(__clap_app: Command) -> Command

Append to [Command] so it can instantiate Self. Read more
source§

fn augment_args_for_update<'b>(__clap_app: Command) -> Command

Append to [Command] so it can update self. Read more
source§

impl CommandFactory for Args

source§

fn command<'b>() -> Command

Build a [Command] that can instantiate Self. Read more
source§

fn command_for_update<'b>() -> Command

Build a [Command] that can update self. Read more
source§

impl Debug for Args

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl FromArgMatches for Args

source§

fn from_arg_matches(__clap_arg_matches: &ArgMatches) -> Result<Self, Error>

Instantiate Self from [ArgMatches], parsing the arguments as needed. Read more
source§

fn from_arg_matches_mut( + __clap_arg_matches: &mut ArgMatches, +) -> Result<Self, Error>

Instantiate Self from [ArgMatches], parsing the arguments as needed. Read more
source§

fn update_from_arg_matches( + &mut self, + __clap_arg_matches: &ArgMatches, +) -> Result<(), Error>

Assign values from ArgMatches to self.
source§

fn update_from_arg_matches_mut( + &mut self, + __clap_arg_matches: &mut ArgMatches, +) -> Result<(), Error>

Assign values from ArgMatches to self.
source§

impl Parser for Args

§

fn parse() -> Self

Parse from std::env::args_os(), exit on error
§

fn try_parse() -> Result<Self, Error>

Parse from std::env::args_os(), return Err on error.
§

fn parse_from<I, T>(itr: I) -> Self
where + I: IntoIterator<Item = T>, + T: Into<OsString> + Clone,

Parse from iterator, exit on error
§

fn try_parse_from<I, T>(itr: I) -> Result<Self, Error>
where + I: IntoIterator<Item = T>, + T: Into<OsString> + Clone,

Parse from iterator, return Err on error.
§

fn update_from<I, T>(&mut self, itr: I)
where + I: IntoIterator<Item = T>, + T: Into<OsString> + Clone,

Update from iterator, exit on error
§

fn try_update_from<I, T>(&mut self, itr: I) -> Result<(), Error>
where + I: IntoIterator<Item = T>, + T: Into<OsString> + Clone,

Update from iterator, return Err on error.

Auto Trait Implementations§

§

impl Freeze for Args

§

impl RefUnwindSafe for Args

§

impl Send for Args

§

impl Sync for Args

§

impl Unpin for Args

§

impl UnwindSafe for Args

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air/trace/run/struct.Keys.html b/air/trace/run/struct.Keys.html new file mode 100644 index 00000000..207fb045 --- /dev/null +++ b/air/trace/run/struct.Keys.html @@ -0,0 +1,42 @@ +Keys in air::trace::run - Rust

Struct air::trace::run::Keys

source ·
struct Keys {
+    random_key: bool,
+    ed25519_key: Option<PathBuf>,
+}

Fields§

§random_key: bool§ed25519_key: Option<PathBuf>

Implementations§

source§

impl Keys

source

fn get_keypair(&self) -> Result<KeyPair>

Trait Implementations§

source§

impl Args for Keys

source§

fn group_id() -> Option<Id>

Report the [ArgGroup::id][crate::ArgGroup::id] for this set of arguments
source§

fn augment_args<'b>(__clap_app: Command) -> Command

Append to [Command] so it can instantiate Self. Read more
source§

fn augment_args_for_update<'b>(__clap_app: Command) -> Command

Append to [Command] so it can update self. Read more
source§

impl Debug for Keys

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl FromArgMatches for Keys

source§

fn from_arg_matches(__clap_arg_matches: &ArgMatches) -> Result<Self, Error>

Instantiate Self from [ArgMatches], parsing the arguments as needed. Read more
source§

fn from_arg_matches_mut( + __clap_arg_matches: &mut ArgMatches, +) -> Result<Self, Error>

Instantiate Self from [ArgMatches], parsing the arguments as needed. Read more
source§

fn update_from_arg_matches( + &mut self, + __clap_arg_matches: &ArgMatches, +) -> Result<(), Error>

Assign values from ArgMatches to self.
source§

fn update_from_arg_matches_mut( + &mut self, + __clap_arg_matches: &mut ArgMatches, +) -> Result<(), Error>

Assign values from ArgMatches to self.

Auto Trait Implementations§

§

impl Freeze for Keys

§

impl RefUnwindSafe for Keys

§

impl Send for Keys

§

impl Sync for Keys

§

impl Unpin for Keys

§

impl UnwindSafe for Keys

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air/trace/run/struct.ModeArgs.html b/air/trace/run/struct.ModeArgs.html new file mode 100644 index 00000000..add6f222 --- /dev/null +++ b/air/trace/run/struct.ModeArgs.html @@ -0,0 +1,45 @@ +ModeArgs in air::trace::run - Rust

Struct air::trace::run::ModeArgs

source ·
struct ModeArgs {
+    native: bool,
+    wasm: bool,
+}

Fields§

§native: bool§wasm: bool

Trait Implementations§

source§

impl Args for ModeArgs

source§

fn group_id() -> Option<Id>

Report the [ArgGroup::id][crate::ArgGroup::id] for this set of arguments
source§

fn augment_args<'b>(__clap_app: Command) -> Command

Append to [Command] so it can instantiate Self. Read more
source§

fn augment_args_for_update<'b>(__clap_app: Command) -> Command

Append to [Command] so it can update self. Read more
source§

impl Clone for ModeArgs

source§

fn clone(&self) -> ModeArgs

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for ModeArgs

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl From<ModeArgs> for Option<Mode>

source§

fn from(value: ModeArgs) -> Self

Converts to this type from the input type.
source§

impl FromArgMatches for ModeArgs

source§

fn from_arg_matches(__clap_arg_matches: &ArgMatches) -> Result<Self, Error>

Instantiate Self from [ArgMatches], parsing the arguments as needed. Read more
source§

fn from_arg_matches_mut( + __clap_arg_matches: &mut ArgMatches, +) -> Result<Self, Error>

Instantiate Self from [ArgMatches], parsing the arguments as needed. Read more
source§

fn update_from_arg_matches( + &mut self, + __clap_arg_matches: &ArgMatches, +) -> Result<(), Error>

Assign values from ArgMatches to self.
source§

fn update_from_arg_matches_mut( + &mut self, + __clap_arg_matches: &mut ArgMatches, +) -> Result<(), Error>

Assign values from ArgMatches to self.
source§

impl Copy for ModeArgs

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
source§

impl<T> CloneToUninit for T
where + T: Copy,

source§

unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air/trace/run/wasm/fn.create_wasm_avm_runner.html b/air/trace/run/wasm/fn.create_wasm_avm_runner.html new file mode 100644 index 00000000..cbda95aa --- /dev/null +++ b/air/trace/run/wasm/fn.create_wasm_avm_runner.html @@ -0,0 +1,5 @@ +create_wasm_avm_runner in air::trace::run::wasm - Rust

Function air::trace::run::wasm::create_wasm_avm_runner

source ·
pub(crate) async fn create_wasm_avm_runner(
+    air_interpreter_wasm_path: &Path,
+    max_heap_size: Option<u64>,
+    test_init_parameters: TestInitParameters,
+) -> Result<Box<WasmAvmRunner>>
\ No newline at end of file diff --git a/air/trace/run/wasm/index.html b/air/trace/run/wasm/index.html new file mode 100644 index 00000000..6ead002f --- /dev/null +++ b/air/trace/run/wasm/index.html @@ -0,0 +1 @@ +air::trace::run::wasm - Rust

Module air::trace::run::wasm

source ·

Structs§

Functions§

\ No newline at end of file diff --git a/air/trace/run/wasm/sidebar-items.js b/air/trace/run/wasm/sidebar-items.js new file mode 100644 index 00000000..a049360d --- /dev/null +++ b/air/trace/run/wasm/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"fn":["create_wasm_avm_runner"],"struct":["WasmAvmRunner"]}; \ No newline at end of file diff --git a/air/trace/run/wasm/struct.WasmAvmRunner.html b/air/trace/run/wasm/struct.WasmAvmRunner.html new file mode 100644 index 00000000..0dc9445b --- /dev/null +++ b/air/trace/run/wasm/struct.WasmAvmRunner.html @@ -0,0 +1,48 @@ +WasmAvmRunner in air::trace::run::wasm - Rust

Struct air::trace::run::wasm::WasmAvmRunner

source ·
pub(crate) struct WasmAvmRunner(AVMRunner<WasmtimeWasmBackend>);

Tuple Fields§

§0: AVMRunner<WasmtimeWasmBackend>

Trait Implementations§

source§

impl AirRunner for WasmAvmRunner

source§

fn call_tracing<'this>( + &'this mut self, + air: String, + prev_data: Vec<u8>, + data: Vec<u8>, + init_peer_id: String, + timestamp: u64, + ttl: u32, + current_peer_id: String, + call_results: CallResults, + tracing_params: String, + tracing_output_mode: u8, + keypair: &KeyPair, + particle_id: String, +) -> LocalBoxFuture<'this, Result<RawAVMOutcome>>

source§

impl DataToHumanReadable for WasmAvmRunner

source§

fn to_human_readable<'this>( + &'this mut self, + data: Vec<u8>, +) -> LocalBoxFuture<'this, Result<String, Box<dyn StdError>>>

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air/trace/sidebar-items.js b/air/trace/sidebar-items.js new file mode 100644 index 00000000..1f348200 --- /dev/null +++ b/air/trace/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"mod":["run","stats","utils"]}; \ No newline at end of file diff --git a/air/trace/stats/fn.print_log_record.html b/air/trace/stats/fn.print_log_record.html new file mode 100644 index 00000000..db957dd4 --- /dev/null +++ b/air/trace/stats/fn.print_log_record.html @@ -0,0 +1 @@ +print_log_record in air::trace::stats - Rust

Function air::trace::stats::print_log_record

source ·
fn print_log_record<W: Write>(out: W, log_record: &LogRecord) -> Result<()>
\ No newline at end of file diff --git a/air/trace/stats/fn.read_logs.html b/air/trace/stats/fn.read_logs.html new file mode 100644 index 00000000..ca6ae2a6 --- /dev/null +++ b/air/trace/stats/fn.read_logs.html @@ -0,0 +1 @@ +read_logs in air::trace::stats - Rust

Function air::trace::stats::read_logs

source ·
fn read_logs<R: BufRead>(input: R) -> impl Iterator<Item = Result<LogRecord>>
\ No newline at end of file diff --git a/air/trace/stats/fn.stats.html b/air/trace/stats/fn.stats.html new file mode 100644 index 00000000..e764994d --- /dev/null +++ b/air/trace/stats/fn.stats.html @@ -0,0 +1 @@ +stats in air::trace::stats - Rust

Function air::trace::stats::stats

source ·
pub(crate) fn stats(args: Args) -> Result<()>
\ No newline at end of file diff --git a/air/trace/stats/index.html b/air/trace/stats/index.html new file mode 100644 index 00000000..1f9a9aad --- /dev/null +++ b/air/trace/stats/index.html @@ -0,0 +1 @@ +air::trace::stats - Rust

Module air::trace::stats

source ·

Modules§

Structs§

Functions§

\ No newline at end of file diff --git a/air/trace/stats/log_data/enum.Message.html b/air/trace/stats/log_data/enum.Message.html new file mode 100644 index 00000000..70fa597f --- /dev/null +++ b/air/trace/stats/log_data/enum.Message.html @@ -0,0 +1,38 @@ +Message in air::trace::stats::log_data - Rust

Enum air::trace::stats::log_data::Message

source ·
pub(crate) enum Message {
+    New,
+    Enter,
+    Close(CloseMessage),
+}

Variants§

§

New

§

Enter

§

Close(CloseMessage)

Trait Implementations§

source§

impl Debug for Message

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'de> Deserialize<'de> for Message

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl Display for Message

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air/trace/stats/log_data/fn.format_argument.html b/air/trace/stats/log_data/fn.format_argument.html new file mode 100644 index 00000000..6e0884a3 --- /dev/null +++ b/air/trace/stats/log_data/fn.format_argument.html @@ -0,0 +1 @@ +format_argument in air::trace::stats::log_data - Rust

Function air::trace::stats::log_data::format_argument

source ·
fn format_argument(val: &Value) -> String
\ No newline at end of file diff --git a/air/trace/stats/log_data/index.html b/air/trace/stats/log_data/index.html new file mode 100644 index 00000000..66bd55ef --- /dev/null +++ b/air/trace/stats/log_data/index.html @@ -0,0 +1 @@ +air::trace::stats::log_data - Rust

Module air::trace::stats::log_data

source ·

Structs§

Enums§

Functions§

\ No newline at end of file diff --git a/air/trace/stats/log_data/sidebar-items.js b/air/trace/stats/log_data/sidebar-items.js new file mode 100644 index 00000000..2483dbe9 --- /dev/null +++ b/air/trace/stats/log_data/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"enum":["Message"],"fn":["format_argument"],"struct":["CloseMessage","LogKey","LogRecord","LogValue","Span"]}; \ No newline at end of file diff --git a/air/trace/stats/log_data/struct.CloseMessage.html b/air/trace/stats/log_data/struct.CloseMessage.html new file mode 100644 index 00000000..af63d3b7 --- /dev/null +++ b/air/trace/stats/log_data/struct.CloseMessage.html @@ -0,0 +1,37 @@ +CloseMessage in air::trace::stats::log_data - Rust

Struct air::trace::stats::log_data::CloseMessage

source ·
pub(crate) struct CloseMessage {
+    pub(crate) time_busy: String,
+    pub(crate) time_idle: String,
+}

Fields§

§time_busy: String§time_idle: String

Trait Implementations§

source§

impl Debug for CloseMessage

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'de> Deserialize<'de> for CloseMessage

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl Display for CloseMessage

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air/trace/stats/log_data/struct.LogKey.html b/air/trace/stats/log_data/struct.LogKey.html new file mode 100644 index 00000000..b914ec76 --- /dev/null +++ b/air/trace/stats/log_data/struct.LogKey.html @@ -0,0 +1,56 @@ +LogKey in air::trace::stats::log_data - Rust

Struct air::trace::stats::log_data::LogKey

source ·
pub(crate) struct LogKey {
+    pub(crate) target: String,
+    pub(crate) span_name: String,
+}

Fields§

§target: String§span_name: String

Trait Implementations§

source§

impl Hash for LogKey

source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
source§

impl Ord for LogKey

source§

fn cmp(&self, other: &LogKey) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · source§

fn max(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · source§

fn min(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · source§

fn clamp(self, min: Self, max: Self) -> Self
where + Self: Sized + PartialOrd,

Restrict a value to a certain interval. Read more
source§

impl PartialEq for LogKey

source§

fn eq(&self, other: &LogKey) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl PartialOrd for LogKey

source§

fn partial_cmp(&self, other: &LogKey) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · source§

fn lt(&self, other: &Rhs) -> bool

This method tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · source§

fn le(&self, other: &Rhs) -> bool

This method tests less than or equal to (for self and other) and is used by the <= +operator. Read more
1.0.0 · source§

fn gt(&self, other: &Rhs) -> bool

This method tests greater than (for self and other) and is used by the > operator. Read more
1.0.0 · source§

fn ge(&self, other: &Rhs) -> bool

This method tests greater than or equal to (for self and other) and is used by the >= +operator. Read more
source§

impl Eq for LogKey

source§

impl StructuralPartialEq for LogKey

Auto Trait Implementations§

§

impl Freeze for LogKey

§

impl RefUnwindSafe for LogKey

§

impl Send for LogKey

§

impl Sync for LogKey

§

impl Unpin for LogKey

§

impl UnwindSafe for LogKey

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CallHasher for T
where + T: Hash + ?Sized,

§

default fn get_hash<H, B>(value: &H, build_hasher: &B) -> u64
where + H: Hash + ?Sized, + B: BuildHasher,

§

impl<Q, K> Comparable<K> for Q
where + Q: Ord + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn compare(&self, key: &K) -> Ordering

Compare self to key and return their ordering.
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air/trace/stats/log_data/struct.LogRecord.html b/air/trace/stats/log_data/struct.LogRecord.html new file mode 100644 index 00000000..3ec8578f --- /dev/null +++ b/air/trace/stats/log_data/struct.LogRecord.html @@ -0,0 +1,37 @@ +LogRecord in air::trace::stats::log_data - Rust

Struct air::trace::stats::log_data::LogRecord

source ·
pub(crate) struct LogRecord {
+    pub(crate) target: String,
+    pub(crate) span: Span,
+    pub(crate) value: LogValue,
+}

Fields§

§target: String§span: Span§value: LogValue

Implementations§

source§

impl LogRecord

source

pub(crate) fn get_key(&self) -> LogKey

Trait Implementations§

source§

impl<'de> Deserialize<'de> for LogRecord

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air/trace/stats/log_data/struct.LogValue.html b/air/trace/stats/log_data/struct.LogValue.html new file mode 100644 index 00000000..fdd49041 --- /dev/null +++ b/air/trace/stats/log_data/struct.LogValue.html @@ -0,0 +1,38 @@ +LogValue in air::trace::stats::log_data - Rust

Struct air::trace::stats::log_data::LogValue

source ·
pub(crate) struct LogValue {
+    pub(crate) timestamp: String,
+    pub(crate) fields: Message,
+    pub(crate) level: String,
+    pub(crate) spans: Vec<Span>,
+}

Fields§

§timestamp: String§fields: Message§level: String§spans: Vec<Span>

Trait Implementations§

source§

impl<'de> Deserialize<'de> for LogValue

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air/trace/stats/log_data/struct.Span.html b/air/trace/stats/log_data/struct.Span.html new file mode 100644 index 00000000..ea62179b --- /dev/null +++ b/air/trace/stats/log_data/struct.Span.html @@ -0,0 +1,37 @@ +Span in air::trace::stats::log_data - Rust

Struct air::trace::stats::log_data::Span

source ·
pub(crate) struct Span {
+    pub(crate) name: String,
+    pub(crate) args: HashMap<String, Value>,
+}

Fields§

§name: String§args: HashMap<String, Value>

Trait Implementations§

source§

impl Debug for Span

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'de> Deserialize<'de> for Span

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl Display for Span

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

§

impl Freeze for Span

§

impl RefUnwindSafe for Span

§

impl Send for Span

§

impl Sync for Span

§

impl Unpin for Span

§

impl UnwindSafe for Span

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air/trace/stats/report/index.html b/air/trace/stats/report/index.html new file mode 100644 index 00000000..217c699b --- /dev/null +++ b/air/trace/stats/report/index.html @@ -0,0 +1 @@ +air::trace::stats::report - Rust

Module air::trace::stats::report

source ·

Structs§

\ No newline at end of file diff --git a/air/trace/stats/report/sidebar-items.js b/air/trace/stats/report/sidebar-items.js new file mode 100644 index 00000000..873407c5 --- /dev/null +++ b/air/trace/stats/report/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"struct":["StatsReport"]}; \ No newline at end of file diff --git a/air/trace/stats/report/struct.StatsReport.html b/air/trace/stats/report/struct.StatsReport.html new file mode 100644 index 00000000..2bd0e013 --- /dev/null +++ b/air/trace/stats/report/struct.StatsReport.html @@ -0,0 +1,37 @@ +StatsReport in air::trace::stats::report - Rust

Struct air::trace::stats::report::StatsReport

source ·
pub(crate) struct StatsReport {
+    data: HashMap<LogKey, Duration>,
+}

Fields§

§data: HashMap<LogKey, Duration>

Implementations§

source§

impl StatsReport

source

pub(crate) fn new() -> Self

source

pub(crate) fn report<W: Write>( + self, + out: W, + sort_stats_by_duration: bool, +) -> Result<()>

source

pub(crate) fn consider(&mut self, rec: LogRecord) -> Result<()>

Trait Implementations§

source§

impl Default for StatsReport

source§

fn default() -> StatsReport

Returns the “default value” for a type. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air/trace/stats/sidebar-items.js b/air/trace/stats/sidebar-items.js new file mode 100644 index 00000000..c6ac76be --- /dev/null +++ b/air/trace/stats/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"fn":["print_log_record","read_logs","stats"],"mod":["log_data","report"],"struct":["Args"]}; \ No newline at end of file diff --git a/air/trace/stats/struct.Args.html b/air/trace/stats/struct.Args.html new file mode 100644 index 00000000..4b0a3b28 --- /dev/null +++ b/air/trace/stats/struct.Args.html @@ -0,0 +1,51 @@ +Args in air::trace::stats - Rust

Struct air::trace::stats::Args

source ·
pub(crate) struct Args {
+    pretty: bool,
+    stats: bool,
+    sort_stats_by_duration: bool,
+}

Fields§

§pretty: bool§stats: bool§sort_stats_by_duration: bool

Trait Implementations§

source§

impl Args for Args

source§

fn group_id() -> Option<Id>

Report the [ArgGroup::id][crate::ArgGroup::id] for this set of arguments
source§

fn augment_args<'b>(__clap_app: Command) -> Command

Append to [Command] so it can instantiate Self. Read more
source§

fn augment_args_for_update<'b>(__clap_app: Command) -> Command

Append to [Command] so it can update self. Read more
source§

impl CommandFactory for Args

source§

fn command<'b>() -> Command

Build a [Command] that can instantiate Self. Read more
source§

fn command_for_update<'b>() -> Command

Build a [Command] that can update self. Read more
source§

impl FromArgMatches for Args

source§

fn from_arg_matches(__clap_arg_matches: &ArgMatches) -> Result<Self, Error>

Instantiate Self from [ArgMatches], parsing the arguments as needed. Read more
source§

fn from_arg_matches_mut( + __clap_arg_matches: &mut ArgMatches, +) -> Result<Self, Error>

Instantiate Self from [ArgMatches], parsing the arguments as needed. Read more
source§

fn update_from_arg_matches( + &mut self, + __clap_arg_matches: &ArgMatches, +) -> Result<(), Error>

Assign values from ArgMatches to self.
source§

fn update_from_arg_matches_mut( + &mut self, + __clap_arg_matches: &mut ArgMatches, +) -> Result<(), Error>

Assign values from ArgMatches to self.
source§

impl Parser for Args

§

fn parse() -> Self

Parse from std::env::args_os(), exit on error
§

fn try_parse() -> Result<Self, Error>

Parse from std::env::args_os(), return Err on error.
§

fn parse_from<I, T>(itr: I) -> Self
where + I: IntoIterator<Item = T>, + T: Into<OsString> + Clone,

Parse from iterator, exit on error
§

fn try_parse_from<I, T>(itr: I) -> Result<Self, Error>
where + I: IntoIterator<Item = T>, + T: Into<OsString> + Clone,

Parse from iterator, return Err on error.
§

fn update_from<I, T>(&mut self, itr: I)
where + I: IntoIterator<Item = T>, + T: Into<OsString> + Clone,

Update from iterator, exit on error
§

fn try_update_from<I, T>(&mut self, itr: I) -> Result<(), Error>
where + I: IntoIterator<Item = T>, + T: Into<OsString> + Clone,

Update from iterator, return Err on error.

Auto Trait Implementations§

§

impl Freeze for Args

§

impl RefUnwindSafe for Args

§

impl Send for Args

§

impl Sync for Args

§

impl Unpin for Args

§

impl UnwindSafe for Args

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air/trace/utils/fn.parse_tracing_duration.html b/air/trace/utils/fn.parse_tracing_duration.html new file mode 100644 index 00000000..d6cb8279 --- /dev/null +++ b/air/trace/utils/fn.parse_tracing_duration.html @@ -0,0 +1 @@ +parse_tracing_duration in air::trace::utils - Rust

Function air::trace::utils::parse_tracing_duration

source ·
pub(crate) fn parse_tracing_duration(input: &str) -> Result<Duration, Error>
\ No newline at end of file diff --git a/air/trace/utils/fn.unix_timestamp_now.html b/air/trace/utils/fn.unix_timestamp_now.html new file mode 100644 index 00000000..49ce1920 --- /dev/null +++ b/air/trace/utils/fn.unix_timestamp_now.html @@ -0,0 +1 @@ +unix_timestamp_now in air::trace::utils - Rust

Function air::trace::utils::unix_timestamp_now

source ·
pub(crate) fn unix_timestamp_now() -> u64
\ No newline at end of file diff --git a/air/trace/utils/index.html b/air/trace/utils/index.html new file mode 100644 index 00000000..9f07074e --- /dev/null +++ b/air/trace/utils/index.html @@ -0,0 +1 @@ +air::trace::utils - Rust

Module air::trace::utils

source ·

Functions§

\ No newline at end of file diff --git a/air/trace/utils/sidebar-items.js b/air/trace/utils/sidebar-items.js new file mode 100644 index 00000000..edbee081 --- /dev/null +++ b/air/trace/utils/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"fn":["parse_tracing_duration","unix_timestamp_now"]}; \ No newline at end of file diff --git a/air_beautifier/all.html b/air_beautifier/all.html new file mode 100644 index 00000000..fab294e0 --- /dev/null +++ b/air_beautifier/all.html @@ -0,0 +1 @@ +List of all items in this crate

List of all items

Structs

Enums

Functions

Constants

\ No newline at end of file diff --git a/air_beautifier/beautifier/constant.DEFAULT_INDENT_STEP.html b/air_beautifier/beautifier/constant.DEFAULT_INDENT_STEP.html new file mode 100644 index 00000000..57d36d06 --- /dev/null +++ b/air_beautifier/beautifier/constant.DEFAULT_INDENT_STEP.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_beautifier/constant.DEFAULT_INDENT_STEP.html...

+ + + \ No newline at end of file diff --git a/air_beautifier/beautifier/enum.BeautifyError.html b/air_beautifier/beautifier/enum.BeautifyError.html new file mode 100644 index 00000000..e8a94739 --- /dev/null +++ b/air_beautifier/beautifier/enum.BeautifyError.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_beautifier/enum.BeautifyError.html...

+ + + \ No newline at end of file diff --git a/air_beautifier/beautifier/struct.Beautifier.html b/air_beautifier/beautifier/struct.Beautifier.html new file mode 100644 index 00000000..cf053a4c --- /dev/null +++ b/air_beautifier/beautifier/struct.Beautifier.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_beautifier/struct.Beautifier.html...

+ + + \ No newline at end of file diff --git a/air_beautifier/constant.DEFAULT_INDENT_STEP.html b/air_beautifier/constant.DEFAULT_INDENT_STEP.html new file mode 100644 index 00000000..175ca2e1 --- /dev/null +++ b/air_beautifier/constant.DEFAULT_INDENT_STEP.html @@ -0,0 +1 @@ +DEFAULT_INDENT_STEP in air_beautifier - Rust

Constant air_beautifier::DEFAULT_INDENT_STEP

source ·
pub const DEFAULT_INDENT_STEP: usize = 4;
\ No newline at end of file diff --git a/air_beautifier/enum.BeautifyError.html b/air_beautifier/enum.BeautifyError.html new file mode 100644 index 00000000..0d87f64b --- /dev/null +++ b/air_beautifier/enum.BeautifyError.html @@ -0,0 +1,21 @@ +BeautifyError in air_beautifier - Rust

Enum air_beautifier::BeautifyError

source ·
pub enum BeautifyError {
+    Parse(String),
+    Io(Error),
+}
Expand description

Error produced by the Beautifier.

+

Variants§

§

Parse(String)

§

Io(Error)

Trait Implementations§

source§

impl Debug for BeautifyError

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Display for BeautifyError

source§

fn fmt(&self, __formatter: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Error for BeautifyError

source§

fn source(&self) -> Option<&(dyn Error + 'static)>

The lower-level source of this error, if any. Read more
1.0.0 · source§

fn description(&self) -> &str

👎Deprecated since 1.42.0: use the Display impl or to_string()
1.0.0 · source§

fn cause(&self) -> Option<&dyn Error>

👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
source§

fn provide<'a>(&'a self, request: &mut Request<'a>)

🔬This is a nightly-only experimental API. (error_generic_member_access)
Provides type based access to context intended for error reports. Read more
source§

impl From<Error> for BeautifyError

source§

fn from(source: Error) -> Self

Converts to this type from the input type.

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_beautifier/fn.beautify.html b/air_beautifier/fn.beautify.html new file mode 100644 index 00000000..934a154d --- /dev/null +++ b/air_beautifier/fn.beautify.html @@ -0,0 +1,6 @@ +beautify in air_beautifier - Rust

Function air_beautifier::beautify

source ·
pub fn beautify(
+    air_script: &str,
+    output: &mut impl Write,
+    enable_patterns: bool,
+) -> Result<(), BeautifyError>
Expand description

Beautify the air_script with default settings to the output.

+
\ No newline at end of file diff --git a/air_beautifier/fn.beautify_to_string.html b/air_beautifier/fn.beautify_to_string.html new file mode 100644 index 00000000..c3de6064 --- /dev/null +++ b/air_beautifier/fn.beautify_to_string.html @@ -0,0 +1,3 @@ +beautify_to_string in air_beautifier - Rust

Function air_beautifier::beautify_to_string

source ·
pub fn beautify_to_string(air_script: &str) -> Result<String, String>
Expand description

Beautify the air_script to a string with default settings. +Return error on parsing error.

+
\ No newline at end of file diff --git a/air_beautifier/index.html b/air_beautifier/index.html new file mode 100644 index 00000000..a77bd5cf --- /dev/null +++ b/air_beautifier/index.html @@ -0,0 +1,2 @@ +air_beautifier - Rust

Crate air_beautifier

source ·

Structs§

Enums§

Constants§

Functions§

  • Beautify the air_script with default settings to the output.
  • Beautify the air_script to a string with default settings. +Return error on parsing error.
\ No newline at end of file diff --git a/air_beautifier/sidebar-items.js b/air_beautifier/sidebar-items.js new file mode 100644 index 00000000..cbb6a000 --- /dev/null +++ b/air_beautifier/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"constant":["DEFAULT_INDENT_STEP"],"enum":["BeautifyError"],"fn":["beautify","beautify_to_string"],"struct":["Beautifier"]}; \ No newline at end of file diff --git a/air_beautifier/struct.Beautifier.html b/air_beautifier/struct.Beautifier.html new file mode 100644 index 00000000..092d84ae --- /dev/null +++ b/air_beautifier/struct.Beautifier.html @@ -0,0 +1,32 @@ +Beautifier in air_beautifier - Rust

Struct air_beautifier::Beautifier

source ·
pub struct Beautifier<W: Write> { /* private fields */ }
Expand description

AIR beautifier.

+

Implementations§

source§

impl<W: Write> Beautifier<W>

source

pub fn new(output: W) -> Self

Beautifier for the output with default indentation step.

+
source

pub fn new_with_indent(output: W, indent_step: usize) -> Self

Beautifier for the output with custom indentation step.

+
source

pub fn enable_all_patterns(self) -> Self

Enable all patterns in the emited code.

+
source

pub fn enable_try_hopon(self) -> Self

source

pub fn into_inner(self) -> W

Unwrap the Beautifier into the underlying writer.

+
source

pub fn beautify(&mut self, air_script: &str) -> Result<(), BeautifyError>

Emit beautified code for the air_script.

+
source

pub fn beautify_ast( + &mut self, + ast: &Instruction<'_>, +) -> Result<(), BeautifyError>

Emit beautified code for the ast.

+

Auto Trait Implementations§

§

impl<W> Freeze for Beautifier<W>
where + W: Freeze,

§

impl<W> RefUnwindSafe for Beautifier<W>
where + W: RefUnwindSafe,

§

impl<W> Send for Beautifier<W>
where + W: Send,

§

impl<W> Sync for Beautifier<W>
where + W: Sync,

§

impl<W> Unpin for Beautifier<W>
where + W: Unpin,

§

impl<W> UnwindSafe for Beautifier<W>
where + W: UnwindSafe,

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_beautify_wasm/all.html b/air_beautify_wasm/all.html new file mode 100644 index 00000000..134a523f --- /dev/null +++ b/air_beautify_wasm/all.html @@ -0,0 +1 @@ +List of all items in this crate

List of all items

Functions

\ No newline at end of file diff --git a/air_beautify_wasm/fn.beautify.html b/air_beautify_wasm/fn.beautify.html new file mode 100644 index 00000000..7f581f96 --- /dev/null +++ b/air_beautify_wasm/fn.beautify.html @@ -0,0 +1 @@ +beautify in air_beautify_wasm - Rust

Function air_beautify_wasm::beautify

source ·
pub fn beautify(air_script: String) -> Result<String, JsError>
\ No newline at end of file diff --git a/air_beautify_wasm/fn.beautify_raw.html b/air_beautify_wasm/fn.beautify_raw.html new file mode 100644 index 00000000..e297e2f2 --- /dev/null +++ b/air_beautify_wasm/fn.beautify_raw.html @@ -0,0 +1 @@ +beautify_raw in air_beautify_wasm - Rust

Function air_beautify_wasm::beautify_raw

source ·
pub fn beautify_raw(air_script: String) -> Result<String, JsError>
\ No newline at end of file diff --git a/air_beautify_wasm/index.html b/air_beautify_wasm/index.html new file mode 100644 index 00000000..e729fd72 --- /dev/null +++ b/air_beautify_wasm/index.html @@ -0,0 +1 @@ +air_beautify_wasm - Rust

Crate air_beautify_wasm

source ·

Functions§

\ No newline at end of file diff --git a/air_beautify_wasm/sidebar-items.js b/air_beautify_wasm/sidebar-items.js new file mode 100644 index 00000000..3e186d31 --- /dev/null +++ b/air_beautify_wasm/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"fn":["beautify","beautify_raw"]}; \ No newline at end of file diff --git a/air_execution_info_collector/all.html b/air_execution_info_collector/all.html new file mode 100644 index 00000000..e6a612cf --- /dev/null +++ b/air_execution_info_collector/all.html @@ -0,0 +1 @@ +List of all items in this crate
\ No newline at end of file diff --git a/air_execution_info_collector/index.html b/air_execution_info_collector/index.html new file mode 100644 index 00000000..8c8cbfa7 --- /dev/null +++ b/air_execution_info_collector/index.html @@ -0,0 +1,3 @@ +air_execution_info_collector - Rust

Crate air_execution_info_collector

source ·

Structs§

\ No newline at end of file diff --git a/air_execution_info_collector/instructions_tracker/struct.ApTracker.html b/air_execution_info_collector/instructions_tracker/struct.ApTracker.html new file mode 100644 index 00000000..cd218991 --- /dev/null +++ b/air_execution_info_collector/instructions_tracker/struct.ApTracker.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_execution_info_collector/struct.ApTracker.html...

+ + + \ No newline at end of file diff --git a/air_execution_info_collector/instructions_tracker/struct.CallTracker.html b/air_execution_info_collector/instructions_tracker/struct.CallTracker.html new file mode 100644 index 00000000..ae1bb7cf --- /dev/null +++ b/air_execution_info_collector/instructions_tracker/struct.CallTracker.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_execution_info_collector/struct.CallTracker.html...

+ + + \ No newline at end of file diff --git a/air_execution_info_collector/instructions_tracker/struct.FoldTracker.html b/air_execution_info_collector/instructions_tracker/struct.FoldTracker.html new file mode 100644 index 00000000..402f1145 --- /dev/null +++ b/air_execution_info_collector/instructions_tracker/struct.FoldTracker.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_execution_info_collector/struct.FoldTracker.html...

+ + + \ No newline at end of file diff --git a/air_execution_info_collector/instructions_tracker/struct.InstructionTracker.html b/air_execution_info_collector/instructions_tracker/struct.InstructionTracker.html new file mode 100644 index 00000000..073617ce --- /dev/null +++ b/air_execution_info_collector/instructions_tracker/struct.InstructionTracker.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_execution_info_collector/struct.InstructionTracker.html...

+ + + \ No newline at end of file diff --git a/air_execution_info_collector/instructions_tracker/struct.NewTracker.html b/air_execution_info_collector/instructions_tracker/struct.NewTracker.html new file mode 100644 index 00000000..395524e1 --- /dev/null +++ b/air_execution_info_collector/instructions_tracker/struct.NewTracker.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_execution_info_collector/struct.NewTracker.html...

+ + + \ No newline at end of file diff --git a/air_execution_info_collector/instructions_tracker/struct.ParTracker.html b/air_execution_info_collector/instructions_tracker/struct.ParTracker.html new file mode 100644 index 00000000..1a5959bb --- /dev/null +++ b/air_execution_info_collector/instructions_tracker/struct.ParTracker.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_execution_info_collector/struct.ParTracker.html...

+ + + \ No newline at end of file diff --git a/air_execution_info_collector/sidebar-items.js b/air_execution_info_collector/sidebar-items.js new file mode 100644 index 00000000..ed853086 --- /dev/null +++ b/air_execution_info_collector/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"struct":["ApTracker","CallTracker","FoldTracker","InstructionTracker","NewTracker","ParTracker"]}; \ No newline at end of file diff --git a/air_execution_info_collector/struct.ApTracker.html b/air_execution_info_collector/struct.ApTracker.html new file mode 100644 index 00000000..068fbee2 --- /dev/null +++ b/air_execution_info_collector/struct.ApTracker.html @@ -0,0 +1,21 @@ +ApTracker in air_execution_info_collector - Rust

Struct air_execution_info_collector::ApTracker

source ·
pub struct ApTracker {
+    pub seen_count: u32,
+    pub executed_count: u32,
+}

Fields§

§seen_count: u32§executed_count: u32

Trait Implementations§

source§

impl Debug for ApTracker

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Default for ApTracker

source§

fn default() -> ApTracker

Returns the “default value” for a type. Read more
source§

impl PartialEq for ApTracker

source§

fn eq(&self, other: &ApTracker) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl Eq for ApTracker

source§

impl StructuralPartialEq for ApTracker

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_execution_info_collector/struct.CallTracker.html b/air_execution_info_collector/struct.CallTracker.html new file mode 100644 index 00000000..975d7d47 --- /dev/null +++ b/air_execution_info_collector/struct.CallTracker.html @@ -0,0 +1,21 @@ +CallTracker in air_execution_info_collector - Rust

Struct air_execution_info_collector::CallTracker

source ·
pub struct CallTracker {
+    pub seen_count: u32,
+    pub executed_count: u32,
+}

Fields§

§seen_count: u32§executed_count: u32

Trait Implementations§

source§

impl Debug for CallTracker

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Default for CallTracker

source§

fn default() -> CallTracker

Returns the “default value” for a type. Read more
source§

impl PartialEq for CallTracker

source§

fn eq(&self, other: &CallTracker) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl Eq for CallTracker

source§

impl StructuralPartialEq for CallTracker

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_execution_info_collector/struct.FoldTracker.html b/air_execution_info_collector/struct.FoldTracker.html new file mode 100644 index 00000000..fdc9c05f --- /dev/null +++ b/air_execution_info_collector/struct.FoldTracker.html @@ -0,0 +1,21 @@ +FoldTracker in air_execution_info_collector - Rust

Struct air_execution_info_collector::FoldTracker

source ·
pub struct FoldTracker {
+    pub seen_scalar_count: u32,
+    pub seen_stream_count: u32,
+}

Fields§

§seen_scalar_count: u32§seen_stream_count: u32

Trait Implementations§

source§

impl Debug for FoldTracker

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Default for FoldTracker

source§

fn default() -> FoldTracker

Returns the “default value” for a type. Read more
source§

impl PartialEq for FoldTracker

source§

fn eq(&self, other: &FoldTracker) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl Eq for FoldTracker

source§

impl StructuralPartialEq for FoldTracker

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_execution_info_collector/struct.InstructionTracker.html b/air_execution_info_collector/struct.InstructionTracker.html new file mode 100644 index 00000000..6353b080 --- /dev/null +++ b/air_execution_info_collector/struct.InstructionTracker.html @@ -0,0 +1,33 @@ +InstructionTracker in air_execution_info_collector - Rust
pub struct InstructionTracker {
+    pub ap: ApTracker,
+    pub call: CallTracker,
+    pub fold: FoldTracker,
+    pub match_count: u32,
+    pub mismatch_count: u32,
+    pub new_tracker: NewTracker,
+    pub next_count: u32,
+    pub null_count: u32,
+    pub par: ParTracker,
+    pub seq_count: u32,
+    pub xor_count: u32,
+}
Expand description

Intended to track a number of executed instruction of each type. For instructions that +have a corresponding state in data, it tracks number of executed instructions on +current peer (executed) and overall number (seen) of met instructions of such type.

+

Fields§

§ap: ApTracker§call: CallTracker§fold: FoldTracker§match_count: u32§mismatch_count: u32§new_tracker: NewTracker§next_count: u32§null_count: u32§par: ParTracker§seq_count: u32§xor_count: u32

Implementations§

source§

impl InstructionTracker

source

pub fn meet_ap(&mut self)

source

pub fn meet_executed_ap(&mut self)

source

pub fn meet_call(&mut self)

source

pub fn meet_executed_call(&mut self)

source

pub fn meet_fold_scalar(&mut self)

source

pub fn meet_fold_stream(&mut self) -> u32

source

pub fn meet_match(&mut self)

source

pub fn meet_mismatch(&mut self)

source

pub fn meet_next(&mut self)

source

pub fn meet_null(&mut self)

source

pub fn meet_par(&mut self)

source

pub fn meet_executed_par(&mut self)

source

pub fn meet_seq(&mut self)

source

pub fn meet_xor(&mut self)

source

pub fn meet_new(&mut self, position: AirPos)

Trait Implementations§

source§

impl Debug for InstructionTracker

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Default for InstructionTracker

source§

fn default() -> InstructionTracker

Returns the “default value” for a type. Read more
source§

impl PartialEq for InstructionTracker

source§

fn eq(&self, other: &InstructionTracker) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl Eq for InstructionTracker

source§

impl StructuralPartialEq for InstructionTracker

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_execution_info_collector/struct.NewTracker.html b/air_execution_info_collector/struct.NewTracker.html new file mode 100644 index 00000000..c42d5f2b --- /dev/null +++ b/air_execution_info_collector/struct.NewTracker.html @@ -0,0 +1,23 @@ +NewTracker in air_execution_info_collector - Rust

Struct air_execution_info_collector::NewTracker

source ·
pub struct NewTracker {
+    pub executed_count: HashMap<AirPos, u32>,
+}

Fields§

§executed_count: HashMap<AirPos, u32>

Mapping from a new instruction position in a script +to a number of their execution. This is needed to +support private stream generation mappings.

+

Implementations§

source§

impl NewTracker

source

pub fn get_iteration(&self, position: AirPos) -> u32

Trait Implementations§

source§

impl Debug for NewTracker

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Default for NewTracker

source§

fn default() -> NewTracker

Returns the “default value” for a type. Read more
source§

impl PartialEq for NewTracker

source§

fn eq(&self, other: &NewTracker) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl Eq for NewTracker

source§

impl StructuralPartialEq for NewTracker

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_execution_info_collector/struct.ParTracker.html b/air_execution_info_collector/struct.ParTracker.html new file mode 100644 index 00000000..9f57f60a --- /dev/null +++ b/air_execution_info_collector/struct.ParTracker.html @@ -0,0 +1,21 @@ +ParTracker in air_execution_info_collector - Rust

Struct air_execution_info_collector::ParTracker

source ·
pub struct ParTracker {
+    pub seen_count: u32,
+    pub executed_count: u32,
+}

Fields§

§seen_count: u32§executed_count: u32

Trait Implementations§

source§

impl Debug for ParTracker

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Default for ParTracker

source§

fn default() -> ParTracker

Returns the “default value” for a type. Read more
source§

impl PartialEq for ParTracker

source§

fn eq(&self, other: &ParTracker) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl Eq for ParTracker

source§

impl StructuralPartialEq for ParTracker

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_interpreter_cid/all.html b/air_interpreter_cid/all.html new file mode 100644 index 00000000..29a218fc --- /dev/null +++ b/air_interpreter_cid/all.html @@ -0,0 +1 @@ +List of all items in this crate
\ No newline at end of file diff --git a/air_interpreter_cid/enum.CidCalculationError.html b/air_interpreter_cid/enum.CidCalculationError.html new file mode 100644 index 00000000..b5c1e3d4 --- /dev/null +++ b/air_interpreter_cid/enum.CidCalculationError.html @@ -0,0 +1,23 @@ +CidCalculationError in air_interpreter_cid - Rust

Enum air_interpreter_cid::CidCalculationError

source ·
pub enum CidCalculationError {
+    InvalidJson(Error),
+}

Variants§

§

InvalidJson(Error)

Trait Implementations§

source§

impl Debug for CidCalculationError

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Display for CidCalculationError

source§

fn fmt(&self, __formatter: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Error for CidCalculationError

source§

fn source(&self) -> Option<&(dyn Error + 'static)>

The lower-level source of this error, if any. Read more
1.0.0 · source§

fn description(&self) -> &str

👎Deprecated since 1.42.0: use the Display impl or to_string()
1.0.0 · source§

fn cause(&self) -> Option<&dyn Error>

👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
source§

fn provide<'a>(&'a self, request: &mut Request<'a>)

🔬This is a nightly-only experimental API. (error_generic_member_access)
Provides type based access to context intended for error reports. Read more
source§

impl From<Error> for CidCalculationError

source§

fn from(source: Error) -> Self

Converts to this type from the input type.

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
§

impl<T> Error for T
where + T: Error + 'static,

§

fn as_error(&self) -> &(dyn Error + 'static)

Gets this error as an std::error::Error.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/air_interpreter_cid/enum.CidVerificationError.html b/air_interpreter_cid/enum.CidVerificationError.html new file mode 100644 index 00000000..f8d6d2a0 --- /dev/null +++ b/air_interpreter_cid/enum.CidVerificationError.html @@ -0,0 +1,30 @@ +CidVerificationError in air_interpreter_cid - Rust

Enum air_interpreter_cid::CidVerificationError

source ·
pub enum CidVerificationError {
+    ValueMismatch {
+        type_name: &'static str,
+        cid_repr: Rc<CidRef>,
+    },
+    InvalidJson(Error),
+    MalformedCid(Error),
+    UnsupportedCidCodec(u64),
+    UnsupportedHashCode(u64),
+}

Variants§

§

ValueMismatch

Fields

§type_name: &'static str
§cid_repr: Rc<CidRef>
§

InvalidJson(Error)

§

MalformedCid(Error)

§

UnsupportedCidCodec(u64)

§

UnsupportedHashCode(u64)

Trait Implementations§

source§

impl Debug for CidVerificationError

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Display for CidVerificationError

source§

fn fmt(&self, __formatter: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Error for CidVerificationError

source§

fn source(&self) -> Option<&(dyn Error + 'static)>

The lower-level source of this error, if any. Read more
1.0.0 · source§

fn description(&self) -> &str

👎Deprecated since 1.42.0: use the Display impl or to_string()
1.0.0 · source§

fn cause(&self) -> Option<&dyn Error>

👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
source§

fn provide<'a>(&'a self, request: &mut Request<'a>)

🔬This is a nightly-only experimental API. (error_generic_member_access)
Provides type based access to context intended for error reports. Read more
source§

impl From<Error> for CidVerificationError

source§

fn from(source: Error) -> Self

Converts to this type from the input type.
source§

impl From<Error> for CidVerificationError

source§

fn from(source: Error) -> Self

Converts to this type from the input type.

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
§

impl<T> Error for T
where + T: Error + 'static,

§

fn as_error(&self) -> &(dyn Error + 'static)

Gets this error as an std::error::Error.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/air_interpreter_cid/fn.raw_value_to_json_cid.html b/air_interpreter_cid/fn.raw_value_to_json_cid.html new file mode 100644 index 00000000..fe5ef4a3 --- /dev/null +++ b/air_interpreter_cid/fn.raw_value_to_json_cid.html @@ -0,0 +1 @@ +raw_value_to_json_cid in air_interpreter_cid - Rust

Function air_interpreter_cid::raw_value_to_json_cid

source ·
pub fn raw_value_to_json_cid<Val>(raw_value: impl AsRef<[u8]>) -> CID<Val>
\ No newline at end of file diff --git a/air_interpreter_cid/fn.value_to_json_cid.html b/air_interpreter_cid/fn.value_to_json_cid.html new file mode 100644 index 00000000..cf0b40bd --- /dev/null +++ b/air_interpreter_cid/fn.value_to_json_cid.html @@ -0,0 +1,4 @@ +value_to_json_cid in air_interpreter_cid - Rust

Function air_interpreter_cid::value_to_json_cid

source ·
pub fn value_to_json_cid<Val: Serialize + ?Sized>(
+    value: &Val,
+) -> Result<CID<Val>, CidCalculationError>
Expand description

Calculate a CID of JSON-serialized value.

+
\ No newline at end of file diff --git a/air_interpreter_cid/fn.verify_raw_value.html b/air_interpreter_cid/fn.verify_raw_value.html new file mode 100644 index 00000000..0ad35466 --- /dev/null +++ b/air_interpreter_cid/fn.verify_raw_value.html @@ -0,0 +1,4 @@ +verify_raw_value in air_interpreter_cid - Rust

Function air_interpreter_cid::verify_raw_value

source ·
pub fn verify_raw_value<Val>(
+    cid: &CID<Val>,
+    raw_value: impl AsRef<[u8]>,
+) -> Result<(), CidVerificationError>
\ No newline at end of file diff --git a/air_interpreter_cid/fn.verify_value.html b/air_interpreter_cid/fn.verify_value.html new file mode 100644 index 00000000..381fac9c --- /dev/null +++ b/air_interpreter_cid/fn.verify_value.html @@ -0,0 +1,4 @@ +verify_value in air_interpreter_cid - Rust

Function air_interpreter_cid::verify_value

source ·
pub fn verify_value<Val: Serialize>(
+    cid: &CID<Val>,
+    value: &Val,
+) -> Result<(), CidVerificationError>
\ No newline at end of file diff --git a/air_interpreter_cid/index.html b/air_interpreter_cid/index.html new file mode 100644 index 00000000..8f472c18 --- /dev/null +++ b/air_interpreter_cid/index.html @@ -0,0 +1,3 @@ +air_interpreter_cid - Rust

Crate air_interpreter_cid

source ·

Structs§

Enums§

Functions§

Type Aliases§

  • Should-be-opaque type for the inner representation of CID. +It has to be serializable and Borsh-serializable, as well as implement Debug, Eq, Ord, Hash and similar +basic traits. It is also can be unsized.
\ No newline at end of file diff --git a/air_interpreter_cid/sidebar-items.js b/air_interpreter_cid/sidebar-items.js new file mode 100644 index 00000000..3c2a4307 --- /dev/null +++ b/air_interpreter_cid/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"enum":["CidCalculationError","CidVerificationError"],"fn":["raw_value_to_json_cid","value_to_json_cid","verify_raw_value","verify_value"],"struct":["ArchivedCID","CID","CIDResolver"],"type":["CidRef"]}; \ No newline at end of file diff --git a/air_interpreter_cid/struct.ArchivedCID.html b/air_interpreter_cid/struct.ArchivedCID.html new file mode 100644 index 00000000..e6c71e17 --- /dev/null +++ b/air_interpreter_cid/struct.ArchivedCID.html @@ -0,0 +1,31 @@ +ArchivedCID in air_interpreter_cid - Rust

Struct air_interpreter_cid::ArchivedCID

source ·
#[repr(C)]
pub struct ArchivedCID<T: ?Sized>(/* private fields */) +where + Rc<CidRef>: Archive, + With<PhantomData<*const T>, Skip>: Archive;
Expand description

An archived CID

+

Trait Implementations§

source§

impl<__C: ?Sized, T: ?Sized> CheckBytes<__C> for ArchivedCID<T>
where + Rc<CidRef>: Archive, + With<PhantomData<*const T>, Skip>: Archive, + Archived<Rc<CidRef>>: CheckBytes<__C>, + Archived<With<PhantomData<*const T>, Skip>>: CheckBytes<__C>,

§

type Error = TupleStructCheckError

The error that may result from checking the type.
source§

unsafe fn check_bytes<'__bytecheck>( + value: *const Self, + context: &mut __C, +) -> Result<&'__bytecheck Self, TupleStructCheckError>

Checks whether the given pointer points to a valid value within the +given context. Read more

Auto Trait Implementations§

§

impl<T> !Freeze for ArchivedCID<T>

§

impl<T> !RefUnwindSafe for ArchivedCID<T>

§

impl<T> !Send for ArchivedCID<T>

§

impl<T> !Sync for ArchivedCID<T>

§

impl<T> !Unpin for ArchivedCID<T>

§

impl<T> !UnwindSafe for ArchivedCID<T>

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/air_interpreter_cid/struct.CID.html b/air_interpreter_cid/struct.CID.html new file mode 100644 index 00000000..aaa0f3d4 --- /dev/null +++ b/air_interpreter_cid/struct.CID.html @@ -0,0 +1,70 @@ +CID in air_interpreter_cid - Rust

Struct air_interpreter_cid::CID

source ·
pub struct CID<T: ?Sized>(/* private fields */);

Implementations§

source§

impl<T: ?Sized> CID<T>

source

pub fn new(cid: impl Into<Rc<CidRef>>) -> Self

source

pub fn get_inner(&self) -> Rc<CidRef>

Trait Implementations§

source§

impl<T: ?Sized> Archive for CID<T>
where + Rc<CidRef>: Archive, + With<PhantomData<*const T>, Skip>: Archive,

§

type Archived = ArchivedCID<T>

The archived representation of this type. Read more
§

type Resolver = CIDResolver<T>

The resolver for this type. It must contain all the additional information from serializing +needed to make the archived type from the normal type.
source§

unsafe fn resolve( + &self, + pos: usize, + resolver: Self::Resolver, + out: *mut Self::Archived, +)

Creates the archived version of this value at the given position and writes it to the given +output. Read more
source§

impl<T: ?Sized> AsRef<str> for CID<T>

source§

fn as_ref(&self) -> &CidRef

Converts this type into a shared reference of the (usually inferred) input type.
source§

impl<T: ?Sized> Borrow<str> for CID<T>

source§

fn borrow(&self) -> &CidRef

Immutably borrows from an owned value. Read more
source§

impl<T: ?Sized> Clone for CID<T>

source§

fn clone(&self) -> Self

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl<T: ?Sized> Debug for CID<T>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'de, T: ?Sized> Deserialize<'de> for CID<T>

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl<__D: Fallible + ?Sized, T: ?Sized> Deserialize<CID<T>, __D> for Archived<CID<T>>
where + Rc<CidRef>: Archive, + Archived<Rc<CidRef>>: Deserialize<Rc<CidRef>, __D>, + With<PhantomData<*const T>, Skip>: Archive, + Archived<With<PhantomData<*const T>, Skip>>: Deserialize<With<PhantomData<*const T>, Skip>, __D>,

source§

fn deserialize(&self, deserializer: &mut __D) -> Result<CID<T>, __D::Error>

Deserializes using the given deserializer
source§

impl<Val> Hash for CID<Val>

source§

fn hash<H: Hasher>(&self, state: &mut H)

Feeds this value into the given Hasher. Read more
1.3.0 · source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
source§

impl<Val> PartialEq for CID<Val>

source§

fn eq(&self, other: &Self) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl<__S: Fallible + ?Sized, T: ?Sized> Serialize<__S> for CID<T>
where + Rc<CidRef>: Serialize<__S>, + With<PhantomData<*const T>, Skip>: Serialize<__S>,

source§

fn serialize(&self, serializer: &mut __S) -> Result<Self::Resolver, __S::Error>

Writes the dependencies for the object and returns a resolver that can create the archived +type.
source§

impl<T: ?Sized> Serialize for CID<T>

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl<T: ?Sized> TryFrom<&CID<T>> for Cid

§

type Error = Error

The type returned in the event of a conversion error.
source§

fn try_from(value: &CID<T>) -> Result<Self, Self::Error>

Performs the conversion.
source§

impl<Val> Eq for CID<Val>

Auto Trait Implementations§

§

impl<T> Freeze for CID<T>
where + T: ?Sized,

§

impl<T> RefUnwindSafe for CID<T>
where + T: RefUnwindSafe + ?Sized,

§

impl<T> !Send for CID<T>

§

impl<T> !Sync for CID<T>

§

impl<T> Unpin for CID<T>
where + T: ?Sized,

§

impl<T> UnwindSafe for CID<T>
where + T: RefUnwindSafe + ?Sized,

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
§

impl<T> ArchiveUnsized for T
where + T: Archive,

§

type Archived = <T as Archive>::Archived

The archived counterpart of this type. Unlike Archive, it may be unsized. Read more
§

type MetadataResolver = ()

The resolver for the metadata of this type. Read more
§

unsafe fn resolve_metadata( + &self, + _: usize, + _: <T as ArchiveUnsized>::MetadataResolver, + _: *mut <<T as ArchiveUnsized>::Archived as ArchivePointee>::ArchivedMetadata, +)

Creates the archived version of the metadata for this value at the given position and writes +it to the given output. Read more
§

unsafe fn resolve_unsized( + &self, + from: usize, + to: usize, + resolver: Self::MetadataResolver, + out: *mut RelPtr<Self::Archived, <isize as Archive>::Archived>, +)

Resolves a relative pointer to this value with the given from and to and writes it to +the given output. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CallHasher for T
where + T: Hash + ?Sized,

§

default fn get_hash<H, B>(value: &H, build_hasher: &B) -> u64
where + H: Hash + ?Sized, + B: BuildHasher,

source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
§

impl<T, S> SerializeUnsized<S> for T
where + T: Serialize<S>, + S: Serializer + ?Sized,

§

fn serialize_unsized( + &self, + serializer: &mut S, +) -> Result<usize, <S as Fallible>::Error>

Writes the object and returns the position of the archived type.
§

fn serialize_metadata(&self, _: &mut S) -> Result<(), <S as Fallible>::Error>

Serializes the metadata for the given type.
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_interpreter_cid/struct.CIDResolver.html b/air_interpreter_cid/struct.CIDResolver.html new file mode 100644 index 00000000..65b5199d --- /dev/null +++ b/air_interpreter_cid/struct.CIDResolver.html @@ -0,0 +1,23 @@ +CIDResolver in air_interpreter_cid - Rust

Struct air_interpreter_cid::CIDResolver

source ·
pub struct CIDResolver<T: ?Sized>(/* private fields */)
+where
+    Rc<CidRef>: Archive,
+    With<PhantomData<*const T>, Skip>: Archive;
Expand description

The resolver for an archived CID

+

Auto Trait Implementations§

§

impl<T> !Freeze for CIDResolver<T>

§

impl<T> !RefUnwindSafe for CIDResolver<T>

§

impl<T> !Send for CIDResolver<T>

§

impl<T> !Sync for CIDResolver<T>

§

impl<T> !Unpin for CIDResolver<T>

§

impl<T> !UnwindSafe for CIDResolver<T>

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/air_interpreter_cid/type.CidRef.html b/air_interpreter_cid/type.CidRef.html new file mode 100644 index 00000000..389437bb --- /dev/null +++ b/air_interpreter_cid/type.CidRef.html @@ -0,0 +1,4 @@ +CidRef in air_interpreter_cid - Rust

Type Alias air_interpreter_cid::CidRef

source ·
pub type CidRef = str;
Expand description

Should-be-opaque type for the inner representation of CID. +It has to be serializable and Borsh-serializable, as well as implement Debug, Eq, Ord, Hash and similar +basic traits. It is also can be unsized.

+
\ No newline at end of file diff --git a/air_interpreter_cid/verify/enum.CidVerificationError.html b/air_interpreter_cid/verify/enum.CidVerificationError.html new file mode 100644 index 00000000..db47b63c --- /dev/null +++ b/air_interpreter_cid/verify/enum.CidVerificationError.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_cid/enum.CidVerificationError.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_cid/verify/fn.verify_raw_value.html b/air_interpreter_cid/verify/fn.verify_raw_value.html new file mode 100644 index 00000000..115722ad --- /dev/null +++ b/air_interpreter_cid/verify/fn.verify_raw_value.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_cid/fn.verify_raw_value.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_cid/verify/fn.verify_value.html b/air_interpreter_cid/verify/fn.verify_value.html new file mode 100644 index 00000000..e6d8f5b9 --- /dev/null +++ b/air_interpreter_cid/verify/fn.verify_value.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_cid/fn.verify_value.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_client/all.html b/air_interpreter_client/all.html new file mode 100644 index 00000000..f4ab046f --- /dev/null +++ b/air_interpreter_client/all.html @@ -0,0 +1 @@ +List of all items in this crate

List of all items

Functions

Constants

\ No newline at end of file diff --git a/air_interpreter_client/constant.DEFAULT_LOG_LEVEL.html b/air_interpreter_client/constant.DEFAULT_LOG_LEVEL.html new file mode 100644 index 00000000..5eab55de --- /dev/null +++ b/air_interpreter_client/constant.DEFAULT_LOG_LEVEL.html @@ -0,0 +1 @@ +DEFAULT_LOG_LEVEL in air_interpreter_client - Rust

Constant air_interpreter_client::DEFAULT_LOG_LEVEL

source ·
pub const DEFAULT_LOG_LEVEL: LevelFilter;
\ No newline at end of file diff --git a/air_interpreter_client/fn.ast.html b/air_interpreter_client/fn.ast.html new file mode 100644 index 00000000..7e0c6bc3 --- /dev/null +++ b/air_interpreter_client/fn.ast.html @@ -0,0 +1 @@ +ast in air_interpreter_client - Rust

Function air_interpreter_client::ast

source ·
pub fn ast(script: String) -> String
\ No newline at end of file diff --git a/air_interpreter_client/fn.invoke.html b/air_interpreter_client/fn.invoke.html new file mode 100644 index 00000000..c6b1b4e3 --- /dev/null +++ b/air_interpreter_client/fn.invoke.html @@ -0,0 +1,8 @@ +invoke in air_interpreter_client - Rust

Function air_interpreter_client::invoke

source ·
pub fn invoke(
+    air: String,
+    prev_data: Vec<u8>,
+    data: Vec<u8>,
+    params: Vec<u8>,
+    call_results: Vec<u8>,
+    log_level: &str,
+) -> String
\ No newline at end of file diff --git a/air_interpreter_client/fn.main.html b/air_interpreter_client/fn.main.html new file mode 100644 index 00000000..d4082459 --- /dev/null +++ b/air_interpreter_client/fn.main.html @@ -0,0 +1 @@ +main in air_interpreter_client - Rust

Function air_interpreter_client::main

source ·
pub fn main()
\ No newline at end of file diff --git a/air_interpreter_client/index.html b/air_interpreter_client/index.html new file mode 100644 index 00000000..840b4ff2 --- /dev/null +++ b/air_interpreter_client/index.html @@ -0,0 +1 @@ +air_interpreter_client - Rust

Crate air_interpreter_client

source ·

Constants§

Functions§

\ No newline at end of file diff --git a/air_interpreter_client/sidebar-items.js b/air_interpreter_client/sidebar-items.js new file mode 100644 index 00000000..b5a9f4b1 --- /dev/null +++ b/air_interpreter_client/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"constant":["DEFAULT_LOG_LEVEL"],"fn":["ast","invoke","main"]}; \ No newline at end of file diff --git a/air_interpreter_data/all.html b/air_interpreter_data/all.html new file mode 100644 index 00000000..0fe034de --- /dev/null +++ b/air_interpreter_data/all.html @@ -0,0 +1 @@ +List of all items in this crate
\ No newline at end of file diff --git a/air_interpreter_data/cid_info/struct.ArchivedCidInfo.html b/air_interpreter_data/cid_info/struct.ArchivedCidInfo.html new file mode 100644 index 00000000..9b488a0b --- /dev/null +++ b/air_interpreter_data/cid_info/struct.ArchivedCidInfo.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_data/struct.ArchivedCidInfo.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_data/cid_info/struct.CidInfo.html b/air_interpreter_data/cid_info/struct.CidInfo.html new file mode 100644 index 00000000..75020a78 --- /dev/null +++ b/air_interpreter_data/cid_info/struct.CidInfo.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_data/struct.CidInfo.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_data/cid_info/struct.CidInfoResolver.html b/air_interpreter_data/cid_info/struct.CidInfoResolver.html new file mode 100644 index 00000000..e93a80ab --- /dev/null +++ b/air_interpreter_data/cid_info/struct.CidInfoResolver.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_data/struct.CidInfoResolver.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_data/cid_store/enum.CidStoreVerificationError.html b/air_interpreter_data/cid_store/enum.CidStoreVerificationError.html new file mode 100644 index 00000000..0cab2086 --- /dev/null +++ b/air_interpreter_data/cid_store/enum.CidStoreVerificationError.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_data/enum.CidStoreVerificationError.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_data/cid_store/struct.ArchivedCidStore.html b/air_interpreter_data/cid_store/struct.ArchivedCidStore.html new file mode 100644 index 00000000..70985c06 --- /dev/null +++ b/air_interpreter_data/cid_store/struct.ArchivedCidStore.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_data/struct.ArchivedCidStore.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_data/cid_store/struct.CidStore.html b/air_interpreter_data/cid_store/struct.CidStore.html new file mode 100644 index 00000000..b9f1eec9 --- /dev/null +++ b/air_interpreter_data/cid_store/struct.CidStore.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_data/struct.CidStore.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_data/cid_store/struct.CidStoreResolver.html b/air_interpreter_data/cid_store/struct.CidStoreResolver.html new file mode 100644 index 00000000..61adb998 --- /dev/null +++ b/air_interpreter_data/cid_store/struct.CidStoreResolver.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_data/struct.CidStoreResolver.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_data/cid_store/struct.CidTracker.html b/air_interpreter_data/cid_store/struct.CidTracker.html new file mode 100644 index 00000000..970e5ce1 --- /dev/null +++ b/air_interpreter_data/cid_store/struct.CidTracker.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_data/struct.CidTracker.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_data/enum.ArchivedCallResult.html b/air_interpreter_data/enum.ArchivedCallResult.html new file mode 100644 index 00000000..6bd66e86 --- /dev/null +++ b/air_interpreter_data/enum.ArchivedCallResult.html @@ -0,0 +1,49 @@ +ArchivedCallResult in air_interpreter_data - Rust

Enum air_interpreter_data::ArchivedCallResult

source ·
#[repr(u8)]
pub enum ArchivedCallResult
where + Sender: Archive, + ValueRef: Archive, + CID<ServiceResultCidAggregate>: Archive,
{ + RequestSentBy(Archived<Sender>), + Executed(Archived<ValueRef>), + Failed(Archived<CID<ServiceResultCidAggregate>>), +}
Expand description

An archived CallResult

+

Variants§

§

RequestSentBy(Archived<Sender>)

The archived counterpart of CallResult::RequestSentBy

+

Tuple Fields

§0: Archived<Sender>

The archived counterpart of CallResult::RequestSentBy::0

+
§

Executed(Archived<ValueRef>)

The archived counterpart of CallResult::Executed

+

Tuple Fields

§0: Archived<ValueRef>

The archived counterpart of CallResult::Executed::0

+
§

Failed(Archived<CID<ServiceResultCidAggregate>>)

The archived counterpart of CallResult::Failed

+

Tuple Fields

§0: Archived<CID<ServiceResultCidAggregate>>

The archived counterpart of CallResult::Failed::0

+

Trait Implementations§

source§

impl<__C: ?Sized> CheckBytes<__C> for ArchivedCallResult
where + Sender: Archive, + ValueRef: Archive, + CID<ServiceResultCidAggregate>: Archive, + Archived<Sender>: CheckBytes<__C>, + Archived<ValueRef>: CheckBytes<__C>, + Archived<CID<ServiceResultCidAggregate>>: CheckBytes<__C>,

§

type Error = EnumCheckError<u8>

The error that may result from checking the type.
source§

unsafe fn check_bytes<'__bytecheck>( + value: *const Self, + context: &mut __C, +) -> Result<&'__bytecheck Self, EnumCheckError<u8>>

Checks whether the given pointer points to a valid value within the +given context. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_interpreter_data/enum.ArchivedCanonResult.html b/air_interpreter_data/enum.ArchivedCanonResult.html new file mode 100644 index 00000000..c1e62728 --- /dev/null +++ b/air_interpreter_data/enum.ArchivedCanonResult.html @@ -0,0 +1,43 @@ +ArchivedCanonResult in air_interpreter_data - Rust

Enum air_interpreter_data::ArchivedCanonResult

source ·
#[repr(u8)]
pub enum ArchivedCanonResult
where + Rc<String>: Archive, + CID<CanonResultCidAggregate>: Archive,
{ + RequestSentBy(Archived<Rc<String>>), + Executed(Archived<CID<CanonResultCidAggregate>>), +}
Expand description

An archived CanonResult

+

Variants§

§

RequestSentBy(Archived<Rc<String>>)

The archived counterpart of CanonResult::RequestSentBy

+

Tuple Fields

§0: Archived<Rc<String>>

The archived counterpart of CanonResult::RequestSentBy::0

+
§

Executed(Archived<CID<CanonResultCidAggregate>>)

The archived counterpart of CanonResult::Executed

+

Tuple Fields

§0: Archived<CID<CanonResultCidAggregate>>

The archived counterpart of CanonResult::Executed::0

+

Trait Implementations§

source§

impl<__C: ?Sized> CheckBytes<__C> for ArchivedCanonResult
where + Rc<String>: Archive, + CID<CanonResultCidAggregate>: Archive, + Archived<Rc<String>>: CheckBytes<__C>, + Archived<CID<CanonResultCidAggregate>>: CheckBytes<__C>,

§

type Error = EnumCheckError<u8>

The error that may result from checking the type.
source§

unsafe fn check_bytes<'__bytecheck>( + value: *const Self, + context: &mut __C, +) -> Result<&'__bytecheck Self, EnumCheckError<u8>>

Checks whether the given pointer points to a valid value within the +given context. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_interpreter_data/enum.ArchivedExecutedState.html b/air_interpreter_data/enum.ArchivedExecutedState.html new file mode 100644 index 00000000..87f18c7e --- /dev/null +++ b/air_interpreter_data/enum.ArchivedExecutedState.html @@ -0,0 +1,61 @@ +ArchivedExecutedState in air_interpreter_data - Rust
#[repr(u8)]
pub enum ArchivedExecutedState
where + ParResult: Archive, + CallResult: Archive, + FoldResult: Archive, + ApResult: Archive, + CanonResult: Archive,
{ + Par(Archived<ParResult>), + Call(Archived<CallResult>), + Fold(Archived<FoldResult>), + Ap(Archived<ApResult>), + Canon(Archived<CanonResult>), +}
Expand description

An archived ExecutedState

+

Variants§

§

Par(Archived<ParResult>)

The archived counterpart of ExecutedState::Par

+

Tuple Fields

§0: Archived<ParResult>

The archived counterpart of ExecutedState::Par::0

+
§

Call(Archived<CallResult>)

The archived counterpart of ExecutedState::Call

+

Tuple Fields

§0: Archived<CallResult>

The archived counterpart of ExecutedState::Call::0

+
§

Fold(Archived<FoldResult>)

The archived counterpart of ExecutedState::Fold

+

Tuple Fields

§0: Archived<FoldResult>

The archived counterpart of ExecutedState::Fold::0

+
§

Ap(Archived<ApResult>)

The archived counterpart of ExecutedState::Ap

+

Tuple Fields

§0: Archived<ApResult>

The archived counterpart of ExecutedState::Ap::0

+
§

Canon(Archived<CanonResult>)

The archived counterpart of ExecutedState::Canon

+

Tuple Fields

§0: Archived<CanonResult>

The archived counterpart of ExecutedState::Canon::0

+

Trait Implementations§

source§

impl<__C: ?Sized> CheckBytes<__C> for ArchivedExecutedState
where + ParResult: Archive, + CallResult: Archive, + FoldResult: Archive, + ApResult: Archive, + CanonResult: Archive, + Archived<ParResult>: CheckBytes<__C>, + Archived<CallResult>: CheckBytes<__C>, + Archived<FoldResult>: CheckBytes<__C>, + Archived<ApResult>: CheckBytes<__C>, + Archived<CanonResult>: CheckBytes<__C>,

§

type Error = EnumCheckError<u8>

The error that may result from checking the type.
source§

unsafe fn check_bytes<'__bytecheck>( + value: *const Self, + context: &mut __C, +) -> Result<&'__bytecheck Self, EnumCheckError<u8>>

Checks whether the given pointer points to a valid value within the +given context. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_interpreter_data/enum.ArchivedProvenance.html b/air_interpreter_data/enum.ArchivedProvenance.html new file mode 100644 index 00000000..acc31de2 --- /dev/null +++ b/air_interpreter_data/enum.ArchivedProvenance.html @@ -0,0 +1,49 @@ +ArchivedProvenance in air_interpreter_data - Rust

Enum air_interpreter_data::ArchivedProvenance

source ·
#[repr(u8)]
pub enum ArchivedProvenance{ + Literal, + ServiceResult { + cid: Archived<CID<ServiceResultCidAggregate>>, + }, + Canon { + cid: Archived<CID<CanonResultCidAggregate>>, + }, +}
Expand description

An archived Provenance

+

Variants§

§

Literal

The archived counterpart of Provenance::Literal

+
§

ServiceResult

The archived counterpart of Provenance::ServiceResult

+

Fields

§cid: Archived<CID<ServiceResultCidAggregate>>

The archived counterpart of Provenance::ServiceResult::cid

+
§

Canon

The archived counterpart of Provenance::Canon

+

Fields

§cid: Archived<CID<CanonResultCidAggregate>>

The archived counterpart of Provenance::Canon::cid

+

Trait Implementations§

source§

impl<__C: ?Sized> CheckBytes<__C> for ArchivedProvenance
where + CID<ServiceResultCidAggregate>: Archive, + CID<CanonResultCidAggregate>: Archive, + Archived<CID<ServiceResultCidAggregate>>: CheckBytes<__C>, + Archived<CID<CanonResultCidAggregate>>: CheckBytes<__C>,

§

type Error = EnumCheckError<u8>

The error that may result from checking the type.
source§

unsafe fn check_bytes<'__bytecheck>( + value: *const Self, + context: &mut __C, +) -> Result<&'__bytecheck Self, EnumCheckError<u8>>

Checks whether the given pointer points to a valid value within the +given context. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_interpreter_data/enum.ArchivedSender.html b/air_interpreter_data/enum.ArchivedSender.html new file mode 100644 index 00000000..040470ea --- /dev/null +++ b/air_interpreter_data/enum.ArchivedSender.html @@ -0,0 +1,47 @@ +ArchivedSender in air_interpreter_data - Rust

Enum air_interpreter_data::ArchivedSender

source ·
#[repr(u8)]
pub enum ArchivedSender
where + Rc<String>: Archive, + u32: Archive,
{ + PeerId(Archived<Rc<String>>), + PeerIdWithCallId { + peer_id: Archived<Rc<String>>, + call_id: Archived<u32>, + }, +}
Expand description

An archived Sender

+

Variants§

§

PeerId(Archived<Rc<String>>)

The archived counterpart of Sender::PeerId

+

Tuple Fields

§0: Archived<Rc<String>>

The archived counterpart of Sender::PeerId::0

+
§

PeerIdWithCallId

The archived counterpart of Sender::PeerIdWithCallId

+

Fields

§peer_id: Archived<Rc<String>>

The archived counterpart of Sender::PeerIdWithCallId::peer_id

+
§call_id: Archived<u32>

The archived counterpart of Sender::PeerIdWithCallId::call_id

+

Trait Implementations§

source§

impl<__C: ?Sized> CheckBytes<__C> for ArchivedSender
where + Rc<String>: Archive, + u32: Archive, + Archived<Rc<String>>: CheckBytes<__C>, + Archived<u32>: CheckBytes<__C>,

§

type Error = EnumCheckError<u8>

The error that may result from checking the type.
source§

unsafe fn check_bytes<'__bytecheck>( + value: *const Self, + context: &mut __C, +) -> Result<&'__bytecheck Self, EnumCheckError<u8>>

Checks whether the given pointer points to a valid value within the +given context. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_interpreter_data/enum.ArchivedValueRef.html b/air_interpreter_data/enum.ArchivedValueRef.html new file mode 100644 index 00000000..1880a614 --- /dev/null +++ b/air_interpreter_data/enum.ArchivedValueRef.html @@ -0,0 +1,53 @@ +ArchivedValueRef in air_interpreter_data - Rust

Enum air_interpreter_data::ArchivedValueRef

source ·
#[repr(u8)]
pub enum ArchivedValueRef
where + CID<ServiceResultCidAggregate>: Archive, + GenerationIdx: Archive, + CID<JValue>: Archive,
{ + Scalar(Archived<CID<ServiceResultCidAggregate>>), + Stream { + cid: Archived<CID<ServiceResultCidAggregate>>, + generation: Archived<GenerationIdx>, + }, + Unused(Archived<CID<JValue>>), +}
Expand description

An archived ValueRef

+

Variants§

§

Scalar(Archived<CID<ServiceResultCidAggregate>>)

The archived counterpart of ValueRef::Scalar

+

Tuple Fields

§0: Archived<CID<ServiceResultCidAggregate>>

The archived counterpart of ValueRef::Scalar::0

+
§

Stream

The archived counterpart of ValueRef::Stream

+

Fields

§cid: Archived<CID<ServiceResultCidAggregate>>

The archived counterpart of ValueRef::Stream::cid

+
§generation: Archived<GenerationIdx>

The archived counterpart of ValueRef::Stream::generation

+
§

Unused(Archived<CID<JValue>>)

The archived counterpart of ValueRef::Unused

+

Tuple Fields

§0: Archived<CID<JValue>>

The archived counterpart of ValueRef::Unused::0

+

Trait Implementations§

source§

impl<__C: ?Sized> CheckBytes<__C> for ArchivedValueRef
where + CID<ServiceResultCidAggregate>: Archive, + GenerationIdx: Archive, + CID<JValue>: Archive, + Archived<CID<ServiceResultCidAggregate>>: CheckBytes<__C>, + Archived<GenerationIdx>: CheckBytes<__C>, + Archived<CID<JValue>>: CheckBytes<__C>,

§

type Error = EnumCheckError<u8>

The error that may result from checking the type.
source§

unsafe fn check_bytes<'__bytecheck>( + value: *const Self, + context: &mut __C, +) -> Result<&'__bytecheck Self, EnumCheckError<u8>>

Checks whether the given pointer points to a valid value within the +given context. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_interpreter_data/enum.CallResult.html b/air_interpreter_data/enum.CallResult.html new file mode 100644 index 00000000..036bf169 --- /dev/null +++ b/air_interpreter_data/enum.CallResult.html @@ -0,0 +1,89 @@ +CallResult in air_interpreter_data - Rust

Enum air_interpreter_data::CallResult

source ·
pub enum CallResult {
+    RequestSentBy(Sender),
+    Executed(ValueRef),
+    Failed(CID<ServiceResultCidAggregate>),
+}

Variants§

§

RequestSentBy(Sender)

Request was sent to a target node by node with such public key and it shouldn’t be called again.

+
§

Executed(ValueRef)

A corresponding call’s been already executed with such value as a result.

+
§

Failed(CID<ServiceResultCidAggregate>)

The call returned a service error.

+

The JValue has to be a two element array [i32, String].

+

Implementations§

source§

impl CallResult

source

pub fn sent_peer_id(peer_id: Rc<String>) -> CallResult

source

pub fn sent_peer_id_with_call_id( + peer_id: Rc<String>, + call_id: u32, +) -> CallResult

source

pub fn executed_service_result(value_ref: ValueRef) -> Self

source

pub fn executed_scalar( + service_result_agg_cid: CID<ServiceResultCidAggregate>, +) -> Self

source

pub fn executed_stream_stub(cid: CID<ServiceResultCidAggregate>) -> CallResult

source

pub fn executed_unused(value_cid: CID<JValue>) -> CallResult

source

pub fn failed( + service_result_agg_cid: CID<ServiceResultCidAggregate>, +) -> CallResult

source

pub fn get_cid(&self) -> Option<&CID<ServiceResultCidAggregate>>

Trait Implementations§

source§

impl Archive for CallResult
where + Sender: Archive, + ValueRef: Archive, + CID<ServiceResultCidAggregate>: Archive,

§

type Archived = ArchivedCallResult

The archived representation of this type. Read more
§

type Resolver = CallResultResolver

The resolver for this type. It must contain all the additional information from serializing +needed to make the archived type from the normal type.
source§

unsafe fn resolve( + &self, + pos: usize, + resolver: <Self as Archive>::Resolver, + out: *mut <Self as Archive>::Archived, +)

Creates the archived version of this value at the given position and writes it to the given +output. Read more
source§

impl Clone for CallResult

source§

fn clone(&self) -> CallResult

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for CallResult

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'de> Deserialize<'de> for CallResult

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl<__D: Fallible + ?Sized> Deserialize<CallResult, __D> for Archived<CallResult>
where + Sender: Archive, + Archived<Sender>: Deserialize<Sender, __D>, + ValueRef: Archive, + Archived<ValueRef>: Deserialize<ValueRef, __D>, + CID<ServiceResultCidAggregate>: Archive, + Archived<CID<ServiceResultCidAggregate>>: Deserialize<CID<ServiceResultCidAggregate>, __D>,

source§

fn deserialize(&self, deserializer: &mut __D) -> Result<CallResult, __D::Error>

Deserializes using the given deserializer
source§

impl PartialEq for CallResult

source§

fn eq(&self, other: &CallResult) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl<__S: Fallible + ?Sized> Serialize<__S> for CallResult
where + Sender: Serialize<__S>, + ValueRef: Serialize<__S>, + CID<ServiceResultCidAggregate>: Serialize<__S>,

source§

fn serialize( + &self, + serializer: &mut __S, +) -> Result<<Self as Archive>::Resolver, __S::Error>

Writes the dependencies for the object and returns a resolver that can create the archived +type.
source§

impl Serialize for CallResult

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Eq for CallResult

source§

impl StructuralPartialEq for CallResult

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
§

impl<T> ArchiveUnsized for T
where + T: Archive,

§

type Archived = <T as Archive>::Archived

The archived counterpart of this type. Unlike Archive, it may be unsized. Read more
§

type MetadataResolver = ()

The resolver for the metadata of this type. Read more
§

unsafe fn resolve_metadata( + &self, + _: usize, + _: <T as ArchiveUnsized>::MetadataResolver, + _: *mut <<T as ArchiveUnsized>::Archived as ArchivePointee>::ArchivedMetadata, +)

Creates the archived version of the metadata for this value at the given position and writes +it to the given output. Read more
§

unsafe fn resolve_unsized( + &self, + from: usize, + to: usize, + resolver: Self::MetadataResolver, + out: *mut RelPtr<Self::Archived, <isize as Archive>::Archived>, +)

Resolves a relative pointer to this value with the given from and to and writes it to +the given output. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
§

impl<T, S> SerializeUnsized<S> for T
where + T: Serialize<S>, + S: Serializer + ?Sized,

§

fn serialize_unsized( + &self, + serializer: &mut S, +) -> Result<usize, <S as Fallible>::Error>

Writes the object and returns the position of the archived type.
§

fn serialize_metadata(&self, _: &mut S) -> Result<(), <S as Fallible>::Error>

Serializes the metadata for the given type.
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_interpreter_data/enum.CallResultResolver.html b/air_interpreter_data/enum.CallResultResolver.html new file mode 100644 index 00000000..8db690d1 --- /dev/null +++ b/air_interpreter_data/enum.CallResultResolver.html @@ -0,0 +1,39 @@ +CallResultResolver in air_interpreter_data - Rust

Enum air_interpreter_data::CallResultResolver

source ·
pub enum CallResultResolver
where + Sender: Archive, + ValueRef: Archive, + CID<ServiceResultCidAggregate>: Archive,
{ + RequestSentBy(Resolver<Sender>), + Executed(Resolver<ValueRef>), + Failed(Resolver<CID<ServiceResultCidAggregate>>), +}
Expand description

The resolver for an archived CallResult

+

Variants§

§

RequestSentBy(Resolver<Sender>)

The resolver for CallResult::RequestSentBy

+

Tuple Fields

§0: Resolver<Sender>

The resolver for CallResult::RequestSentBy::0

+
§

Executed(Resolver<ValueRef>)

The resolver for CallResult::Executed

+

Tuple Fields

§0: Resolver<ValueRef>

The resolver for CallResult::Executed::0

+
§

Failed(Resolver<CID<ServiceResultCidAggregate>>)

The resolver for CallResult::Failed

+

Tuple Fields

§0: Resolver<CID<ServiceResultCidAggregate>>

The resolver for CallResult::Failed::0

+

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_interpreter_data/enum.CanonResult.html b/air_interpreter_data/enum.CanonResult.html new file mode 100644 index 00000000..107dfa35 --- /dev/null +++ b/air_interpreter_data/enum.CanonResult.html @@ -0,0 +1,75 @@ +CanonResult in air_interpreter_data - Rust

Enum air_interpreter_data::CanonResult

source ·
pub enum CanonResult {
+    RequestSentBy(Rc<String>),
+    Executed(CID<CanonResultCidAggregate>),
+}
Expand description

Contains ids of element that were on a stream at the moment of an appropriate canon call.

+

Variants§

§

RequestSentBy(Rc<String>)

Request was sent to a target node by node with such public key and it shouldn’t be called again.

+
§

Executed(CID<CanonResultCidAggregate>)

Implementations§

Trait Implementations§

source§

impl Archive for CanonResult
where + Rc<String>: Archive, + CID<CanonResultCidAggregate>: Archive,

§

type Archived = ArchivedCanonResult

The archived representation of this type. Read more
§

type Resolver = CanonResultResolver

The resolver for this type. It must contain all the additional information from serializing +needed to make the archived type from the normal type.
source§

unsafe fn resolve( + &self, + pos: usize, + resolver: <Self as Archive>::Resolver, + out: *mut <Self as Archive>::Archived, +)

Creates the archived version of this value at the given position and writes it to the given +output. Read more
source§

impl Clone for CanonResult

source§

fn clone(&self) -> CanonResult

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for CanonResult

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'de> Deserialize<'de> for CanonResult

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl<__D: Fallible + ?Sized> Deserialize<CanonResult, __D> for Archived<CanonResult>
where + Rc<String>: Archive, + Archived<Rc<String>>: Deserialize<Rc<String>, __D>, + CID<CanonResultCidAggregate>: Archive, + Archived<CID<CanonResultCidAggregate>>: Deserialize<CID<CanonResultCidAggregate>, __D>,

source§

fn deserialize(&self, deserializer: &mut __D) -> Result<CanonResult, __D::Error>

Deserializes using the given deserializer
source§

impl PartialEq for CanonResult

source§

fn eq(&self, other: &CanonResult) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl<__S: Fallible + ?Sized> Serialize<__S> for CanonResult
where + Rc<String>: Serialize<__S>, + CID<CanonResultCidAggregate>: Serialize<__S>,

source§

fn serialize( + &self, + serializer: &mut __S, +) -> Result<<Self as Archive>::Resolver, __S::Error>

Writes the dependencies for the object and returns a resolver that can create the archived +type.
source§

impl Serialize for CanonResult

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Eq for CanonResult

source§

impl StructuralPartialEq for CanonResult

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
§

impl<T> ArchiveUnsized for T
where + T: Archive,

§

type Archived = <T as Archive>::Archived

The archived counterpart of this type. Unlike Archive, it may be unsized. Read more
§

type MetadataResolver = ()

The resolver for the metadata of this type. Read more
§

unsafe fn resolve_metadata( + &self, + _: usize, + _: <T as ArchiveUnsized>::MetadataResolver, + _: *mut <<T as ArchiveUnsized>::Archived as ArchivePointee>::ArchivedMetadata, +)

Creates the archived version of the metadata for this value at the given position and writes +it to the given output. Read more
§

unsafe fn resolve_unsized( + &self, + from: usize, + to: usize, + resolver: Self::MetadataResolver, + out: *mut RelPtr<Self::Archived, <isize as Archive>::Archived>, +)

Resolves a relative pointer to this value with the given from and to and writes it to +the given output. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
§

impl<T, S> SerializeUnsized<S> for T
where + T: Serialize<S>, + S: Serializer + ?Sized,

§

fn serialize_unsized( + &self, + serializer: &mut S, +) -> Result<usize, <S as Fallible>::Error>

Writes the object and returns the position of the archived type.
§

fn serialize_metadata(&self, _: &mut S) -> Result<(), <S as Fallible>::Error>

Serializes the metadata for the given type.
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_interpreter_data/enum.CanonResultResolver.html b/air_interpreter_data/enum.CanonResultResolver.html new file mode 100644 index 00000000..a9ba0cf7 --- /dev/null +++ b/air_interpreter_data/enum.CanonResultResolver.html @@ -0,0 +1,35 @@ +CanonResultResolver in air_interpreter_data - Rust

Enum air_interpreter_data::CanonResultResolver

source ·
pub enum CanonResultResolver
where + Rc<String>: Archive, + CID<CanonResultCidAggregate>: Archive,
{ + RequestSentBy(Resolver<Rc<String>>), + Executed(Resolver<CID<CanonResultCidAggregate>>), +}
Expand description

The resolver for an archived CanonResult

+

Variants§

§

RequestSentBy(Resolver<Rc<String>>)

The resolver for CanonResult::RequestSentBy

+

Tuple Fields

§0: Resolver<Rc<String>>
§

Executed(Resolver<CID<CanonResultCidAggregate>>)

The resolver for CanonResult::Executed

+

Tuple Fields

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_interpreter_data/enum.CidStoreVerificationError.html b/air_interpreter_data/enum.CidStoreVerificationError.html new file mode 100644 index 00000000..2c3af4bb --- /dev/null +++ b/air_interpreter_data/enum.CidStoreVerificationError.html @@ -0,0 +1,34 @@ +CidStoreVerificationError in air_interpreter_data - Rust
pub enum CidStoreVerificationError {
+    CidVerificationError(CidVerificationError),
+    MissingReference {
+        source_type_name: &'static str,
+        target_type_name: &'static str,
+        target_cid_repr: Rc<CidRef>,
+    },
+}

Variants§

§

CidVerificationError(CidVerificationError)

§

MissingReference

Fields

§source_type_name: &'static str
§target_type_name: &'static str
§target_cid_repr: Rc<CidRef>

Trait Implementations§

source§

impl Debug for CidStoreVerificationError

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Display for CidStoreVerificationError

source§

fn fmt(&self, __formatter: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Error for CidStoreVerificationError

source§

fn source(&self) -> Option<&(dyn Error + 'static)>

The lower-level source of this error, if any. Read more
1.0.0 · source§

fn description(&self) -> &str

👎Deprecated since 1.42.0: use the Display impl or to_string()
1.0.0 · source§

fn cause(&self) -> Option<&dyn Error>

👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
source§

fn provide<'a>(&'a self, request: &mut Request<'a>)

🔬This is a nightly-only experimental API. (error_generic_member_access)
Provides type based access to context intended for error reports. Read more
source§

impl From<CidVerificationError> for CidStoreVerificationError

source§

fn from(source: CidVerificationError) -> Self

Converts to this type from the input type.

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
§

impl<T> Error for T
where + T: Error + 'static,

§

fn as_error(&self) -> &(dyn Error + 'static)

Gets this error as an std::error::Error.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_interpreter_data/enum.DataDeserializationError.html b/air_interpreter_data/enum.DataDeserializationError.html new file mode 100644 index 00000000..2e95345b --- /dev/null +++ b/air_interpreter_data/enum.DataDeserializationError.html @@ -0,0 +1,30 @@ +DataDeserializationError in air_interpreter_data - Rust
pub enum DataDeserializationError {
+    Envelope(Error),
+    Data(RkyvDeserializeError),
+}

Variants§

§

Envelope(Error)

§

Data(RkyvDeserializeError)

Trait Implementations§

source§

impl Debug for DataDeserializationError

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Display for DataDeserializationError

source§

fn fmt(&self, __formatter: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Error for DataDeserializationError

1.30.0 · source§

fn source(&self) -> Option<&(dyn Error + 'static)>

The lower-level source of this error, if any. Read more
1.0.0 · source§

fn description(&self) -> &str

👎Deprecated since 1.42.0: use the Display impl or to_string()
1.0.0 · source§

fn cause(&self) -> Option<&dyn Error>

👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
source§

fn provide<'a>(&'a self, request: &mut Request<'a>)

🔬This is a nightly-only experimental API. (error_generic_member_access)
Provides type based access to context intended for error reports. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
§

impl<T> Error for T
where + T: Error + 'static,

§

fn as_error(&self) -> &(dyn Error + 'static)

Gets this error as an std::error::Error.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_interpreter_data/enum.ExecutedState.html b/air_interpreter_data/enum.ExecutedState.html new file mode 100644 index 00000000..a168bfc3 --- /dev/null +++ b/air_interpreter_data/enum.ExecutedState.html @@ -0,0 +1,92 @@ +ExecutedState in air_interpreter_data - Rust

Enum air_interpreter_data::ExecutedState

source ·
pub enum ExecutedState {
+    Par(ParResult),
+    Call(CallResult),
+    Fold(FoldResult),
+    Ap(ApResult),
+    Canon(CanonResult),
+}

Variants§

Implementations§

source§

impl ExecutedState

source

pub fn par(left_subgraph_size: usize, right_subgraph_size: usize) -> Self

Trait Implementations§

source§

impl Archive for ExecutedState
where + ParResult: Archive, + CallResult: Archive, + FoldResult: Archive, + ApResult: Archive, + CanonResult: Archive,

§

type Archived = ArchivedExecutedState

The archived representation of this type. Read more
§

type Resolver = ExecutedStateResolver

The resolver for this type. It must contain all the additional information from serializing +needed to make the archived type from the normal type.
source§

unsafe fn resolve( + &self, + pos: usize, + resolver: <Self as Archive>::Resolver, + out: *mut <Self as Archive>::Archived, +)

Creates the archived version of this value at the given position and writes it to the given +output. Read more
source§

impl Clone for ExecutedState

source§

fn clone(&self) -> ExecutedState

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for ExecutedState

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'de> Deserialize<'de> for ExecutedState

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl<__D: Fallible + ?Sized> Deserialize<ExecutedState, __D> for Archived<ExecutedState>
where + ParResult: Archive, + Archived<ParResult>: Deserialize<ParResult, __D>, + CallResult: Archive, + Archived<CallResult>: Deserialize<CallResult, __D>, + FoldResult: Archive, + Archived<FoldResult>: Deserialize<FoldResult, __D>, + ApResult: Archive, + Archived<ApResult>: Deserialize<ApResult, __D>, + CanonResult: Archive, + Archived<CanonResult>: Deserialize<CanonResult, __D>,

source§

fn deserialize( + &self, + deserializer: &mut __D, +) -> Result<ExecutedState, __D::Error>

Deserializes using the given deserializer
source§

impl Display for ExecutedState

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl PartialEq for ExecutedState

source§

fn eq(&self, other: &ExecutedState) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl<__S: Fallible + ?Sized> Serialize<__S> for ExecutedState
where + ParResult: Serialize<__S>, + CallResult: Serialize<__S>, + FoldResult: Serialize<__S>, + ApResult: Serialize<__S>, + CanonResult: Serialize<__S>,

source§

fn serialize( + &self, + serializer: &mut __S, +) -> Result<<Self as Archive>::Resolver, __S::Error>

Writes the dependencies for the object and returns a resolver that can create the archived +type.
source§

impl Serialize for ExecutedState

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Eq for ExecutedState

source§

impl StructuralPartialEq for ExecutedState

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
§

impl<T> ArchiveUnsized for T
where + T: Archive,

§

type Archived = <T as Archive>::Archived

The archived counterpart of this type. Unlike Archive, it may be unsized. Read more
§

type MetadataResolver = ()

The resolver for the metadata of this type. Read more
§

unsafe fn resolve_metadata( + &self, + _: usize, + _: <T as ArchiveUnsized>::MetadataResolver, + _: *mut <<T as ArchiveUnsized>::Archived as ArchivePointee>::ArchivedMetadata, +)

Creates the archived version of the metadata for this value at the given position and writes +it to the given output. Read more
§

unsafe fn resolve_unsized( + &self, + from: usize, + to: usize, + resolver: Self::MetadataResolver, + out: *mut RelPtr<Self::Archived, <isize as Archive>::Archived>, +)

Resolves a relative pointer to this value with the given from and to and writes it to +the given output. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
§

impl<T, S> SerializeUnsized<S> for T
where + T: Serialize<S>, + S: Serializer + ?Sized,

§

fn serialize_unsized( + &self, + serializer: &mut S, +) -> Result<usize, <S as Fallible>::Error>

Writes the object and returns the position of the archived type.
§

fn serialize_metadata(&self, _: &mut S) -> Result<(), <S as Fallible>::Error>

Serializes the metadata for the given type.
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_interpreter_data/enum.ExecutedStateResolver.html b/air_interpreter_data/enum.ExecutedStateResolver.html new file mode 100644 index 00000000..5b6c11eb --- /dev/null +++ b/air_interpreter_data/enum.ExecutedStateResolver.html @@ -0,0 +1,47 @@ +ExecutedStateResolver in air_interpreter_data - Rust
pub enum ExecutedStateResolver
where + ParResult: Archive, + CallResult: Archive, + FoldResult: Archive, + ApResult: Archive, + CanonResult: Archive,
{ + Par(Resolver<ParResult>), + Call(Resolver<CallResult>), + Fold(Resolver<FoldResult>), + Ap(Resolver<ApResult>), + Canon(Resolver<CanonResult>), +}
Expand description

The resolver for an archived ExecutedState

+

Variants§

§

Par(Resolver<ParResult>)

The resolver for ExecutedState::Par

+

Tuple Fields

§0: Resolver<ParResult>

The resolver for ExecutedState::Par::0

+
§

Call(Resolver<CallResult>)

The resolver for ExecutedState::Call

+

Tuple Fields

§0: Resolver<CallResult>

The resolver for ExecutedState::Call::0

+
§

Fold(Resolver<FoldResult>)

The resolver for ExecutedState::Fold

+

Tuple Fields

§0: Resolver<FoldResult>

The resolver for ExecutedState::Fold::0

+
§

Ap(Resolver<ApResult>)

The resolver for ExecutedState::Ap

+

Tuple Fields

§0: Resolver<ApResult>

The resolver for ExecutedState::Ap::0

+
§

Canon(Resolver<CanonResult>)

The resolver for ExecutedState::Canon

+

Tuple Fields

§0: Resolver<CanonResult>

The resolver for ExecutedState::Canon::0

+

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_interpreter_data/enum.Provenance.html b/air_interpreter_data/enum.Provenance.html new file mode 100644 index 00000000..734fd993 --- /dev/null +++ b/air_interpreter_data/enum.Provenance.html @@ -0,0 +1,78 @@ +Provenance in air_interpreter_data - Rust

Enum air_interpreter_data::Provenance

source ·
pub enum Provenance {
+    Literal,
+    ServiceResult {
+        cid: CID<ServiceResultCidAggregate>,
+    },
+    Canon {
+        cid: CID<CanonResultCidAggregate>,
+    },
+}

Variants§

§

Literal

§

ServiceResult

§

Canon

Implementations§

Trait Implementations§

source§

impl Archive for Provenance

§

type Archived = ArchivedProvenance

The archived representation of this type. Read more
§

type Resolver = ProvenanceResolver

The resolver for this type. It must contain all the additional information from serializing +needed to make the archived type from the normal type.
source§

unsafe fn resolve( + &self, + pos: usize, + resolver: <Self as Archive>::Resolver, + out: *mut <Self as Archive>::Archived, +)

Creates the archived version of this value at the given position and writes it to the given +output. Read more
source§

impl Clone for Provenance

source§

fn clone(&self) -> Provenance

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for Provenance

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'de> Deserialize<'de> for Provenance

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl<__D: Fallible + ?Sized> Deserialize<Provenance, __D> for Archived<Provenance>
where + CID<ServiceResultCidAggregate>: Archive, + Archived<CID<ServiceResultCidAggregate>>: Deserialize<CID<ServiceResultCidAggregate>, __D>, + CID<CanonResultCidAggregate>: Archive, + Archived<CID<CanonResultCidAggregate>>: Deserialize<CID<CanonResultCidAggregate>, __D>,

source§

fn deserialize(&self, deserializer: &mut __D) -> Result<Provenance, __D::Error>

Deserializes using the given deserializer
source§

impl PartialEq for Provenance

source§

fn eq(&self, other: &Provenance) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl<__S: Fallible + ?Sized> Serialize<__S> for Provenance
where + CID<ServiceResultCidAggregate>: Serialize<__S>, + CID<CanonResultCidAggregate>: Serialize<__S>,

source§

fn serialize( + &self, + serializer: &mut __S, +) -> Result<<Self as Archive>::Resolver, __S::Error>

Writes the dependencies for the object and returns a resolver that can create the archived +type.
source§

impl Serialize for Provenance

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Eq for Provenance

source§

impl StructuralPartialEq for Provenance

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
§

impl<T> ArchiveUnsized for T
where + T: Archive,

§

type Archived = <T as Archive>::Archived

The archived counterpart of this type. Unlike Archive, it may be unsized. Read more
§

type MetadataResolver = ()

The resolver for the metadata of this type. Read more
§

unsafe fn resolve_metadata( + &self, + _: usize, + _: <T as ArchiveUnsized>::MetadataResolver, + _: *mut <<T as ArchiveUnsized>::Archived as ArchivePointee>::ArchivedMetadata, +)

Creates the archived version of the metadata for this value at the given position and writes +it to the given output. Read more
§

unsafe fn resolve_unsized( + &self, + from: usize, + to: usize, + resolver: Self::MetadataResolver, + out: *mut RelPtr<Self::Archived, <isize as Archive>::Archived>, +)

Resolves a relative pointer to this value with the given from and to and writes it to +the given output. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
§

impl<T, S> SerializeUnsized<S> for T
where + T: Serialize<S>, + S: Serializer + ?Sized,

§

fn serialize_unsized( + &self, + serializer: &mut S, +) -> Result<usize, <S as Fallible>::Error>

Writes the object and returns the position of the archived type.
§

fn serialize_metadata(&self, _: &mut S) -> Result<(), <S as Fallible>::Error>

Serializes the metadata for the given type.
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_interpreter_data/enum.ProvenanceResolver.html b/air_interpreter_data/enum.ProvenanceResolver.html new file mode 100644 index 00000000..818312f0 --- /dev/null +++ b/air_interpreter_data/enum.ProvenanceResolver.html @@ -0,0 +1,41 @@ +ProvenanceResolver in air_interpreter_data - Rust

Enum air_interpreter_data::ProvenanceResolver

source ·
pub enum ProvenanceResolver{
+    Literal,
+    ServiceResult {
+        cid: Resolver<CID<ServiceResultCidAggregate>>,
+    },
+    Canon {
+        cid: Resolver<CID<CanonResultCidAggregate>>,
+    },
+}
Expand description

The resolver for an archived Provenance

+

Variants§

§

Literal

The resolver for Provenance::Literal

+
§

ServiceResult

The resolver for Provenance::ServiceResult

+

Fields

§

Canon

The resolver for Provenance::Canon

+

Fields

§cid: Resolver<CID<CanonResultCidAggregate>>

The resolver for Provenance::Canon::cid

+

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_interpreter_data/enum.Sender.html b/air_interpreter_data/enum.Sender.html new file mode 100644 index 00000000..fdc621a2 --- /dev/null +++ b/air_interpreter_data/enum.Sender.html @@ -0,0 +1,77 @@ +Sender in air_interpreter_data - Rust

Enum air_interpreter_data::Sender

source ·
pub enum Sender {
+    PeerId(Rc<String>),
+    PeerIdWithCallId {
+        peer_id: Rc<String>,
+        call_id: u32,
+    },
+}

Variants§

§

PeerId(Rc<String>)

§

PeerIdWithCallId

Fields

§peer_id: Rc<String>
§call_id: u32

Trait Implementations§

source§

impl Archive for Sender
where + Rc<String>: Archive, + u32: Archive,

§

type Archived = ArchivedSender

The archived representation of this type. Read more
§

type Resolver = SenderResolver

The resolver for this type. It must contain all the additional information from serializing +needed to make the archived type from the normal type.
source§

unsafe fn resolve( + &self, + pos: usize, + resolver: <Self as Archive>::Resolver, + out: *mut <Self as Archive>::Archived, +)

Creates the archived version of this value at the given position and writes it to the given +output. Read more
source§

impl Clone for Sender

source§

fn clone(&self) -> Sender

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for Sender

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'de> Deserialize<'de> for Sender

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl<__D: Fallible + ?Sized> Deserialize<Sender, __D> for Archived<Sender>
where + Rc<String>: Archive, + Archived<Rc<String>>: Deserialize<Rc<String>, __D>, + u32: Archive, + Archived<u32>: Deserialize<u32, __D>,

source§

fn deserialize(&self, deserializer: &mut __D) -> Result<Sender, __D::Error>

Deserializes using the given deserializer
source§

impl Display for Sender

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl PartialEq for Sender

source§

fn eq(&self, other: &Sender) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl<__S: Fallible + ?Sized> Serialize<__S> for Sender
where + Rc<String>: Serialize<__S>, + u32: Serialize<__S>,

source§

fn serialize( + &self, + serializer: &mut __S, +) -> Result<<Self as Archive>::Resolver, __S::Error>

Writes the dependencies for the object and returns a resolver that can create the archived +type.
source§

impl Serialize for Sender

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Eq for Sender

source§

impl StructuralPartialEq for Sender

Auto Trait Implementations§

§

impl Freeze for Sender

§

impl RefUnwindSafe for Sender

§

impl !Send for Sender

§

impl !Sync for Sender

§

impl Unpin for Sender

§

impl UnwindSafe for Sender

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
§

impl<T> ArchiveUnsized for T
where + T: Archive,

§

type Archived = <T as Archive>::Archived

The archived counterpart of this type. Unlike Archive, it may be unsized. Read more
§

type MetadataResolver = ()

The resolver for the metadata of this type. Read more
§

unsafe fn resolve_metadata( + &self, + _: usize, + _: <T as ArchiveUnsized>::MetadataResolver, + _: *mut <<T as ArchiveUnsized>::Archived as ArchivePointee>::ArchivedMetadata, +)

Creates the archived version of the metadata for this value at the given position and writes +it to the given output. Read more
§

unsafe fn resolve_unsized( + &self, + from: usize, + to: usize, + resolver: Self::MetadataResolver, + out: *mut RelPtr<Self::Archived, <isize as Archive>::Archived>, +)

Resolves a relative pointer to this value with the given from and to and writes it to +the given output. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
§

impl<T, S> SerializeUnsized<S> for T
where + T: Serialize<S>, + S: Serializer + ?Sized,

§

fn serialize_unsized( + &self, + serializer: &mut S, +) -> Result<usize, <S as Fallible>::Error>

Writes the object and returns the position of the archived type.
§

fn serialize_metadata(&self, _: &mut S) -> Result<(), <S as Fallible>::Error>

Serializes the metadata for the given type.
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_interpreter_data/enum.SenderResolver.html b/air_interpreter_data/enum.SenderResolver.html new file mode 100644 index 00000000..7bcf7783 --- /dev/null +++ b/air_interpreter_data/enum.SenderResolver.html @@ -0,0 +1,39 @@ +SenderResolver in air_interpreter_data - Rust

Enum air_interpreter_data::SenderResolver

source ·
pub enum SenderResolver
where + Rc<String>: Archive, + u32: Archive,
{ + PeerId(Resolver<Rc<String>>), + PeerIdWithCallId { + peer_id: Resolver<Rc<String>>, + call_id: Resolver<u32>, + }, +}
Expand description

The resolver for an archived Sender

+

Variants§

§

PeerId(Resolver<Rc<String>>)

The resolver for Sender::PeerId

+

Tuple Fields

§0: Resolver<Rc<String>>

The resolver for Sender::PeerId::0

+
§

PeerIdWithCallId

The resolver for Sender::PeerIdWithCallId

+

Fields

§peer_id: Resolver<Rc<String>>
§call_id: Resolver<u32>

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_interpreter_data/enum.ValueRef.html b/air_interpreter_data/enum.ValueRef.html new file mode 100644 index 00000000..cb8dccd2 --- /dev/null +++ b/air_interpreter_data/enum.ValueRef.html @@ -0,0 +1,85 @@ +ValueRef in air_interpreter_data - Rust

Enum air_interpreter_data::ValueRef

source ·
pub enum ValueRef {
+    Scalar(CID<ServiceResultCidAggregate>),
+    Stream {
+        cid: CID<ServiceResultCidAggregate>,
+        generation: GenerationIdx,
+    },
+    Unused(CID<JValue>),
+}

Variants§

§

Scalar(CID<ServiceResultCidAggregate>)

The call value is stored to a scalar variable.

+
§

Stream

The call value is stored to a stream variable.

+
§

Unused(CID<JValue>)

The call value is not stored.

+

Trait Implementations§

source§

impl Archive for ValueRef
where + CID<ServiceResultCidAggregate>: Archive, + GenerationIdx: Archive, + CID<JValue>: Archive,

§

type Archived = ArchivedValueRef

The archived representation of this type. Read more
§

type Resolver = ValueRefResolver

The resolver for this type. It must contain all the additional information from serializing +needed to make the archived type from the normal type.
source§

unsafe fn resolve( + &self, + pos: usize, + resolver: <Self as Archive>::Resolver, + out: *mut <Self as Archive>::Archived, +)

Creates the archived version of this value at the given position and writes it to the given +output. Read more
source§

impl Clone for ValueRef

source§

fn clone(&self) -> ValueRef

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for ValueRef

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'de> Deserialize<'de> for ValueRef

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl<__D: Fallible + ?Sized> Deserialize<ValueRef, __D> for Archived<ValueRef>
where + CID<ServiceResultCidAggregate>: Archive, + Archived<CID<ServiceResultCidAggregate>>: Deserialize<CID<ServiceResultCidAggregate>, __D>, + GenerationIdx: Archive, + Archived<GenerationIdx>: Deserialize<GenerationIdx, __D>, + CID<JValue>: Archive, + Archived<CID<JValue>>: Deserialize<CID<JValue>, __D>,

source§

fn deserialize(&self, deserializer: &mut __D) -> Result<ValueRef, __D::Error>

Deserializes using the given deserializer
source§

impl Display for ValueRef

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl PartialEq for ValueRef

source§

fn eq(&self, other: &ValueRef) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl<__S: Fallible + ?Sized> Serialize<__S> for ValueRef
where + CID<ServiceResultCidAggregate>: Serialize<__S>, + GenerationIdx: Serialize<__S>, + CID<JValue>: Serialize<__S>,

source§

fn serialize( + &self, + serializer: &mut __S, +) -> Result<<Self as Archive>::Resolver, __S::Error>

Writes the dependencies for the object and returns a resolver that can create the archived +type.
source§

impl Serialize for ValueRef

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Eq for ValueRef

source§

impl StructuralPartialEq for ValueRef

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
§

impl<T> ArchiveUnsized for T
where + T: Archive,

§

type Archived = <T as Archive>::Archived

The archived counterpart of this type. Unlike Archive, it may be unsized. Read more
§

type MetadataResolver = ()

The resolver for the metadata of this type. Read more
§

unsafe fn resolve_metadata( + &self, + _: usize, + _: <T as ArchiveUnsized>::MetadataResolver, + _: *mut <<T as ArchiveUnsized>::Archived as ArchivePointee>::ArchivedMetadata, +)

Creates the archived version of the metadata for this value at the given position and writes +it to the given output. Read more
§

unsafe fn resolve_unsized( + &self, + from: usize, + to: usize, + resolver: Self::MetadataResolver, + out: *mut RelPtr<Self::Archived, <isize as Archive>::Archived>, +)

Resolves a relative pointer to this value with the given from and to and writes it to +the given output. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
§

impl<T, S> SerializeUnsized<S> for T
where + T: Serialize<S>, + S: Serializer + ?Sized,

§

fn serialize_unsized( + &self, + serializer: &mut S, +) -> Result<usize, <S as Fallible>::Error>

Writes the object and returns the position of the archived type.
§

fn serialize_metadata(&self, _: &mut S) -> Result<(), <S as Fallible>::Error>

Serializes the metadata for the given type.
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_interpreter_data/enum.ValueRefResolver.html b/air_interpreter_data/enum.ValueRefResolver.html new file mode 100644 index 00000000..30e41013 --- /dev/null +++ b/air_interpreter_data/enum.ValueRefResolver.html @@ -0,0 +1,43 @@ +ValueRefResolver in air_interpreter_data - Rust

Enum air_interpreter_data::ValueRefResolver

source ·
pub enum ValueRefResolver
where + CID<ServiceResultCidAggregate>: Archive, + GenerationIdx: Archive, + CID<JValue>: Archive,
{ + Scalar(Resolver<CID<ServiceResultCidAggregate>>), + Stream { + cid: Resolver<CID<ServiceResultCidAggregate>>, + generation: Resolver<GenerationIdx>, + }, + Unused(Resolver<CID<JValue>>), +}
Expand description

The resolver for an archived ValueRef

+

Variants§

§

Scalar(Resolver<CID<ServiceResultCidAggregate>>)

The resolver for ValueRef::Scalar

+

Tuple Fields

§0: Resolver<CID<ServiceResultCidAggregate>>

The resolver for ValueRef::Scalar::0

+
§

Stream

The resolver for ValueRef::Stream

+

Fields

§cid: Resolver<CID<ServiceResultCidAggregate>>

The resolver for ValueRef::Stream::cid

+
§generation: Resolver<GenerationIdx>

The resolver for ValueRef::Stream::generation

+
§

Unused(Resolver<CID<JValue>>)

The resolver for ValueRef::Unused

+

Tuple Fields

§0: Resolver<CID<JValue>>

The resolver for ValueRef::Unused::0

+

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_interpreter_data/executed_state/enum.ArchivedCallResult.html b/air_interpreter_data/executed_state/enum.ArchivedCallResult.html new file mode 100644 index 00000000..33e8d546 --- /dev/null +++ b/air_interpreter_data/executed_state/enum.ArchivedCallResult.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_data/enum.ArchivedCallResult.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_data/executed_state/enum.ArchivedCanonResult.html b/air_interpreter_data/executed_state/enum.ArchivedCanonResult.html new file mode 100644 index 00000000..13cea2cf --- /dev/null +++ b/air_interpreter_data/executed_state/enum.ArchivedCanonResult.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_data/enum.ArchivedCanonResult.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_data/executed_state/enum.ArchivedExecutedState.html b/air_interpreter_data/executed_state/enum.ArchivedExecutedState.html new file mode 100644 index 00000000..d3727ad4 --- /dev/null +++ b/air_interpreter_data/executed_state/enum.ArchivedExecutedState.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_data/enum.ArchivedExecutedState.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_data/executed_state/enum.ArchivedProvenance.html b/air_interpreter_data/executed_state/enum.ArchivedProvenance.html new file mode 100644 index 00000000..d90ba1b4 --- /dev/null +++ b/air_interpreter_data/executed_state/enum.ArchivedProvenance.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_data/enum.ArchivedProvenance.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_data/executed_state/enum.ArchivedSender.html b/air_interpreter_data/executed_state/enum.ArchivedSender.html new file mode 100644 index 00000000..cc88788d --- /dev/null +++ b/air_interpreter_data/executed_state/enum.ArchivedSender.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_data/enum.ArchivedSender.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_data/executed_state/enum.ArchivedValueRef.html b/air_interpreter_data/executed_state/enum.ArchivedValueRef.html new file mode 100644 index 00000000..d59be2a0 --- /dev/null +++ b/air_interpreter_data/executed_state/enum.ArchivedValueRef.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_data/enum.ArchivedValueRef.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_data/executed_state/enum.CallResult.html b/air_interpreter_data/executed_state/enum.CallResult.html new file mode 100644 index 00000000..925ba4a0 --- /dev/null +++ b/air_interpreter_data/executed_state/enum.CallResult.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_data/enum.CallResult.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_data/executed_state/enum.CallResultResolver.html b/air_interpreter_data/executed_state/enum.CallResultResolver.html new file mode 100644 index 00000000..79e01631 --- /dev/null +++ b/air_interpreter_data/executed_state/enum.CallResultResolver.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_data/enum.CallResultResolver.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_data/executed_state/enum.CanonResult.html b/air_interpreter_data/executed_state/enum.CanonResult.html new file mode 100644 index 00000000..ba82f047 --- /dev/null +++ b/air_interpreter_data/executed_state/enum.CanonResult.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_data/enum.CanonResult.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_data/executed_state/enum.CanonResultResolver.html b/air_interpreter_data/executed_state/enum.CanonResultResolver.html new file mode 100644 index 00000000..d6dd22c3 --- /dev/null +++ b/air_interpreter_data/executed_state/enum.CanonResultResolver.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_data/enum.CanonResultResolver.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_data/executed_state/enum.ExecutedState.html b/air_interpreter_data/executed_state/enum.ExecutedState.html new file mode 100644 index 00000000..aef14f98 --- /dev/null +++ b/air_interpreter_data/executed_state/enum.ExecutedState.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_data/enum.ExecutedState.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_data/executed_state/enum.ExecutedStateResolver.html b/air_interpreter_data/executed_state/enum.ExecutedStateResolver.html new file mode 100644 index 00000000..2c6a6591 --- /dev/null +++ b/air_interpreter_data/executed_state/enum.ExecutedStateResolver.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_data/enum.ExecutedStateResolver.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_data/executed_state/enum.Provenance.html b/air_interpreter_data/executed_state/enum.Provenance.html new file mode 100644 index 00000000..769f08e5 --- /dev/null +++ b/air_interpreter_data/executed_state/enum.Provenance.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_data/enum.Provenance.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_data/executed_state/enum.ProvenanceResolver.html b/air_interpreter_data/executed_state/enum.ProvenanceResolver.html new file mode 100644 index 00000000..a1bd98ef --- /dev/null +++ b/air_interpreter_data/executed_state/enum.ProvenanceResolver.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_data/enum.ProvenanceResolver.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_data/executed_state/enum.Sender.html b/air_interpreter_data/executed_state/enum.Sender.html new file mode 100644 index 00000000..67404eef --- /dev/null +++ b/air_interpreter_data/executed_state/enum.Sender.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_data/enum.Sender.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_data/executed_state/enum.SenderResolver.html b/air_interpreter_data/executed_state/enum.SenderResolver.html new file mode 100644 index 00000000..7f3d5dd0 --- /dev/null +++ b/air_interpreter_data/executed_state/enum.SenderResolver.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_data/enum.SenderResolver.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_data/executed_state/enum.ValueRef.html b/air_interpreter_data/executed_state/enum.ValueRef.html new file mode 100644 index 00000000..e42b7102 --- /dev/null +++ b/air_interpreter_data/executed_state/enum.ValueRef.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_data/enum.ValueRef.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_data/executed_state/enum.ValueRefResolver.html b/air_interpreter_data/executed_state/enum.ValueRefResolver.html new file mode 100644 index 00000000..44a3687a --- /dev/null +++ b/air_interpreter_data/executed_state/enum.ValueRefResolver.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_data/enum.ValueRefResolver.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_data/executed_state/struct.ApResult.html b/air_interpreter_data/executed_state/struct.ApResult.html new file mode 100644 index 00000000..9dca4da6 --- /dev/null +++ b/air_interpreter_data/executed_state/struct.ApResult.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_data/struct.ApResult.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_data/executed_state/struct.ApResultResolver.html b/air_interpreter_data/executed_state/struct.ApResultResolver.html new file mode 100644 index 00000000..bc9e3d82 --- /dev/null +++ b/air_interpreter_data/executed_state/struct.ApResultResolver.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_data/struct.ApResultResolver.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_data/executed_state/struct.ArchivedApResult.html b/air_interpreter_data/executed_state/struct.ArchivedApResult.html new file mode 100644 index 00000000..9cf0c74a --- /dev/null +++ b/air_interpreter_data/executed_state/struct.ArchivedApResult.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_data/struct.ArchivedApResult.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_data/executed_state/struct.ArchivedCallServiceFailed.html b/air_interpreter_data/executed_state/struct.ArchivedCallServiceFailed.html new file mode 100644 index 00000000..620a2db1 --- /dev/null +++ b/air_interpreter_data/executed_state/struct.ArchivedCallServiceFailed.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_data/struct.ArchivedCallServiceFailed.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_data/executed_state/struct.ArchivedCanonCidAggregate.html b/air_interpreter_data/executed_state/struct.ArchivedCanonCidAggregate.html new file mode 100644 index 00000000..57450a0d --- /dev/null +++ b/air_interpreter_data/executed_state/struct.ArchivedCanonCidAggregate.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_data/struct.ArchivedCanonCidAggregate.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_data/executed_state/struct.ArchivedCanonResultCidAggregate.html b/air_interpreter_data/executed_state/struct.ArchivedCanonResultCidAggregate.html new file mode 100644 index 00000000..a96f1041 --- /dev/null +++ b/air_interpreter_data/executed_state/struct.ArchivedCanonResultCidAggregate.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_data/struct.ArchivedCanonResultCidAggregate.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_data/executed_state/struct.ArchivedFoldResult.html b/air_interpreter_data/executed_state/struct.ArchivedFoldResult.html new file mode 100644 index 00000000..40071d60 --- /dev/null +++ b/air_interpreter_data/executed_state/struct.ArchivedFoldResult.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_data/struct.ArchivedFoldResult.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_data/executed_state/struct.ArchivedFoldSubTraceLore.html b/air_interpreter_data/executed_state/struct.ArchivedFoldSubTraceLore.html new file mode 100644 index 00000000..f36b3cad --- /dev/null +++ b/air_interpreter_data/executed_state/struct.ArchivedFoldSubTraceLore.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_data/struct.ArchivedFoldSubTraceLore.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_data/executed_state/struct.ArchivedParResult.html b/air_interpreter_data/executed_state/struct.ArchivedParResult.html new file mode 100644 index 00000000..73f10a11 --- /dev/null +++ b/air_interpreter_data/executed_state/struct.ArchivedParResult.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_data/struct.ArchivedParResult.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_data/executed_state/struct.ArchivedServiceResultCidAggregate.html b/air_interpreter_data/executed_state/struct.ArchivedServiceResultCidAggregate.html new file mode 100644 index 00000000..7168dee8 --- /dev/null +++ b/air_interpreter_data/executed_state/struct.ArchivedServiceResultCidAggregate.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_data/struct.ArchivedServiceResultCidAggregate.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_data/executed_state/struct.ArchivedSubTraceDesc.html b/air_interpreter_data/executed_state/struct.ArchivedSubTraceDesc.html new file mode 100644 index 00000000..09606310 --- /dev/null +++ b/air_interpreter_data/executed_state/struct.ArchivedSubTraceDesc.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_data/struct.ArchivedSubTraceDesc.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_data/executed_state/struct.CallServiceFailed.html b/air_interpreter_data/executed_state/struct.CallServiceFailed.html new file mode 100644 index 00000000..f455f576 --- /dev/null +++ b/air_interpreter_data/executed_state/struct.CallServiceFailed.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_data/struct.CallServiceFailed.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_data/executed_state/struct.CallServiceFailedResolver.html b/air_interpreter_data/executed_state/struct.CallServiceFailedResolver.html new file mode 100644 index 00000000..c69bc419 --- /dev/null +++ b/air_interpreter_data/executed_state/struct.CallServiceFailedResolver.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_data/struct.CallServiceFailedResolver.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_data/executed_state/struct.CanonCidAggregate.html b/air_interpreter_data/executed_state/struct.CanonCidAggregate.html new file mode 100644 index 00000000..ab4d4afa --- /dev/null +++ b/air_interpreter_data/executed_state/struct.CanonCidAggregate.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_data/struct.CanonCidAggregate.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_data/executed_state/struct.CanonCidAggregateResolver.html b/air_interpreter_data/executed_state/struct.CanonCidAggregateResolver.html new file mode 100644 index 00000000..b865ea50 --- /dev/null +++ b/air_interpreter_data/executed_state/struct.CanonCidAggregateResolver.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_data/struct.CanonCidAggregateResolver.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_data/executed_state/struct.CanonResultCidAggregate.html b/air_interpreter_data/executed_state/struct.CanonResultCidAggregate.html new file mode 100644 index 00000000..95fc4402 --- /dev/null +++ b/air_interpreter_data/executed_state/struct.CanonResultCidAggregate.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_data/struct.CanonResultCidAggregate.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_data/executed_state/struct.CanonResultCidAggregateResolver.html b/air_interpreter_data/executed_state/struct.CanonResultCidAggregateResolver.html new file mode 100644 index 00000000..08fb531c --- /dev/null +++ b/air_interpreter_data/executed_state/struct.CanonResultCidAggregateResolver.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_data/struct.CanonResultCidAggregateResolver.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_data/executed_state/struct.FoldResult.html b/air_interpreter_data/executed_state/struct.FoldResult.html new file mode 100644 index 00000000..a5425f38 --- /dev/null +++ b/air_interpreter_data/executed_state/struct.FoldResult.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_data/struct.FoldResult.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_data/executed_state/struct.FoldResultResolver.html b/air_interpreter_data/executed_state/struct.FoldResultResolver.html new file mode 100644 index 00000000..750dd320 --- /dev/null +++ b/air_interpreter_data/executed_state/struct.FoldResultResolver.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_data/struct.FoldResultResolver.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_data/executed_state/struct.FoldSubTraceLore.html b/air_interpreter_data/executed_state/struct.FoldSubTraceLore.html new file mode 100644 index 00000000..2c47fe18 --- /dev/null +++ b/air_interpreter_data/executed_state/struct.FoldSubTraceLore.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_data/struct.FoldSubTraceLore.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_data/executed_state/struct.FoldSubTraceLoreResolver.html b/air_interpreter_data/executed_state/struct.FoldSubTraceLoreResolver.html new file mode 100644 index 00000000..a2019950 --- /dev/null +++ b/air_interpreter_data/executed_state/struct.FoldSubTraceLoreResolver.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_data/struct.FoldSubTraceLoreResolver.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_data/executed_state/struct.ParResult.html b/air_interpreter_data/executed_state/struct.ParResult.html new file mode 100644 index 00000000..df58f665 --- /dev/null +++ b/air_interpreter_data/executed_state/struct.ParResult.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_data/struct.ParResult.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_data/executed_state/struct.ParResultResolver.html b/air_interpreter_data/executed_state/struct.ParResultResolver.html new file mode 100644 index 00000000..7e918ae5 --- /dev/null +++ b/air_interpreter_data/executed_state/struct.ParResultResolver.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_data/struct.ParResultResolver.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_data/executed_state/struct.ServiceResultCidAggregate.html b/air_interpreter_data/executed_state/struct.ServiceResultCidAggregate.html new file mode 100644 index 00000000..6aec168f --- /dev/null +++ b/air_interpreter_data/executed_state/struct.ServiceResultCidAggregate.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_data/struct.ServiceResultCidAggregate.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_data/executed_state/struct.ServiceResultCidAggregateResolver.html b/air_interpreter_data/executed_state/struct.ServiceResultCidAggregateResolver.html new file mode 100644 index 00000000..3f718197 --- /dev/null +++ b/air_interpreter_data/executed_state/struct.ServiceResultCidAggregateResolver.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_data/struct.ServiceResultCidAggregateResolver.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_data/executed_state/struct.SubTraceDesc.html b/air_interpreter_data/executed_state/struct.SubTraceDesc.html new file mode 100644 index 00000000..1e16167c --- /dev/null +++ b/air_interpreter_data/executed_state/struct.SubTraceDesc.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_data/struct.SubTraceDesc.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_data/executed_state/struct.SubTraceDescResolver.html b/air_interpreter_data/executed_state/struct.SubTraceDescResolver.html new file mode 100644 index 00000000..6918bbde --- /dev/null +++ b/air_interpreter_data/executed_state/struct.SubTraceDescResolver.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_data/struct.SubTraceDescResolver.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_data/executed_state/type.FoldLore.html b/air_interpreter_data/executed_state/type.FoldLore.html new file mode 100644 index 00000000..1b76ca3e --- /dev/null +++ b/air_interpreter_data/executed_state/type.FoldLore.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_data/type.FoldLore.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_data/fn.data_version.html b/air_interpreter_data/fn.data_version.html new file mode 100644 index 00000000..600e3e61 --- /dev/null +++ b/air_interpreter_data/fn.data_version.html @@ -0,0 +1 @@ +data_version in air_interpreter_data - Rust

Function air_interpreter_data::data_version

source ·
pub fn data_version() -> &'static Version
\ No newline at end of file diff --git a/air_interpreter_data/generation_idx/struct.ArchivedGenerationIdx.html b/air_interpreter_data/generation_idx/struct.ArchivedGenerationIdx.html new file mode 100644 index 00000000..16d62121 --- /dev/null +++ b/air_interpreter_data/generation_idx/struct.ArchivedGenerationIdx.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_data/struct.ArchivedGenerationIdx.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_data/generation_idx/struct.GenerationIdx.html b/air_interpreter_data/generation_idx/struct.GenerationIdx.html new file mode 100644 index 00000000..cbbae8c6 --- /dev/null +++ b/air_interpreter_data/generation_idx/struct.GenerationIdx.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_data/struct.GenerationIdx.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_data/generation_idx/struct.GenerationIdxResolver.html b/air_interpreter_data/generation_idx/struct.GenerationIdxResolver.html new file mode 100644 index 00000000..22b1c753 --- /dev/null +++ b/air_interpreter_data/generation_idx/struct.GenerationIdxResolver.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_data/struct.GenerationIdxResolver.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_data/index.html b/air_interpreter_data/index.html new file mode 100644 index 00000000..2210b2e7 --- /dev/null +++ b/air_interpreter_data/index.html @@ -0,0 +1,17 @@ +air_interpreter_data - Rust

Crate air_interpreter_data

source ·

Modules§

Structs§

Enums§

Functions§

Type Aliases§

\ No newline at end of file diff --git a/air_interpreter_data/interpreter_data/enum.DataDeserializationError.html b/air_interpreter_data/interpreter_data/enum.DataDeserializationError.html new file mode 100644 index 00000000..90ecb1a3 --- /dev/null +++ b/air_interpreter_data/interpreter_data/enum.DataDeserializationError.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_data/enum.DataDeserializationError.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_data/interpreter_data/errors/enum.DataVerifierError.html b/air_interpreter_data/interpreter_data/errors/enum.DataVerifierError.html new file mode 100644 index 00000000..28121268 --- /dev/null +++ b/air_interpreter_data/interpreter_data/errors/enum.DataVerifierError.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../air_interpreter_data/verification/enum.DataVerifierError.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_data/interpreter_data/repr/struct.InterpreterDataEnvelopeRepr.html b/air_interpreter_data/interpreter_data/repr/struct.InterpreterDataEnvelopeRepr.html new file mode 100644 index 00000000..91ba1253 --- /dev/null +++ b/air_interpreter_data/interpreter_data/repr/struct.InterpreterDataEnvelopeRepr.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../air_interpreter_data/struct.InterpreterDataEnvelopeRepr.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_data/interpreter_data/repr/type.InterpreterDataEnvelopeFormat.html b/air_interpreter_data/interpreter_data/repr/type.InterpreterDataEnvelopeFormat.html new file mode 100644 index 00000000..eb9a98f1 --- /dev/null +++ b/air_interpreter_data/interpreter_data/repr/type.InterpreterDataEnvelopeFormat.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../air_interpreter_data/type.InterpreterDataEnvelopeFormat.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_data/interpreter_data/struct.ArchivedInterpreterData.html b/air_interpreter_data/interpreter_data/struct.ArchivedInterpreterData.html new file mode 100644 index 00000000..9745c8b1 --- /dev/null +++ b/air_interpreter_data/interpreter_data/struct.ArchivedInterpreterData.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_data/struct.ArchivedInterpreterData.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_data/interpreter_data/struct.InterpreterData.html b/air_interpreter_data/interpreter_data/struct.InterpreterData.html new file mode 100644 index 00000000..3f9f3200 --- /dev/null +++ b/air_interpreter_data/interpreter_data/struct.InterpreterData.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_data/struct.InterpreterData.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_data/interpreter_data/struct.InterpreterDataEnvelope.html b/air_interpreter_data/interpreter_data/struct.InterpreterDataEnvelope.html new file mode 100644 index 00000000..e74a53af --- /dev/null +++ b/air_interpreter_data/interpreter_data/struct.InterpreterDataEnvelope.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_data/struct.InterpreterDataEnvelope.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_data/interpreter_data/struct.InterpreterDataResolver.html b/air_interpreter_data/interpreter_data/struct.InterpreterDataResolver.html new file mode 100644 index 00000000..8d217d3a --- /dev/null +++ b/air_interpreter_data/interpreter_data/struct.InterpreterDataResolver.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_data/struct.InterpreterDataResolver.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_data/interpreter_data/struct.Versions.html b/air_interpreter_data/interpreter_data/struct.Versions.html new file mode 100644 index 00000000..3ea253cd --- /dev/null +++ b/air_interpreter_data/interpreter_data/struct.Versions.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_data/struct.Versions.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_data/interpreter_data/verification/index.html b/air_interpreter_data/interpreter_data/verification/index.html new file mode 100644 index 00000000..6b672276 --- /dev/null +++ b/air_interpreter_data/interpreter_data/verification/index.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../air_interpreter_data/verification/index.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_data/interpreter_data/verification/struct.DataVerifier.html b/air_interpreter_data/interpreter_data/verification/struct.DataVerifier.html new file mode 100644 index 00000000..fe032759 --- /dev/null +++ b/air_interpreter_data/interpreter_data/verification/struct.DataVerifier.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../air_interpreter_data/verification/struct.DataVerifier.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_data/raw_value/struct.ArchivedRawValue.html b/air_interpreter_data/raw_value/struct.ArchivedRawValue.html new file mode 100644 index 00000000..5b84ef90 --- /dev/null +++ b/air_interpreter_data/raw_value/struct.ArchivedRawValue.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_data/struct.ArchivedRawValue.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_data/raw_value/struct.RawValue.html b/air_interpreter_data/raw_value/struct.RawValue.html new file mode 100644 index 00000000..ca6c5861 --- /dev/null +++ b/air_interpreter_data/raw_value/struct.RawValue.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_data/struct.RawValue.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_data/raw_value/struct.RawValueResolver.html b/air_interpreter_data/raw_value/struct.RawValueResolver.html new file mode 100644 index 00000000..1d201ec7 --- /dev/null +++ b/air_interpreter_data/raw_value/struct.RawValueResolver.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_data/struct.RawValueResolver.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_data/sidebar-items.js b/air_interpreter_data/sidebar-items.js new file mode 100644 index 00000000..62450a82 --- /dev/null +++ b/air_interpreter_data/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"enum":["ArchivedCallResult","ArchivedCanonResult","ArchivedExecutedState","ArchivedProvenance","ArchivedSender","ArchivedValueRef","CallResult","CallResultResolver","CanonResult","CanonResultResolver","CidStoreVerificationError","DataDeserializationError","ExecutedState","ExecutedStateResolver","Provenance","ProvenanceResolver","Sender","SenderResolver","ValueRef","ValueRefResolver"],"fn":["data_version"],"mod":["verification"],"struct":["ApResult","ApResultResolver","ArchivedApResult","ArchivedCallServiceFailed","ArchivedCanonCidAggregate","ArchivedCanonResultCidAggregate","ArchivedCidInfo","ArchivedCidStore","ArchivedExecutionTrace","ArchivedFoldResult","ArchivedFoldSubTraceLore","ArchivedGenerationIdx","ArchivedInterpreterData","ArchivedParResult","ArchivedRawValue","ArchivedServiceResultCidAggregate","ArchivedSubTraceDesc","ArchivedTracePos","CallServiceFailed","CallServiceFailedResolver","CanonCidAggregate","CanonCidAggregateResolver","CanonResultCidAggregate","CanonResultCidAggregateResolver","CidInfo","CidInfoResolver","CidStore","CidStoreResolver","CidTracker","ExecutionTrace","ExecutionTraceResolver","FoldResult","FoldResultResolver","FoldSubTraceLore","FoldSubTraceLoreResolver","GenerationIdx","GenerationIdxResolver","InterpreterData","InterpreterDataEnvelope","InterpreterDataEnvelopeRepr","InterpreterDataResolver","ParResult","ParResultResolver","RawValue","RawValueResolver","ServiceResultCidAggregate","ServiceResultCidAggregateResolver","SubTraceDesc","SubTraceDescResolver","TracePos","TracePosResolver","Versions"],"type":["FoldLore","InterpreterDataEnvelopeFormat","PosType","TraceLen"]}; \ No newline at end of file diff --git a/air_interpreter_data/struct.ApResult.html b/air_interpreter_data/struct.ApResult.html new file mode 100644 index 00000000..bf82327c --- /dev/null +++ b/air_interpreter_data/struct.ApResult.html @@ -0,0 +1,66 @@ +ApResult in air_interpreter_data - Rust

Struct air_interpreter_data::ApResult

source ·
pub struct ApResult {
+    pub res_generations: Vec<GenerationIdx>,
+}
Expand description

Describes result of applying functor apply to streams.

+

Fields§

§res_generations: Vec<GenerationIdx>

Implementations§

source§

impl ApResult

source

pub fn new(res_generation: GenerationIdx) -> Self

source

pub fn stub() -> Self

Trait Implementations§

source§

impl Archive for ApResult
where + Vec<GenerationIdx>: Archive,

§

type Archived = ArchivedApResult

The archived representation of this type. Read more
§

type Resolver = ApResultResolver

The resolver for this type. It must contain all the additional information from serializing +needed to make the archived type from the normal type.
source§

unsafe fn resolve( + &self, + pos: usize, + resolver: Self::Resolver, + out: *mut Self::Archived, +)

Creates the archived version of this value at the given position and writes it to the given +output. Read more
source§

impl Clone for ApResult

source§

fn clone(&self) -> ApResult

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for ApResult

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Default for ApResult

source§

fn default() -> ApResult

Returns the “default value” for a type. Read more
source§

impl<'de> Deserialize<'de> for ApResult

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl<__D: Fallible + ?Sized> Deserialize<ApResult, __D> for Archived<ApResult>
where + Vec<GenerationIdx>: Archive, + Archived<Vec<GenerationIdx>>: Deserialize<Vec<GenerationIdx>, __D>,

source§

fn deserialize(&self, deserializer: &mut __D) -> Result<ApResult, __D::Error>

Deserializes using the given deserializer
source§

impl PartialEq for ApResult

source§

fn eq(&self, other: &ApResult) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl<__S: Fallible + ?Sized> Serialize<__S> for ApResult
where + Vec<GenerationIdx>: Serialize<__S>,

source§

fn serialize(&self, serializer: &mut __S) -> Result<Self::Resolver, __S::Error>

Writes the dependencies for the object and returns a resolver that can create the archived +type.
source§

impl Serialize for ApResult

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Eq for ApResult

source§

impl StructuralPartialEq for ApResult

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
§

impl<T> ArchiveUnsized for T
where + T: Archive,

§

type Archived = <T as Archive>::Archived

The archived counterpart of this type. Unlike Archive, it may be unsized. Read more
§

type MetadataResolver = ()

The resolver for the metadata of this type. Read more
§

unsafe fn resolve_metadata( + &self, + _: usize, + _: <T as ArchiveUnsized>::MetadataResolver, + _: *mut <<T as ArchiveUnsized>::Archived as ArchivePointee>::ArchivedMetadata, +)

Creates the archived version of the metadata for this value at the given position and writes +it to the given output. Read more
§

unsafe fn resolve_unsized( + &self, + from: usize, + to: usize, + resolver: Self::MetadataResolver, + out: *mut RelPtr<Self::Archived, <isize as Archive>::Archived>, +)

Resolves a relative pointer to this value with the given from and to and writes it to +the given output. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
§

impl<T, S> SerializeUnsized<S> for T
where + T: Serialize<S>, + S: Serializer + ?Sized,

§

fn serialize_unsized( + &self, + serializer: &mut S, +) -> Result<usize, <S as Fallible>::Error>

Writes the object and returns the position of the archived type.
§

fn serialize_metadata(&self, _: &mut S) -> Result<(), <S as Fallible>::Error>

Serializes the metadata for the given type.
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_interpreter_data/struct.ApResultResolver.html b/air_interpreter_data/struct.ApResultResolver.html new file mode 100644 index 00000000..493f2e30 --- /dev/null +++ b/air_interpreter_data/struct.ApResultResolver.html @@ -0,0 +1,27 @@ +ApResultResolver in air_interpreter_data - Rust

Struct air_interpreter_data::ApResultResolver

source ·
pub struct ApResultResolver
where + Vec<GenerationIdx>: Archive,
{ /* private fields */ }
Expand description

The resolver for an archived ApResult

+

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_interpreter_data/struct.ArchivedApResult.html b/air_interpreter_data/struct.ArchivedApResult.html new file mode 100644 index 00000000..f7014e97 --- /dev/null +++ b/air_interpreter_data/struct.ArchivedApResult.html @@ -0,0 +1,36 @@ +ArchivedApResult in air_interpreter_data - Rust

Struct air_interpreter_data::ArchivedApResult

source ·
#[repr(C)]
pub struct ArchivedApResult
where + Vec<GenerationIdx>: Archive,
{ + pub res_generations: Archived<Vec<GenerationIdx>>, +}
Expand description

An archived ApResult

+

Fields§

§res_generations: Archived<Vec<GenerationIdx>>

The archived counterpart of ApResult::res_generations

+

Trait Implementations§

source§

impl<__C: ?Sized> CheckBytes<__C> for ArchivedApResult
where + Vec<GenerationIdx>: Archive, + Archived<Vec<GenerationIdx>>: CheckBytes<__C>,

§

type Error = StructCheckError

The error that may result from checking the type.
source§

unsafe fn check_bytes<'__bytecheck>( + value: *const Self, + context: &mut __C, +) -> Result<&'__bytecheck Self, StructCheckError>

Checks whether the given pointer points to a valid value within the +given context. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_interpreter_data/struct.ArchivedCallServiceFailed.html b/air_interpreter_data/struct.ArchivedCallServiceFailed.html new file mode 100644 index 00000000..5564bd13 --- /dev/null +++ b/air_interpreter_data/struct.ArchivedCallServiceFailed.html @@ -0,0 +1,41 @@ +ArchivedCallServiceFailed in air_interpreter_data - Rust
#[repr(C)]
pub struct ArchivedCallServiceFailed
where + i32: Archive, + Rc<String>: Archive,
{ + pub ret_code: Archived<i32>, + pub message: Archived<Rc<String>>, +}
Expand description

An archived CallServiceFailed

+

Fields§

§ret_code: Archived<i32>

The archived counterpart of CallServiceFailed::ret_code

+
§message: Archived<Rc<String>>

The archived counterpart of CallServiceFailed::message

+

Trait Implementations§

source§

impl<__C: ?Sized> CheckBytes<__C> for ArchivedCallServiceFailed
where + i32: Archive, + Rc<String>: Archive, + Archived<i32>: CheckBytes<__C>, + Archived<Rc<String>>: CheckBytes<__C>,

§

type Error = StructCheckError

The error that may result from checking the type.
source§

unsafe fn check_bytes<'__bytecheck>( + value: *const Self, + context: &mut __C, +) -> Result<&'__bytecheck Self, StructCheckError>

Checks whether the given pointer points to a valid value within the +given context. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_interpreter_data/struct.ArchivedCanonCidAggregate.html b/air_interpreter_data/struct.ArchivedCanonCidAggregate.html new file mode 100644 index 00000000..35378710 --- /dev/null +++ b/air_interpreter_data/struct.ArchivedCanonCidAggregate.html @@ -0,0 +1,46 @@ +ArchivedCanonCidAggregate in air_interpreter_data - Rust
#[repr(C)]
pub struct ArchivedCanonCidAggregate
where + CID<RawValue>: Archive, + CID<SecurityTetraplet>: Archive, + Provenance: Archive,
{ + pub value: Archived<CID<RawValue>>, + pub tetraplet: Archived<CID<SecurityTetraplet>>, + pub provenance: Archived<Provenance>, +}
Expand description

An archived CanonCidAggregate

+

Fields§

§value: Archived<CID<RawValue>>

The archived counterpart of CanonCidAggregate::value

+
§tetraplet: Archived<CID<SecurityTetraplet>>

The archived counterpart of CanonCidAggregate::tetraplet

+
§provenance: Archived<Provenance>

The archived counterpart of CanonCidAggregate::provenance

+

Trait Implementations§

source§

impl<__C: ?Sized> CheckBytes<__C> for ArchivedCanonCidAggregate
where + CID<RawValue>: Archive, + CID<SecurityTetraplet>: Archive, + Provenance: Archive, + Archived<CID<RawValue>>: CheckBytes<__C>, + Archived<CID<SecurityTetraplet>>: CheckBytes<__C>, + Archived<Provenance>: CheckBytes<__C>,

§

type Error = StructCheckError

The error that may result from checking the type.
source§

unsafe fn check_bytes<'__bytecheck>( + value: *const Self, + context: &mut __C, +) -> Result<&'__bytecheck Self, StructCheckError>

Checks whether the given pointer points to a valid value within the +given context. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_interpreter_data/struct.ArchivedCanonResultCidAggregate.html b/air_interpreter_data/struct.ArchivedCanonResultCidAggregate.html new file mode 100644 index 00000000..f4b89caf --- /dev/null +++ b/air_interpreter_data/struct.ArchivedCanonResultCidAggregate.html @@ -0,0 +1,41 @@ +ArchivedCanonResultCidAggregate in air_interpreter_data - Rust
#[repr(C)]
pub struct ArchivedCanonResultCidAggregate
where + CID<SecurityTetraplet>: Archive, + Vec<CID<CanonCidAggregate>>: Archive,
{ + pub tetraplet: Archived<CID<SecurityTetraplet>>, + pub values: Archived<Vec<CID<CanonCidAggregate>>>, +}
Expand description

Fields§

§tetraplet: Archived<CID<SecurityTetraplet>>

The archived counterpart of CanonResultCidAggregate::tetraplet

+
§values: Archived<Vec<CID<CanonCidAggregate>>>

The archived counterpart of CanonResultCidAggregate::values

+

Trait Implementations§

source§

impl<__C: ?Sized> CheckBytes<__C> for ArchivedCanonResultCidAggregate
where + CID<SecurityTetraplet>: Archive, + Vec<CID<CanonCidAggregate>>: Archive, + Archived<CID<SecurityTetraplet>>: CheckBytes<__C>, + Archived<Vec<CID<CanonCidAggregate>>>: CheckBytes<__C>,

§

type Error = StructCheckError

The error that may result from checking the type.
source§

unsafe fn check_bytes<'__bytecheck>( + value: *const Self, + context: &mut __C, +) -> Result<&'__bytecheck Self, StructCheckError>

Checks whether the given pointer points to a valid value within the +given context. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_interpreter_data/struct.ArchivedCidInfo.html b/air_interpreter_data/struct.ArchivedCidInfo.html new file mode 100644 index 00000000..3cec157f --- /dev/null +++ b/air_interpreter_data/struct.ArchivedCidInfo.html @@ -0,0 +1,56 @@ +ArchivedCidInfo in air_interpreter_data - Rust

Struct air_interpreter_data::ArchivedCidInfo

source ·
#[repr(C)]
pub struct ArchivedCidInfo
where + CidStore<RawValue>: Archive, + CidStore<SecurityTetraplet>: Archive, + CidStore<CanonCidAggregate>: Archive, + CidStore<CanonResultCidAggregate>: Archive, + CidStore<ServiceResultCidAggregate>: Archive,
{ + pub value_store: Archived<CidStore<RawValue>>, + pub tetraplet_store: Archived<CidStore<SecurityTetraplet>>, + pub canon_element_store: Archived<CidStore<CanonCidAggregate>>, + pub canon_result_store: Archived<CidStore<CanonResultCidAggregate>>, + pub service_result_store: Archived<CidStore<ServiceResultCidAggregate>>, +}
Expand description

An archived CidInfo

+

Fields§

§value_store: Archived<CidStore<RawValue>>

The archived counterpart of CidInfo::value_store

+
§tetraplet_store: Archived<CidStore<SecurityTetraplet>>

The archived counterpart of CidInfo::tetraplet_store

+
§canon_element_store: Archived<CidStore<CanonCidAggregate>>

The archived counterpart of CidInfo::canon_element_store

+
§canon_result_store: Archived<CidStore<CanonResultCidAggregate>>

The archived counterpart of CidInfo::canon_result_store

+
§service_result_store: Archived<CidStore<ServiceResultCidAggregate>>

The archived counterpart of CidInfo::service_result_store

+

Trait Implementations§

source§

impl<__C: ?Sized> CheckBytes<__C> for ArchivedCidInfo
where + CidStore<RawValue>: Archive, + CidStore<SecurityTetraplet>: Archive, + CidStore<CanonCidAggregate>: Archive, + CidStore<CanonResultCidAggregate>: Archive, + CidStore<ServiceResultCidAggregate>: Archive, + Archived<CidStore<RawValue>>: CheckBytes<__C>, + Archived<CidStore<SecurityTetraplet>>: CheckBytes<__C>, + Archived<CidStore<CanonCidAggregate>>: CheckBytes<__C>, + Archived<CidStore<CanonResultCidAggregate>>: CheckBytes<__C>, + Archived<CidStore<ServiceResultCidAggregate>>: CheckBytes<__C>,

§

type Error = StructCheckError

The error that may result from checking the type.
source§

unsafe fn check_bytes<'__bytecheck>( + value: *const Self, + context: &mut __C, +) -> Result<&'__bytecheck Self, StructCheckError>

Checks whether the given pointer points to a valid value within the +given context. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_interpreter_data/struct.ArchivedCidStore.html b/air_interpreter_data/struct.ArchivedCidStore.html new file mode 100644 index 00000000..7cd831ff --- /dev/null +++ b/air_interpreter_data/struct.ArchivedCidStore.html @@ -0,0 +1,34 @@ +ArchivedCidStore in air_interpreter_data - Rust

Struct air_interpreter_data::ArchivedCidStore

source ·
#[repr(C)]
pub struct ArchivedCidStore<Val>(/* private fields */) +where + With<HashMap<CID<Val>, Rc<Val>>, AsVec>: Archive;
Expand description

An archived CidStore

+

Trait Implementations§

source§

impl<__C: ?Sized, Val> CheckBytes<__C> for ArchivedCidStore<Val>
where + With<HashMap<CID<Val>, Rc<Val>>, AsVec>: Archive, + Archived<With<HashMap<CID<Val>, Rc<Val>>, AsVec>>: CheckBytes<__C>,

§

type Error = TupleStructCheckError

The error that may result from checking the type.
source§

unsafe fn check_bytes<'__bytecheck>( + value: *const Self, + context: &mut __C, +) -> Result<&'__bytecheck Self, TupleStructCheckError>

Checks whether the given pointer points to a valid value within the +given context. Read more

Auto Trait Implementations§

§

impl<Val> !Freeze for ArchivedCidStore<Val>

§

impl<Val> !RefUnwindSafe for ArchivedCidStore<Val>

§

impl<Val> !Send for ArchivedCidStore<Val>

§

impl<Val> !Sync for ArchivedCidStore<Val>

§

impl<Val> !Unpin for ArchivedCidStore<Val>

§

impl<Val> !UnwindSafe for ArchivedCidStore<Val>

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_interpreter_data/struct.ArchivedExecutionTrace.html b/air_interpreter_data/struct.ArchivedExecutionTrace.html new file mode 100644 index 00000000..d9ed63fc --- /dev/null +++ b/air_interpreter_data/struct.ArchivedExecutionTrace.html @@ -0,0 +1,34 @@ +ArchivedExecutionTrace in air_interpreter_data - Rust

Struct air_interpreter_data::ArchivedExecutionTrace

source ·
#[repr(C)]
pub struct ArchivedExecutionTrace(/* private fields */) +where + Vec<ExecutedState>: Archive;
Expand description

An archived ExecutionTrace

+

Trait Implementations§

source§

impl<__C: ?Sized> CheckBytes<__C> for ArchivedExecutionTrace
where + Vec<ExecutedState>: Archive, + Archived<Vec<ExecutedState>>: CheckBytes<__C>,

§

type Error = TupleStructCheckError

The error that may result from checking the type.
source§

unsafe fn check_bytes<'__bytecheck>( + value: *const Self, + context: &mut __C, +) -> Result<&'__bytecheck Self, TupleStructCheckError>

Checks whether the given pointer points to a valid value within the +given context. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_interpreter_data/struct.ArchivedFoldResult.html b/air_interpreter_data/struct.ArchivedFoldResult.html new file mode 100644 index 00000000..da4bde4d --- /dev/null +++ b/air_interpreter_data/struct.ArchivedFoldResult.html @@ -0,0 +1,36 @@ +ArchivedFoldResult in air_interpreter_data - Rust

Struct air_interpreter_data::ArchivedFoldResult

source ·
#[repr(C)]
pub struct ArchivedFoldResult
where + FoldLore: Archive,
{ + pub lore: Archived<FoldLore>, +}
Expand description

An archived FoldResult

+

Fields§

§lore: Archived<FoldLore>

The archived counterpart of FoldResult::lore

+

Trait Implementations§

source§

impl<__C: ?Sized> CheckBytes<__C> for ArchivedFoldResult
where + FoldLore: Archive, + Archived<FoldLore>: CheckBytes<__C>,

§

type Error = StructCheckError

The error that may result from checking the type.
source§

unsafe fn check_bytes<'__bytecheck>( + value: *const Self, + context: &mut __C, +) -> Result<&'__bytecheck Self, StructCheckError>

Checks whether the given pointer points to a valid value within the +given context. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_interpreter_data/struct.ArchivedFoldSubTraceLore.html b/air_interpreter_data/struct.ArchivedFoldSubTraceLore.html new file mode 100644 index 00000000..0a0a79f4 --- /dev/null +++ b/air_interpreter_data/struct.ArchivedFoldSubTraceLore.html @@ -0,0 +1,41 @@ +ArchivedFoldSubTraceLore in air_interpreter_data - Rust
#[repr(C)]
pub struct ArchivedFoldSubTraceLore
where + TracePos: Archive, + Vec<SubTraceDesc>: Archive,
{ + pub value_pos: Archived<TracePos>, + pub subtraces_desc: Archived<Vec<SubTraceDesc>>, +}
Expand description

An archived FoldSubTraceLore

+

Fields§

§value_pos: Archived<TracePos>

The archived counterpart of FoldSubTraceLore::value_pos

+
§subtraces_desc: Archived<Vec<SubTraceDesc>>

The archived counterpart of FoldSubTraceLore::subtraces_desc

+

Trait Implementations§

source§

impl<__C: ?Sized> CheckBytes<__C> for ArchivedFoldSubTraceLore
where + TracePos: Archive, + Vec<SubTraceDesc>: Archive, + Archived<TracePos>: CheckBytes<__C>, + Archived<Vec<SubTraceDesc>>: CheckBytes<__C>,

§

type Error = StructCheckError

The error that may result from checking the type.
source§

unsafe fn check_bytes<'__bytecheck>( + value: *const Self, + context: &mut __C, +) -> Result<&'__bytecheck Self, StructCheckError>

Checks whether the given pointer points to a valid value within the +given context. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_interpreter_data/struct.ArchivedGenerationIdx.html b/air_interpreter_data/struct.ArchivedGenerationIdx.html new file mode 100644 index 00000000..4bfe7503 --- /dev/null +++ b/air_interpreter_data/struct.ArchivedGenerationIdx.html @@ -0,0 +1,34 @@ +ArchivedGenerationIdx in air_interpreter_data - Rust

Struct air_interpreter_data::ArchivedGenerationIdx

source ·
#[repr(C)]
pub struct ArchivedGenerationIdx(/* private fields */) +where + u32: Archive;
Expand description

An archived GenerationIdx

+

Trait Implementations§

source§

impl<__C: ?Sized> CheckBytes<__C> for ArchivedGenerationIdx
where + u32: Archive, + Archived<u32>: CheckBytes<__C>,

§

type Error = TupleStructCheckError

The error that may result from checking the type.
source§

unsafe fn check_bytes<'__bytecheck>( + value: *const Self, + context: &mut __C, +) -> Result<&'__bytecheck Self, TupleStructCheckError>

Checks whether the given pointer points to a valid value within the +given context. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_interpreter_data/struct.ArchivedInterpreterData.html b/air_interpreter_data/struct.ArchivedInterpreterData.html new file mode 100644 index 00000000..83052d31 --- /dev/null +++ b/air_interpreter_data/struct.ArchivedInterpreterData.html @@ -0,0 +1,51 @@ +ArchivedInterpreterData in air_interpreter_data - Rust
#[repr(C)]
pub struct ArchivedInterpreterData
where + ExecutionTrace: Archive, + u32: Archive, + CidInfo: Archive, + SignatureStore: Archive,
{ + pub trace: Archived<ExecutionTrace>, + pub last_call_request_id: Archived<u32>, + pub cid_info: Archived<CidInfo>, + pub signatures: Archived<SignatureStore>, +}
Expand description

An archived InterpreterData

+

Fields§

§trace: Archived<ExecutionTrace>

The archived counterpart of InterpreterData::trace

+
§last_call_request_id: Archived<u32>

The archived counterpart of InterpreterData::last_call_request_id

+
§cid_info: Archived<CidInfo>

The archived counterpart of InterpreterData::cid_info

+
§signatures: Archived<SignatureStore>

The archived counterpart of InterpreterData::signatures

+

Trait Implementations§

source§

impl<__C: ?Sized> CheckBytes<__C> for ArchivedInterpreterData
where + ExecutionTrace: Archive, + u32: Archive, + CidInfo: Archive, + SignatureStore: Archive, + Archived<ExecutionTrace>: CheckBytes<__C>, + Archived<u32>: CheckBytes<__C>, + Archived<CidInfo>: CheckBytes<__C>, + Archived<SignatureStore>: CheckBytes<__C>,

§

type Error = StructCheckError

The error that may result from checking the type.
source§

unsafe fn check_bytes<'__bytecheck>( + value: *const Self, + context: &mut __C, +) -> Result<&'__bytecheck Self, StructCheckError>

Checks whether the given pointer points to a valid value within the +given context. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_interpreter_data/struct.ArchivedParResult.html b/air_interpreter_data/struct.ArchivedParResult.html new file mode 100644 index 00000000..341008ee --- /dev/null +++ b/air_interpreter_data/struct.ArchivedParResult.html @@ -0,0 +1,38 @@ +ArchivedParResult in air_interpreter_data - Rust

Struct air_interpreter_data::ArchivedParResult

source ·
#[repr(C)]
pub struct ArchivedParResult
where + u32: Archive,
{ + pub left_size: Archived<u32>, + pub right_size: Archived<u32>, +}
Expand description

An archived ParResult

+

Fields§

§left_size: Archived<u32>

The archived counterpart of ParResult::left_size

+
§right_size: Archived<u32>

The archived counterpart of ParResult::right_size

+

Trait Implementations§

source§

impl<__C: ?Sized> CheckBytes<__C> for ArchivedParResult
where + u32: Archive, + Archived<u32>: CheckBytes<__C>,

§

type Error = StructCheckError

The error that may result from checking the type.
source§

unsafe fn check_bytes<'__bytecheck>( + value: *const Self, + context: &mut __C, +) -> Result<&'__bytecheck Self, StructCheckError>

Checks whether the given pointer points to a valid value within the +given context. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_interpreter_data/struct.ArchivedRawValue.html b/air_interpreter_data/struct.ArchivedRawValue.html new file mode 100644 index 00000000..2f4b6411 --- /dev/null +++ b/air_interpreter_data/struct.ArchivedRawValue.html @@ -0,0 +1,36 @@ +ArchivedRawValue in air_interpreter_data - Rust

Struct air_interpreter_data::ArchivedRawValue

source ·
#[repr(C)]
pub struct ArchivedRawValue
where + Box<str>: Archive, + With<RefCell<Option<JValue>>, Skip>: Archive,
{ /* private fields */ }
Expand description

An archived RawValue

+

Trait Implementations§

source§

impl<__C: ?Sized> CheckBytes<__C> for ArchivedRawValue
where + Box<str>: Archive, + With<RefCell<Option<JValue>>, Skip>: Archive, + Archived<Box<str>>: CheckBytes<__C>, + Archived<With<RefCell<Option<JValue>>, Skip>>: CheckBytes<__C>,

§

type Error = StructCheckError

The error that may result from checking the type.
source§

unsafe fn check_bytes<'__bytecheck>( + value: *const Self, + context: &mut __C, +) -> Result<&'__bytecheck Self, StructCheckError>

Checks whether the given pointer points to a valid value within the +given context. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_interpreter_data/struct.ArchivedServiceResultCidAggregate.html b/air_interpreter_data/struct.ArchivedServiceResultCidAggregate.html new file mode 100644 index 00000000..791e0088 --- /dev/null +++ b/air_interpreter_data/struct.ArchivedServiceResultCidAggregate.html @@ -0,0 +1,46 @@ +ArchivedServiceResultCidAggregate in air_interpreter_data - Rust
#[repr(C)]
pub struct ArchivedServiceResultCidAggregate
where + CID<RawValue>: Archive, + Rc<str>: Archive, + CID<SecurityTetraplet>: Archive,
{ + pub value_cid: Archived<CID<RawValue>>, + pub argument_hash: Archived<Rc<str>>, + pub tetraplet_cid: Archived<CID<SecurityTetraplet>>, +}
Expand description

Fields§

§value_cid: Archived<CID<RawValue>>

The archived counterpart of ServiceResultCidAggregate::value_cid

+
§argument_hash: Archived<Rc<str>>

The archived counterpart of ServiceResultCidAggregate::argument_hash

+
§tetraplet_cid: Archived<CID<SecurityTetraplet>>

The archived counterpart of ServiceResultCidAggregate::tetraplet_cid

+

Trait Implementations§

source§

impl<__C: ?Sized> CheckBytes<__C> for ArchivedServiceResultCidAggregate
where + CID<RawValue>: Archive, + Rc<str>: Archive, + CID<SecurityTetraplet>: Archive, + Archived<CID<RawValue>>: CheckBytes<__C>, + Archived<Rc<str>>: CheckBytes<__C>, + Archived<CID<SecurityTetraplet>>: CheckBytes<__C>,

§

type Error = StructCheckError

The error that may result from checking the type.
source§

unsafe fn check_bytes<'__bytecheck>( + value: *const Self, + context: &mut __C, +) -> Result<&'__bytecheck Self, StructCheckError>

Checks whether the given pointer points to a valid value within the +given context. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_interpreter_data/struct.ArchivedSubTraceDesc.html b/air_interpreter_data/struct.ArchivedSubTraceDesc.html new file mode 100644 index 00000000..b6d6ac65 --- /dev/null +++ b/air_interpreter_data/struct.ArchivedSubTraceDesc.html @@ -0,0 +1,41 @@ +ArchivedSubTraceDesc in air_interpreter_data - Rust

Struct air_interpreter_data::ArchivedSubTraceDesc

source ·
#[repr(C)]
pub struct ArchivedSubTraceDesc
where + TracePos: Archive, + u32: Archive,
{ + pub begin_pos: Archived<TracePos>, + pub subtrace_len: Archived<u32>, +}
Expand description

An archived SubTraceDesc

+

Fields§

§begin_pos: Archived<TracePos>

The archived counterpart of SubTraceDesc::begin_pos

+
§subtrace_len: Archived<u32>

The archived counterpart of SubTraceDesc::subtrace_len

+

Trait Implementations§

source§

impl<__C: ?Sized> CheckBytes<__C> for ArchivedSubTraceDesc
where + TracePos: Archive, + u32: Archive, + Archived<TracePos>: CheckBytes<__C>, + Archived<u32>: CheckBytes<__C>,

§

type Error = StructCheckError

The error that may result from checking the type.
source§

unsafe fn check_bytes<'__bytecheck>( + value: *const Self, + context: &mut __C, +) -> Result<&'__bytecheck Self, StructCheckError>

Checks whether the given pointer points to a valid value within the +given context. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_interpreter_data/struct.ArchivedTracePos.html b/air_interpreter_data/struct.ArchivedTracePos.html new file mode 100644 index 00000000..98cb2059 --- /dev/null +++ b/air_interpreter_data/struct.ArchivedTracePos.html @@ -0,0 +1,34 @@ +ArchivedTracePos in air_interpreter_data - Rust

Struct air_interpreter_data::ArchivedTracePos

source ·
#[repr(C)]
pub struct ArchivedTracePos(/* private fields */) +where + PosType: Archive;
Expand description

An archived TracePos

+

Trait Implementations§

source§

impl<__C: ?Sized> CheckBytes<__C> for ArchivedTracePos
where + PosType: Archive, + Archived<PosType>: CheckBytes<__C>,

§

type Error = TupleStructCheckError

The error that may result from checking the type.
source§

unsafe fn check_bytes<'__bytecheck>( + value: *const Self, + context: &mut __C, +) -> Result<&'__bytecheck Self, TupleStructCheckError>

Checks whether the given pointer points to a valid value within the +given context. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_interpreter_data/struct.CallServiceFailed.html b/air_interpreter_data/struct.CallServiceFailed.html new file mode 100644 index 00000000..b592ffdb --- /dev/null +++ b/air_interpreter_data/struct.CallServiceFailed.html @@ -0,0 +1,74 @@ +CallServiceFailed in air_interpreter_data - Rust

Struct air_interpreter_data::CallServiceFailed

source ·
pub struct CallServiceFailed {
+    pub ret_code: i32,
+    pub message: Rc<String>,
+}

Fields§

§ret_code: i32§message: Rc<String>

This field contains a JSON-serialized value, not a plain error message.

+

Implementations§

source§

impl CallServiceFailed

source

pub fn new(ret_code: i32, message: Rc<String>) -> Self

source

pub fn to_value(&self) -> JValue

Trait Implementations§

source§

impl Archive for CallServiceFailed
where + i32: Archive, + Rc<String>: Archive,

§

type Archived = ArchivedCallServiceFailed

The archived representation of this type. Read more
§

type Resolver = CallServiceFailedResolver

The resolver for this type. It must contain all the additional information from serializing +needed to make the archived type from the normal type.
source§

unsafe fn resolve( + &self, + pos: usize, + resolver: Self::Resolver, + out: *mut Self::Archived, +)

Creates the archived version of this value at the given position and writes it to the given +output. Read more
source§

impl Clone for CallServiceFailed

source§

fn clone(&self) -> CallServiceFailed

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for CallServiceFailed

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'de> Deserialize<'de> for CallServiceFailed

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl<__D: Fallible + ?Sized> Deserialize<CallServiceFailed, __D> for Archived<CallServiceFailed>
where + i32: Archive, + Archived<i32>: Deserialize<i32, __D>, + Rc<String>: Archive, + Archived<Rc<String>>: Deserialize<Rc<String>, __D>,

source§

fn deserialize( + &self, + deserializer: &mut __D, +) -> Result<CallServiceFailed, __D::Error>

Deserializes using the given deserializer
source§

impl PartialEq for CallServiceFailed

source§

fn eq(&self, other: &CallServiceFailed) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl<__S: Fallible + ?Sized> Serialize<__S> for CallServiceFailed
where + i32: Serialize<__S>, + Rc<String>: Serialize<__S>,

source§

fn serialize(&self, serializer: &mut __S) -> Result<Self::Resolver, __S::Error>

Writes the dependencies for the object and returns a resolver that can create the archived +type.
source§

impl Serialize for CallServiceFailed

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Eq for CallServiceFailed

source§

impl StructuralPartialEq for CallServiceFailed

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
§

impl<T> ArchiveUnsized for T
where + T: Archive,

§

type Archived = <T as Archive>::Archived

The archived counterpart of this type. Unlike Archive, it may be unsized. Read more
§

type MetadataResolver = ()

The resolver for the metadata of this type. Read more
§

unsafe fn resolve_metadata( + &self, + _: usize, + _: <T as ArchiveUnsized>::MetadataResolver, + _: *mut <<T as ArchiveUnsized>::Archived as ArchivePointee>::ArchivedMetadata, +)

Creates the archived version of the metadata for this value at the given position and writes +it to the given output. Read more
§

unsafe fn resolve_unsized( + &self, + from: usize, + to: usize, + resolver: Self::MetadataResolver, + out: *mut RelPtr<Self::Archived, <isize as Archive>::Archived>, +)

Resolves a relative pointer to this value with the given from and to and writes it to +the given output. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
§

impl<T, S> SerializeUnsized<S> for T
where + T: Serialize<S>, + S: Serializer + ?Sized,

§

fn serialize_unsized( + &self, + serializer: &mut S, +) -> Result<usize, <S as Fallible>::Error>

Writes the object and returns the position of the archived type.
§

fn serialize_metadata(&self, _: &mut S) -> Result<(), <S as Fallible>::Error>

Serializes the metadata for the given type.
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_interpreter_data/struct.CallServiceFailedResolver.html b/air_interpreter_data/struct.CallServiceFailedResolver.html new file mode 100644 index 00000000..d0b1b978 --- /dev/null +++ b/air_interpreter_data/struct.CallServiceFailedResolver.html @@ -0,0 +1,28 @@ +CallServiceFailedResolver in air_interpreter_data - Rust
pub struct CallServiceFailedResolver
where + i32: Archive, + Rc<String>: Archive,
{ /* private fields */ }
Expand description

The resolver for an archived CallServiceFailed

+

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_interpreter_data/struct.CanonCidAggregate.html b/air_interpreter_data/struct.CanonCidAggregate.html new file mode 100644 index 00000000..d0fb913f --- /dev/null +++ b/air_interpreter_data/struct.CanonCidAggregate.html @@ -0,0 +1,83 @@ +CanonCidAggregate in air_interpreter_data - Rust

Struct air_interpreter_data::CanonCidAggregate

source ·
pub struct CanonCidAggregate {
+    pub value: CID<RawValue>,
+    pub tetraplet: CID<SecurityTetraplet>,
+    pub provenance: Provenance,
+}
Expand description

The type Canon trace CID refers to.

+

Fields§

§value: CID<RawValue>§tetraplet: CID<SecurityTetraplet>§provenance: Provenance

Implementations§

source§

impl CanonCidAggregate

source

pub fn new( + value: CID<RawValue>, + tetraplet: CID<SecurityTetraplet>, + provenance: Provenance, +) -> Self

Trait Implementations§

source§

impl Archive for CanonCidAggregate
where + CID<RawValue>: Archive, + CID<SecurityTetraplet>: Archive, + Provenance: Archive,

§

type Archived = ArchivedCanonCidAggregate

The archived representation of this type. Read more
§

type Resolver = CanonCidAggregateResolver

The resolver for this type. It must contain all the additional information from serializing +needed to make the archived type from the normal type.
source§

unsafe fn resolve( + &self, + pos: usize, + resolver: Self::Resolver, + out: *mut Self::Archived, +)

Creates the archived version of this value at the given position and writes it to the given +output. Read more
source§

impl Clone for CanonCidAggregate

source§

fn clone(&self) -> CanonCidAggregate

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for CanonCidAggregate

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'de> Deserialize<'de> for CanonCidAggregate

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl<__D: Fallible + ?Sized> Deserialize<CanonCidAggregate, __D> for Archived<CanonCidAggregate>
where + CID<RawValue>: Archive, + Archived<CID<RawValue>>: Deserialize<CID<RawValue>, __D>, + CID<SecurityTetraplet>: Archive, + Archived<CID<SecurityTetraplet>>: Deserialize<CID<SecurityTetraplet>, __D>, + Provenance: Archive, + Archived<Provenance>: Deserialize<Provenance, __D>,

source§

fn deserialize( + &self, + deserializer: &mut __D, +) -> Result<CanonCidAggregate, __D::Error>

Deserializes using the given deserializer
source§

impl PartialEq for CanonCidAggregate

source§

fn eq(&self, other: &CanonCidAggregate) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl<__S: Fallible + ?Sized> Serialize<__S> for CanonCidAggregate
where + CID<RawValue>: Serialize<__S>, + CID<SecurityTetraplet>: Serialize<__S>, + Provenance: Serialize<__S>,

source§

fn serialize(&self, serializer: &mut __S) -> Result<Self::Resolver, __S::Error>

Writes the dependencies for the object and returns a resolver that can create the archived +type.
source§

impl Serialize for CanonCidAggregate

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Eq for CanonCidAggregate

source§

impl StructuralPartialEq for CanonCidAggregate

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
§

impl<T> ArchiveUnsized for T
where + T: Archive,

§

type Archived = <T as Archive>::Archived

The archived counterpart of this type. Unlike Archive, it may be unsized. Read more
§

type MetadataResolver = ()

The resolver for the metadata of this type. Read more
§

unsafe fn resolve_metadata( + &self, + _: usize, + _: <T as ArchiveUnsized>::MetadataResolver, + _: *mut <<T as ArchiveUnsized>::Archived as ArchivePointee>::ArchivedMetadata, +)

Creates the archived version of the metadata for this value at the given position and writes +it to the given output. Read more
§

unsafe fn resolve_unsized( + &self, + from: usize, + to: usize, + resolver: Self::MetadataResolver, + out: *mut RelPtr<Self::Archived, <isize as Archive>::Archived>, +)

Resolves a relative pointer to this value with the given from and to and writes it to +the given output. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
§

impl<T, S> SerializeUnsized<S> for T
where + T: Serialize<S>, + S: Serializer + ?Sized,

§

fn serialize_unsized( + &self, + serializer: &mut S, +) -> Result<usize, <S as Fallible>::Error>

Writes the object and returns the position of the archived type.
§

fn serialize_metadata(&self, _: &mut S) -> Result<(), <S as Fallible>::Error>

Serializes the metadata for the given type.
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_interpreter_data/struct.CanonCidAggregateResolver.html b/air_interpreter_data/struct.CanonCidAggregateResolver.html new file mode 100644 index 00000000..d3fd15fc --- /dev/null +++ b/air_interpreter_data/struct.CanonCidAggregateResolver.html @@ -0,0 +1,29 @@ +CanonCidAggregateResolver in air_interpreter_data - Rust
pub struct CanonCidAggregateResolver
where + CID<RawValue>: Archive, + CID<SecurityTetraplet>: Archive, + Provenance: Archive,
{ /* private fields */ }
Expand description

The resolver for an archived CanonCidAggregate

+

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_interpreter_data/struct.CanonResultCidAggregate.html b/air_interpreter_data/struct.CanonResultCidAggregate.html new file mode 100644 index 00000000..926b3a9e --- /dev/null +++ b/air_interpreter_data/struct.CanonResultCidAggregate.html @@ -0,0 +1,76 @@ +CanonResultCidAggregate in air_interpreter_data - Rust
pub struct CanonResultCidAggregate {
+    pub tetraplet: CID<SecurityTetraplet>,
+    pub values: Vec<CID<CanonCidAggregate>>,
+}

Fields§

§tetraplet: CID<SecurityTetraplet>§values: Vec<CID<CanonCidAggregate>>

Implementations§

source§

impl CanonResultCidAggregate

source

pub fn new( + tetraplet: CID<SecurityTetraplet>, + values: Vec<CID<CanonCidAggregate>>, +) -> Self

Trait Implementations§

source§

impl Archive for CanonResultCidAggregate
where + CID<SecurityTetraplet>: Archive, + Vec<CID<CanonCidAggregate>>: Archive,

§

type Archived = ArchivedCanonResultCidAggregate

The archived representation of this type. Read more
§

type Resolver = CanonResultCidAggregateResolver

The resolver for this type. It must contain all the additional information from serializing +needed to make the archived type from the normal type.
source§

unsafe fn resolve( + &self, + pos: usize, + resolver: Self::Resolver, + out: *mut Self::Archived, +)

Creates the archived version of this value at the given position and writes it to the given +output. Read more
source§

impl Clone for CanonResultCidAggregate

source§

fn clone(&self) -> CanonResultCidAggregate

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for CanonResultCidAggregate

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'de> Deserialize<'de> for CanonResultCidAggregate

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl<__D: Fallible + ?Sized> Deserialize<CanonResultCidAggregate, __D> for Archived<CanonResultCidAggregate>
where + CID<SecurityTetraplet>: Archive, + Archived<CID<SecurityTetraplet>>: Deserialize<CID<SecurityTetraplet>, __D>, + Vec<CID<CanonCidAggregate>>: Archive, + Archived<Vec<CID<CanonCidAggregate>>>: Deserialize<Vec<CID<CanonCidAggregate>>, __D>,

source§

fn deserialize( + &self, + deserializer: &mut __D, +) -> Result<CanonResultCidAggregate, __D::Error>

Deserializes using the given deserializer
source§

impl PartialEq for CanonResultCidAggregate

source§

fn eq(&self, other: &CanonResultCidAggregate) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl<__S: Fallible + ?Sized> Serialize<__S> for CanonResultCidAggregate
where + CID<SecurityTetraplet>: Serialize<__S>, + Vec<CID<CanonCidAggregate>>: Serialize<__S>,

source§

fn serialize(&self, serializer: &mut __S) -> Result<Self::Resolver, __S::Error>

Writes the dependencies for the object and returns a resolver that can create the archived +type.
source§

impl Serialize for CanonResultCidAggregate

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Eq for CanonResultCidAggregate

source§

impl StructuralPartialEq for CanonResultCidAggregate

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
§

impl<T> ArchiveUnsized for T
where + T: Archive,

§

type Archived = <T as Archive>::Archived

The archived counterpart of this type. Unlike Archive, it may be unsized. Read more
§

type MetadataResolver = ()

The resolver for the metadata of this type. Read more
§

unsafe fn resolve_metadata( + &self, + _: usize, + _: <T as ArchiveUnsized>::MetadataResolver, + _: *mut <<T as ArchiveUnsized>::Archived as ArchivePointee>::ArchivedMetadata, +)

Creates the archived version of the metadata for this value at the given position and writes +it to the given output. Read more
§

unsafe fn resolve_unsized( + &self, + from: usize, + to: usize, + resolver: Self::MetadataResolver, + out: *mut RelPtr<Self::Archived, <isize as Archive>::Archived>, +)

Resolves a relative pointer to this value with the given from and to and writes it to +the given output. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
§

impl<T, S> SerializeUnsized<S> for T
where + T: Serialize<S>, + S: Serializer + ?Sized,

§

fn serialize_unsized( + &self, + serializer: &mut S, +) -> Result<usize, <S as Fallible>::Error>

Writes the object and returns the position of the archived type.
§

fn serialize_metadata(&self, _: &mut S) -> Result<(), <S as Fallible>::Error>

Serializes the metadata for the given type.
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_interpreter_data/struct.CanonResultCidAggregateResolver.html b/air_interpreter_data/struct.CanonResultCidAggregateResolver.html new file mode 100644 index 00000000..03a65876 --- /dev/null +++ b/air_interpreter_data/struct.CanonResultCidAggregateResolver.html @@ -0,0 +1,28 @@ +CanonResultCidAggregateResolver in air_interpreter_data - Rust
pub struct CanonResultCidAggregateResolver
where + CID<SecurityTetraplet>: Archive, + Vec<CID<CanonCidAggregate>>: Archive,
{ /* private fields */ }
Expand description

The resolver for an archived CanonResultCidAggregate

+

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_interpreter_data/struct.CidInfo.html b/air_interpreter_data/struct.CidInfo.html new file mode 100644 index 00000000..3225417c --- /dev/null +++ b/air_interpreter_data/struct.CidInfo.html @@ -0,0 +1,90 @@ +CidInfo in air_interpreter_data - Rust

Struct air_interpreter_data::CidInfo

source ·
pub struct CidInfo {
+    pub value_store: CidStore<RawValue>,
+    pub tetraplet_store: CidStore<SecurityTetraplet>,
+    pub canon_element_store: CidStore<CanonCidAggregate>,
+    pub canon_result_store: CidStore<CanonResultCidAggregate>,
+    pub service_result_store: CidStore<ServiceResultCidAggregate>,
+}

Fields§

§value_store: CidStore<RawValue>

Map CID to value.

+
§tetraplet_store: CidStore<SecurityTetraplet>

Map CID to a tetraplet.

+
§canon_element_store: CidStore<CanonCidAggregate>

Map CID to a canon element value.

+
§canon_result_store: CidStore<CanonResultCidAggregate>

Map CID to a canon result.

+
§service_result_store: CidStore<ServiceResultCidAggregate>

Map CID to a service result aggregate.

+

Implementations§

Trait Implementations§

source§

impl Archive for CidInfo
where + CidStore<RawValue>: Archive, + CidStore<SecurityTetraplet>: Archive, + CidStore<CanonCidAggregate>: Archive, + CidStore<CanonResultCidAggregate>: Archive, + CidStore<ServiceResultCidAggregate>: Archive,

§

type Archived = ArchivedCidInfo

The archived representation of this type. Read more
§

type Resolver = CidInfoResolver

The resolver for this type. It must contain all the additional information from serializing +needed to make the archived type from the normal type.
source§

unsafe fn resolve( + &self, + pos: usize, + resolver: Self::Resolver, + out: *mut Self::Archived, +)

Creates the archived version of this value at the given position and writes it to the given +output. Read more
source§

impl Clone for CidInfo

source§

fn clone(&self) -> CidInfo

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for CidInfo

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Default for CidInfo

source§

fn default() -> CidInfo

Returns the “default value” for a type. Read more
source§

impl<'de> Deserialize<'de> for CidInfo

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl<__D: Fallible + ?Sized> Deserialize<CidInfo, __D> for Archived<CidInfo>
where + CidStore<RawValue>: Archive, + Archived<CidStore<RawValue>>: Deserialize<CidStore<RawValue>, __D>, + CidStore<SecurityTetraplet>: Archive, + Archived<CidStore<SecurityTetraplet>>: Deserialize<CidStore<SecurityTetraplet>, __D>, + CidStore<CanonCidAggregate>: Archive, + Archived<CidStore<CanonCidAggregate>>: Deserialize<CidStore<CanonCidAggregate>, __D>, + CidStore<CanonResultCidAggregate>: Archive, + Archived<CidStore<CanonResultCidAggregate>>: Deserialize<CidStore<CanonResultCidAggregate>, __D>, + CidStore<ServiceResultCidAggregate>: Archive, + Archived<CidStore<ServiceResultCidAggregate>>: Deserialize<CidStore<ServiceResultCidAggregate>, __D>,

source§

fn deserialize(&self, deserializer: &mut __D) -> Result<CidInfo, __D::Error>

Deserializes using the given deserializer
source§

impl PartialEq for CidInfo

source§

fn eq(&self, other: &CidInfo) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl<__S: Fallible + ?Sized> Serialize<__S> for CidInfo
where + CidStore<RawValue>: Serialize<__S>, + CidStore<SecurityTetraplet>: Serialize<__S>, + CidStore<CanonCidAggregate>: Serialize<__S>, + CidStore<CanonResultCidAggregate>: Serialize<__S>, + CidStore<ServiceResultCidAggregate>: Serialize<__S>,

source§

fn serialize(&self, serializer: &mut __S) -> Result<Self::Resolver, __S::Error>

Writes the dependencies for the object and returns a resolver that can create the archived +type.
source§

impl Serialize for CidInfo

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Eq for CidInfo

source§

impl StructuralPartialEq for CidInfo

Auto Trait Implementations§

§

impl Freeze for CidInfo

§

impl !RefUnwindSafe for CidInfo

§

impl !Send for CidInfo

§

impl !Sync for CidInfo

§

impl Unpin for CidInfo

§

impl !UnwindSafe for CidInfo

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
§

impl<T> ArchiveUnsized for T
where + T: Archive,

§

type Archived = <T as Archive>::Archived

The archived counterpart of this type. Unlike Archive, it may be unsized. Read more
§

type MetadataResolver = ()

The resolver for the metadata of this type. Read more
§

unsafe fn resolve_metadata( + &self, + _: usize, + _: <T as ArchiveUnsized>::MetadataResolver, + _: *mut <<T as ArchiveUnsized>::Archived as ArchivePointee>::ArchivedMetadata, +)

Creates the archived version of the metadata for this value at the given position and writes +it to the given output. Read more
§

unsafe fn resolve_unsized( + &self, + from: usize, + to: usize, + resolver: Self::MetadataResolver, + out: *mut RelPtr<Self::Archived, <isize as Archive>::Archived>, +)

Resolves a relative pointer to this value with the given from and to and writes it to +the given output. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
§

impl<T, S> SerializeUnsized<S> for T
where + T: Serialize<S>, + S: Serializer + ?Sized,

§

fn serialize_unsized( + &self, + serializer: &mut S, +) -> Result<usize, <S as Fallible>::Error>

Writes the object and returns the position of the archived type.
§

fn serialize_metadata(&self, _: &mut S) -> Result<(), <S as Fallible>::Error>

Serializes the metadata for the given type.
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_interpreter_data/struct.CidInfoResolver.html b/air_interpreter_data/struct.CidInfoResolver.html new file mode 100644 index 00000000..de3447e8 --- /dev/null +++ b/air_interpreter_data/struct.CidInfoResolver.html @@ -0,0 +1,31 @@ +CidInfoResolver in air_interpreter_data - Rust

Struct air_interpreter_data::CidInfoResolver

source ·
pub struct CidInfoResolver
where + CidStore<RawValue>: Archive, + CidStore<SecurityTetraplet>: Archive, + CidStore<CanonCidAggregate>: Archive, + CidStore<CanonResultCidAggregate>: Archive, + CidStore<ServiceResultCidAggregate>: Archive,
{ /* private fields */ }
Expand description

The resolver for an archived CidInfo

+

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_interpreter_data/struct.CidStore.html b/air_interpreter_data/struct.CidStore.html new file mode 100644 index 00000000..440bfc6c --- /dev/null +++ b/air_interpreter_data/struct.CidStore.html @@ -0,0 +1,75 @@ +CidStore in air_interpreter_data - Rust

Struct air_interpreter_data::CidStore

source ·
pub struct CidStore<Val>(/* private fields */);
Expand description

Stores CID to Value corresponance.

+

Implementations§

source§

impl<Val> CidStore<Val>

source

pub fn new() -> Self

source

pub fn get(&self, cid: &CID<Val>) -> Option<Rc<Val>>

source

pub fn is_empty(&self) -> bool

source

pub fn len(&self) -> usize

source

pub fn iter(&self) -> impl Iterator<Item = (&CID<Val>, &Rc<Val>)>

source

pub fn check_reference<Src>( + &self, + _source_cid: &CID<Src>, + target_cid: &CID<Val>, +) -> Result<(), CidStoreVerificationError>

source§

impl<Val: Serialize> CidStore<Val>

source§

impl CidStore<RawValue>

Trait Implementations§

source§

impl<Val> Archive for CidStore<Val>
where + With<HashMap<CID<Val>, Rc<Val>>, AsVec>: Archive,

§

type Archived = ArchivedCidStore<Val>

The archived representation of this type. Read more
§

type Resolver = CidStoreResolver<Val>

The resolver for this type. It must contain all the additional information from serializing +needed to make the archived type from the normal type.
source§

unsafe fn resolve( + &self, + pos: usize, + resolver: Self::Resolver, + out: *mut Self::Archived, +)

Creates the archived version of this value at the given position and writes it to the given +output. Read more
source§

impl<Val: Clone> Clone for CidStore<Val>

source§

fn clone(&self) -> CidStore<Val>

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl<Val: Debug> Debug for CidStore<Val>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<Val> Default for CidStore<Val>

source§

fn default() -> Self

Returns the “default value” for a type. Read more
source§

impl<'de, Val> Deserialize<'de> for CidStore<Val>
where + Val: Deserialize<'de>,

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl<__D: Fallible + ?Sized, Val> Deserialize<CidStore<Val>, __D> for Archived<CidStore<Val>>
where + With<HashMap<CID<Val>, Rc<Val>>, AsVec>: Archive, + Archived<With<HashMap<CID<Val>, Rc<Val>>, AsVec>>: Deserialize<With<HashMap<CID<Val>, Rc<Val>>, AsVec>, __D>,

source§

fn deserialize( + &self, + deserializer: &mut __D, +) -> Result<CidStore<Val>, __D::Error>

Deserializes using the given deserializer
source§

impl<Val> From<CidTracker<Val>> for CidStore<Val>

source§

fn from(value: CidTracker<Val>) -> Self

Converts to this type from the input type.
source§

impl<Val> IntoIterator for CidStore<Val>

§

type Item = (CID<Val>, Rc<Val>)

The type of the elements being iterated over.
§

type IntoIter = IntoIter<CID<Val>, Rc<Val>>

Which kind of iterator are we turning this into?
source§

fn into_iter(self) -> Self::IntoIter

Creates an iterator from a value. Read more
source§

impl<Val: PartialEq> PartialEq for CidStore<Val>

source§

fn eq(&self, other: &CidStore<Val>) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl<__S: Fallible + ?Sized, Val> Serialize<__S> for CidStore<Val>
where + With<HashMap<CID<Val>, Rc<Val>>, AsVec>: Serialize<__S>,

source§

fn serialize(&self, serializer: &mut __S) -> Result<Self::Resolver, __S::Error>

Writes the dependencies for the object and returns a resolver that can create the archived +type.
source§

impl<Val> Serialize for CidStore<Val>
where + Val: Serialize,

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl<Val: Eq> Eq for CidStore<Val>

source§

impl<Val> StructuralPartialEq for CidStore<Val>

Auto Trait Implementations§

§

impl<Val> Freeze for CidStore<Val>

§

impl<Val> RefUnwindSafe for CidStore<Val>
where + Val: RefUnwindSafe,

§

impl<Val> !Send for CidStore<Val>

§

impl<Val> !Sync for CidStore<Val>

§

impl<Val> Unpin for CidStore<Val>

§

impl<Val> UnwindSafe for CidStore<Val>
where + Val: RefUnwindSafe,

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
§

impl<T> ArchiveUnsized for T
where + T: Archive,

§

type Archived = <T as Archive>::Archived

The archived counterpart of this type. Unlike Archive, it may be unsized. Read more
§

type MetadataResolver = ()

The resolver for the metadata of this type. Read more
§

unsafe fn resolve_metadata( + &self, + _: usize, + _: <T as ArchiveUnsized>::MetadataResolver, + _: *mut <<T as ArchiveUnsized>::Archived as ArchivePointee>::ArchivedMetadata, +)

Creates the archived version of the metadata for this value at the given position and writes +it to the given output. Read more
§

unsafe fn resolve_unsized( + &self, + from: usize, + to: usize, + resolver: Self::MetadataResolver, + out: *mut RelPtr<Self::Archived, <isize as Archive>::Archived>, +)

Resolves a relative pointer to this value with the given from and to and writes it to +the given output. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
§

impl<T, S> SerializeUnsized<S> for T
where + T: Serialize<S>, + S: Serializer + ?Sized,

§

fn serialize_unsized( + &self, + serializer: &mut S, +) -> Result<usize, <S as Fallible>::Error>

Writes the object and returns the position of the archived type.
§

fn serialize_metadata(&self, _: &mut S) -> Result<(), <S as Fallible>::Error>

Serializes the metadata for the given type.
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_interpreter_data/struct.CidStoreResolver.html b/air_interpreter_data/struct.CidStoreResolver.html new file mode 100644 index 00000000..2310c47a --- /dev/null +++ b/air_interpreter_data/struct.CidStoreResolver.html @@ -0,0 +1,28 @@ +CidStoreResolver in air_interpreter_data - Rust

Struct air_interpreter_data::CidStoreResolver

source ·
pub struct CidStoreResolver<Val>(/* private fields */)
+where
+    With<HashMap<CID<Val>, Rc<Val>>, AsVec>: Archive;
Expand description

The resolver for an archived CidStore

+

Auto Trait Implementations§

§

impl<Val> !Freeze for CidStoreResolver<Val>

§

impl<Val> !RefUnwindSafe for CidStoreResolver<Val>

§

impl<Val> !Send for CidStoreResolver<Val>

§

impl<Val> !Sync for CidStoreResolver<Val>

§

impl<Val> !Unpin for CidStoreResolver<Val>

§

impl<Val> !UnwindSafe for CidStoreResolver<Val>

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_interpreter_data/struct.CidTracker.html b/air_interpreter_data/struct.CidTracker.html new file mode 100644 index 00000000..f4663f4c --- /dev/null +++ b/air_interpreter_data/struct.CidTracker.html @@ -0,0 +1,38 @@ +CidTracker in air_interpreter_data - Rust

Struct air_interpreter_data::CidTracker

source ·
pub struct CidTracker<Val = JValue> { /* private fields */ }

Implementations§

source§

impl<Val> CidTracker<Val>

source

pub fn new() -> Self

source

pub fn from_cid_stores( + prev_cid_map: CidStore<Val>, + current_cid_map: CidStore<Val>, +) -> Self

source

pub fn get(&self, cid: &CID<Val>) -> Option<Rc<Val>>

source§

impl<Val: Serialize> CidTracker<Val>

source

pub fn track_value( + &mut self, + value: impl Into<Rc<Val>>, +) -> Result<CID<Val>, CidCalculationError>

source§

impl CidTracker<RawValue>

source

pub fn track_raw_value( + &mut self, + value: impl Into<Rc<RawValue>>, +) -> CID<RawValue>

Trait Implementations§

source§

impl<Val: Clone> Clone for CidTracker<Val>

source§

fn clone(&self) -> CidTracker<Val>

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl<Val: Debug> Debug for CidTracker<Val>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<Val> Default for CidTracker<Val>

source§

fn default() -> Self

Returns the “default value” for a type. Read more
source§

impl<Val> From<CidTracker<Val>> for CidStore<Val>

source§

fn from(value: CidTracker<Val>) -> Self

Converts to this type from the input type.

Auto Trait Implementations§

§

impl<Val> Freeze for CidTracker<Val>

§

impl<Val> RefUnwindSafe for CidTracker<Val>
where + Val: RefUnwindSafe,

§

impl<Val = JValue> !Send for CidTracker<Val>

§

impl<Val = JValue> !Sync for CidTracker<Val>

§

impl<Val> Unpin for CidTracker<Val>

§

impl<Val> UnwindSafe for CidTracker<Val>
where + Val: RefUnwindSafe,

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_interpreter_data/struct.ExecutionTrace.html b/air_interpreter_data/struct.ExecutionTrace.html new file mode 100644 index 00000000..dfc22b47 --- /dev/null +++ b/air_interpreter_data/struct.ExecutionTrace.html @@ -0,0 +1,1153 @@ +ExecutionTrace in air_interpreter_data - Rust

Struct air_interpreter_data::ExecutionTrace

source ·
pub struct ExecutionTrace(/* private fields */);

Implementations§

source§

impl ExecutionTrace

source

pub fn get(&self, index: TracePos) -> Option<&ExecutedState>

source

pub fn get_mut(&mut self, index: TracePos) -> Option<&mut ExecutedState>

source

pub fn pop(&mut self) -> Option<ExecutedState>

source

pub fn push(&mut self, value: ExecutedState)

source

pub fn trace_states_count(&self) -> TraceLen

Methods from Deref<Target = [ExecutedState]>§

1.80.0 · source

pub fn as_flattened(&self) -> &[T]

Takes a &[[T; N]], and flattens it to a &[T].

+
§Panics
+

This panics if the length of the resulting slice would overflow a usize.

+

This is only possible when flattening a slice of arrays of zero-sized +types, and thus tends to be irrelevant in practice. If +size_of::<T>() > 0, this will never panic.

+
§Examples
+
assert_eq!([[1, 2, 3], [4, 5, 6]].as_flattened(), &[1, 2, 3, 4, 5, 6]);
+
+assert_eq!(
+    [[1, 2, 3], [4, 5, 6]].as_flattened(),
+    [[1, 2], [3, 4], [5, 6]].as_flattened(),
+);
+
+let slice_of_empty_arrays: &[[i32; 0]] = &[[], [], [], [], []];
+assert!(slice_of_empty_arrays.as_flattened().is_empty());
+
+let empty_slice_of_arrays: &[[u32; 10]] = &[];
+assert!(empty_slice_of_arrays.as_flattened().is_empty());
+
source

pub fn as_str(&self) -> &str

🔬This is a nightly-only experimental API. (ascii_char)

Views this slice of ASCII characters as a UTF-8 str.

+
source

pub fn as_bytes(&self) -> &[u8]

🔬This is a nightly-only experimental API. (ascii_char)

Views this slice of ASCII characters as a slice of u8 bytes.

+
1.79.0 · source

pub fn utf8_chunks(&self) -> Utf8Chunks<'_>

Creates an iterator over the contiguous valid UTF-8 ranges of this +slice, and the non-UTF-8 fragments in between.

+
§Examples
+

This function formats arbitrary but mostly-UTF-8 bytes into Rust source +code in the form of a C-string literal (c"...").

+ +
use std::fmt::Write as _;
+
+pub fn cstr_literal(bytes: &[u8]) -> String {
+    let mut repr = String::new();
+    repr.push_str("c\"");
+    for chunk in bytes.utf8_chunks() {
+        for ch in chunk.valid().chars() {
+            // Escapes \0, \t, \r, \n, \\, \', \", and uses \u{...} for non-printable characters.
+            write!(repr, "{}", ch.escape_debug()).unwrap();
+        }
+        for byte in chunk.invalid() {
+            write!(repr, "\\x{:02X}", byte).unwrap();
+        }
+    }
+    repr.push('"');
+    repr
+}
+
+fn main() {
+    let lit = cstr_literal(b"\xferris the \xf0\x9f\xa6\x80\x07");
+    let expected = stringify!(c"\xFErris the 🦀\u{7}");
+    assert_eq!(lit, expected);
+}
+
1.23.0 · source

pub fn is_ascii(&self) -> bool

Checks if all bytes in this slice are within the ASCII range.

+
source

pub fn as_ascii(&self) -> Option<&[AsciiChar]>

🔬This is a nightly-only experimental API. (ascii_char)

If this slice is_ascii, returns it as a slice of +ASCII characters, otherwise returns None.

+
source

pub unsafe fn as_ascii_unchecked(&self) -> &[AsciiChar]

🔬This is a nightly-only experimental API. (ascii_char)

Converts this slice of bytes into a slice of ASCII characters, +without checking whether they’re valid.

+
§Safety
+

Every byte in the slice must be in 0..=127, or else this is UB.

+
1.23.0 · source

pub fn eq_ignore_ascii_case(&self, other: &[u8]) -> bool

Checks that two slices are an ASCII case-insensitive match.

+

Same as to_ascii_lowercase(a) == to_ascii_lowercase(b), +but without allocating and copying temporaries.

+
1.60.0 · source

pub fn escape_ascii(&self) -> EscapeAscii<'_>

Returns an iterator that produces an escaped version of this slice, +treating it as an ASCII string.

+
§Examples
+

+let s = b"0\t\r\n'\"\\\x9d";
+let escaped = s.escape_ascii().to_string();
+assert_eq!(escaped, "0\\t\\r\\n\\'\\\"\\\\\\x9d");
+
1.80.0 · source

pub fn trim_ascii_start(&self) -> &[u8]

Returns a byte slice with leading ASCII whitespace bytes removed.

+

‘Whitespace’ refers to the definition used by +u8::is_ascii_whitespace.

+
§Examples
+
assert_eq!(b" \t hello world\n".trim_ascii_start(), b"hello world\n");
+assert_eq!(b"  ".trim_ascii_start(), b"");
+assert_eq!(b"".trim_ascii_start(), b"");
+
1.80.0 · source

pub fn trim_ascii_end(&self) -> &[u8]

Returns a byte slice with trailing ASCII whitespace bytes removed.

+

‘Whitespace’ refers to the definition used by +u8::is_ascii_whitespace.

+
§Examples
+
assert_eq!(b"\r hello world\n ".trim_ascii_end(), b"\r hello world");
+assert_eq!(b"  ".trim_ascii_end(), b"");
+assert_eq!(b"".trim_ascii_end(), b"");
+
1.80.0 · source

pub fn trim_ascii(&self) -> &[u8]

Returns a byte slice with leading and trailing ASCII whitespace bytes +removed.

+

‘Whitespace’ refers to the definition used by +u8::is_ascii_whitespace.

+
§Examples
+
assert_eq!(b"\r hello world\n ".trim_ascii(), b"hello world");
+assert_eq!(b"  ".trim_ascii(), b"");
+assert_eq!(b"".trim_ascii(), b"");
+
1.0.0 · source

pub fn len(&self) -> usize

Returns the number of elements in the slice.

+
§Examples
+
let a = [1, 2, 3];
+assert_eq!(a.len(), 3);
+
1.0.0 · source

pub fn is_empty(&self) -> bool

Returns true if the slice has a length of 0.

+
§Examples
+
let a = [1, 2, 3];
+assert!(!a.is_empty());
+
+let b: &[i32] = &[];
+assert!(b.is_empty());
+
1.0.0 · source

pub fn first(&self) -> Option<&T>

Returns the first element of the slice, or None if it is empty.

+
§Examples
+
let v = [10, 40, 30];
+assert_eq!(Some(&10), v.first());
+
+let w: &[i32] = &[];
+assert_eq!(None, w.first());
+
1.5.0 · source

pub fn split_first(&self) -> Option<(&T, &[T])>

Returns the first and all the rest of the elements of the slice, or None if it is empty.

+
§Examples
+
let x = &[0, 1, 2];
+
+if let Some((first, elements)) = x.split_first() {
+    assert_eq!(first, &0);
+    assert_eq!(elements, &[1, 2]);
+}
+
1.5.0 · source

pub fn split_last(&self) -> Option<(&T, &[T])>

Returns the last and all the rest of the elements of the slice, or None if it is empty.

+
§Examples
+
let x = &[0, 1, 2];
+
+if let Some((last, elements)) = x.split_last() {
+    assert_eq!(last, &2);
+    assert_eq!(elements, &[0, 1]);
+}
+
1.0.0 · source

pub fn last(&self) -> Option<&T>

Returns the last element of the slice, or None if it is empty.

+
§Examples
+
let v = [10, 40, 30];
+assert_eq!(Some(&30), v.last());
+
+let w: &[i32] = &[];
+assert_eq!(None, w.last());
+
1.77.0 · source

pub fn first_chunk<const N: usize>(&self) -> Option<&[T; N]>

Return an array reference to the first N items in the slice.

+

If the slice is not at least N in length, this will return None.

+
§Examples
+
let u = [10, 40, 30];
+assert_eq!(Some(&[10, 40]), u.first_chunk::<2>());
+
+let v: &[i32] = &[10];
+assert_eq!(None, v.first_chunk::<2>());
+
+let w: &[i32] = &[];
+assert_eq!(Some(&[]), w.first_chunk::<0>());
+
1.77.0 · source

pub fn split_first_chunk<const N: usize>(&self) -> Option<(&[T; N], &[T])>

Return an array reference to the first N items in the slice and the remaining slice.

+

If the slice is not at least N in length, this will return None.

+
§Examples
+
let x = &[0, 1, 2];
+
+if let Some((first, elements)) = x.split_first_chunk::<2>() {
+    assert_eq!(first, &[0, 1]);
+    assert_eq!(elements, &[2]);
+}
+
+assert_eq!(None, x.split_first_chunk::<4>());
+
1.77.0 · source

pub fn split_last_chunk<const N: usize>(&self) -> Option<(&[T], &[T; N])>

Return an array reference to the last N items in the slice and the remaining slice.

+

If the slice is not at least N in length, this will return None.

+
§Examples
+
let x = &[0, 1, 2];
+
+if let Some((elements, last)) = x.split_last_chunk::<2>() {
+    assert_eq!(elements, &[0]);
+    assert_eq!(last, &[1, 2]);
+}
+
+assert_eq!(None, x.split_last_chunk::<4>());
+
1.77.0 · source

pub fn last_chunk<const N: usize>(&self) -> Option<&[T; N]>

Return an array reference to the last N items in the slice.

+

If the slice is not at least N in length, this will return None.

+
§Examples
+
let u = [10, 40, 30];
+assert_eq!(Some(&[40, 30]), u.last_chunk::<2>());
+
+let v: &[i32] = &[10];
+assert_eq!(None, v.last_chunk::<2>());
+
+let w: &[i32] = &[];
+assert_eq!(Some(&[]), w.last_chunk::<0>());
+
1.0.0 · source

pub fn get<I>(&self, index: I) -> Option<&<I as SliceIndex<[T]>>::Output>
where + I: SliceIndex<[T]>,

Returns a reference to an element or subslice depending on the type of +index.

+
    +
  • If given a position, returns a reference to the element at that +position or None if out of bounds.
  • +
  • If given a range, returns the subslice corresponding to that range, +or None if out of bounds.
  • +
+
§Examples
+
let v = [10, 40, 30];
+assert_eq!(Some(&40), v.get(1));
+assert_eq!(Some(&[10, 40][..]), v.get(0..2));
+assert_eq!(None, v.get(3));
+assert_eq!(None, v.get(0..4));
+
1.0.0 · source

pub unsafe fn get_unchecked<I>( + &self, + index: I, +) -> &<I as SliceIndex<[T]>>::Output
where + I: SliceIndex<[T]>,

Returns a reference to an element or subslice, without doing bounds +checking.

+

For a safe alternative see get.

+
§Safety
+

Calling this method with an out-of-bounds index is undefined behavior +even if the resulting reference is not used.

+

You can think of this like .get(index).unwrap_unchecked(). It’s UB +to call .get_unchecked(len), even if you immediately convert to a +pointer. And it’s UB to call .get_unchecked(..len + 1), +.get_unchecked(..=len), or similar.

+
§Examples
+
let x = &[1, 2, 4];
+
+unsafe {
+    assert_eq!(x.get_unchecked(1), &2);
+}
+
1.0.0 · source

pub fn as_ptr(&self) -> *const T

Returns a raw pointer to the slice’s buffer.

+

The caller must ensure that the slice outlives the pointer this +function returns, or else it will end up pointing to garbage.

+

The caller must also ensure that the memory the pointer (non-transitively) points to +is never written to (except inside an UnsafeCell) using this pointer or any pointer +derived from it. If you need to mutate the contents of the slice, use as_mut_ptr.

+

Modifying the container referenced by this slice may cause its buffer +to be reallocated, which would also make any pointers to it invalid.

+
§Examples
+
let x = &[1, 2, 4];
+let x_ptr = x.as_ptr();
+
+unsafe {
+    for i in 0..x.len() {
+        assert_eq!(x.get_unchecked(i), &*x_ptr.add(i));
+    }
+}
+
1.48.0 · source

pub fn as_ptr_range(&self) -> Range<*const T>

Returns the two raw pointers spanning the slice.

+

The returned range is half-open, which means that the end pointer +points one past the last element of the slice. This way, an empty +slice is represented by two equal pointers, and the difference between +the two pointers represents the size of the slice.

+

See as_ptr for warnings on using these pointers. The end pointer +requires extra caution, as it does not point to a valid element in the +slice.

+

This function is useful for interacting with foreign interfaces which +use two pointers to refer to a range of elements in memory, as is +common in C++.

+

It can also be useful to check if a pointer to an element refers to an +element of this slice:

+ +
let a = [1, 2, 3];
+let x = &a[1] as *const _;
+let y = &5 as *const _;
+
+assert!(a.as_ptr_range().contains(&x));
+assert!(!a.as_ptr_range().contains(&y));
+
1.0.0 · source

pub fn iter(&self) -> Iter<'_, T>

Returns an iterator over the slice.

+

The iterator yields all items from start to end.

+
§Examples
+
let x = &[1, 2, 4];
+let mut iterator = x.iter();
+
+assert_eq!(iterator.next(), Some(&1));
+assert_eq!(iterator.next(), Some(&2));
+assert_eq!(iterator.next(), Some(&4));
+assert_eq!(iterator.next(), None);
+
1.0.0 · source

pub fn windows(&self, size: usize) -> Windows<'_, T>

Returns an iterator over all contiguous windows of length +size. The windows overlap. If the slice is shorter than +size, the iterator returns no values.

+
§Panics
+

Panics if size is 0.

+
§Examples
+
let slice = ['l', 'o', 'r', 'e', 'm'];
+let mut iter = slice.windows(3);
+assert_eq!(iter.next().unwrap(), &['l', 'o', 'r']);
+assert_eq!(iter.next().unwrap(), &['o', 'r', 'e']);
+assert_eq!(iter.next().unwrap(), &['r', 'e', 'm']);
+assert!(iter.next().is_none());
+

If the slice is shorter than size:

+ +
let slice = ['f', 'o', 'o'];
+let mut iter = slice.windows(4);
+assert!(iter.next().is_none());
+

There’s no windows_mut, as that existing would let safe code violate the +“only one &mut at a time to the same thing” rule. However, you can sometimes +use Cell::as_slice_of_cells in +conjunction with windows to accomplish something similar:

+ +
use std::cell::Cell;
+
+let mut array = ['R', 'u', 's', 't', ' ', '2', '0', '1', '5'];
+let slice = &mut array[..];
+let slice_of_cells: &[Cell<char>] = Cell::from_mut(slice).as_slice_of_cells();
+for w in slice_of_cells.windows(3) {
+    Cell::swap(&w[0], &w[2]);
+}
+assert_eq!(array, ['s', 't', ' ', '2', '0', '1', '5', 'u', 'R']);
+
1.0.0 · source

pub fn chunks(&self, chunk_size: usize) -> Chunks<'_, T>

Returns an iterator over chunk_size elements of the slice at a time, starting at the +beginning of the slice.

+

The chunks are slices and do not overlap. If chunk_size does not divide the length of the +slice, then the last chunk will not have length chunk_size.

+

See chunks_exact for a variant of this iterator that returns chunks of always exactly +chunk_size elements, and rchunks for the same iterator but starting at the end of the +slice.

+
§Panics
+

Panics if chunk_size is 0.

+
§Examples
+
let slice = ['l', 'o', 'r', 'e', 'm'];
+let mut iter = slice.chunks(2);
+assert_eq!(iter.next().unwrap(), &['l', 'o']);
+assert_eq!(iter.next().unwrap(), &['r', 'e']);
+assert_eq!(iter.next().unwrap(), &['m']);
+assert!(iter.next().is_none());
+
1.31.0 · source

pub fn chunks_exact(&self, chunk_size: usize) -> ChunksExact<'_, T>

Returns an iterator over chunk_size elements of the slice at a time, starting at the +beginning of the slice.

+

The chunks are slices and do not overlap. If chunk_size does not divide the length of the +slice, then the last up to chunk_size-1 elements will be omitted and can be retrieved +from the remainder function of the iterator.

+

Due to each chunk having exactly chunk_size elements, the compiler can often optimize the +resulting code better than in the case of chunks.

+

See chunks for a variant of this iterator that also returns the remainder as a smaller +chunk, and rchunks_exact for the same iterator but starting at the end of the slice.

+
§Panics
+

Panics if chunk_size is 0.

+
§Examples
+
let slice = ['l', 'o', 'r', 'e', 'm'];
+let mut iter = slice.chunks_exact(2);
+assert_eq!(iter.next().unwrap(), &['l', 'o']);
+assert_eq!(iter.next().unwrap(), &['r', 'e']);
+assert!(iter.next().is_none());
+assert_eq!(iter.remainder(), &['m']);
+
source

pub unsafe fn as_chunks_unchecked<const N: usize>(&self) -> &[[T; N]]

🔬This is a nightly-only experimental API. (slice_as_chunks)

Splits the slice into a slice of N-element arrays, +assuming that there’s no remainder.

+
§Safety
+

This may only be called when

+
    +
  • The slice splits exactly into N-element chunks (aka self.len() % N == 0).
  • +
  • N != 0.
  • +
+
§Examples
+
#![feature(slice_as_chunks)]
+let slice: &[char] = &['l', 'o', 'r', 'e', 'm', '!'];
+let chunks: &[[char; 1]] =
+    // SAFETY: 1-element chunks never have remainder
+    unsafe { slice.as_chunks_unchecked() };
+assert_eq!(chunks, &[['l'], ['o'], ['r'], ['e'], ['m'], ['!']]);
+let chunks: &[[char; 3]] =
+    // SAFETY: The slice length (6) is a multiple of 3
+    unsafe { slice.as_chunks_unchecked() };
+assert_eq!(chunks, &[['l', 'o', 'r'], ['e', 'm', '!']]);
+
+// These would be unsound:
+// let chunks: &[[_; 5]] = slice.as_chunks_unchecked() // The slice length is not a multiple of 5
+// let chunks: &[[_; 0]] = slice.as_chunks_unchecked() // Zero-length chunks are never allowed
+
source

pub fn as_chunks<const N: usize>(&self) -> (&[[T; N]], &[T])

🔬This is a nightly-only experimental API. (slice_as_chunks)

Splits the slice into a slice of N-element arrays, +starting at the beginning of the slice, +and a remainder slice with length strictly less than N.

+
§Panics
+

Panics if N is 0. This check will most probably get changed to a compile time +error before this method gets stabilized.

+
§Examples
+
#![feature(slice_as_chunks)]
+let slice = ['l', 'o', 'r', 'e', 'm'];
+let (chunks, remainder) = slice.as_chunks();
+assert_eq!(chunks, &[['l', 'o'], ['r', 'e']]);
+assert_eq!(remainder, &['m']);
+

If you expect the slice to be an exact multiple, you can combine +let-else with an empty slice pattern:

+ +
#![feature(slice_as_chunks)]
+let slice = ['R', 'u', 's', 't'];
+let (chunks, []) = slice.as_chunks::<2>() else {
+    panic!("slice didn't have even length")
+};
+assert_eq!(chunks, &[['R', 'u'], ['s', 't']]);
+
source

pub fn as_rchunks<const N: usize>(&self) -> (&[T], &[[T; N]])

🔬This is a nightly-only experimental API. (slice_as_chunks)

Splits the slice into a slice of N-element arrays, +starting at the end of the slice, +and a remainder slice with length strictly less than N.

+
§Panics
+

Panics if N is 0. This check will most probably get changed to a compile time +error before this method gets stabilized.

+
§Examples
+
#![feature(slice_as_chunks)]
+let slice = ['l', 'o', 'r', 'e', 'm'];
+let (remainder, chunks) = slice.as_rchunks();
+assert_eq!(remainder, &['l']);
+assert_eq!(chunks, &[['o', 'r'], ['e', 'm']]);
+
source

pub fn array_chunks<const N: usize>(&self) -> ArrayChunks<'_, T, N>

🔬This is a nightly-only experimental API. (array_chunks)

Returns an iterator over N elements of the slice at a time, starting at the +beginning of the slice.

+

The chunks are array references and do not overlap. If N does not divide the +length of the slice, then the last up to N-1 elements will be omitted and can be +retrieved from the remainder function of the iterator.

+

This method is the const generic equivalent of chunks_exact.

+
§Panics
+

Panics if N is 0. This check will most probably get changed to a compile time +error before this method gets stabilized.

+
§Examples
+
#![feature(array_chunks)]
+let slice = ['l', 'o', 'r', 'e', 'm'];
+let mut iter = slice.array_chunks();
+assert_eq!(iter.next().unwrap(), &['l', 'o']);
+assert_eq!(iter.next().unwrap(), &['r', 'e']);
+assert!(iter.next().is_none());
+assert_eq!(iter.remainder(), &['m']);
+
source

pub fn array_windows<const N: usize>(&self) -> ArrayWindows<'_, T, N>

🔬This is a nightly-only experimental API. (array_windows)

Returns an iterator over overlapping windows of N elements of a slice, +starting at the beginning of the slice.

+

This is the const generic equivalent of windows.

+

If N is greater than the size of the slice, it will return no windows.

+
§Panics
+

Panics if N is 0. This check will most probably get changed to a compile time +error before this method gets stabilized.

+
§Examples
+
#![feature(array_windows)]
+let slice = [0, 1, 2, 3];
+let mut iter = slice.array_windows();
+assert_eq!(iter.next().unwrap(), &[0, 1]);
+assert_eq!(iter.next().unwrap(), &[1, 2]);
+assert_eq!(iter.next().unwrap(), &[2, 3]);
+assert!(iter.next().is_none());
+
1.31.0 · source

pub fn rchunks(&self, chunk_size: usize) -> RChunks<'_, T>

Returns an iterator over chunk_size elements of the slice at a time, starting at the end +of the slice.

+

The chunks are slices and do not overlap. If chunk_size does not divide the length of the +slice, then the last chunk will not have length chunk_size.

+

See rchunks_exact for a variant of this iterator that returns chunks of always exactly +chunk_size elements, and chunks for the same iterator but starting at the beginning +of the slice.

+
§Panics
+

Panics if chunk_size is 0.

+
§Examples
+
let slice = ['l', 'o', 'r', 'e', 'm'];
+let mut iter = slice.rchunks(2);
+assert_eq!(iter.next().unwrap(), &['e', 'm']);
+assert_eq!(iter.next().unwrap(), &['o', 'r']);
+assert_eq!(iter.next().unwrap(), &['l']);
+assert!(iter.next().is_none());
+
1.31.0 · source

pub fn rchunks_exact(&self, chunk_size: usize) -> RChunksExact<'_, T>

Returns an iterator over chunk_size elements of the slice at a time, starting at the +end of the slice.

+

The chunks are slices and do not overlap. If chunk_size does not divide the length of the +slice, then the last up to chunk_size-1 elements will be omitted and can be retrieved +from the remainder function of the iterator.

+

Due to each chunk having exactly chunk_size elements, the compiler can often optimize the +resulting code better than in the case of rchunks.

+

See rchunks for a variant of this iterator that also returns the remainder as a smaller +chunk, and chunks_exact for the same iterator but starting at the beginning of the +slice.

+
§Panics
+

Panics if chunk_size is 0.

+
§Examples
+
let slice = ['l', 'o', 'r', 'e', 'm'];
+let mut iter = slice.rchunks_exact(2);
+assert_eq!(iter.next().unwrap(), &['e', 'm']);
+assert_eq!(iter.next().unwrap(), &['o', 'r']);
+assert!(iter.next().is_none());
+assert_eq!(iter.remainder(), &['l']);
+
1.77.0 · source

pub fn chunk_by<F>(&self, pred: F) -> ChunkBy<'_, T, F>
where + F: FnMut(&T, &T) -> bool,

Returns an iterator over the slice producing non-overlapping runs +of elements using the predicate to separate them.

+

The predicate is called for every pair of consecutive elements, +meaning that it is called on slice[0] and slice[1], +followed by slice[1] and slice[2], and so on.

+
§Examples
+
let slice = &[1, 1, 1, 3, 3, 2, 2, 2];
+
+let mut iter = slice.chunk_by(|a, b| a == b);
+
+assert_eq!(iter.next(), Some(&[1, 1, 1][..]));
+assert_eq!(iter.next(), Some(&[3, 3][..]));
+assert_eq!(iter.next(), Some(&[2, 2, 2][..]));
+assert_eq!(iter.next(), None);
+

This method can be used to extract the sorted subslices:

+ +
let slice = &[1, 1, 2, 3, 2, 3, 2, 3, 4];
+
+let mut iter = slice.chunk_by(|a, b| a <= b);
+
+assert_eq!(iter.next(), Some(&[1, 1, 2, 3][..]));
+assert_eq!(iter.next(), Some(&[2, 3][..]));
+assert_eq!(iter.next(), Some(&[2, 3, 4][..]));
+assert_eq!(iter.next(), None);
+
1.0.0 · source

pub fn split_at(&self, mid: usize) -> (&[T], &[T])

Divides one slice into two at an index.

+

The first will contain all indices from [0, mid) (excluding +the index mid itself) and the second will contain all +indices from [mid, len) (excluding the index len itself).

+
§Panics
+

Panics if mid > len. For a non-panicking alternative see +split_at_checked.

+
§Examples
+
let v = [1, 2, 3, 4, 5, 6];
+
+{
+   let (left, right) = v.split_at(0);
+   assert_eq!(left, []);
+   assert_eq!(right, [1, 2, 3, 4, 5, 6]);
+}
+
+{
+    let (left, right) = v.split_at(2);
+    assert_eq!(left, [1, 2]);
+    assert_eq!(right, [3, 4, 5, 6]);
+}
+
+{
+    let (left, right) = v.split_at(6);
+    assert_eq!(left, [1, 2, 3, 4, 5, 6]);
+    assert_eq!(right, []);
+}
+
1.79.0 · source

pub unsafe fn split_at_unchecked(&self, mid: usize) -> (&[T], &[T])

Divides one slice into two at an index, without doing bounds checking.

+

The first will contain all indices from [0, mid) (excluding +the index mid itself) and the second will contain all +indices from [mid, len) (excluding the index len itself).

+

For a safe alternative see split_at.

+
§Safety
+

Calling this method with an out-of-bounds index is undefined behavior +even if the resulting reference is not used. The caller has to ensure that +0 <= mid <= self.len().

+
§Examples
+
let v = [1, 2, 3, 4, 5, 6];
+
+unsafe {
+   let (left, right) = v.split_at_unchecked(0);
+   assert_eq!(left, []);
+   assert_eq!(right, [1, 2, 3, 4, 5, 6]);
+}
+
+unsafe {
+    let (left, right) = v.split_at_unchecked(2);
+    assert_eq!(left, [1, 2]);
+    assert_eq!(right, [3, 4, 5, 6]);
+}
+
+unsafe {
+    let (left, right) = v.split_at_unchecked(6);
+    assert_eq!(left, [1, 2, 3, 4, 5, 6]);
+    assert_eq!(right, []);
+}
+
1.80.0 · source

pub fn split_at_checked(&self, mid: usize) -> Option<(&[T], &[T])>

Divides one slice into two at an index, returning None if the slice is +too short.

+

If mid ≤ len returns a pair of slices where the first will contain all +indices from [0, mid) (excluding the index mid itself) and the +second will contain all indices from [mid, len) (excluding the index +len itself).

+

Otherwise, if mid > len, returns None.

+
§Examples
+
let v = [1, -2, 3, -4, 5, -6];
+
+{
+   let (left, right) = v.split_at_checked(0).unwrap();
+   assert_eq!(left, []);
+   assert_eq!(right, [1, -2, 3, -4, 5, -6]);
+}
+
+{
+    let (left, right) = v.split_at_checked(2).unwrap();
+    assert_eq!(left, [1, -2]);
+    assert_eq!(right, [3, -4, 5, -6]);
+}
+
+{
+    let (left, right) = v.split_at_checked(6).unwrap();
+    assert_eq!(left, [1, -2, 3, -4, 5, -6]);
+    assert_eq!(right, []);
+}
+
+assert_eq!(None, v.split_at_checked(7));
+
1.0.0 · source

pub fn split<F>(&self, pred: F) -> Split<'_, T, F>
where + F: FnMut(&T) -> bool,

Returns an iterator over subslices separated by elements that match +pred. The matched element is not contained in the subslices.

+
§Examples
+
let slice = [10, 40, 33, 20];
+let mut iter = slice.split(|num| num % 3 == 0);
+
+assert_eq!(iter.next().unwrap(), &[10, 40]);
+assert_eq!(iter.next().unwrap(), &[20]);
+assert!(iter.next().is_none());
+

If the first element is matched, an empty slice will be the first item +returned by the iterator. Similarly, if the last element in the slice +is matched, an empty slice will be the last item returned by the +iterator:

+ +
let slice = [10, 40, 33];
+let mut iter = slice.split(|num| num % 3 == 0);
+
+assert_eq!(iter.next().unwrap(), &[10, 40]);
+assert_eq!(iter.next().unwrap(), &[]);
+assert!(iter.next().is_none());
+

If two matched elements are directly adjacent, an empty slice will be +present between them:

+ +
let slice = [10, 6, 33, 20];
+let mut iter = slice.split(|num| num % 3 == 0);
+
+assert_eq!(iter.next().unwrap(), &[10]);
+assert_eq!(iter.next().unwrap(), &[]);
+assert_eq!(iter.next().unwrap(), &[20]);
+assert!(iter.next().is_none());
+
1.51.0 · source

pub fn split_inclusive<F>(&self, pred: F) -> SplitInclusive<'_, T, F>
where + F: FnMut(&T) -> bool,

Returns an iterator over subslices separated by elements that match +pred. The matched element is contained in the end of the previous +subslice as a terminator.

+
§Examples
+
let slice = [10, 40, 33, 20];
+let mut iter = slice.split_inclusive(|num| num % 3 == 0);
+
+assert_eq!(iter.next().unwrap(), &[10, 40, 33]);
+assert_eq!(iter.next().unwrap(), &[20]);
+assert!(iter.next().is_none());
+

If the last element of the slice is matched, +that element will be considered the terminator of the preceding slice. +That slice will be the last item returned by the iterator.

+ +
let slice = [3, 10, 40, 33];
+let mut iter = slice.split_inclusive(|num| num % 3 == 0);
+
+assert_eq!(iter.next().unwrap(), &[3]);
+assert_eq!(iter.next().unwrap(), &[10, 40, 33]);
+assert!(iter.next().is_none());
+
1.27.0 · source

pub fn rsplit<F>(&self, pred: F) -> RSplit<'_, T, F>
where + F: FnMut(&T) -> bool,

Returns an iterator over subslices separated by elements that match +pred, starting at the end of the slice and working backwards. +The matched element is not contained in the subslices.

+
§Examples
+
let slice = [11, 22, 33, 0, 44, 55];
+let mut iter = slice.rsplit(|num| *num == 0);
+
+assert_eq!(iter.next().unwrap(), &[44, 55]);
+assert_eq!(iter.next().unwrap(), &[11, 22, 33]);
+assert_eq!(iter.next(), None);
+

As with split(), if the first or last element is matched, an empty +slice will be the first (or last) item returned by the iterator.

+ +
let v = &[0, 1, 1, 2, 3, 5, 8];
+let mut it = v.rsplit(|n| *n % 2 == 0);
+assert_eq!(it.next().unwrap(), &[]);
+assert_eq!(it.next().unwrap(), &[3, 5]);
+assert_eq!(it.next().unwrap(), &[1, 1]);
+assert_eq!(it.next().unwrap(), &[]);
+assert_eq!(it.next(), None);
+
1.0.0 · source

pub fn splitn<F>(&self, n: usize, pred: F) -> SplitN<'_, T, F>
where + F: FnMut(&T) -> bool,

Returns an iterator over subslices separated by elements that match +pred, limited to returning at most n items. The matched element is +not contained in the subslices.

+

The last element returned, if any, will contain the remainder of the +slice.

+
§Examples
+

Print the slice split once by numbers divisible by 3 (i.e., [10, 40], +[20, 60, 50]):

+ +
let v = [10, 40, 30, 20, 60, 50];
+
+for group in v.splitn(2, |num| *num % 3 == 0) {
+    println!("{group:?}");
+}
+
1.0.0 · source

pub fn rsplitn<F>(&self, n: usize, pred: F) -> RSplitN<'_, T, F>
where + F: FnMut(&T) -> bool,

Returns an iterator over subslices separated by elements that match +pred limited to returning at most n items. This starts at the end of +the slice and works backwards. The matched element is not contained in +the subslices.

+

The last element returned, if any, will contain the remainder of the +slice.

+
§Examples
+

Print the slice split once, starting from the end, by numbers divisible +by 3 (i.e., [50], [10, 40, 30, 20]):

+ +
let v = [10, 40, 30, 20, 60, 50];
+
+for group in v.rsplitn(2, |num| *num % 3 == 0) {
+    println!("{group:?}");
+}
+
source

pub fn split_once<F>(&self, pred: F) -> Option<(&[T], &[T])>
where + F: FnMut(&T) -> bool,

🔬This is a nightly-only experimental API. (slice_split_once)

Splits the slice on the first element that matches the specified +predicate.

+

If any matching elements are present in the slice, returns the prefix +before the match and suffix after. The matching element itself is not +included. If no elements match, returns None.

+
§Examples
+
#![feature(slice_split_once)]
+let s = [1, 2, 3, 2, 4];
+assert_eq!(s.split_once(|&x| x == 2), Some((
+    &[1][..],
+    &[3, 2, 4][..]
+)));
+assert_eq!(s.split_once(|&x| x == 0), None);
+
source

pub fn rsplit_once<F>(&self, pred: F) -> Option<(&[T], &[T])>
where + F: FnMut(&T) -> bool,

🔬This is a nightly-only experimental API. (slice_split_once)

Splits the slice on the last element that matches the specified +predicate.

+

If any matching elements are present in the slice, returns the prefix +before the match and suffix after. The matching element itself is not +included. If no elements match, returns None.

+
§Examples
+
#![feature(slice_split_once)]
+let s = [1, 2, 3, 2, 4];
+assert_eq!(s.rsplit_once(|&x| x == 2), Some((
+    &[1, 2, 3][..],
+    &[4][..]
+)));
+assert_eq!(s.rsplit_once(|&x| x == 0), None);
+
1.0.0 · source

pub fn contains(&self, x: &T) -> bool
where + T: PartialEq,

Returns true if the slice contains an element with the given value.

+

This operation is O(n).

+

Note that if you have a sorted slice, binary_search may be faster.

+
§Examples
+
let v = [10, 40, 30];
+assert!(v.contains(&30));
+assert!(!v.contains(&50));
+

If you do not have a &T, but some other value that you can compare +with one (for example, String implements PartialEq<str>), you can +use iter().any:

+ +
let v = [String::from("hello"), String::from("world")]; // slice of `String`
+assert!(v.iter().any(|e| e == "hello")); // search with `&str`
+assert!(!v.iter().any(|e| e == "hi"));
+
1.0.0 · source

pub fn starts_with(&self, needle: &[T]) -> bool
where + T: PartialEq,

Returns true if needle is a prefix of the slice or equal to the slice.

+
§Examples
+
let v = [10, 40, 30];
+assert!(v.starts_with(&[10]));
+assert!(v.starts_with(&[10, 40]));
+assert!(v.starts_with(&v));
+assert!(!v.starts_with(&[50]));
+assert!(!v.starts_with(&[10, 50]));
+

Always returns true if needle is an empty slice:

+ +
let v = &[10, 40, 30];
+assert!(v.starts_with(&[]));
+let v: &[u8] = &[];
+assert!(v.starts_with(&[]));
+
1.0.0 · source

pub fn ends_with(&self, needle: &[T]) -> bool
where + T: PartialEq,

Returns true if needle is a suffix of the slice or equal to the slice.

+
§Examples
+
let v = [10, 40, 30];
+assert!(v.ends_with(&[30]));
+assert!(v.ends_with(&[40, 30]));
+assert!(v.ends_with(&v));
+assert!(!v.ends_with(&[50]));
+assert!(!v.ends_with(&[50, 30]));
+

Always returns true if needle is an empty slice:

+ +
let v = &[10, 40, 30];
+assert!(v.ends_with(&[]));
+let v: &[u8] = &[];
+assert!(v.ends_with(&[]));
+
1.51.0 · source

pub fn strip_prefix<P>(&self, prefix: &P) -> Option<&[T]>
where + P: SlicePattern<Item = T> + ?Sized, + T: PartialEq,

Returns a subslice with the prefix removed.

+

If the slice starts with prefix, returns the subslice after the prefix, wrapped in Some. +If prefix is empty, simply returns the original slice. If prefix is equal to the +original slice, returns an empty slice.

+

If the slice does not start with prefix, returns None.

+
§Examples
+
let v = &[10, 40, 30];
+assert_eq!(v.strip_prefix(&[10]), Some(&[40, 30][..]));
+assert_eq!(v.strip_prefix(&[10, 40]), Some(&[30][..]));
+assert_eq!(v.strip_prefix(&[10, 40, 30]), Some(&[][..]));
+assert_eq!(v.strip_prefix(&[50]), None);
+assert_eq!(v.strip_prefix(&[10, 50]), None);
+
+let prefix : &str = "he";
+assert_eq!(b"hello".strip_prefix(prefix.as_bytes()),
+           Some(b"llo".as_ref()));
+
1.51.0 · source

pub fn strip_suffix<P>(&self, suffix: &P) -> Option<&[T]>
where + P: SlicePattern<Item = T> + ?Sized, + T: PartialEq,

Returns a subslice with the suffix removed.

+

If the slice ends with suffix, returns the subslice before the suffix, wrapped in Some. +If suffix is empty, simply returns the original slice. If suffix is equal to the +original slice, returns an empty slice.

+

If the slice does not end with suffix, returns None.

+
§Examples
+
let v = &[10, 40, 30];
+assert_eq!(v.strip_suffix(&[30]), Some(&[10, 40][..]));
+assert_eq!(v.strip_suffix(&[40, 30]), Some(&[10][..]));
+assert_eq!(v.strip_suffix(&[10, 40, 30]), Some(&[][..]));
+assert_eq!(v.strip_suffix(&[50]), None);
+assert_eq!(v.strip_suffix(&[50, 30]), None);
+

Binary searches this slice for a given element. +If the slice is not sorted, the returned result is unspecified and +meaningless.

+

If the value is found then Result::Ok is returned, containing the +index of the matching element. If there are multiple matches, then any +one of the matches could be returned. The index is chosen +deterministically, but is subject to change in future versions of Rust. +If the value is not found then Result::Err is returned, containing +the index where a matching element could be inserted while maintaining +sorted order.

+

See also binary_search_by, binary_search_by_key, and partition_point.

+
§Examples
+

Looks up a series of four elements. The first is found, with a +uniquely determined position; the second and third are not +found; the fourth could match any position in [1, 4].

+ +
let s = [0, 1, 1, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55];
+
+assert_eq!(s.binary_search(&13),  Ok(9));
+assert_eq!(s.binary_search(&4),   Err(7));
+assert_eq!(s.binary_search(&100), Err(13));
+let r = s.binary_search(&1);
+assert!(match r { Ok(1..=4) => true, _ => false, });
+

If you want to find that whole range of matching items, rather than +an arbitrary matching one, that can be done using partition_point:

+ +
let s = [0, 1, 1, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55];
+
+let low = s.partition_point(|x| x < &1);
+assert_eq!(low, 1);
+let high = s.partition_point(|x| x <= &1);
+assert_eq!(high, 5);
+let r = s.binary_search(&1);
+assert!((low..high).contains(&r.unwrap()));
+
+assert!(s[..low].iter().all(|&x| x < 1));
+assert!(s[low..high].iter().all(|&x| x == 1));
+assert!(s[high..].iter().all(|&x| x > 1));
+
+// For something not found, the "range" of equal items is empty
+assert_eq!(s.partition_point(|x| x < &11), 9);
+assert_eq!(s.partition_point(|x| x <= &11), 9);
+assert_eq!(s.binary_search(&11), Err(9));
+

If you want to insert an item to a sorted vector, while maintaining +sort order, consider using partition_point:

+ +
let mut s = vec![0, 1, 1, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55];
+let num = 42;
+let idx = s.partition_point(|&x| x <= num);
+// If `num` is unique, `s.partition_point(|&x| x < num)` (with `<`) is equivalent to
+// `s.binary_search(&num).unwrap_or_else(|x| x)`, but using `<=` will allow `insert`
+// to shift less elements.
+s.insert(idx, num);
+assert_eq!(s, [0, 1, 1, 1, 1, 2, 3, 5, 8, 13, 21, 34, 42, 55]);
+
1.0.0 · source

pub fn binary_search_by<'a, F>(&'a self, f: F) -> Result<usize, usize>
where + F: FnMut(&'a T) -> Ordering,

Binary searches this slice with a comparator function.

+

The comparator function should return an order code that indicates +whether its argument is Less, Equal or Greater the desired +target. +If the slice is not sorted or if the comparator function does not +implement an order consistent with the sort order of the underlying +slice, the returned result is unspecified and meaningless.

+

If the value is found then Result::Ok is returned, containing the +index of the matching element. If there are multiple matches, then any +one of the matches could be returned. The index is chosen +deterministically, but is subject to change in future versions of Rust. +If the value is not found then Result::Err is returned, containing +the index where a matching element could be inserted while maintaining +sorted order.

+

See also binary_search, binary_search_by_key, and partition_point.

+
§Examples
+

Looks up a series of four elements. The first is found, with a +uniquely determined position; the second and third are not +found; the fourth could match any position in [1, 4].

+ +
let s = [0, 1, 1, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55];
+
+let seek = 13;
+assert_eq!(s.binary_search_by(|probe| probe.cmp(&seek)), Ok(9));
+let seek = 4;
+assert_eq!(s.binary_search_by(|probe| probe.cmp(&seek)), Err(7));
+let seek = 100;
+assert_eq!(s.binary_search_by(|probe| probe.cmp(&seek)), Err(13));
+let seek = 1;
+let r = s.binary_search_by(|probe| probe.cmp(&seek));
+assert!(match r { Ok(1..=4) => true, _ => false, });
+
1.10.0 · source

pub fn binary_search_by_key<'a, B, F>( + &'a self, + b: &B, + f: F, +) -> Result<usize, usize>
where + F: FnMut(&'a T) -> B, + B: Ord,

Binary searches this slice with a key extraction function.

+

Assumes that the slice is sorted by the key, for instance with +sort_by_key using the same key extraction function. +If the slice is not sorted by the key, the returned result is +unspecified and meaningless.

+

If the value is found then Result::Ok is returned, containing the +index of the matching element. If there are multiple matches, then any +one of the matches could be returned. The index is chosen +deterministically, but is subject to change in future versions of Rust. +If the value is not found then Result::Err is returned, containing +the index where a matching element could be inserted while maintaining +sorted order.

+

See also binary_search, binary_search_by, and partition_point.

+
§Examples
+

Looks up a series of four elements in a slice of pairs sorted by +their second elements. The first is found, with a uniquely +determined position; the second and third are not found; the +fourth could match any position in [1, 4].

+ +
let s = [(0, 0), (2, 1), (4, 1), (5, 1), (3, 1),
+         (1, 2), (2, 3), (4, 5), (5, 8), (3, 13),
+         (1, 21), (2, 34), (4, 55)];
+
+assert_eq!(s.binary_search_by_key(&13, |&(a, b)| b),  Ok(9));
+assert_eq!(s.binary_search_by_key(&4, |&(a, b)| b),   Err(7));
+assert_eq!(s.binary_search_by_key(&100, |&(a, b)| b), Err(13));
+let r = s.binary_search_by_key(&1, |&(a, b)| b);
+assert!(match r { Ok(1..=4) => true, _ => false, });
+
1.30.0 · source

pub unsafe fn align_to<U>(&self) -> (&[T], &[U], &[T])

Transmute the slice to a slice of another type, ensuring alignment of the types is +maintained.

+

This method splits the slice into three distinct slices: prefix, correctly aligned middle +slice of a new type, and the suffix slice. The middle part will be as big as possible under +the given alignment constraint and element size.

+

This method has no purpose when either input element T or output element U are +zero-sized and will return the original slice without splitting anything.

+
§Safety
+

This method is essentially a transmute with respect to the elements in the returned +middle slice, so all the usual caveats pertaining to transmute::<T, U> also apply here.

+
§Examples
+

Basic usage:

+ +
unsafe {
+    let bytes: [u8; 7] = [1, 2, 3, 4, 5, 6, 7];
+    let (prefix, shorts, suffix) = bytes.align_to::<u16>();
+    // less_efficient_algorithm_for_bytes(prefix);
+    // more_efficient_algorithm_for_aligned_shorts(shorts);
+    // less_efficient_algorithm_for_bytes(suffix);
+}
+
source

pub fn as_simd<const LANES: usize>(&self) -> (&[T], &[Simd<T, LANES>], &[T])
where + Simd<T, LANES>: AsRef<[T; LANES]>, + T: SimdElement, + LaneCount<LANES>: SupportedLaneCount,

🔬This is a nightly-only experimental API. (portable_simd)

Split a slice into a prefix, a middle of aligned SIMD types, and a suffix.

+

This is a safe wrapper around slice::align_to, so inherits the same +guarantees as that method.

+
§Panics
+

This will panic if the size of the SIMD type is different from +LANES times that of the scalar.

+

At the time of writing, the trait restrictions on Simd<T, LANES> keeps +that from ever happening, as only power-of-two numbers of lanes are +supported. It’s possible that, in the future, those restrictions might +be lifted in a way that would make it possible to see panics from this +method for something like LANES == 3.

+
§Examples
+
#![feature(portable_simd)]
+use core::simd::prelude::*;
+
+let short = &[1, 2, 3];
+let (prefix, middle, suffix) = short.as_simd::<4>();
+assert_eq!(middle, []); // Not enough elements for anything in the middle
+
+// They might be split in any possible way between prefix and suffix
+let it = prefix.iter().chain(suffix).copied();
+assert_eq!(it.collect::<Vec<_>>(), vec![1, 2, 3]);
+
+fn basic_simd_sum(x: &[f32]) -> f32 {
+    use std::ops::Add;
+    let (prefix, middle, suffix) = x.as_simd();
+    let sums = f32x4::from_array([
+        prefix.iter().copied().sum(),
+        0.0,
+        0.0,
+        suffix.iter().copied().sum(),
+    ]);
+    let sums = middle.iter().copied().fold(sums, f32x4::add);
+    sums.reduce_sum()
+}
+
+let numbers: Vec<f32> = (1..101).map(|x| x as _).collect();
+assert_eq!(basic_simd_sum(&numbers[1..99]), 4949.0);
+
source

pub fn is_sorted(&self) -> bool
where + T: PartialOrd,

🔬This is a nightly-only experimental API. (is_sorted)

Checks if the elements of this slice are sorted.

+

That is, for each element a and its following element b, a <= b must hold. If the +slice yields exactly zero or one element, true is returned.

+

Note that if Self::Item is only PartialOrd, but not Ord, the above definition +implies that this function returns false if any two consecutive items are not +comparable.

+
§Examples
+
#![feature(is_sorted)]
+let empty: [i32; 0] = [];
+
+assert!([1, 2, 2, 9].is_sorted());
+assert!(![1, 3, 2, 4].is_sorted());
+assert!([0].is_sorted());
+assert!(empty.is_sorted());
+assert!(![0.0, 1.0, f32::NAN].is_sorted());
+
source

pub fn is_sorted_by<'a, F>(&'a self, compare: F) -> bool
where + F: FnMut(&'a T, &'a T) -> bool,

🔬This is a nightly-only experimental API. (is_sorted)

Checks if the elements of this slice are sorted using the given comparator function.

+

Instead of using PartialOrd::partial_cmp, this function uses the given compare +function to determine whether two elements are to be considered in sorted order.

+
§Examples
+
#![feature(is_sorted)]
+
+assert!([1, 2, 2, 9].is_sorted_by(|a, b| a <= b));
+assert!(![1, 2, 2, 9].is_sorted_by(|a, b| a < b));
+
+assert!([0].is_sorted_by(|a, b| true));
+assert!([0].is_sorted_by(|a, b| false));
+
+let empty: [i32; 0] = [];
+assert!(empty.is_sorted_by(|a, b| false));
+assert!(empty.is_sorted_by(|a, b| true));
+
source

pub fn is_sorted_by_key<'a, F, K>(&'a self, f: F) -> bool
where + F: FnMut(&'a T) -> K, + K: PartialOrd,

🔬This is a nightly-only experimental API. (is_sorted)

Checks if the elements of this slice are sorted using the given key extraction function.

+

Instead of comparing the slice’s elements directly, this function compares the keys of the +elements, as determined by f. Apart from that, it’s equivalent to is_sorted; see its +documentation for more information.

+
§Examples
+
#![feature(is_sorted)]
+
+assert!(["c", "bb", "aaa"].is_sorted_by_key(|s| s.len()));
+assert!(![-2i32, -1, 0, 3].is_sorted_by_key(|n| n.abs()));
+
1.52.0 · source

pub fn partition_point<P>(&self, pred: P) -> usize
where + P: FnMut(&T) -> bool,

Returns the index of the partition point according to the given predicate +(the index of the first element of the second partition).

+

The slice is assumed to be partitioned according to the given predicate. +This means that all elements for which the predicate returns true are at the start of the slice +and all elements for which the predicate returns false are at the end. +For example, [7, 15, 3, 5, 4, 12, 6] is partitioned under the predicate x % 2 != 0 +(all odd numbers are at the start, all even at the end).

+

If this slice is not partitioned, the returned result is unspecified and meaningless, +as this method performs a kind of binary search.

+

See also binary_search, binary_search_by, and binary_search_by_key.

+
§Examples
+
let v = [1, 2, 3, 3, 5, 6, 7];
+let i = v.partition_point(|&x| x < 5);
+
+assert_eq!(i, 4);
+assert!(v[..i].iter().all(|&x| x < 5));
+assert!(v[i..].iter().all(|&x| !(x < 5)));
+

If all elements of the slice match the predicate, including if the slice +is empty, then the length of the slice will be returned:

+ +
let a = [2, 4, 8];
+assert_eq!(a.partition_point(|x| x < &100), a.len());
+let a: [i32; 0] = [];
+assert_eq!(a.partition_point(|x| x < &100), 0);
+

If you want to insert an item to a sorted vector, while maintaining +sort order:

+ +
let mut s = vec![0, 1, 1, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55];
+let num = 42;
+let idx = s.partition_point(|&x| x <= num);
+s.insert(idx, num);
+assert_eq!(s, [0, 1, 1, 1, 1, 2, 3, 5, 8, 13, 21, 34, 42, 55]);
+
1.23.0 · source

pub fn to_ascii_uppercase(&self) -> Vec<u8>

Returns a vector containing a copy of this slice where each byte +is mapped to its ASCII upper case equivalent.

+

ASCII letters ‘a’ to ‘z’ are mapped to ‘A’ to ‘Z’, +but non-ASCII letters are unchanged.

+

To uppercase the value in-place, use make_ascii_uppercase.

+
1.23.0 · source

pub fn to_ascii_lowercase(&self) -> Vec<u8>

Returns a vector containing a copy of this slice where each byte +is mapped to its ASCII lower case equivalent.

+

ASCII letters ‘A’ to ‘Z’ are mapped to ‘a’ to ‘z’, +but non-ASCII letters are unchanged.

+

To lowercase the value in-place, use make_ascii_lowercase.

+
1.0.0 · source

pub fn to_vec(&self) -> Vec<T>
where + T: Clone,

Copies self into a new Vec.

+
§Examples
+
let s = [10, 40, 30];
+let x = s.to_vec();
+// Here, `s` and `x` can be modified independently.
+
source

pub fn to_vec_in<A>(&self, alloc: A) -> Vec<T, A>
where + A: Allocator, + T: Clone,

🔬This is a nightly-only experimental API. (allocator_api)

Copies self into a new Vec with an allocator.

+
§Examples
+
#![feature(allocator_api)]
+
+use std::alloc::System;
+
+let s = [10, 40, 30];
+let x = s.to_vec_in(System);
+// Here, `s` and `x` can be modified independently.
+
1.40.0 · source

pub fn repeat(&self, n: usize) -> Vec<T>
where + T: Copy,

Creates a vector by copying a slice n times.

+
§Panics
+

This function will panic if the capacity would overflow.

+
§Examples
+

Basic usage:

+ +
assert_eq!([1, 2].repeat(3), vec![1, 2, 1, 2, 1, 2]);
+

A panic upon overflow:

+ +
// this will panic at runtime
+b"0123456789abcdef".repeat(usize::MAX);
+
1.0.0 · source

pub fn concat<Item>(&self) -> <[T] as Concat<Item>>::Output
where + [T]: Concat<Item>, + Item: ?Sized,

Flattens a slice of T into a single value Self::Output.

+
§Examples
+
assert_eq!(["hello", "world"].concat(), "helloworld");
+assert_eq!([[1, 2], [3, 4]].concat(), [1, 2, 3, 4]);
+
1.3.0 · source

pub fn join<Separator>( + &self, + sep: Separator, +) -> <[T] as Join<Separator>>::Output
where + [T]: Join<Separator>,

Flattens a slice of T into a single value Self::Output, placing a +given separator between each.

+
§Examples
+
assert_eq!(["hello", "world"].join(" "), "hello world");
+assert_eq!([[1, 2], [3, 4]].join(&0), [1, 2, 0, 3, 4]);
+assert_eq!([[1, 2], [3, 4]].join(&[0, 0][..]), [1, 2, 0, 0, 3, 4]);
+
1.0.0 · source

pub fn connect<Separator>( + &self, + sep: Separator, +) -> <[T] as Join<Separator>>::Output
where + [T]: Join<Separator>,

👎Deprecated since 1.3.0: renamed to join

Flattens a slice of T into a single value Self::Output, placing a +given separator between each.

+
§Examples
+
assert_eq!(["hello", "world"].connect(" "), "hello world");
+assert_eq!([[1, 2], [3, 4]].connect(&0), [1, 2, 0, 3, 4]);
+

Trait Implementations§

source§

impl Archive for ExecutionTrace
where + Vec<ExecutedState>: Archive,

§

type Archived = ArchivedExecutionTrace

The archived representation of this type. Read more
§

type Resolver = ExecutionTraceResolver

The resolver for this type. It must contain all the additional information from serializing +needed to make the archived type from the normal type.
source§

unsafe fn resolve( + &self, + pos: usize, + resolver: Self::Resolver, + out: *mut Self::Archived, +)

Creates the archived version of this value at the given position and writes it to the given +output. Read more
source§

impl Clone for ExecutionTrace

source§

fn clone(&self) -> ExecutionTrace

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for ExecutionTrace

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Default for ExecutionTrace

source§

fn default() -> ExecutionTrace

Returns the “default value” for a type. Read more
source§

impl Deref for ExecutionTrace

§

type Target = [ExecutedState]

The resulting type after dereferencing.
source§

fn deref(&self) -> &[ExecutedState]

Dereferences the value.
source§

impl<'de> Deserialize<'de> for ExecutionTrace

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl<__D: Fallible + ?Sized> Deserialize<ExecutionTrace, __D> for Archived<ExecutionTrace>
where + Vec<ExecutedState>: Archive, + Archived<Vec<ExecutedState>>: Deserialize<Vec<ExecutedState>, __D>,

source§

fn deserialize( + &self, + deserializer: &mut __D, +) -> Result<ExecutionTrace, __D::Error>

Deserializes using the given deserializer
source§

impl From<Vec<ExecutedState>> for ExecutionTrace

source§

fn from(vec: Vec<ExecutedState>) -> Self

Converts to this type from the input type.
source§

impl Index<TracePos> for ExecutionTrace

§

type Output = ExecutedState

The returned type after indexing.
source§

fn index(&self, index: TracePos) -> &Self::Output

Performs the indexing (container[index]) operation. Read more
source§

impl IndexMut<TracePos> for ExecutionTrace

source§

fn index_mut(&mut self, index: TracePos) -> &mut Self::Output

Performs the mutable indexing (container[index]) operation. Read more
source§

impl<'trace> IntoIterator for &'trace ExecutionTrace

§

type Item = &'trace ExecutedState

The type of the elements being iterated over.
§

type IntoIter = <&'trace Vec<ExecutedState> as IntoIterator>::IntoIter

Which kind of iterator are we turning this into?
source§

fn into_iter(self) -> Self::IntoIter

Creates an iterator from a value. Read more
source§

impl PartialEq<Vec<ExecutedState>> for ExecutionTrace

source§

fn eq(&self, other: &Vec<ExecutedState>) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl PartialEq for ExecutionTrace

source§

fn eq(&self, other: &ExecutionTrace) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl<__S: Fallible + ?Sized> Serialize<__S> for ExecutionTrace
where + Vec<ExecutedState>: Serialize<__S>,

source§

fn serialize(&self, serializer: &mut __S) -> Result<Self::Resolver, __S::Error>

Writes the dependencies for the object and returns a resolver that can create the archived +type.
source§

impl Serialize for ExecutionTrace

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Eq for ExecutionTrace

source§

impl StructuralPartialEq for ExecutionTrace

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
§

impl<T> ArchiveUnsized for T
where + T: Archive,

§

type Archived = <T as Archive>::Archived

The archived counterpart of this type. Unlike Archive, it may be unsized. Read more
§

type MetadataResolver = ()

The resolver for the metadata of this type. Read more
§

unsafe fn resolve_metadata( + &self, + _: usize, + _: <T as ArchiveUnsized>::MetadataResolver, + _: *mut <<T as ArchiveUnsized>::Archived as ArchivePointee>::ArchivedMetadata, +)

Creates the archived version of the metadata for this value at the given position and writes +it to the given output. Read more
§

unsafe fn resolve_unsized( + &self, + from: usize, + to: usize, + resolver: Self::MetadataResolver, + out: *mut RelPtr<Self::Archived, <isize as Archive>::Archived>, +)

Resolves a relative pointer to this value with the given from and to and writes it to +the given output. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
§

impl<T, S> SerializeUnsized<S> for T
where + T: Serialize<S>, + S: Serializer + ?Sized,

§

fn serialize_unsized( + &self, + serializer: &mut S, +) -> Result<usize, <S as Fallible>::Error>

Writes the object and returns the position of the archived type.
§

fn serialize_metadata(&self, _: &mut S) -> Result<(), <S as Fallible>::Error>

Serializes the metadata for the given type.
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_interpreter_data/struct.ExecutionTraceResolver.html b/air_interpreter_data/struct.ExecutionTraceResolver.html new file mode 100644 index 00000000..7312040b --- /dev/null +++ b/air_interpreter_data/struct.ExecutionTraceResolver.html @@ -0,0 +1,28 @@ +ExecutionTraceResolver in air_interpreter_data - Rust

Struct air_interpreter_data::ExecutionTraceResolver

source ·
pub struct ExecutionTraceResolver(/* private fields */)
+where
+    Vec<ExecutedState>: Archive;
Expand description

The resolver for an archived ExecutionTrace

+

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_interpreter_data/struct.FoldResult.html b/air_interpreter_data/struct.FoldResult.html new file mode 100644 index 00000000..2bfa57d8 --- /dev/null +++ b/air_interpreter_data/struct.FoldResult.html @@ -0,0 +1,65 @@ +FoldResult in air_interpreter_data - Rust

Struct air_interpreter_data::FoldResult

source ·
pub struct FoldResult {
+    pub lore: FoldLore,
+}

Fields§

§lore: FoldLore

Trait Implementations§

source§

impl Archive for FoldResult
where + FoldLore: Archive,

§

type Archived = ArchivedFoldResult

The archived representation of this type. Read more
§

type Resolver = FoldResultResolver

The resolver for this type. It must contain all the additional information from serializing +needed to make the archived type from the normal type.
source§

unsafe fn resolve( + &self, + pos: usize, + resolver: Self::Resolver, + out: *mut Self::Archived, +)

Creates the archived version of this value at the given position and writes it to the given +output. Read more
source§

impl Clone for FoldResult

source§

fn clone(&self) -> FoldResult

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for FoldResult

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Default for FoldResult

source§

fn default() -> FoldResult

Returns the “default value” for a type. Read more
source§

impl<'de> Deserialize<'de> for FoldResult

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl<__D: Fallible + ?Sized> Deserialize<FoldResult, __D> for Archived<FoldResult>
where + FoldLore: Archive, + Archived<FoldLore>: Deserialize<FoldLore, __D>,

source§

fn deserialize(&self, deserializer: &mut __D) -> Result<FoldResult, __D::Error>

Deserializes using the given deserializer
source§

impl PartialEq for FoldResult

source§

fn eq(&self, other: &FoldResult) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl<__S: Fallible + ?Sized> Serialize<__S> for FoldResult
where + FoldLore: Serialize<__S>,

source§

fn serialize(&self, serializer: &mut __S) -> Result<Self::Resolver, __S::Error>

Writes the dependencies for the object and returns a resolver that can create the archived +type.
source§

impl Serialize for FoldResult

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Eq for FoldResult

source§

impl StructuralPartialEq for FoldResult

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
§

impl<T> ArchiveUnsized for T
where + T: Archive,

§

type Archived = <T as Archive>::Archived

The archived counterpart of this type. Unlike Archive, it may be unsized. Read more
§

type MetadataResolver = ()

The resolver for the metadata of this type. Read more
§

unsafe fn resolve_metadata( + &self, + _: usize, + _: <T as ArchiveUnsized>::MetadataResolver, + _: *mut <<T as ArchiveUnsized>::Archived as ArchivePointee>::ArchivedMetadata, +)

Creates the archived version of the metadata for this value at the given position and writes +it to the given output. Read more
§

unsafe fn resolve_unsized( + &self, + from: usize, + to: usize, + resolver: Self::MetadataResolver, + out: *mut RelPtr<Self::Archived, <isize as Archive>::Archived>, +)

Resolves a relative pointer to this value with the given from and to and writes it to +the given output. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
§

impl<T, S> SerializeUnsized<S> for T
where + T: Serialize<S>, + S: Serializer + ?Sized,

§

fn serialize_unsized( + &self, + serializer: &mut S, +) -> Result<usize, <S as Fallible>::Error>

Writes the object and returns the position of the archived type.
§

fn serialize_metadata(&self, _: &mut S) -> Result<(), <S as Fallible>::Error>

Serializes the metadata for the given type.
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_interpreter_data/struct.FoldResultResolver.html b/air_interpreter_data/struct.FoldResultResolver.html new file mode 100644 index 00000000..5d1baf35 --- /dev/null +++ b/air_interpreter_data/struct.FoldResultResolver.html @@ -0,0 +1,27 @@ +FoldResultResolver in air_interpreter_data - Rust

Struct air_interpreter_data::FoldResultResolver

source ·
pub struct FoldResultResolver
where + FoldLore: Archive,
{ /* private fields */ }
Expand description

The resolver for an archived FoldResult

+

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_interpreter_data/struct.FoldSubTraceLore.html b/air_interpreter_data/struct.FoldSubTraceLore.html new file mode 100644 index 00000000..dbdef2a7 --- /dev/null +++ b/air_interpreter_data/struct.FoldSubTraceLore.html @@ -0,0 +1,93 @@ +FoldSubTraceLore in air_interpreter_data - Rust

Struct air_interpreter_data::FoldSubTraceLore

source ·
pub struct FoldSubTraceLore {
+    pub value_pos: TracePos,
+    pub subtraces_desc: Vec<SubTraceDesc>,
+}
Expand description

Let’s consider an example of trace that could be produces by the following fold: +(fold $stream v +(call 1) +(call 2) +(next v) +(call 3) +(call 4) +) +x +Having started with stream with two elements {v1, v2} the resulted trace would looks like +[(1) (2)] [(1) (2)] [(3) (4)] [(3) (4)] <— the sequence of call states +v1 v2 v2 v1 <–– corresponding values from $stream that +the iterable v had at the moment of call

+

From this example, it could be seen that each instruction sequence inside fold is divided into +two intervals (left and right), each of these intervals has borders [begin, end). +So, this struct describes position inside overall execution_step trace belongs to one fold iteration.

+

Fields§

§value_pos: TracePos

Position of current value in a trace.

+
§subtraces_desc: Vec<SubTraceDesc>

Descriptors of a subtrace that are corresponded to the current value. Technically, now +it always contains two values, and Vec here is used to have a possibility to handle more +than one next inside fold in future.

+

Trait Implementations§

source§

impl Archive for FoldSubTraceLore
where + TracePos: Archive, + Vec<SubTraceDesc>: Archive,

§

type Archived = ArchivedFoldSubTraceLore

The archived representation of this type. Read more
§

type Resolver = FoldSubTraceLoreResolver

The resolver for this type. It must contain all the additional information from serializing +needed to make the archived type from the normal type.
source§

unsafe fn resolve( + &self, + pos: usize, + resolver: Self::Resolver, + out: *mut Self::Archived, +)

Creates the archived version of this value at the given position and writes it to the given +output. Read more
source§

impl Clone for FoldSubTraceLore

source§

fn clone(&self) -> FoldSubTraceLore

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for FoldSubTraceLore

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Default for FoldSubTraceLore

source§

fn default() -> FoldSubTraceLore

Returns the “default value” for a type. Read more
source§

impl<'de> Deserialize<'de> for FoldSubTraceLore

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl<__D: Fallible + ?Sized> Deserialize<FoldSubTraceLore, __D> for Archived<FoldSubTraceLore>
where + TracePos: Archive, + Archived<TracePos>: Deserialize<TracePos, __D>, + Vec<SubTraceDesc>: Archive, + Archived<Vec<SubTraceDesc>>: Deserialize<Vec<SubTraceDesc>, __D>,

source§

fn deserialize( + &self, + deserializer: &mut __D, +) -> Result<FoldSubTraceLore, __D::Error>

Deserializes using the given deserializer
source§

impl PartialEq for FoldSubTraceLore

source§

fn eq(&self, other: &FoldSubTraceLore) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl<__S: Fallible + ?Sized> Serialize<__S> for FoldSubTraceLore
where + TracePos: Serialize<__S>, + Vec<SubTraceDesc>: Serialize<__S>,

source§

fn serialize(&self, serializer: &mut __S) -> Result<Self::Resolver, __S::Error>

Writes the dependencies for the object and returns a resolver that can create the archived +type.
source§

impl Serialize for FoldSubTraceLore

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Eq for FoldSubTraceLore

source§

impl StructuralPartialEq for FoldSubTraceLore

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
§

impl<T> ArchiveUnsized for T
where + T: Archive,

§

type Archived = <T as Archive>::Archived

The archived counterpart of this type. Unlike Archive, it may be unsized. Read more
§

type MetadataResolver = ()

The resolver for the metadata of this type. Read more
§

unsafe fn resolve_metadata( + &self, + _: usize, + _: <T as ArchiveUnsized>::MetadataResolver, + _: *mut <<T as ArchiveUnsized>::Archived as ArchivePointee>::ArchivedMetadata, +)

Creates the archived version of the metadata for this value at the given position and writes +it to the given output. Read more
§

unsafe fn resolve_unsized( + &self, + from: usize, + to: usize, + resolver: Self::MetadataResolver, + out: *mut RelPtr<Self::Archived, <isize as Archive>::Archived>, +)

Resolves a relative pointer to this value with the given from and to and writes it to +the given output. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
§

impl<T, S> SerializeUnsized<S> for T
where + T: Serialize<S>, + S: Serializer + ?Sized,

§

fn serialize_unsized( + &self, + serializer: &mut S, +) -> Result<usize, <S as Fallible>::Error>

Writes the object and returns the position of the archived type.
§

fn serialize_metadata(&self, _: &mut S) -> Result<(), <S as Fallible>::Error>

Serializes the metadata for the given type.
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_interpreter_data/struct.FoldSubTraceLoreResolver.html b/air_interpreter_data/struct.FoldSubTraceLoreResolver.html new file mode 100644 index 00000000..75819962 --- /dev/null +++ b/air_interpreter_data/struct.FoldSubTraceLoreResolver.html @@ -0,0 +1,28 @@ +FoldSubTraceLoreResolver in air_interpreter_data - Rust
pub struct FoldSubTraceLoreResolver
where + TracePos: Archive, + Vec<SubTraceDesc>: Archive,
{ /* private fields */ }
Expand description

The resolver for an archived FoldSubTraceLore

+

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_interpreter_data/struct.GenerationIdx.html b/air_interpreter_data/struct.GenerationIdx.html new file mode 100644 index 00000000..b5b2e44a --- /dev/null +++ b/air_interpreter_data/struct.GenerationIdx.html @@ -0,0 +1,82 @@ +GenerationIdx in air_interpreter_data - Rust

Struct air_interpreter_data::GenerationIdx

source ·
pub struct GenerationIdx(/* private fields */);

Implementations§

source§

impl GenerationIdx

source

pub fn checked_add(self, other: Self) -> Option<Self>

source

pub fn checked_sub(self, other: Self) -> Option<Self>

source

pub fn next(self) -> Self

source

pub fn prev(self) -> Self

source

pub fn stub() -> Self

Trait Implementations§

source§

impl Archive for GenerationIdx
where + u32: Archive,

§

type Archived = ArchivedGenerationIdx

The archived representation of this type. Read more
§

type Resolver = GenerationIdxResolver

The resolver for this type. It must contain all the additional information from serializing +needed to make the archived type from the normal type.
source§

unsafe fn resolve( + &self, + pos: usize, + resolver: Self::Resolver, + out: *mut Self::Archived, +)

Creates the archived version of this value at the given position and writes it to the given +output. Read more
source§

impl Clone for GenerationIdx

source§

fn clone(&self) -> GenerationIdx

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for GenerationIdx

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Default for GenerationIdx

source§

fn default() -> GenerationIdx

Returns the “default value” for a type. Read more
source§

impl<'de> Deserialize<'de> for GenerationIdx

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl<__D: Fallible + ?Sized> Deserialize<GenerationIdx, __D> for Archived<GenerationIdx>
where + u32: Archive, + Archived<u32>: Deserialize<u32, __D>,

source§

fn deserialize( + &self, + deserializer: &mut __D, +) -> Result<GenerationIdx, __D::Error>

Deserializes using the given deserializer
source§

impl Display for GenerationIdx

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl From<GenerationIdx> for usize

source§

fn from(value: GenerationIdx) -> Self

Converts to this type from the input type.
source§

impl From<usize> for GenerationIdx

source§

fn from(value: usize) -> Self

Converts to this type from the input type.
source§

impl Hash for GenerationIdx

source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
source§

impl Ord for GenerationIdx

source§

fn cmp(&self, other: &GenerationIdx) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · source§

fn max(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · source§

fn min(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · source§

fn clamp(self, min: Self, max: Self) -> Self
where + Self: Sized + PartialOrd,

Restrict a value to a certain interval. Read more
source§

impl PartialEq<usize> for GenerationIdx

source§

fn eq(&self, other: &usize) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl PartialEq for GenerationIdx

source§

fn eq(&self, other: &GenerationIdx) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl PartialOrd<usize> for GenerationIdx

source§

fn partial_cmp(&self, other: &usize) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · source§

fn lt(&self, other: &Rhs) -> bool

This method tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · source§

fn le(&self, other: &Rhs) -> bool

This method tests less than or equal to (for self and other) and is used by the <= +operator. Read more
1.0.0 · source§

fn gt(&self, other: &Rhs) -> bool

This method tests greater than (for self and other) and is used by the > operator. Read more
1.0.0 · source§

fn ge(&self, other: &Rhs) -> bool

This method tests greater than or equal to (for self and other) and is used by the >= +operator. Read more
source§

impl PartialOrd for GenerationIdx

source§

fn partial_cmp(&self, other: &GenerationIdx) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · source§

fn lt(&self, other: &Rhs) -> bool

This method tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · source§

fn le(&self, other: &Rhs) -> bool

This method tests less than or equal to (for self and other) and is used by the <= +operator. Read more
1.0.0 · source§

fn gt(&self, other: &Rhs) -> bool

This method tests greater than (for self and other) and is used by the > operator. Read more
1.0.0 · source§

fn ge(&self, other: &Rhs) -> bool

This method tests greater than or equal to (for self and other) and is used by the >= +operator. Read more
source§

impl<__S: Fallible + ?Sized> Serialize<__S> for GenerationIdx
where + u32: Serialize<__S>,

source§

fn serialize(&self, serializer: &mut __S) -> Result<Self::Resolver, __S::Error>

Writes the dependencies for the object and returns a resolver that can create the archived +type.
source§

impl Serialize for GenerationIdx

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Copy for GenerationIdx

source§

impl Eq for GenerationIdx

source§

impl StructuralPartialEq for GenerationIdx

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
§

impl<T> ArchiveUnsized for T
where + T: Archive,

§

type Archived = <T as Archive>::Archived

The archived counterpart of this type. Unlike Archive, it may be unsized. Read more
§

type MetadataResolver = ()

The resolver for the metadata of this type. Read more
§

unsafe fn resolve_metadata( + &self, + _: usize, + _: <T as ArchiveUnsized>::MetadataResolver, + _: *mut <<T as ArchiveUnsized>::Archived as ArchivePointee>::ArchivedMetadata, +)

Creates the archived version of the metadata for this value at the given position and writes +it to the given output. Read more
§

unsafe fn resolve_unsized( + &self, + from: usize, + to: usize, + resolver: Self::MetadataResolver, + out: *mut RelPtr<Self::Archived, <isize as Archive>::Archived>, +)

Resolves a relative pointer to this value with the given from and to and writes it to +the given output. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CallHasher for T
where + T: Hash + ?Sized,

§

default fn get_hash<H, B>(value: &H, build_hasher: &B) -> u64
where + H: Hash + ?Sized, + B: BuildHasher,

source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
source§

impl<T> CloneToUninit for T
where + T: Copy,

source§

unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
§

impl<T, S> SerializeUnsized<S> for T
where + T: Serialize<S>, + S: Serializer + ?Sized,

§

fn serialize_unsized( + &self, + serializer: &mut S, +) -> Result<usize, <S as Fallible>::Error>

Writes the object and returns the position of the archived type.
§

fn serialize_metadata(&self, _: &mut S) -> Result<(), <S as Fallible>::Error>

Serializes the metadata for the given type.
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_interpreter_data/struct.GenerationIdxResolver.html b/air_interpreter_data/struct.GenerationIdxResolver.html new file mode 100644 index 00000000..a44d1ae4 --- /dev/null +++ b/air_interpreter_data/struct.GenerationIdxResolver.html @@ -0,0 +1,28 @@ +GenerationIdxResolver in air_interpreter_data - Rust

Struct air_interpreter_data::GenerationIdxResolver

source ·
pub struct GenerationIdxResolver(/* private fields */)
+where
+    u32: Archive;
Expand description

The resolver for an archived GenerationIdx

+

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_interpreter_data/struct.InterpreterData.html b/air_interpreter_data/struct.InterpreterData.html new file mode 100644 index 00000000..581ffd10 --- /dev/null +++ b/air_interpreter_data/struct.InterpreterData.html @@ -0,0 +1,93 @@ +InterpreterData in air_interpreter_data - Rust

Struct air_interpreter_data::InterpreterData

source ·
pub struct InterpreterData {
+    pub trace: ExecutionTrace,
+    pub last_call_request_id: u32,
+    pub cid_info: CidInfo,
+    pub signatures: SignatureStore,
+}
Expand description

The AIR interpreter could be considered as a function +f(prev_data: InterpreterData, current_data: InterpreterData, … ) -> (result_data: InterpreterData, …). +This function receives prev and current data and produces a result data. All these data +have the following format.

+

Fields§

§trace: ExecutionTrace

Trace of AIR execution, which contains executed call, par, fold, and ap states.

+
§last_call_request_id: u32

Last exposed to a peer call request id. All next call request ids will be bigger than this.

+
§cid_info: CidInfo

CID-to-somethings mappings.

+
§signatures: SignatureStore

Signature store.

+

Every peer signs call results and canon values it produced (all together), and stores the signatures +in this store.

+

Implementations§

source§

impl InterpreterData

source

pub fn try_from_slice(slice: &[u8]) -> Result<Self, DataDeserializationError>

source

pub fn serialize( + &self, +) -> Result<Vec<u8>, CompositeSerializerError<Infallible, AllocScratchError, SharedSerializeMapError>>

Trait Implementations§

source§

impl Archive for InterpreterData
where + ExecutionTrace: Archive, + u32: Archive, + CidInfo: Archive, + SignatureStore: Archive,

§

type Archived = ArchivedInterpreterData

The archived representation of this type. Read more
§

type Resolver = InterpreterDataResolver

The resolver for this type. It must contain all the additional information from serializing +needed to make the archived type from the normal type.
source§

unsafe fn resolve( + &self, + pos: usize, + resolver: Self::Resolver, + out: *mut Self::Archived, +)

Creates the archived version of this value at the given position and writes it to the given +output. Read more
source§

impl Clone for InterpreterData

source§

fn clone(&self) -> InterpreterData

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for InterpreterData

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Default for InterpreterData

source§

fn default() -> InterpreterData

Returns the “default value” for a type. Read more
source§

impl<'de> Deserialize<'de> for InterpreterData

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl<__D: Fallible + ?Sized> Deserialize<InterpreterData, __D> for Archived<InterpreterData>
where + ExecutionTrace: Archive, + Archived<ExecutionTrace>: Deserialize<ExecutionTrace, __D>, + u32: Archive, + Archived<u32>: Deserialize<u32, __D>, + CidInfo: Archive, + Archived<CidInfo>: Deserialize<CidInfo, __D>, + SignatureStore: Archive, + Archived<SignatureStore>: Deserialize<SignatureStore, __D>,

source§

fn deserialize( + &self, + deserializer: &mut __D, +) -> Result<InterpreterData, __D::Error>

Deserializes using the given deserializer
source§

impl<__S: Fallible + ?Sized> Serialize<__S> for InterpreterData
where + ExecutionTrace: Serialize<__S>, + u32: Serialize<__S>, + CidInfo: Serialize<__S>, + SignatureStore: Serialize<__S>,

source§

fn serialize(&self, serializer: &mut __S) -> Result<Self::Resolver, __S::Error>

Writes the dependencies for the object and returns a resolver that can create the archived +type.
source§

impl Serialize for InterpreterData

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
§

impl<T> ArchiveUnsized for T
where + T: Archive,

§

type Archived = <T as Archive>::Archived

The archived counterpart of this type. Unlike Archive, it may be unsized. Read more
§

type MetadataResolver = ()

The resolver for the metadata of this type. Read more
§

unsafe fn resolve_metadata( + &self, + _: usize, + _: <T as ArchiveUnsized>::MetadataResolver, + _: *mut <<T as ArchiveUnsized>::Archived as ArchivePointee>::ArchivedMetadata, +)

Creates the archived version of the metadata for this value at the given position and writes +it to the given output. Read more
§

unsafe fn resolve_unsized( + &self, + from: usize, + to: usize, + resolver: Self::MetadataResolver, + out: *mut RelPtr<Self::Archived, <isize as Archive>::Archived>, +)

Resolves a relative pointer to this value with the given from and to and writes it to +the given output. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
§

impl<T, S> SerializeUnsized<S> for T
where + T: Serialize<S>, + S: Serializer + ?Sized,

§

fn serialize_unsized( + &self, + serializer: &mut S, +) -> Result<usize, <S as Fallible>::Error>

Writes the object and returns the position of the archived type.
§

fn serialize_metadata(&self, _: &mut S) -> Result<(), <S as Fallible>::Error>

Serializes the metadata for the given type.
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_interpreter_data/struct.InterpreterDataEnvelope.html b/air_interpreter_data/struct.InterpreterDataEnvelope.html new file mode 100644 index 00000000..288f67ab --- /dev/null +++ b/air_interpreter_data/struct.InterpreterDataEnvelope.html @@ -0,0 +1,49 @@ +InterpreterDataEnvelope in air_interpreter_data - Rust
pub struct InterpreterDataEnvelope<'a> {
+    pub versions: Versions,
+    pub inner_data: Cow<'a, [u8]>,
+}
Expand description

An envelope for the AIR interpreter data that makes AIR data version info accessible in a stable way.

+

Fields§

§versions: Versions

Versions of data and an interpreter produced this data.

+
§inner_data: Cow<'a, [u8]>

Implementations§

source§

impl InterpreterDataEnvelope<'_>

source

pub fn new(interpreter_version: Version) -> Self

source

pub fn from_execution_result( + trace: ExecutionTrace, + cid_info: CidInfo, + signatures: SignatureStore, + last_call_request_id: u32, + interpreter_version: Version, +) -> Self

source

pub fn try_get_versions( + slice: &[u8], +) -> Result<Versions, DataDeserializationError>

Tries to de InterpreterData from slice according to the data version. +Tries to de only versions part of interpreter data.

+
source

pub fn serialize( + &self, +) -> Result<Vec<u8>, <InterpreterDataEnvelopeRepr as Representation>::SerializeError>

source§

impl<'data> InterpreterDataEnvelope<'data>

source

pub fn try_from_slice( + slice: &'data [u8], +) -> Result<Self, DataDeserializationError>

Trait Implementations§

source§

impl<'a> Clone for InterpreterDataEnvelope<'a>

source§

fn clone(&self) -> InterpreterDataEnvelope<'a>

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl<'a> Debug for InterpreterDataEnvelope<'a>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'de: 'a, 'a> Deserialize<'de> for InterpreterDataEnvelope<'a>

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl<'a> Serialize for InterpreterDataEnvelope<'a>

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_interpreter_data/struct.InterpreterDataEnvelopeRepr.html b/air_interpreter_data/struct.InterpreterDataEnvelopeRepr.html new file mode 100644 index 00000000..2a6ff128 --- /dev/null +++ b/air_interpreter_data/struct.InterpreterDataEnvelopeRepr.html @@ -0,0 +1,25 @@ +InterpreterDataEnvelopeRepr in air_interpreter_data - Rust
pub struct InterpreterDataEnvelopeRepr;

Trait Implementations§

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_interpreter_data/struct.InterpreterDataResolver.html b/air_interpreter_data/struct.InterpreterDataResolver.html new file mode 100644 index 00000000..c0d94579 --- /dev/null +++ b/air_interpreter_data/struct.InterpreterDataResolver.html @@ -0,0 +1,30 @@ +InterpreterDataResolver in air_interpreter_data - Rust
pub struct InterpreterDataResolver
where + ExecutionTrace: Archive, + u32: Archive, + CidInfo: Archive, + SignatureStore: Archive,
{ /* private fields */ }
Expand description

The resolver for an archived InterpreterData

+

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_interpreter_data/struct.ParResult.html b/air_interpreter_data/struct.ParResult.html new file mode 100644 index 00000000..8717cfcc --- /dev/null +++ b/air_interpreter_data/struct.ParResult.html @@ -0,0 +1,65 @@ +ParResult in air_interpreter_data - Rust

Struct air_interpreter_data::ParResult

source ·
pub struct ParResult {
+    pub left_size: u32,
+    pub right_size: u32,
+}

Fields§

§left_size: u32§right_size: u32

Implementations§

source§

impl ParResult

source

pub fn new(left_size: u32, right_size: u32) -> Self

source

pub fn size(&self) -> Option<u32>

Returns a size of subtrace that this par describes in execution_step trace.

+

Trait Implementations§

source§

impl Archive for ParResult
where + u32: Archive,

§

type Archived = ArchivedParResult

The archived representation of this type. Read more
§

type Resolver = ParResultResolver

The resolver for this type. It must contain all the additional information from serializing +needed to make the archived type from the normal type.
source§

unsafe fn resolve( + &self, + pos: usize, + resolver: Self::Resolver, + out: *mut Self::Archived, +)

Creates the archived version of this value at the given position and writes it to the given +output. Read more
source§

impl Clone for ParResult

source§

fn clone(&self) -> ParResult

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for ParResult

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Default for ParResult

source§

fn default() -> ParResult

Returns the “default value” for a type. Read more
source§

impl<__D: Fallible + ?Sized> Deserialize<ParResult, __D> for Archived<ParResult>
where + u32: Archive, + Archived<u32>: Deserialize<u32, __D>,

source§

fn deserialize(&self, deserializer: &mut __D) -> Result<ParResult, __D::Error>

Deserializes using the given deserializer
source§

impl PartialEq for ParResult

source§

fn eq(&self, other: &ParResult) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl<__S: Fallible + ?Sized> Serialize<__S> for ParResult
where + u32: Serialize<__S>,

source§

fn serialize(&self, serializer: &mut __S) -> Result<Self::Resolver, __S::Error>

Writes the dependencies for the object and returns a resolver that can create the archived +type.
source§

impl Copy for ParResult

source§

impl Eq for ParResult

source§

impl StructuralPartialEq for ParResult

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
§

impl<T> ArchiveUnsized for T
where + T: Archive,

§

type Archived = <T as Archive>::Archived

The archived counterpart of this type. Unlike Archive, it may be unsized. Read more
§

type MetadataResolver = ()

The resolver for the metadata of this type. Read more
§

unsafe fn resolve_metadata( + &self, + _: usize, + _: <T as ArchiveUnsized>::MetadataResolver, + _: *mut <<T as ArchiveUnsized>::Archived as ArchivePointee>::ArchivedMetadata, +)

Creates the archived version of the metadata for this value at the given position and writes +it to the given output. Read more
§

unsafe fn resolve_unsized( + &self, + from: usize, + to: usize, + resolver: Self::MetadataResolver, + out: *mut RelPtr<Self::Archived, <isize as Archive>::Archived>, +)

Resolves a relative pointer to this value with the given from and to and writes it to +the given output. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
source§

impl<T> CloneToUninit for T
where + T: Copy,

source§

unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
§

impl<T, S> SerializeUnsized<S> for T
where + T: Serialize<S>, + S: Serializer + ?Sized,

§

fn serialize_unsized( + &self, + serializer: &mut S, +) -> Result<usize, <S as Fallible>::Error>

Writes the object and returns the position of the archived type.
§

fn serialize_metadata(&self, _: &mut S) -> Result<(), <S as Fallible>::Error>

Serializes the metadata for the given type.
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_interpreter_data/struct.ParResultResolver.html b/air_interpreter_data/struct.ParResultResolver.html new file mode 100644 index 00000000..5d54c1b4 --- /dev/null +++ b/air_interpreter_data/struct.ParResultResolver.html @@ -0,0 +1,27 @@ +ParResultResolver in air_interpreter_data - Rust

Struct air_interpreter_data::ParResultResolver

source ·
pub struct ParResultResolver
where + u32: Archive,
{ /* private fields */ }
Expand description

The resolver for an archived ParResult

+

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_interpreter_data/struct.RawValue.html b/air_interpreter_data/struct.RawValue.html new file mode 100644 index 00000000..0002a815 --- /dev/null +++ b/air_interpreter_data/struct.RawValue.html @@ -0,0 +1,67 @@ +RawValue in air_interpreter_data - Rust

Struct air_interpreter_data::RawValue

source ·
pub struct RawValue { /* private fields */ }

Implementations§

source§

impl RawValue

source

pub fn from_value(value: impl Into<JValue>) -> Self

source

pub fn get_value(&self) -> JValue

Trait Implementations§

source§

impl Archive for RawValue
where + Box<str>: Archive, + With<RefCell<Option<JValue>>, Skip>: Archive,

§

type Archived = ArchivedRawValue

The archived representation of this type. Read more
§

type Resolver = RawValueResolver

The resolver for this type. It must contain all the additional information from serializing +needed to make the archived type from the normal type.
source§

unsafe fn resolve( + &self, + pos: usize, + resolver: Self::Resolver, + out: *mut Self::Archived, +)

Creates the archived version of this value at the given position and writes it to the given +output. Read more
source§

impl Clone for RawValue

source§

fn clone(&self) -> RawValue

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for RawValue

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'de> Deserialize<'de> for RawValue

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl<__D: Fallible + ?Sized> Deserialize<RawValue, __D> for Archived<RawValue>
where + Box<str>: Archive, + Archived<Box<str>>: Deserialize<Box<str>, __D>, + With<RefCell<Option<JValue>>, Skip>: Archive, + Archived<With<RefCell<Option<JValue>>, Skip>>: Deserialize<With<RefCell<Option<JValue>>, Skip>, __D>,

source§

fn deserialize(&self, deserializer: &mut __D) -> Result<RawValue, __D::Error>

Deserializes using the given deserializer
source§

impl From<JValue> for RawValue

source§

fn from(value: JValue) -> Self

Converts to this type from the input type.
source§

impl PartialEq for RawValue

source§

fn eq(&self, other: &Self) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl<__S: Fallible + ?Sized> Serialize<__S> for RawValue
where + Box<str>: Serialize<__S>, + With<RefCell<Option<JValue>>, Skip>: Serialize<__S>,

source§

fn serialize(&self, serializer: &mut __S) -> Result<Self::Resolver, __S::Error>

Writes the dependencies for the object and returns a resolver that can create the archived +type.
source§

impl Serialize for RawValue

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Eq for RawValue

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
§

impl<T> ArchiveUnsized for T
where + T: Archive,

§

type Archived = <T as Archive>::Archived

The archived counterpart of this type. Unlike Archive, it may be unsized. Read more
§

type MetadataResolver = ()

The resolver for the metadata of this type. Read more
§

unsafe fn resolve_metadata( + &self, + _: usize, + _: <T as ArchiveUnsized>::MetadataResolver, + _: *mut <<T as ArchiveUnsized>::Archived as ArchivePointee>::ArchivedMetadata, +)

Creates the archived version of the metadata for this value at the given position and writes +it to the given output. Read more
§

unsafe fn resolve_unsized( + &self, + from: usize, + to: usize, + resolver: Self::MetadataResolver, + out: *mut RelPtr<Self::Archived, <isize as Archive>::Archived>, +)

Resolves a relative pointer to this value with the given from and to and writes it to +the given output. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
§

impl<T, S> SerializeUnsized<S> for T
where + T: Serialize<S>, + S: Serializer + ?Sized,

§

fn serialize_unsized( + &self, + serializer: &mut S, +) -> Result<usize, <S as Fallible>::Error>

Writes the object and returns the position of the archived type.
§

fn serialize_metadata(&self, _: &mut S) -> Result<(), <S as Fallible>::Error>

Serializes the metadata for the given type.
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_interpreter_data/struct.RawValueResolver.html b/air_interpreter_data/struct.RawValueResolver.html new file mode 100644 index 00000000..b90ea3f6 --- /dev/null +++ b/air_interpreter_data/struct.RawValueResolver.html @@ -0,0 +1,28 @@ +RawValueResolver in air_interpreter_data - Rust

Struct air_interpreter_data::RawValueResolver

source ·
pub struct RawValueResolver
where + Box<str>: Archive, + With<RefCell<Option<JValue>>, Skip>: Archive,
{ /* private fields */ }
Expand description

The resolver for an archived RawValue

+

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_interpreter_data/struct.ServiceResultCidAggregate.html b/air_interpreter_data/struct.ServiceResultCidAggregate.html new file mode 100644 index 00000000..54c0046a --- /dev/null +++ b/air_interpreter_data/struct.ServiceResultCidAggregate.html @@ -0,0 +1,85 @@ +ServiceResultCidAggregate in air_interpreter_data - Rust
pub struct ServiceResultCidAggregate {
+    pub value_cid: CID<RawValue>,
+    pub argument_hash: Rc<str>,
+    pub tetraplet_cid: CID<SecurityTetraplet>,
+}
Expand description

A proof of service result execution result.

+

Fields§

§value_cid: CID<RawValue>§argument_hash: Rc<str>

Hash of the call arguments.

+
§tetraplet_cid: CID<SecurityTetraplet>

The tetraplet of the call result.

+

Implementations§

source§

impl ServiceResultCidAggregate

source

pub fn new( + value_cid: CID<RawValue>, + argument_hash: Rc<str>, + tetraplet_cid: CID<SecurityTetraplet>, +) -> Self

Trait Implementations§

source§

impl Archive for ServiceResultCidAggregate
where + CID<RawValue>: Archive, + Rc<str>: Archive, + CID<SecurityTetraplet>: Archive,

§

type Archived = ArchivedServiceResultCidAggregate

The archived representation of this type. Read more
§

type Resolver = ServiceResultCidAggregateResolver

The resolver for this type. It must contain all the additional information from serializing +needed to make the archived type from the normal type.
source§

unsafe fn resolve( + &self, + pos: usize, + resolver: Self::Resolver, + out: *mut Self::Archived, +)

Creates the archived version of this value at the given position and writes it to the given +output. Read more
source§

impl Clone for ServiceResultCidAggregate

source§

fn clone(&self) -> ServiceResultCidAggregate

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for ServiceResultCidAggregate

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'de> Deserialize<'de> for ServiceResultCidAggregate

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl<__D: Fallible + ?Sized> Deserialize<ServiceResultCidAggregate, __D> for Archived<ServiceResultCidAggregate>
where + CID<RawValue>: Archive, + Archived<CID<RawValue>>: Deserialize<CID<RawValue>, __D>, + Rc<str>: Archive, + Archived<Rc<str>>: Deserialize<Rc<str>, __D>, + CID<SecurityTetraplet>: Archive, + Archived<CID<SecurityTetraplet>>: Deserialize<CID<SecurityTetraplet>, __D>,

source§

fn deserialize( + &self, + deserializer: &mut __D, +) -> Result<ServiceResultCidAggregate, __D::Error>

Deserializes using the given deserializer
source§

impl PartialEq for ServiceResultCidAggregate

source§

fn eq(&self, other: &ServiceResultCidAggregate) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl<__S: Fallible + ?Sized> Serialize<__S> for ServiceResultCidAggregate
where + CID<RawValue>: Serialize<__S>, + Rc<str>: Serialize<__S>, + CID<SecurityTetraplet>: Serialize<__S>,

source§

fn serialize(&self, serializer: &mut __S) -> Result<Self::Resolver, __S::Error>

Writes the dependencies for the object and returns a resolver that can create the archived +type.
source§

impl Serialize for ServiceResultCidAggregate

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Eq for ServiceResultCidAggregate

source§

impl StructuralPartialEq for ServiceResultCidAggregate

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
§

impl<T> ArchiveUnsized for T
where + T: Archive,

§

type Archived = <T as Archive>::Archived

The archived counterpart of this type. Unlike Archive, it may be unsized. Read more
§

type MetadataResolver = ()

The resolver for the metadata of this type. Read more
§

unsafe fn resolve_metadata( + &self, + _: usize, + _: <T as ArchiveUnsized>::MetadataResolver, + _: *mut <<T as ArchiveUnsized>::Archived as ArchivePointee>::ArchivedMetadata, +)

Creates the archived version of the metadata for this value at the given position and writes +it to the given output. Read more
§

unsafe fn resolve_unsized( + &self, + from: usize, + to: usize, + resolver: Self::MetadataResolver, + out: *mut RelPtr<Self::Archived, <isize as Archive>::Archived>, +)

Resolves a relative pointer to this value with the given from and to and writes it to +the given output. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
§

impl<T, S> SerializeUnsized<S> for T
where + T: Serialize<S>, + S: Serializer + ?Sized,

§

fn serialize_unsized( + &self, + serializer: &mut S, +) -> Result<usize, <S as Fallible>::Error>

Writes the object and returns the position of the archived type.
§

fn serialize_metadata(&self, _: &mut S) -> Result<(), <S as Fallible>::Error>

Serializes the metadata for the given type.
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_interpreter_data/struct.ServiceResultCidAggregateResolver.html b/air_interpreter_data/struct.ServiceResultCidAggregateResolver.html new file mode 100644 index 00000000..52968e01 --- /dev/null +++ b/air_interpreter_data/struct.ServiceResultCidAggregateResolver.html @@ -0,0 +1,29 @@ +ServiceResultCidAggregateResolver in air_interpreter_data - Rust
pub struct ServiceResultCidAggregateResolver
where + CID<RawValue>: Archive, + Rc<str>: Archive, + CID<SecurityTetraplet>: Archive,
{ /* private fields */ }
Expand description

The resolver for an archived ServiceResultCidAggregate

+

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_interpreter_data/struct.SubTraceDesc.html b/air_interpreter_data/struct.SubTraceDesc.html new file mode 100644 index 00000000..4b546792 --- /dev/null +++ b/air_interpreter_data/struct.SubTraceDesc.html @@ -0,0 +1,77 @@ +SubTraceDesc in air_interpreter_data - Rust

Struct air_interpreter_data::SubTraceDesc

source ·
pub struct SubTraceDesc {
+    pub begin_pos: TracePos,
+    pub subtrace_len: u32,
+}
Expand description

Descriptor of a subtrace inside execution trace.

+

Fields§

§begin_pos: TracePos

Start position in a trace of this subtrace.

+
§subtrace_len: u32

Length of the subtrace.

+

Implementations§

source§

impl SubTraceDesc

source

pub fn new(begin_pos: TracePos, subtrace_len: usize) -> Self

Trait Implementations§

source§

impl Archive for SubTraceDesc
where + TracePos: Archive, + u32: Archive,

§

type Archived = ArchivedSubTraceDesc

The archived representation of this type. Read more
§

type Resolver = SubTraceDescResolver

The resolver for this type. It must contain all the additional information from serializing +needed to make the archived type from the normal type.
source§

unsafe fn resolve( + &self, + pos: usize, + resolver: Self::Resolver, + out: *mut Self::Archived, +)

Creates the archived version of this value at the given position and writes it to the given +output. Read more
source§

impl Clone for SubTraceDesc

source§

fn clone(&self) -> SubTraceDesc

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for SubTraceDesc

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Default for SubTraceDesc

source§

fn default() -> SubTraceDesc

Returns the “default value” for a type. Read more
source§

impl<'de> Deserialize<'de> for SubTraceDesc

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl<__D: Fallible + ?Sized> Deserialize<SubTraceDesc, __D> for Archived<SubTraceDesc>
where + TracePos: Archive, + Archived<TracePos>: Deserialize<TracePos, __D>, + u32: Archive, + Archived<u32>: Deserialize<u32, __D>,

source§

fn deserialize( + &self, + deserializer: &mut __D, +) -> Result<SubTraceDesc, __D::Error>

Deserializes using the given deserializer
source§

impl PartialEq for SubTraceDesc

source§

fn eq(&self, other: &SubTraceDesc) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl<__S: Fallible + ?Sized> Serialize<__S> for SubTraceDesc
where + TracePos: Serialize<__S>, + u32: Serialize<__S>,

source§

fn serialize(&self, serializer: &mut __S) -> Result<Self::Resolver, __S::Error>

Writes the dependencies for the object and returns a resolver that can create the archived +type.
source§

impl Serialize for SubTraceDesc

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Copy for SubTraceDesc

source§

impl Eq for SubTraceDesc

source§

impl StructuralPartialEq for SubTraceDesc

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
§

impl<T> ArchiveUnsized for T
where + T: Archive,

§

type Archived = <T as Archive>::Archived

The archived counterpart of this type. Unlike Archive, it may be unsized. Read more
§

type MetadataResolver = ()

The resolver for the metadata of this type. Read more
§

unsafe fn resolve_metadata( + &self, + _: usize, + _: <T as ArchiveUnsized>::MetadataResolver, + _: *mut <<T as ArchiveUnsized>::Archived as ArchivePointee>::ArchivedMetadata, +)

Creates the archived version of the metadata for this value at the given position and writes +it to the given output. Read more
§

unsafe fn resolve_unsized( + &self, + from: usize, + to: usize, + resolver: Self::MetadataResolver, + out: *mut RelPtr<Self::Archived, <isize as Archive>::Archived>, +)

Resolves a relative pointer to this value with the given from and to and writes it to +the given output. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
source§

impl<T> CloneToUninit for T
where + T: Copy,

source§

unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
§

impl<T, S> SerializeUnsized<S> for T
where + T: Serialize<S>, + S: Serializer + ?Sized,

§

fn serialize_unsized( + &self, + serializer: &mut S, +) -> Result<usize, <S as Fallible>::Error>

Writes the object and returns the position of the archived type.
§

fn serialize_metadata(&self, _: &mut S) -> Result<(), <S as Fallible>::Error>

Serializes the metadata for the given type.
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_interpreter_data/struct.SubTraceDescResolver.html b/air_interpreter_data/struct.SubTraceDescResolver.html new file mode 100644 index 00000000..1c1f1ee0 --- /dev/null +++ b/air_interpreter_data/struct.SubTraceDescResolver.html @@ -0,0 +1,28 @@ +SubTraceDescResolver in air_interpreter_data - Rust

Struct air_interpreter_data::SubTraceDescResolver

source ·
pub struct SubTraceDescResolver
where + TracePos: Archive, + u32: Archive,
{ /* private fields */ }
Expand description

The resolver for an archived SubTraceDesc

+

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_interpreter_data/struct.TracePos.html b/air_interpreter_data/struct.TracePos.html new file mode 100644 index 00000000..4cfb7087 --- /dev/null +++ b/air_interpreter_data/struct.TracePos.html @@ -0,0 +1,76 @@ +TracePos in air_interpreter_data - Rust

Struct air_interpreter_data::TracePos

source ·
pub struct TracePos(/* private fields */);

Trait Implementations§

source§

impl Add<u32> for TracePos

§

type Output = TracePos

The resulting type after applying the + operator.
source§

fn add(self, rhs: PosType) -> TracePos

Performs the + operation. Read more
source§

impl Add for TracePos

§

type Output = TracePos

The resulting type after applying the + operator.
source§

fn add(self, rhs: Self) -> TracePos

Performs the + operation. Read more
source§

impl AddAssign<u32> for TracePos

source§

fn add_assign(&mut self, rhs: PosType)

Performs the += operation. Read more
source§

impl AddAssign for TracePos

source§

fn add_assign(&mut self, rhs: Self)

Performs the += operation. Read more
source§

impl Archive for TracePos
where + PosType: Archive,

§

type Archived = ArchivedTracePos

The archived representation of this type. Read more
§

type Resolver = TracePosResolver

The resolver for this type. It must contain all the additional information from serializing +needed to make the archived type from the normal type.
source§

unsafe fn resolve( + &self, + pos: usize, + resolver: Self::Resolver, + out: *mut Self::Archived, +)

Creates the archived version of this value at the given position and writes it to the given +output. Read more
source§

impl CheckedAdd for TracePos

source§

fn checked_add(&self, other: &Self) -> Option<Self>

Adds two numbers, checking for overflow. If overflow happens, None is +returned.
source§

impl Clone for TracePos

source§

fn clone(&self) -> TracePos

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for TracePos

source§

fn fmt(&self, fmt: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Default for TracePos

source§

fn default() -> TracePos

Returns the “default value” for a type. Read more
source§

impl<'de> Deserialize<'de> for TracePos

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl<__D: Fallible + ?Sized> Deserialize<TracePos, __D> for Archived<TracePos>
where + PosType: Archive, + Archived<PosType>: Deserialize<PosType, __D>,

source§

fn deserialize(&self, deserializer: &mut __D) -> Result<TracePos, __D::Error>

Deserializes using the given deserializer
source§

impl Display for TracePos

source§

fn fmt(&self, fmt: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl From<TracePos> for PosType

source§

fn from(v: TracePos) -> Self

Converts to this type from the input type.
source§

impl From<TracePos> for usize

source§

fn from(value: TracePos) -> Self

Converts to this type from the input type.
source§

impl From<u32> for TracePos

source§

fn from(v: PosType) -> Self

Converts to this type from the input type.
source§

impl Hash for TracePos

source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
source§

impl Index<TracePos> for ExecutionTrace

§

type Output = ExecutedState

The returned type after indexing.
source§

fn index(&self, index: TracePos) -> &Self::Output

Performs the indexing (container[index]) operation. Read more
source§

impl IndexMut<TracePos> for ExecutionTrace

source§

fn index_mut(&mut self, index: TracePos) -> &mut Self::Output

Performs the mutable indexing (container[index]) operation. Read more
source§

impl Ord for TracePos

source§

fn cmp(&self, other: &TracePos) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · source§

fn max(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · source§

fn min(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · source§

fn clamp(self, min: Self, max: Self) -> Self
where + Self: Sized + PartialOrd,

Restrict a value to a certain interval. Read more
source§

impl PartialEq for TracePos

source§

fn eq(&self, other: &TracePos) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl PartialOrd for TracePos

source§

fn partial_cmp(&self, other: &TracePos) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · source§

fn lt(&self, other: &Rhs) -> bool

This method tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · source§

fn le(&self, other: &Rhs) -> bool

This method tests less than or equal to (for self and other) and is used by the <= +operator. Read more
1.0.0 · source§

fn gt(&self, other: &Rhs) -> bool

This method tests greater than (for self and other) and is used by the > operator. Read more
1.0.0 · source§

fn ge(&self, other: &Rhs) -> bool

This method tests greater than or equal to (for self and other) and is used by the >= +operator. Read more
source§

impl<__S: Fallible + ?Sized> Serialize<__S> for TracePos
where + PosType: Serialize<__S>,

source§

fn serialize(&self, serializer: &mut __S) -> Result<Self::Resolver, __S::Error>

Writes the dependencies for the object and returns a resolver that can create the archived +type.
source§

impl Serialize for TracePos

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Sub<u32> for TracePos

§

type Output = TracePos

The resulting type after applying the - operator.
source§

fn sub(self, rhs: PosType) -> TracePos

Performs the - operation. Read more
source§

impl Sub for TracePos

§

type Output = TracePos

The resulting type after applying the - operator.
source§

fn sub(self, rhs: Self) -> TracePos

Performs the - operation. Read more
source§

impl TryFrom<usize> for TracePos

§

type Error = <u32 as TryFrom<usize>>::Error

The type returned in the event of a conversion error.
source§

fn try_from(value: usize) -> Result<Self, Self::Error>

Performs the conversion.
source§

impl Copy for TracePos

source§

impl Eq for TracePos

source§

impl StructuralPartialEq for TracePos

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
§

impl<T> ArchiveUnsized for T
where + T: Archive,

§

type Archived = <T as Archive>::Archived

The archived counterpart of this type. Unlike Archive, it may be unsized. Read more
§

type MetadataResolver = ()

The resolver for the metadata of this type. Read more
§

unsafe fn resolve_metadata( + &self, + _: usize, + _: <T as ArchiveUnsized>::MetadataResolver, + _: *mut <<T as ArchiveUnsized>::Archived as ArchivePointee>::ArchivedMetadata, +)

Creates the archived version of the metadata for this value at the given position and writes +it to the given output. Read more
§

unsafe fn resolve_unsized( + &self, + from: usize, + to: usize, + resolver: Self::MetadataResolver, + out: *mut RelPtr<Self::Archived, <isize as Archive>::Archived>, +)

Resolves a relative pointer to this value with the given from and to and writes it to +the given output. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CallHasher for T
where + T: Hash + ?Sized,

§

default fn get_hash<H, B>(value: &H, build_hasher: &B) -> u64
where + H: Hash + ?Sized, + B: BuildHasher,

source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
source§

impl<T> CloneToUninit for T
where + T: Copy,

source§

unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
§

impl<T, S> SerializeUnsized<S> for T
where + T: Serialize<S>, + S: Serializer + ?Sized,

§

fn serialize_unsized( + &self, + serializer: &mut S, +) -> Result<usize, <S as Fallible>::Error>

Writes the object and returns the position of the archived type.
§

fn serialize_metadata(&self, _: &mut S) -> Result<(), <S as Fallible>::Error>

Serializes the metadata for the given type.
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_interpreter_data/struct.TracePosResolver.html b/air_interpreter_data/struct.TracePosResolver.html new file mode 100644 index 00000000..da0e1c43 --- /dev/null +++ b/air_interpreter_data/struct.TracePosResolver.html @@ -0,0 +1,28 @@ +TracePosResolver in air_interpreter_data - Rust

Struct air_interpreter_data::TracePosResolver

source ·
pub struct TracePosResolver(/* private fields */)
+where
+    PosType: Archive;
Expand description

The resolver for an archived TracePos

+

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_interpreter_data/struct.Versions.html b/air_interpreter_data/struct.Versions.html new file mode 100644 index 00000000..1a1c1def --- /dev/null +++ b/air_interpreter_data/struct.Versions.html @@ -0,0 +1,35 @@ +Versions in air_interpreter_data - Rust

Struct air_interpreter_data::Versions

source ·
pub struct Versions {
+    pub data_version: Version,
+    pub interpreter_version: Version,
+}

Fields§

§data_version: Version

Version of this data format.

+
§interpreter_version: Version

Version of an interpreter produced this data.

+

Implementations§

source§

impl Versions

source

pub fn new(interpreter_version: Version) -> Self

Trait Implementations§

source§

impl Clone for Versions

source§

fn clone(&self) -> Versions

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for Versions

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'de> Deserialize<'de> for Versions

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl FromSerialized<Versions> for InterpreterDataEnvelopeRepr

source§

fn deserialize(&self, repr: &[u8]) -> Result<Versions, Self::DeserializeError>

source§

impl Serialize for Versions

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_interpreter_data/trace/struct.ArchivedExecutionTrace.html b/air_interpreter_data/trace/struct.ArchivedExecutionTrace.html new file mode 100644 index 00000000..0fd5276c --- /dev/null +++ b/air_interpreter_data/trace/struct.ArchivedExecutionTrace.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_data/struct.ArchivedExecutionTrace.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_data/trace/struct.ExecutionTrace.html b/air_interpreter_data/trace/struct.ExecutionTrace.html new file mode 100644 index 00000000..549142e2 --- /dev/null +++ b/air_interpreter_data/trace/struct.ExecutionTrace.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_data/struct.ExecutionTrace.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_data/trace/struct.ExecutionTraceResolver.html b/air_interpreter_data/trace/struct.ExecutionTraceResolver.html new file mode 100644 index 00000000..4ce33dae --- /dev/null +++ b/air_interpreter_data/trace/struct.ExecutionTraceResolver.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_data/struct.ExecutionTraceResolver.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_data/trace/type.TraceLen.html b/air_interpreter_data/trace/type.TraceLen.html new file mode 100644 index 00000000..af8d7500 --- /dev/null +++ b/air_interpreter_data/trace/type.TraceLen.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_data/type.TraceLen.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_data/trace_pos/struct.ArchivedTracePos.html b/air_interpreter_data/trace_pos/struct.ArchivedTracePos.html new file mode 100644 index 00000000..0f85dd51 --- /dev/null +++ b/air_interpreter_data/trace_pos/struct.ArchivedTracePos.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_data/struct.ArchivedTracePos.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_data/trace_pos/struct.TracePos.html b/air_interpreter_data/trace_pos/struct.TracePos.html new file mode 100644 index 00000000..d353d55d --- /dev/null +++ b/air_interpreter_data/trace_pos/struct.TracePos.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_data/struct.TracePos.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_data/trace_pos/struct.TracePosResolver.html b/air_interpreter_data/trace_pos/struct.TracePosResolver.html new file mode 100644 index 00000000..811e7d0f --- /dev/null +++ b/air_interpreter_data/trace_pos/struct.TracePosResolver.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_data/struct.TracePosResolver.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_data/trace_pos/type.PosType.html b/air_interpreter_data/trace_pos/type.PosType.html new file mode 100644 index 00000000..a3262816 --- /dev/null +++ b/air_interpreter_data/trace_pos/type.PosType.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_data/type.PosType.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_data/type.FoldLore.html b/air_interpreter_data/type.FoldLore.html new file mode 100644 index 00000000..d5579653 --- /dev/null +++ b/air_interpreter_data/type.FoldLore.html @@ -0,0 +1,3 @@ +FoldLore in air_interpreter_data - Rust

Type Alias air_interpreter_data::FoldLore

source ·
pub type FoldLore = Vec<FoldSubTraceLore>;
Expand description

This type represents all information in an execution trace about states executed during +a fold execution.

+

Aliased Type§

struct FoldLore { /* private fields */ }
\ No newline at end of file diff --git a/air_interpreter_data/type.InterpreterDataEnvelopeFormat.html b/air_interpreter_data/type.InterpreterDataEnvelopeFormat.html new file mode 100644 index 00000000..83b18d1a --- /dev/null +++ b/air_interpreter_data/type.InterpreterDataEnvelopeFormat.html @@ -0,0 +1 @@ +InterpreterDataEnvelopeFormat in air_interpreter_data - Rust
pub type InterpreterDataEnvelopeFormat = MsgPackFormat;

Aliased Type§

struct InterpreterDataEnvelopeFormat;
\ No newline at end of file diff --git a/air_interpreter_data/type.PosType.html b/air_interpreter_data/type.PosType.html new file mode 100644 index 00000000..53b3cd12 --- /dev/null +++ b/air_interpreter_data/type.PosType.html @@ -0,0 +1 @@ +PosType in air_interpreter_data - Rust

Type Alias air_interpreter_data::PosType

source ·
pub type PosType = u32;

Trait Implementations§

source§

impl From<TracePos> for PosType

source§

fn from(v: TracePos) -> Self

Converts to this type from the input type.
\ No newline at end of file diff --git a/air_interpreter_data/type.TraceLen.html b/air_interpreter_data/type.TraceLen.html new file mode 100644 index 00000000..fb975e5c --- /dev/null +++ b/air_interpreter_data/type.TraceLen.html @@ -0,0 +1 @@ +TraceLen in air_interpreter_data - Rust

Type Alias air_interpreter_data::TraceLen

source ·
pub type TraceLen = u32;
\ No newline at end of file diff --git a/air_interpreter_data/verification/enum.DataVerifierError.html b/air_interpreter_data/verification/enum.DataVerifierError.html new file mode 100644 index 00000000..09ba2ebc --- /dev/null +++ b/air_interpreter_data/verification/enum.DataVerifierError.html @@ -0,0 +1,44 @@ +DataVerifierError in air_interpreter_data::verification - Rust
pub enum DataVerifierError {
+    MalformedKey {
+        error: KeyError,
+        key: String,
+    },
+    MalformedSignature(DecodingError),
+    PeerIdNotFound(String),
+    SignatureMismatch {
+        error: Box<VerificationError>,
+        cids: Vec<Rc<CidRef>>,
+        peer_id: String,
+    },
+    MergeMismatch {
+        peer_id: String,
+        larger_cids: Vec<Rc<CidRef>>,
+        smaller_cids: Vec<Rc<CidRef>>,
+    },
+}

Variants§

§

MalformedKey

Fields

§error: KeyError
§

MalformedSignature(DecodingError)

§

PeerIdNotFound(String)

§

SignatureMismatch

Fields

§cids: Vec<Rc<CidRef>>
§peer_id: String
§

MergeMismatch

Fields

§peer_id: String
§larger_cids: Vec<Rc<CidRef>>
§smaller_cids: Vec<Rc<CidRef>>

Trait Implementations§

source§

impl Debug for DataVerifierError

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Display for DataVerifierError

source§

fn fmt(&self, __formatter: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Error for DataVerifierError

source§

fn source(&self) -> Option<&(dyn Error + 'static)>

The lower-level source of this error, if any. Read more
1.0.0 · source§

fn description(&self) -> &str

👎Deprecated since 1.42.0: use the Display impl or to_string()
1.0.0 · source§

fn cause(&self) -> Option<&dyn Error>

👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
source§

fn provide<'a>(&'a self, request: &mut Request<'a>)

🔬This is a nightly-only experimental API. (error_generic_member_access)
Provides type based access to context intended for error reports. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
§

impl<T> Error for T
where + T: Error + 'static,

§

fn as_error(&self) -> &(dyn Error + 'static)

Gets this error as an std::error::Error.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_interpreter_data/verification/index.html b/air_interpreter_data/verification/index.html new file mode 100644 index 00000000..498bcc6d --- /dev/null +++ b/air_interpreter_data/verification/index.html @@ -0,0 +1 @@ +air_interpreter_data::verification - Rust

Module air_interpreter_data::verification

source ·

Structs§

  • An util for verificating particular data’s signatures.

Enums§

\ No newline at end of file diff --git a/air_interpreter_data/verification/sidebar-items.js b/air_interpreter_data/verification/sidebar-items.js new file mode 100644 index 00000000..6cb9cc28 --- /dev/null +++ b/air_interpreter_data/verification/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"enum":["DataVerifierError"],"struct":["DataVerifier"]}; \ No newline at end of file diff --git a/air_interpreter_data/verification/struct.DataVerifier.html b/air_interpreter_data/verification/struct.DataVerifier.html new file mode 100644 index 00000000..91af5a28 --- /dev/null +++ b/air_interpreter_data/verification/struct.DataVerifier.html @@ -0,0 +1,37 @@ +DataVerifier in air_interpreter_data::verification - Rust

Struct air_interpreter_data::verification::DataVerifier

source ·
pub struct DataVerifier<'data> { /* private fields */ }
Expand description

An util for verificating particular data’s signatures.

+

Implementations§

source§

impl<'data> DataVerifier<'data>

source

pub fn new( + data: &'data InterpreterData, + salt: &'data str, +) -> Result<Self, DataVerifierError>

source

pub fn verify(&self) -> Result<(), DataVerifierError>

Verify each peers’ signatures.

+
source

pub fn merge(self, other: Self) -> Result<SignatureStore, DataVerifierError>

For each peer, merge previous and current CID multisets by determining the largest set.

+

This code uses an invariant: peer’s multiset of produced CIDs is always a superset of +previous invocation’s multiset:

+

A_0 ⊆ A_1 ⊆ … ⊆ A_n.

+

So, the largest multiset is selected as the result of merging, the invariant is checked, +and a error is returned if it is violated.

+

If the multisets are of same size, they have to be equal.

+

Auto Trait Implementations§

§

impl<'data> Freeze for DataVerifier<'data>

§

impl<'data> RefUnwindSafe for DataVerifier<'data>

§

impl<'data> !Send for DataVerifier<'data>

§

impl<'data> !Sync for DataVerifier<'data>

§

impl<'data> Unpin for DataVerifier<'data>

§

impl<'data> UnwindSafe for DataVerifier<'data>

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_interpreter_interface/all.html b/air_interpreter_interface/all.html new file mode 100644 index 00000000..455fa18d --- /dev/null +++ b/air_interpreter_interface/all.html @@ -0,0 +1 @@ +List of all items in this crate
\ No newline at end of file diff --git a/air_interpreter_interface/call_request_parameters/struct.CallArgumentsRepr.html b/air_interpreter_interface/call_request_parameters/struct.CallArgumentsRepr.html new file mode 100644 index 00000000..829c9820 --- /dev/null +++ b/air_interpreter_interface/call_request_parameters/struct.CallArgumentsRepr.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_interface/struct.CallArgumentsRepr.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_interface/call_request_parameters/struct.CallRequestParams.html b/air_interpreter_interface/call_request_parameters/struct.CallRequestParams.html new file mode 100644 index 00000000..e8ea8d1b --- /dev/null +++ b/air_interpreter_interface/call_request_parameters/struct.CallRequestParams.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_interface/struct.CallRequestParams.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_interface/call_request_parameters/struct.CallRequestsRepr.html b/air_interpreter_interface/call_request_parameters/struct.CallRequestsRepr.html new file mode 100644 index 00000000..22684b0c --- /dev/null +++ b/air_interpreter_interface/call_request_parameters/struct.CallRequestsRepr.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_interface/struct.CallRequestsRepr.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_interface/call_request_parameters/struct.SerializedCallArguments.html b/air_interpreter_interface/call_request_parameters/struct.SerializedCallArguments.html new file mode 100644 index 00000000..a7f69d38 --- /dev/null +++ b/air_interpreter_interface/call_request_parameters/struct.SerializedCallArguments.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_interface/struct.SerializedCallArguments.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_interface/call_request_parameters/struct.SerializedCallRequests.html b/air_interpreter_interface/call_request_parameters/struct.SerializedCallRequests.html new file mode 100644 index 00000000..8d732eed --- /dev/null +++ b/air_interpreter_interface/call_request_parameters/struct.SerializedCallRequests.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_interface/struct.SerializedCallRequests.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_interface/call_request_parameters/struct.SerializedTetraplets.html b/air_interpreter_interface/call_request_parameters/struct.SerializedTetraplets.html new file mode 100644 index 00000000..ce93fe9f --- /dev/null +++ b/air_interpreter_interface/call_request_parameters/struct.SerializedTetraplets.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_interface/struct.SerializedTetraplets.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_interface/call_request_parameters/struct.TetrapletsRepr.html b/air_interpreter_interface/call_request_parameters/struct.TetrapletsRepr.html new file mode 100644 index 00000000..41104f46 --- /dev/null +++ b/air_interpreter_interface/call_request_parameters/struct.TetrapletsRepr.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_interface/struct.TetrapletsRepr.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_interface/call_request_parameters/type.CallArgumentsDeserializeError.html b/air_interpreter_interface/call_request_parameters/type.CallArgumentsDeserializeError.html new file mode 100644 index 00000000..e8cc122d --- /dev/null +++ b/air_interpreter_interface/call_request_parameters/type.CallArgumentsDeserializeError.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_interface/type.CallArgumentsDeserializeError.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_interface/call_request_parameters/type.CallArgumentsFormat.html b/air_interpreter_interface/call_request_parameters/type.CallArgumentsFormat.html new file mode 100644 index 00000000..b9b4f8cd --- /dev/null +++ b/air_interpreter_interface/call_request_parameters/type.CallArgumentsFormat.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_interface/type.CallArgumentsFormat.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_interface/call_request_parameters/type.CallRequests.html b/air_interpreter_interface/call_request_parameters/type.CallRequests.html new file mode 100644 index 00000000..b633c585 --- /dev/null +++ b/air_interpreter_interface/call_request_parameters/type.CallRequests.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_interface/type.CallRequests.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_interface/call_request_parameters/type.CallRequestsDeserializeError.html b/air_interpreter_interface/call_request_parameters/type.CallRequestsDeserializeError.html new file mode 100644 index 00000000..6b5eb33e --- /dev/null +++ b/air_interpreter_interface/call_request_parameters/type.CallRequestsDeserializeError.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_interface/type.CallRequestsDeserializeError.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_interface/call_request_parameters/type.CallRequestsFormat.html b/air_interpreter_interface/call_request_parameters/type.CallRequestsFormat.html new file mode 100644 index 00000000..674edd65 --- /dev/null +++ b/air_interpreter_interface/call_request_parameters/type.CallRequestsFormat.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_interface/type.CallRequestsFormat.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_interface/call_request_parameters/type.TetrapletDeserializeError.html b/air_interpreter_interface/call_request_parameters/type.TetrapletDeserializeError.html new file mode 100644 index 00000000..fb5de0ea --- /dev/null +++ b/air_interpreter_interface/call_request_parameters/type.TetrapletDeserializeError.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_interface/type.TetrapletDeserializeError.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_interface/call_request_parameters/type.TetrapletsFormat.html b/air_interpreter_interface/call_request_parameters/type.TetrapletsFormat.html new file mode 100644 index 00000000..2039fd05 --- /dev/null +++ b/air_interpreter_interface/call_request_parameters/type.TetrapletsFormat.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_interface/type.TetrapletsFormat.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_interface/call_service_result/constant.CALL_SERVICE_SUCCESS.html b/air_interpreter_interface/call_service_result/constant.CALL_SERVICE_SUCCESS.html new file mode 100644 index 00000000..eac56d5a --- /dev/null +++ b/air_interpreter_interface/call_service_result/constant.CALL_SERVICE_SUCCESS.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_interface/constant.CALL_SERVICE_SUCCESS.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_interface/call_service_result/struct.CallResultsRepr.html b/air_interpreter_interface/call_service_result/struct.CallResultsRepr.html new file mode 100644 index 00000000..87ecebab --- /dev/null +++ b/air_interpreter_interface/call_service_result/struct.CallResultsRepr.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_interface/struct.CallResultsRepr.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_interface/call_service_result/struct.CallServiceResult.html b/air_interpreter_interface/call_service_result/struct.CallServiceResult.html new file mode 100644 index 00000000..177c6b84 --- /dev/null +++ b/air_interpreter_interface/call_service_result/struct.CallServiceResult.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_interface/struct.CallServiceResult.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_interface/call_service_result/struct.SerializedCallResults.html b/air_interpreter_interface/call_service_result/struct.SerializedCallResults.html new file mode 100644 index 00000000..5e8b57ba --- /dev/null +++ b/air_interpreter_interface/call_service_result/struct.SerializedCallResults.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_interface/struct.SerializedCallResults.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_interface/call_service_result/type.CallResults.html b/air_interpreter_interface/call_service_result/type.CallResults.html new file mode 100644 index 00000000..09dfc559 --- /dev/null +++ b/air_interpreter_interface/call_service_result/type.CallResults.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_interface/type.CallResults.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_interface/call_service_result/type.CallResultsDeserializeError.html b/air_interpreter_interface/call_service_result/type.CallResultsDeserializeError.html new file mode 100644 index 00000000..59daf687 --- /dev/null +++ b/air_interpreter_interface/call_service_result/type.CallResultsDeserializeError.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_interface/type.CallResultsDeserializeError.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_interface/call_service_result/type.CallResultsFormat.html b/air_interpreter_interface/call_service_result/type.CallResultsFormat.html new file mode 100644 index 00000000..655b43fd --- /dev/null +++ b/air_interpreter_interface/call_service_result/type.CallResultsFormat.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_interface/type.CallResultsFormat.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_interface/call_service_result/type.CallResultsSerializeError.html b/air_interpreter_interface/call_service_result/type.CallResultsSerializeError.html new file mode 100644 index 00000000..e6aa997e --- /dev/null +++ b/air_interpreter_interface/call_service_result/type.CallResultsSerializeError.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_interface/type.CallResultsSerializeError.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_interface/constant.CALL_SERVICE_SUCCESS.html b/air_interpreter_interface/constant.CALL_SERVICE_SUCCESS.html new file mode 100644 index 00000000..9f40a0f9 --- /dev/null +++ b/air_interpreter_interface/constant.CALL_SERVICE_SUCCESS.html @@ -0,0 +1 @@ +CALL_SERVICE_SUCCESS in air_interpreter_interface - Rust

Constant air_interpreter_interface::CALL_SERVICE_SUCCESS

source ·
pub const CALL_SERVICE_SUCCESS: i32 = 0;
\ No newline at end of file diff --git a/air_interpreter_interface/constant.INTERPRETER_SUCCESS.html b/air_interpreter_interface/constant.INTERPRETER_SUCCESS.html new file mode 100644 index 00000000..ecbb4ccc --- /dev/null +++ b/air_interpreter_interface/constant.INTERPRETER_SUCCESS.html @@ -0,0 +1 @@ +INTERPRETER_SUCCESS in air_interpreter_interface - Rust

Constant air_interpreter_interface::INTERPRETER_SUCCESS

source ·
pub const INTERPRETER_SUCCESS: i64 = 0;
\ No newline at end of file diff --git a/air_interpreter_interface/fn.try_as_string.html b/air_interpreter_interface/fn.try_as_string.html new file mode 100644 index 00000000..94deac30 --- /dev/null +++ b/air_interpreter_interface/fn.try_as_string.html @@ -0,0 +1 @@ +try_as_string in air_interpreter_interface - Rust

Function air_interpreter_interface::try_as_string

source ·
pub fn try_as_string(ivalue: IValue, field_name: &str) -> Result<String, String>
\ No newline at end of file diff --git a/air_interpreter_interface/index.html b/air_interpreter_interface/index.html new file mode 100644 index 00000000..ea52f58c --- /dev/null +++ b/air_interpreter_interface/index.html @@ -0,0 +1,9 @@ +air_interpreter_interface - Rust

Crate air_interpreter_interface

source ·

Structs§

Constants§

Statics§

  • These are RAM consumption related limits to be enforced by AquaVM. +There are two enforcing modes in AquaVM: soft and hard limit. The mode +is signalled by AquaVM function Invoker via its run parameters. +Soft limit mode sets a set of flags to return to the Invoker. +Hard limit mode forces AquaVM to return Uncatchable error if the limits +are exceeded. +The math behind the limits value is based on:

Functions§

Type Aliases§

\ No newline at end of file diff --git a/air_interpreter_interface/interpreter_outcome/constant.INTERPRETER_SUCCESS.html b/air_interpreter_interface/interpreter_outcome/constant.INTERPRETER_SUCCESS.html new file mode 100644 index 00000000..0eb534fe --- /dev/null +++ b/air_interpreter_interface/interpreter_outcome/constant.INTERPRETER_SUCCESS.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_interface/constant.INTERPRETER_SUCCESS.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_interface/interpreter_outcome/fn.try_as_string.html b/air_interpreter_interface/interpreter_outcome/fn.try_as_string.html new file mode 100644 index 00000000..ebe57bb3 --- /dev/null +++ b/air_interpreter_interface/interpreter_outcome/fn.try_as_string.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_interface/fn.try_as_string.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_interface/interpreter_outcome/struct.InterpreterOutcome.html b/air_interpreter_interface/interpreter_outcome/struct.InterpreterOutcome.html new file mode 100644 index 00000000..08d7a951 --- /dev/null +++ b/air_interpreter_interface/interpreter_outcome/struct.InterpreterOutcome.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_interface/struct.InterpreterOutcome.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_interface/interpreter_outcome/struct.SoftLimitsTriggering.html b/air_interpreter_interface/interpreter_outcome/struct.SoftLimitsTriggering.html new file mode 100644 index 00000000..e9fd1504 --- /dev/null +++ b/air_interpreter_interface/interpreter_outcome/struct.SoftLimitsTriggering.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_interface/struct.SoftLimitsTriggering.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_interface/run_args_memory_limits/static.MAX_AIR_SIZE.html b/air_interpreter_interface/run_args_memory_limits/static.MAX_AIR_SIZE.html new file mode 100644 index 00000000..7978fc37 --- /dev/null +++ b/air_interpreter_interface/run_args_memory_limits/static.MAX_AIR_SIZE.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_interface/static.MAX_AIR_SIZE.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_interface/run_args_memory_limits/static.MAX_CALL_RESULT_SIZE.html b/air_interpreter_interface/run_args_memory_limits/static.MAX_CALL_RESULT_SIZE.html new file mode 100644 index 00000000..dfb0ca9b --- /dev/null +++ b/air_interpreter_interface/run_args_memory_limits/static.MAX_CALL_RESULT_SIZE.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_interface/static.MAX_CALL_RESULT_SIZE.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_interface/run_args_memory_limits/static.MAX_PARTICLE_SIZE.html b/air_interpreter_interface/run_args_memory_limits/static.MAX_PARTICLE_SIZE.html new file mode 100644 index 00000000..6aa69e69 --- /dev/null +++ b/air_interpreter_interface/run_args_memory_limits/static.MAX_PARTICLE_SIZE.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_interface/static.MAX_PARTICLE_SIZE.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_interface/run_parameters/struct.RunParameters.html b/air_interpreter_interface/run_parameters/struct.RunParameters.html new file mode 100644 index 00000000..feae4e94 --- /dev/null +++ b/air_interpreter_interface/run_parameters/struct.RunParameters.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_interface/struct.RunParameters.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_interface/sidebar-items.js b/air_interpreter_interface/sidebar-items.js new file mode 100644 index 00000000..6b02895a --- /dev/null +++ b/air_interpreter_interface/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"constant":["CALL_SERVICE_SUCCESS","INTERPRETER_SUCCESS"],"fn":["try_as_string"],"static":["MAX_AIR_SIZE","MAX_CALL_RESULT_SIZE","MAX_PARTICLE_SIZE"],"struct":["CallArgumentsRepr","CallRequestParams","CallRequestsRepr","CallResultsRepr","CallServiceResult","InterpreterOutcome","RunParameters","SerializedCallArguments","SerializedCallRequests","SerializedCallResults","SerializedTetraplets","SoftLimitsTriggering","TetrapletsRepr"],"type":["CallArgumentsDeserializeError","CallArgumentsFormat","CallRequests","CallRequestsDeserializeError","CallRequestsFormat","CallResults","CallResultsDeserializeError","CallResultsFormat","CallResultsSerializeError","TetrapletDeserializeError","TetrapletsFormat"]}; \ No newline at end of file diff --git a/air_interpreter_interface/static.MAX_AIR_SIZE.html b/air_interpreter_interface/static.MAX_AIR_SIZE.html new file mode 100644 index 00000000..4baa014f --- /dev/null +++ b/air_interpreter_interface/static.MAX_AIR_SIZE.html @@ -0,0 +1,14 @@ +MAX_AIR_SIZE in air_interpreter_interface - Rust

Static air_interpreter_interface::MAX_AIR_SIZE

source ·
pub static MAX_AIR_SIZE: u64
Expand description

These are RAM consumption related limits to be enforced by AquaVM. +There are two enforcing modes in AquaVM: soft and hard limit. The mode +is signalled by AquaVM function Invoker via its run parameters. +Soft limit mode sets a set of flags to return to the Invoker. +Hard limit mode forces AquaVM to return Uncatchable error if the limits +are exceeded. +The math behind the limits value is based on:

+
    +
  • 4GB value that provder guaratees for a Computation Unit that also has 1 CPU core.
  • +
  • the fact that peak RAM consumption linearly depends on: particle size, +number of instructions and their types. +The limits values are to be re-considered after more RAM efficient in-memory representation.
  • +
+
\ No newline at end of file diff --git a/air_interpreter_interface/static.MAX_CALL_RESULT_SIZE.html b/air_interpreter_interface/static.MAX_CALL_RESULT_SIZE.html new file mode 100644 index 00000000..e32097d6 --- /dev/null +++ b/air_interpreter_interface/static.MAX_CALL_RESULT_SIZE.html @@ -0,0 +1 @@ +MAX_CALL_RESULT_SIZE in air_interpreter_interface - Rust
pub static MAX_CALL_RESULT_SIZE: u64
\ No newline at end of file diff --git a/air_interpreter_interface/static.MAX_PARTICLE_SIZE.html b/air_interpreter_interface/static.MAX_PARTICLE_SIZE.html new file mode 100644 index 00000000..8f5c5b74 --- /dev/null +++ b/air_interpreter_interface/static.MAX_PARTICLE_SIZE.html @@ -0,0 +1 @@ +MAX_PARTICLE_SIZE in air_interpreter_interface - Rust

Static air_interpreter_interface::MAX_PARTICLE_SIZE

source ·
pub static MAX_PARTICLE_SIZE: u64
\ No newline at end of file diff --git a/air_interpreter_interface/struct.CallArgumentsRepr.html b/air_interpreter_interface/struct.CallArgumentsRepr.html new file mode 100644 index 00000000..4b4d9cf1 --- /dev/null +++ b/air_interpreter_interface/struct.CallArgumentsRepr.html @@ -0,0 +1,29 @@ +CallArgumentsRepr in air_interpreter_interface - Rust

Struct air_interpreter_interface::CallArgumentsRepr

source ·
pub struct CallArgumentsRepr;

Trait Implementations§

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/air_interpreter_interface/struct.CallRequestParams.html b/air_interpreter_interface/struct.CallRequestParams.html new file mode 100644 index 00000000..a4635ec3 --- /dev/null +++ b/air_interpreter_interface/struct.CallRequestParams.html @@ -0,0 +1,42 @@ +CallRequestParams in air_interpreter_interface - Rust

Struct air_interpreter_interface::CallRequestParams

source ·
pub struct CallRequestParams {
+    pub service_id: String,
+    pub function_name: String,
+    pub arguments: SerializedCallArguments,
+    pub tetraplets: SerializedTetraplets,
+}
Expand description

Contains arguments of a call instruction and all other necessary information +required for calling a service.

+

Fields§

§service_id: String

Id of a service that should be called.

+
§function_name: String

Name of a function from service identified by service_id that should be called.

+
§arguments: SerializedCallArguments

Serialized to JSON string Vec of arguments that should be passed to a service.

+
§tetraplets: SerializedTetraplets

Serialized to JSON string Vec<Vec> that should be passed to a service.

+

Implementations§

source§

impl CallRequestParams

source

pub fn new( + service_id: String, + function_name: String, + arguments: SerializedCallArguments, + tetraplets: SerializedTetraplets, +) -> Self

Trait Implementations§

source§

impl Clone for CallRequestParams

source§

fn clone(&self) -> CallRequestParams

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for CallRequestParams

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'de> Deserialize<'de> for CallRequestParams

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl PartialEq for CallRequestParams

source§

fn eq(&self, other: &CallRequestParams) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl Serialize for CallRequestParams

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Eq for CallRequestParams

source§

impl StructuralPartialEq for CallRequestParams

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_interpreter_interface/struct.CallRequestsRepr.html b/air_interpreter_interface/struct.CallRequestsRepr.html new file mode 100644 index 00000000..5f28f137 --- /dev/null +++ b/air_interpreter_interface/struct.CallRequestsRepr.html @@ -0,0 +1,29 @@ +CallRequestsRepr in air_interpreter_interface - Rust

Struct air_interpreter_interface::CallRequestsRepr

source ·
pub struct CallRequestsRepr;

Trait Implementations§

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/air_interpreter_interface/struct.CallResultsRepr.html b/air_interpreter_interface/struct.CallResultsRepr.html new file mode 100644 index 00000000..3f537e47 --- /dev/null +++ b/air_interpreter_interface/struct.CallResultsRepr.html @@ -0,0 +1,29 @@ +CallResultsRepr in air_interpreter_interface - Rust

Struct air_interpreter_interface::CallResultsRepr

source ·
pub struct CallResultsRepr;

Trait Implementations§

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/air_interpreter_interface/struct.CallServiceResult.html b/air_interpreter_interface/struct.CallServiceResult.html new file mode 100644 index 00000000..a3df7d88 --- /dev/null +++ b/air_interpreter_interface/struct.CallServiceResult.html @@ -0,0 +1,32 @@ +CallServiceResult in air_interpreter_interface - Rust

Struct air_interpreter_interface::CallServiceResult

source ·
pub struct CallServiceResult {
+    pub ret_code: i32,
+    pub result: String,
+}
Expand description

Represents an executed host function result.

+

Fields§

§ret_code: i32

A error code service or builtin returned, where CALL_SERVICE_SUCCESS represents success.

+
§result: String

Resulted JValue serialized to a string. It’s impossible to wrap it with the marine macro, +inasmuch as it’s a enum uses HashMap inside.

+

Implementations§

source§

impl CallServiceResult

source

pub fn ok(result: &JValue) -> Self

source

pub fn err(err_code: i32, result: &JValue) -> Self

Trait Implementations§

source§

impl Clone for CallServiceResult

source§

fn clone(&self) -> CallServiceResult

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for CallServiceResult

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Default for CallServiceResult

source§

fn default() -> CallServiceResult

Returns the “default value” for a type. Read more
source§

impl<'de> Deserialize<'de> for CallServiceResult

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl Display for CallServiceResult

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Serialize for CallServiceResult

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_interpreter_interface/struct.InterpreterOutcome.html b/air_interpreter_interface/struct.InterpreterOutcome.html new file mode 100644 index 00000000..c948c790 --- /dev/null +++ b/air_interpreter_interface/struct.InterpreterOutcome.html @@ -0,0 +1,52 @@ +InterpreterOutcome in air_interpreter_interface - Rust
pub struct InterpreterOutcome {
+    pub ret_code: i64,
+    pub error_message: String,
+    pub data: Vec<u8>,
+    pub next_peer_pks: Vec<String>,
+    pub call_requests: Vec<u8>,
+    pub air_size_limit_exceeded: bool,
+    pub particle_size_limit_exceeded: bool,
+    pub call_result_size_limit_exceeded: bool,
+}
Expand description

Describes a result returned at the end of the interpreter execution_step.

+

Fields§

§ret_code: i64

A return code, where INTERPRETER_SUCCESS means success.

+
§error_message: String

Contains error message if ret_code != INTERPRETER_SUCCESS.

+
§data: Vec<u8>

Contains script data that should be preserved in an executor of this interpreter +regardless of ret_code value.

+
§next_peer_pks: Vec<String>

Public keys of peers that should receive data.

+
§call_requests: Vec<u8>

Collected parameters of all met call instructions that could be executed on a current peer.

+
§air_size_limit_exceeded: bool

This flag signals that AIR script size exceeds the limit.

+
§particle_size_limit_exceeded: bool

This flag signals that particle data size exceeds the limit.

+
§call_result_size_limit_exceeded: bool

This flag signals that call result size exceeds the limit.

+

Implementations§

source§

impl InterpreterOutcome

source

pub fn new( + ret_code: i64, + error_message: String, + data: Vec<u8>, + next_peer_pks: Vec<String>, + call_requests: SerializedCallRequests, + soft_limits_triggering: SoftLimitsTriggering, +) -> Self

source§

impl InterpreterOutcome

source

pub fn from_ivalue(ivalue: IValue) -> Result<Self, String>

Trait Implementations§

source§

impl Clone for InterpreterOutcome

source§

fn clone(&self) -> InterpreterOutcome

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for InterpreterOutcome

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'de> Deserialize<'de> for InterpreterOutcome

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl PartialEq for InterpreterOutcome

source§

fn eq(&self, other: &InterpreterOutcome) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl Serialize for InterpreterOutcome

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Eq for InterpreterOutcome

source§

impl StructuralPartialEq for InterpreterOutcome

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_interpreter_interface/struct.RunParameters.html b/air_interpreter_interface/struct.RunParameters.html new file mode 100644 index 00000000..2342eae2 --- /dev/null +++ b/air_interpreter_interface/struct.RunParameters.html @@ -0,0 +1,66 @@ +RunParameters in air_interpreter_interface - Rust

Struct air_interpreter_interface::RunParameters

source ·
pub struct RunParameters {
+    pub init_peer_id: String,
+    pub current_peer_id: String,
+    pub timestamp: u64,
+    pub ttl: u32,
+    pub key_format: u8,
+    pub secret_key_bytes: Vec<u8>,
+    pub particle_id: String,
+    pub air_size_limit: u64,
+    pub particle_size_limit: u64,
+    pub call_result_size_limit: u64,
+    pub hard_limit_enabled: bool,
+}
Expand description

Parameters that a host side should pass to an interpreter and that necessary for execution.

+

Fields§

§init_peer_id: String

Peer id of a peer that start this particle.

+
§current_peer_id: String

Peer id of a current peer.

+
§timestamp: u64

Unix timestamp from a particle in milliseconds. +It represents time when this particle was sent from the init peer id.

+
§ttl: u32

TTL set by init peer id in milliseconds.

+
§key_format: u8

A key format.

+

This value is the result of fluence_keypair::KeyType::into.

+
§secret_key_bytes: Vec<u8>

A secret key material.

+

The value is the result fluence_keypair::KeyPair::secret, for compatibility +with JS client who can only serialize to secret key, not to keypair.

+
§particle_id: String

Unique particle ID.

+
§air_size_limit: u64

The AIR script size limit.

+
§particle_size_limit: u64

The particle data size limit.

+
§call_result_size_limit: u64

This is the limit for the size of service call result.

+
§hard_limit_enabled: bool

This knob controls hard RAM limits behavior for AVMRunner.

+

Implementations§

source§

impl RunParameters

source

pub fn new( + init_peer_id: String, + current_peer_id: String, + timestamp: u64, + ttl: u32, + key_format: u8, + secret_key_bytes: Vec<u8>, + particle_id: String, + air_size_limit: u64, + particle_size_limit: u64, + call_result_size_limit: u64, + hard_limit_enabled: bool, +) -> Self

source

pub fn into_ivalue(self) -> IValue

Trait Implementations§

source§

impl Clone for RunParameters

source§

fn clone(&self) -> RunParameters

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for RunParameters

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'de> Deserialize<'de> for RunParameters

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl PartialEq for RunParameters

source§

fn eq(&self, other: &RunParameters) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl Serialize for RunParameters

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Eq for RunParameters

source§

impl StructuralPartialEq for RunParameters

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_interpreter_interface/struct.SerializedCallArguments.html b/air_interpreter_interface/struct.SerializedCallArguments.html new file mode 100644 index 00000000..a8817491 --- /dev/null +++ b/air_interpreter_interface/struct.SerializedCallArguments.html @@ -0,0 +1,1116 @@ +SerializedCallArguments in air_interpreter_interface - Rust
pub struct SerializedCallArguments { /* private fields */ }

Methods from Deref<Target = [u8]>§

1.80.0 · source

pub fn as_flattened(&self) -> &[T]

Takes a &[[T; N]], and flattens it to a &[T].

+
§Panics
+

This panics if the length of the resulting slice would overflow a usize.

+

This is only possible when flattening a slice of arrays of zero-sized +types, and thus tends to be irrelevant in practice. If +size_of::<T>() > 0, this will never panic.

+
§Examples
+
assert_eq!([[1, 2, 3], [4, 5, 6]].as_flattened(), &[1, 2, 3, 4, 5, 6]);
+
+assert_eq!(
+    [[1, 2, 3], [4, 5, 6]].as_flattened(),
+    [[1, 2], [3, 4], [5, 6]].as_flattened(),
+);
+
+let slice_of_empty_arrays: &[[i32; 0]] = &[[], [], [], [], []];
+assert!(slice_of_empty_arrays.as_flattened().is_empty());
+
+let empty_slice_of_arrays: &[[u32; 10]] = &[];
+assert!(empty_slice_of_arrays.as_flattened().is_empty());
+
source

pub fn as_str(&self) -> &str

🔬This is a nightly-only experimental API. (ascii_char)

Views this slice of ASCII characters as a UTF-8 str.

+
source

pub fn as_bytes(&self) -> &[u8]

🔬This is a nightly-only experimental API. (ascii_char)

Views this slice of ASCII characters as a slice of u8 bytes.

+
1.79.0 · source

pub fn utf8_chunks(&self) -> Utf8Chunks<'_>

Creates an iterator over the contiguous valid UTF-8 ranges of this +slice, and the non-UTF-8 fragments in between.

+
§Examples
+

This function formats arbitrary but mostly-UTF-8 bytes into Rust source +code in the form of a C-string literal (c"...").

+ +
use std::fmt::Write as _;
+
+pub fn cstr_literal(bytes: &[u8]) -> String {
+    let mut repr = String::new();
+    repr.push_str("c\"");
+    for chunk in bytes.utf8_chunks() {
+        for ch in chunk.valid().chars() {
+            // Escapes \0, \t, \r, \n, \\, \', \", and uses \u{...} for non-printable characters.
+            write!(repr, "{}", ch.escape_debug()).unwrap();
+        }
+        for byte in chunk.invalid() {
+            write!(repr, "\\x{:02X}", byte).unwrap();
+        }
+    }
+    repr.push('"');
+    repr
+}
+
+fn main() {
+    let lit = cstr_literal(b"\xferris the \xf0\x9f\xa6\x80\x07");
+    let expected = stringify!(c"\xFErris the 🦀\u{7}");
+    assert_eq!(lit, expected);
+}
+
1.23.0 · source

pub fn is_ascii(&self) -> bool

Checks if all bytes in this slice are within the ASCII range.

+
source

pub fn as_ascii(&self) -> Option<&[AsciiChar]>

🔬This is a nightly-only experimental API. (ascii_char)

If this slice is_ascii, returns it as a slice of +ASCII characters, otherwise returns None.

+
source

pub unsafe fn as_ascii_unchecked(&self) -> &[AsciiChar]

🔬This is a nightly-only experimental API. (ascii_char)

Converts this slice of bytes into a slice of ASCII characters, +without checking whether they’re valid.

+
§Safety
+

Every byte in the slice must be in 0..=127, or else this is UB.

+
1.23.0 · source

pub fn eq_ignore_ascii_case(&self, other: &[u8]) -> bool

Checks that two slices are an ASCII case-insensitive match.

+

Same as to_ascii_lowercase(a) == to_ascii_lowercase(b), +but without allocating and copying temporaries.

+
1.60.0 · source

pub fn escape_ascii(&self) -> EscapeAscii<'_>

Returns an iterator that produces an escaped version of this slice, +treating it as an ASCII string.

+
§Examples
+

+let s = b"0\t\r\n'\"\\\x9d";
+let escaped = s.escape_ascii().to_string();
+assert_eq!(escaped, "0\\t\\r\\n\\'\\\"\\\\\\x9d");
+
1.80.0 · source

pub fn trim_ascii_start(&self) -> &[u8]

Returns a byte slice with leading ASCII whitespace bytes removed.

+

‘Whitespace’ refers to the definition used by +u8::is_ascii_whitespace.

+
§Examples
+
assert_eq!(b" \t hello world\n".trim_ascii_start(), b"hello world\n");
+assert_eq!(b"  ".trim_ascii_start(), b"");
+assert_eq!(b"".trim_ascii_start(), b"");
+
1.80.0 · source

pub fn trim_ascii_end(&self) -> &[u8]

Returns a byte slice with trailing ASCII whitespace bytes removed.

+

‘Whitespace’ refers to the definition used by +u8::is_ascii_whitespace.

+
§Examples
+
assert_eq!(b"\r hello world\n ".trim_ascii_end(), b"\r hello world");
+assert_eq!(b"  ".trim_ascii_end(), b"");
+assert_eq!(b"".trim_ascii_end(), b"");
+
1.80.0 · source

pub fn trim_ascii(&self) -> &[u8]

Returns a byte slice with leading and trailing ASCII whitespace bytes +removed.

+

‘Whitespace’ refers to the definition used by +u8::is_ascii_whitespace.

+
§Examples
+
assert_eq!(b"\r hello world\n ".trim_ascii(), b"hello world");
+assert_eq!(b"  ".trim_ascii(), b"");
+assert_eq!(b"".trim_ascii(), b"");
+
1.0.0 · source

pub fn len(&self) -> usize

Returns the number of elements in the slice.

+
§Examples
+
let a = [1, 2, 3];
+assert_eq!(a.len(), 3);
+
1.0.0 · source

pub fn is_empty(&self) -> bool

Returns true if the slice has a length of 0.

+
§Examples
+
let a = [1, 2, 3];
+assert!(!a.is_empty());
+
+let b: &[i32] = &[];
+assert!(b.is_empty());
+
1.0.0 · source

pub fn first(&self) -> Option<&T>

Returns the first element of the slice, or None if it is empty.

+
§Examples
+
let v = [10, 40, 30];
+assert_eq!(Some(&10), v.first());
+
+let w: &[i32] = &[];
+assert_eq!(None, w.first());
+
1.5.0 · source

pub fn split_first(&self) -> Option<(&T, &[T])>

Returns the first and all the rest of the elements of the slice, or None if it is empty.

+
§Examples
+
let x = &[0, 1, 2];
+
+if let Some((first, elements)) = x.split_first() {
+    assert_eq!(first, &0);
+    assert_eq!(elements, &[1, 2]);
+}
+
1.5.0 · source

pub fn split_last(&self) -> Option<(&T, &[T])>

Returns the last and all the rest of the elements of the slice, or None if it is empty.

+
§Examples
+
let x = &[0, 1, 2];
+
+if let Some((last, elements)) = x.split_last() {
+    assert_eq!(last, &2);
+    assert_eq!(elements, &[0, 1]);
+}
+
1.0.0 · source

pub fn last(&self) -> Option<&T>

Returns the last element of the slice, or None if it is empty.

+
§Examples
+
let v = [10, 40, 30];
+assert_eq!(Some(&30), v.last());
+
+let w: &[i32] = &[];
+assert_eq!(None, w.last());
+
1.77.0 · source

pub fn first_chunk<const N: usize>(&self) -> Option<&[T; N]>

Return an array reference to the first N items in the slice.

+

If the slice is not at least N in length, this will return None.

+
§Examples
+
let u = [10, 40, 30];
+assert_eq!(Some(&[10, 40]), u.first_chunk::<2>());
+
+let v: &[i32] = &[10];
+assert_eq!(None, v.first_chunk::<2>());
+
+let w: &[i32] = &[];
+assert_eq!(Some(&[]), w.first_chunk::<0>());
+
1.77.0 · source

pub fn split_first_chunk<const N: usize>(&self) -> Option<(&[T; N], &[T])>

Return an array reference to the first N items in the slice and the remaining slice.

+

If the slice is not at least N in length, this will return None.

+
§Examples
+
let x = &[0, 1, 2];
+
+if let Some((first, elements)) = x.split_first_chunk::<2>() {
+    assert_eq!(first, &[0, 1]);
+    assert_eq!(elements, &[2]);
+}
+
+assert_eq!(None, x.split_first_chunk::<4>());
+
1.77.0 · source

pub fn split_last_chunk<const N: usize>(&self) -> Option<(&[T], &[T; N])>

Return an array reference to the last N items in the slice and the remaining slice.

+

If the slice is not at least N in length, this will return None.

+
§Examples
+
let x = &[0, 1, 2];
+
+if let Some((elements, last)) = x.split_last_chunk::<2>() {
+    assert_eq!(elements, &[0]);
+    assert_eq!(last, &[1, 2]);
+}
+
+assert_eq!(None, x.split_last_chunk::<4>());
+
1.77.0 · source

pub fn last_chunk<const N: usize>(&self) -> Option<&[T; N]>

Return an array reference to the last N items in the slice.

+

If the slice is not at least N in length, this will return None.

+
§Examples
+
let u = [10, 40, 30];
+assert_eq!(Some(&[40, 30]), u.last_chunk::<2>());
+
+let v: &[i32] = &[10];
+assert_eq!(None, v.last_chunk::<2>());
+
+let w: &[i32] = &[];
+assert_eq!(Some(&[]), w.last_chunk::<0>());
+
1.0.0 · source

pub fn get<I>(&self, index: I) -> Option<&<I as SliceIndex<[T]>>::Output>
where + I: SliceIndex<[T]>,

Returns a reference to an element or subslice depending on the type of +index.

+
    +
  • If given a position, returns a reference to the element at that +position or None if out of bounds.
  • +
  • If given a range, returns the subslice corresponding to that range, +or None if out of bounds.
  • +
+
§Examples
+
let v = [10, 40, 30];
+assert_eq!(Some(&40), v.get(1));
+assert_eq!(Some(&[10, 40][..]), v.get(0..2));
+assert_eq!(None, v.get(3));
+assert_eq!(None, v.get(0..4));
+
1.0.0 · source

pub unsafe fn get_unchecked<I>( + &self, + index: I, +) -> &<I as SliceIndex<[T]>>::Output
where + I: SliceIndex<[T]>,

Returns a reference to an element or subslice, without doing bounds +checking.

+

For a safe alternative see get.

+
§Safety
+

Calling this method with an out-of-bounds index is undefined behavior +even if the resulting reference is not used.

+

You can think of this like .get(index).unwrap_unchecked(). It’s UB +to call .get_unchecked(len), even if you immediately convert to a +pointer. And it’s UB to call .get_unchecked(..len + 1), +.get_unchecked(..=len), or similar.

+
§Examples
+
let x = &[1, 2, 4];
+
+unsafe {
+    assert_eq!(x.get_unchecked(1), &2);
+}
+
1.0.0 · source

pub fn as_ptr(&self) -> *const T

Returns a raw pointer to the slice’s buffer.

+

The caller must ensure that the slice outlives the pointer this +function returns, or else it will end up pointing to garbage.

+

The caller must also ensure that the memory the pointer (non-transitively) points to +is never written to (except inside an UnsafeCell) using this pointer or any pointer +derived from it. If you need to mutate the contents of the slice, use as_mut_ptr.

+

Modifying the container referenced by this slice may cause its buffer +to be reallocated, which would also make any pointers to it invalid.

+
§Examples
+
let x = &[1, 2, 4];
+let x_ptr = x.as_ptr();
+
+unsafe {
+    for i in 0..x.len() {
+        assert_eq!(x.get_unchecked(i), &*x_ptr.add(i));
+    }
+}
+
1.48.0 · source

pub fn as_ptr_range(&self) -> Range<*const T>

Returns the two raw pointers spanning the slice.

+

The returned range is half-open, which means that the end pointer +points one past the last element of the slice. This way, an empty +slice is represented by two equal pointers, and the difference between +the two pointers represents the size of the slice.

+

See as_ptr for warnings on using these pointers. The end pointer +requires extra caution, as it does not point to a valid element in the +slice.

+

This function is useful for interacting with foreign interfaces which +use two pointers to refer to a range of elements in memory, as is +common in C++.

+

It can also be useful to check if a pointer to an element refers to an +element of this slice:

+ +
let a = [1, 2, 3];
+let x = &a[1] as *const _;
+let y = &5 as *const _;
+
+assert!(a.as_ptr_range().contains(&x));
+assert!(!a.as_ptr_range().contains(&y));
+
1.0.0 · source

pub fn iter(&self) -> Iter<'_, T>

Returns an iterator over the slice.

+

The iterator yields all items from start to end.

+
§Examples
+
let x = &[1, 2, 4];
+let mut iterator = x.iter();
+
+assert_eq!(iterator.next(), Some(&1));
+assert_eq!(iterator.next(), Some(&2));
+assert_eq!(iterator.next(), Some(&4));
+assert_eq!(iterator.next(), None);
+
1.0.0 · source

pub fn windows(&self, size: usize) -> Windows<'_, T>

Returns an iterator over all contiguous windows of length +size. The windows overlap. If the slice is shorter than +size, the iterator returns no values.

+
§Panics
+

Panics if size is 0.

+
§Examples
+
let slice = ['l', 'o', 'r', 'e', 'm'];
+let mut iter = slice.windows(3);
+assert_eq!(iter.next().unwrap(), &['l', 'o', 'r']);
+assert_eq!(iter.next().unwrap(), &['o', 'r', 'e']);
+assert_eq!(iter.next().unwrap(), &['r', 'e', 'm']);
+assert!(iter.next().is_none());
+

If the slice is shorter than size:

+ +
let slice = ['f', 'o', 'o'];
+let mut iter = slice.windows(4);
+assert!(iter.next().is_none());
+

There’s no windows_mut, as that existing would let safe code violate the +“only one &mut at a time to the same thing” rule. However, you can sometimes +use Cell::as_slice_of_cells in +conjunction with windows to accomplish something similar:

+ +
use std::cell::Cell;
+
+let mut array = ['R', 'u', 's', 't', ' ', '2', '0', '1', '5'];
+let slice = &mut array[..];
+let slice_of_cells: &[Cell<char>] = Cell::from_mut(slice).as_slice_of_cells();
+for w in slice_of_cells.windows(3) {
+    Cell::swap(&w[0], &w[2]);
+}
+assert_eq!(array, ['s', 't', ' ', '2', '0', '1', '5', 'u', 'R']);
+
1.0.0 · source

pub fn chunks(&self, chunk_size: usize) -> Chunks<'_, T>

Returns an iterator over chunk_size elements of the slice at a time, starting at the +beginning of the slice.

+

The chunks are slices and do not overlap. If chunk_size does not divide the length of the +slice, then the last chunk will not have length chunk_size.

+

See chunks_exact for a variant of this iterator that returns chunks of always exactly +chunk_size elements, and rchunks for the same iterator but starting at the end of the +slice.

+
§Panics
+

Panics if chunk_size is 0.

+
§Examples
+
let slice = ['l', 'o', 'r', 'e', 'm'];
+let mut iter = slice.chunks(2);
+assert_eq!(iter.next().unwrap(), &['l', 'o']);
+assert_eq!(iter.next().unwrap(), &['r', 'e']);
+assert_eq!(iter.next().unwrap(), &['m']);
+assert!(iter.next().is_none());
+
1.31.0 · source

pub fn chunks_exact(&self, chunk_size: usize) -> ChunksExact<'_, T>

Returns an iterator over chunk_size elements of the slice at a time, starting at the +beginning of the slice.

+

The chunks are slices and do not overlap. If chunk_size does not divide the length of the +slice, then the last up to chunk_size-1 elements will be omitted and can be retrieved +from the remainder function of the iterator.

+

Due to each chunk having exactly chunk_size elements, the compiler can often optimize the +resulting code better than in the case of chunks.

+

See chunks for a variant of this iterator that also returns the remainder as a smaller +chunk, and rchunks_exact for the same iterator but starting at the end of the slice.

+
§Panics
+

Panics if chunk_size is 0.

+
§Examples
+
let slice = ['l', 'o', 'r', 'e', 'm'];
+let mut iter = slice.chunks_exact(2);
+assert_eq!(iter.next().unwrap(), &['l', 'o']);
+assert_eq!(iter.next().unwrap(), &['r', 'e']);
+assert!(iter.next().is_none());
+assert_eq!(iter.remainder(), &['m']);
+
source

pub unsafe fn as_chunks_unchecked<const N: usize>(&self) -> &[[T; N]]

🔬This is a nightly-only experimental API. (slice_as_chunks)

Splits the slice into a slice of N-element arrays, +assuming that there’s no remainder.

+
§Safety
+

This may only be called when

+
    +
  • The slice splits exactly into N-element chunks (aka self.len() % N == 0).
  • +
  • N != 0.
  • +
+
§Examples
+
#![feature(slice_as_chunks)]
+let slice: &[char] = &['l', 'o', 'r', 'e', 'm', '!'];
+let chunks: &[[char; 1]] =
+    // SAFETY: 1-element chunks never have remainder
+    unsafe { slice.as_chunks_unchecked() };
+assert_eq!(chunks, &[['l'], ['o'], ['r'], ['e'], ['m'], ['!']]);
+let chunks: &[[char; 3]] =
+    // SAFETY: The slice length (6) is a multiple of 3
+    unsafe { slice.as_chunks_unchecked() };
+assert_eq!(chunks, &[['l', 'o', 'r'], ['e', 'm', '!']]);
+
+// These would be unsound:
+// let chunks: &[[_; 5]] = slice.as_chunks_unchecked() // The slice length is not a multiple of 5
+// let chunks: &[[_; 0]] = slice.as_chunks_unchecked() // Zero-length chunks are never allowed
+
source

pub fn as_chunks<const N: usize>(&self) -> (&[[T; N]], &[T])

🔬This is a nightly-only experimental API. (slice_as_chunks)

Splits the slice into a slice of N-element arrays, +starting at the beginning of the slice, +and a remainder slice with length strictly less than N.

+
§Panics
+

Panics if N is 0. This check will most probably get changed to a compile time +error before this method gets stabilized.

+
§Examples
+
#![feature(slice_as_chunks)]
+let slice = ['l', 'o', 'r', 'e', 'm'];
+let (chunks, remainder) = slice.as_chunks();
+assert_eq!(chunks, &[['l', 'o'], ['r', 'e']]);
+assert_eq!(remainder, &['m']);
+

If you expect the slice to be an exact multiple, you can combine +let-else with an empty slice pattern:

+ +
#![feature(slice_as_chunks)]
+let slice = ['R', 'u', 's', 't'];
+let (chunks, []) = slice.as_chunks::<2>() else {
+    panic!("slice didn't have even length")
+};
+assert_eq!(chunks, &[['R', 'u'], ['s', 't']]);
+
source

pub fn as_rchunks<const N: usize>(&self) -> (&[T], &[[T; N]])

🔬This is a nightly-only experimental API. (slice_as_chunks)

Splits the slice into a slice of N-element arrays, +starting at the end of the slice, +and a remainder slice with length strictly less than N.

+
§Panics
+

Panics if N is 0. This check will most probably get changed to a compile time +error before this method gets stabilized.

+
§Examples
+
#![feature(slice_as_chunks)]
+let slice = ['l', 'o', 'r', 'e', 'm'];
+let (remainder, chunks) = slice.as_rchunks();
+assert_eq!(remainder, &['l']);
+assert_eq!(chunks, &[['o', 'r'], ['e', 'm']]);
+
source

pub fn array_chunks<const N: usize>(&self) -> ArrayChunks<'_, T, N>

🔬This is a nightly-only experimental API. (array_chunks)

Returns an iterator over N elements of the slice at a time, starting at the +beginning of the slice.

+

The chunks are array references and do not overlap. If N does not divide the +length of the slice, then the last up to N-1 elements will be omitted and can be +retrieved from the remainder function of the iterator.

+

This method is the const generic equivalent of chunks_exact.

+
§Panics
+

Panics if N is 0. This check will most probably get changed to a compile time +error before this method gets stabilized.

+
§Examples
+
#![feature(array_chunks)]
+let slice = ['l', 'o', 'r', 'e', 'm'];
+let mut iter = slice.array_chunks();
+assert_eq!(iter.next().unwrap(), &['l', 'o']);
+assert_eq!(iter.next().unwrap(), &['r', 'e']);
+assert!(iter.next().is_none());
+assert_eq!(iter.remainder(), &['m']);
+
source

pub fn array_windows<const N: usize>(&self) -> ArrayWindows<'_, T, N>

🔬This is a nightly-only experimental API. (array_windows)

Returns an iterator over overlapping windows of N elements of a slice, +starting at the beginning of the slice.

+

This is the const generic equivalent of windows.

+

If N is greater than the size of the slice, it will return no windows.

+
§Panics
+

Panics if N is 0. This check will most probably get changed to a compile time +error before this method gets stabilized.

+
§Examples
+
#![feature(array_windows)]
+let slice = [0, 1, 2, 3];
+let mut iter = slice.array_windows();
+assert_eq!(iter.next().unwrap(), &[0, 1]);
+assert_eq!(iter.next().unwrap(), &[1, 2]);
+assert_eq!(iter.next().unwrap(), &[2, 3]);
+assert!(iter.next().is_none());
+
1.31.0 · source

pub fn rchunks(&self, chunk_size: usize) -> RChunks<'_, T>

Returns an iterator over chunk_size elements of the slice at a time, starting at the end +of the slice.

+

The chunks are slices and do not overlap. If chunk_size does not divide the length of the +slice, then the last chunk will not have length chunk_size.

+

See rchunks_exact for a variant of this iterator that returns chunks of always exactly +chunk_size elements, and chunks for the same iterator but starting at the beginning +of the slice.

+
§Panics
+

Panics if chunk_size is 0.

+
§Examples
+
let slice = ['l', 'o', 'r', 'e', 'm'];
+let mut iter = slice.rchunks(2);
+assert_eq!(iter.next().unwrap(), &['e', 'm']);
+assert_eq!(iter.next().unwrap(), &['o', 'r']);
+assert_eq!(iter.next().unwrap(), &['l']);
+assert!(iter.next().is_none());
+
1.31.0 · source

pub fn rchunks_exact(&self, chunk_size: usize) -> RChunksExact<'_, T>

Returns an iterator over chunk_size elements of the slice at a time, starting at the +end of the slice.

+

The chunks are slices and do not overlap. If chunk_size does not divide the length of the +slice, then the last up to chunk_size-1 elements will be omitted and can be retrieved +from the remainder function of the iterator.

+

Due to each chunk having exactly chunk_size elements, the compiler can often optimize the +resulting code better than in the case of rchunks.

+

See rchunks for a variant of this iterator that also returns the remainder as a smaller +chunk, and chunks_exact for the same iterator but starting at the beginning of the +slice.

+
§Panics
+

Panics if chunk_size is 0.

+
§Examples
+
let slice = ['l', 'o', 'r', 'e', 'm'];
+let mut iter = slice.rchunks_exact(2);
+assert_eq!(iter.next().unwrap(), &['e', 'm']);
+assert_eq!(iter.next().unwrap(), &['o', 'r']);
+assert!(iter.next().is_none());
+assert_eq!(iter.remainder(), &['l']);
+
1.77.0 · source

pub fn chunk_by<F>(&self, pred: F) -> ChunkBy<'_, T, F>
where + F: FnMut(&T, &T) -> bool,

Returns an iterator over the slice producing non-overlapping runs +of elements using the predicate to separate them.

+

The predicate is called for every pair of consecutive elements, +meaning that it is called on slice[0] and slice[1], +followed by slice[1] and slice[2], and so on.

+
§Examples
+
let slice = &[1, 1, 1, 3, 3, 2, 2, 2];
+
+let mut iter = slice.chunk_by(|a, b| a == b);
+
+assert_eq!(iter.next(), Some(&[1, 1, 1][..]));
+assert_eq!(iter.next(), Some(&[3, 3][..]));
+assert_eq!(iter.next(), Some(&[2, 2, 2][..]));
+assert_eq!(iter.next(), None);
+

This method can be used to extract the sorted subslices:

+ +
let slice = &[1, 1, 2, 3, 2, 3, 2, 3, 4];
+
+let mut iter = slice.chunk_by(|a, b| a <= b);
+
+assert_eq!(iter.next(), Some(&[1, 1, 2, 3][..]));
+assert_eq!(iter.next(), Some(&[2, 3][..]));
+assert_eq!(iter.next(), Some(&[2, 3, 4][..]));
+assert_eq!(iter.next(), None);
+
1.0.0 · source

pub fn split_at(&self, mid: usize) -> (&[T], &[T])

Divides one slice into two at an index.

+

The first will contain all indices from [0, mid) (excluding +the index mid itself) and the second will contain all +indices from [mid, len) (excluding the index len itself).

+
§Panics
+

Panics if mid > len. For a non-panicking alternative see +split_at_checked.

+
§Examples
+
let v = [1, 2, 3, 4, 5, 6];
+
+{
+   let (left, right) = v.split_at(0);
+   assert_eq!(left, []);
+   assert_eq!(right, [1, 2, 3, 4, 5, 6]);
+}
+
+{
+    let (left, right) = v.split_at(2);
+    assert_eq!(left, [1, 2]);
+    assert_eq!(right, [3, 4, 5, 6]);
+}
+
+{
+    let (left, right) = v.split_at(6);
+    assert_eq!(left, [1, 2, 3, 4, 5, 6]);
+    assert_eq!(right, []);
+}
+
1.79.0 · source

pub unsafe fn split_at_unchecked(&self, mid: usize) -> (&[T], &[T])

Divides one slice into two at an index, without doing bounds checking.

+

The first will contain all indices from [0, mid) (excluding +the index mid itself) and the second will contain all +indices from [mid, len) (excluding the index len itself).

+

For a safe alternative see split_at.

+
§Safety
+

Calling this method with an out-of-bounds index is undefined behavior +even if the resulting reference is not used. The caller has to ensure that +0 <= mid <= self.len().

+
§Examples
+
let v = [1, 2, 3, 4, 5, 6];
+
+unsafe {
+   let (left, right) = v.split_at_unchecked(0);
+   assert_eq!(left, []);
+   assert_eq!(right, [1, 2, 3, 4, 5, 6]);
+}
+
+unsafe {
+    let (left, right) = v.split_at_unchecked(2);
+    assert_eq!(left, [1, 2]);
+    assert_eq!(right, [3, 4, 5, 6]);
+}
+
+unsafe {
+    let (left, right) = v.split_at_unchecked(6);
+    assert_eq!(left, [1, 2, 3, 4, 5, 6]);
+    assert_eq!(right, []);
+}
+
1.80.0 · source

pub fn split_at_checked(&self, mid: usize) -> Option<(&[T], &[T])>

Divides one slice into two at an index, returning None if the slice is +too short.

+

If mid ≤ len returns a pair of slices where the first will contain all +indices from [0, mid) (excluding the index mid itself) and the +second will contain all indices from [mid, len) (excluding the index +len itself).

+

Otherwise, if mid > len, returns None.

+
§Examples
+
let v = [1, -2, 3, -4, 5, -6];
+
+{
+   let (left, right) = v.split_at_checked(0).unwrap();
+   assert_eq!(left, []);
+   assert_eq!(right, [1, -2, 3, -4, 5, -6]);
+}
+
+{
+    let (left, right) = v.split_at_checked(2).unwrap();
+    assert_eq!(left, [1, -2]);
+    assert_eq!(right, [3, -4, 5, -6]);
+}
+
+{
+    let (left, right) = v.split_at_checked(6).unwrap();
+    assert_eq!(left, [1, -2, 3, -4, 5, -6]);
+    assert_eq!(right, []);
+}
+
+assert_eq!(None, v.split_at_checked(7));
+
1.0.0 · source

pub fn split<F>(&self, pred: F) -> Split<'_, T, F>
where + F: FnMut(&T) -> bool,

Returns an iterator over subslices separated by elements that match +pred. The matched element is not contained in the subslices.

+
§Examples
+
let slice = [10, 40, 33, 20];
+let mut iter = slice.split(|num| num % 3 == 0);
+
+assert_eq!(iter.next().unwrap(), &[10, 40]);
+assert_eq!(iter.next().unwrap(), &[20]);
+assert!(iter.next().is_none());
+

If the first element is matched, an empty slice will be the first item +returned by the iterator. Similarly, if the last element in the slice +is matched, an empty slice will be the last item returned by the +iterator:

+ +
let slice = [10, 40, 33];
+let mut iter = slice.split(|num| num % 3 == 0);
+
+assert_eq!(iter.next().unwrap(), &[10, 40]);
+assert_eq!(iter.next().unwrap(), &[]);
+assert!(iter.next().is_none());
+

If two matched elements are directly adjacent, an empty slice will be +present between them:

+ +
let slice = [10, 6, 33, 20];
+let mut iter = slice.split(|num| num % 3 == 0);
+
+assert_eq!(iter.next().unwrap(), &[10]);
+assert_eq!(iter.next().unwrap(), &[]);
+assert_eq!(iter.next().unwrap(), &[20]);
+assert!(iter.next().is_none());
+
1.51.0 · source

pub fn split_inclusive<F>(&self, pred: F) -> SplitInclusive<'_, T, F>
where + F: FnMut(&T) -> bool,

Returns an iterator over subslices separated by elements that match +pred. The matched element is contained in the end of the previous +subslice as a terminator.

+
§Examples
+
let slice = [10, 40, 33, 20];
+let mut iter = slice.split_inclusive(|num| num % 3 == 0);
+
+assert_eq!(iter.next().unwrap(), &[10, 40, 33]);
+assert_eq!(iter.next().unwrap(), &[20]);
+assert!(iter.next().is_none());
+

If the last element of the slice is matched, +that element will be considered the terminator of the preceding slice. +That slice will be the last item returned by the iterator.

+ +
let slice = [3, 10, 40, 33];
+let mut iter = slice.split_inclusive(|num| num % 3 == 0);
+
+assert_eq!(iter.next().unwrap(), &[3]);
+assert_eq!(iter.next().unwrap(), &[10, 40, 33]);
+assert!(iter.next().is_none());
+
1.27.0 · source

pub fn rsplit<F>(&self, pred: F) -> RSplit<'_, T, F>
where + F: FnMut(&T) -> bool,

Returns an iterator over subslices separated by elements that match +pred, starting at the end of the slice and working backwards. +The matched element is not contained in the subslices.

+
§Examples
+
let slice = [11, 22, 33, 0, 44, 55];
+let mut iter = slice.rsplit(|num| *num == 0);
+
+assert_eq!(iter.next().unwrap(), &[44, 55]);
+assert_eq!(iter.next().unwrap(), &[11, 22, 33]);
+assert_eq!(iter.next(), None);
+

As with split(), if the first or last element is matched, an empty +slice will be the first (or last) item returned by the iterator.

+ +
let v = &[0, 1, 1, 2, 3, 5, 8];
+let mut it = v.rsplit(|n| *n % 2 == 0);
+assert_eq!(it.next().unwrap(), &[]);
+assert_eq!(it.next().unwrap(), &[3, 5]);
+assert_eq!(it.next().unwrap(), &[1, 1]);
+assert_eq!(it.next().unwrap(), &[]);
+assert_eq!(it.next(), None);
+
1.0.0 · source

pub fn splitn<F>(&self, n: usize, pred: F) -> SplitN<'_, T, F>
where + F: FnMut(&T) -> bool,

Returns an iterator over subslices separated by elements that match +pred, limited to returning at most n items. The matched element is +not contained in the subslices.

+

The last element returned, if any, will contain the remainder of the +slice.

+
§Examples
+

Print the slice split once by numbers divisible by 3 (i.e., [10, 40], +[20, 60, 50]):

+ +
let v = [10, 40, 30, 20, 60, 50];
+
+for group in v.splitn(2, |num| *num % 3 == 0) {
+    println!("{group:?}");
+}
+
1.0.0 · source

pub fn rsplitn<F>(&self, n: usize, pred: F) -> RSplitN<'_, T, F>
where + F: FnMut(&T) -> bool,

Returns an iterator over subslices separated by elements that match +pred limited to returning at most n items. This starts at the end of +the slice and works backwards. The matched element is not contained in +the subslices.

+

The last element returned, if any, will contain the remainder of the +slice.

+
§Examples
+

Print the slice split once, starting from the end, by numbers divisible +by 3 (i.e., [50], [10, 40, 30, 20]):

+ +
let v = [10, 40, 30, 20, 60, 50];
+
+for group in v.rsplitn(2, |num| *num % 3 == 0) {
+    println!("{group:?}");
+}
+
source

pub fn split_once<F>(&self, pred: F) -> Option<(&[T], &[T])>
where + F: FnMut(&T) -> bool,

🔬This is a nightly-only experimental API. (slice_split_once)

Splits the slice on the first element that matches the specified +predicate.

+

If any matching elements are present in the slice, returns the prefix +before the match and suffix after. The matching element itself is not +included. If no elements match, returns None.

+
§Examples
+
#![feature(slice_split_once)]
+let s = [1, 2, 3, 2, 4];
+assert_eq!(s.split_once(|&x| x == 2), Some((
+    &[1][..],
+    &[3, 2, 4][..]
+)));
+assert_eq!(s.split_once(|&x| x == 0), None);
+
source

pub fn rsplit_once<F>(&self, pred: F) -> Option<(&[T], &[T])>
where + F: FnMut(&T) -> bool,

🔬This is a nightly-only experimental API. (slice_split_once)

Splits the slice on the last element that matches the specified +predicate.

+

If any matching elements are present in the slice, returns the prefix +before the match and suffix after. The matching element itself is not +included. If no elements match, returns None.

+
§Examples
+
#![feature(slice_split_once)]
+let s = [1, 2, 3, 2, 4];
+assert_eq!(s.rsplit_once(|&x| x == 2), Some((
+    &[1, 2, 3][..],
+    &[4][..]
+)));
+assert_eq!(s.rsplit_once(|&x| x == 0), None);
+
1.0.0 · source

pub fn contains(&self, x: &T) -> bool
where + T: PartialEq,

Returns true if the slice contains an element with the given value.

+

This operation is O(n).

+

Note that if you have a sorted slice, binary_search may be faster.

+
§Examples
+
let v = [10, 40, 30];
+assert!(v.contains(&30));
+assert!(!v.contains(&50));
+

If you do not have a &T, but some other value that you can compare +with one (for example, String implements PartialEq<str>), you can +use iter().any:

+ +
let v = [String::from("hello"), String::from("world")]; // slice of `String`
+assert!(v.iter().any(|e| e == "hello")); // search with `&str`
+assert!(!v.iter().any(|e| e == "hi"));
+
1.0.0 · source

pub fn starts_with(&self, needle: &[T]) -> bool
where + T: PartialEq,

Returns true if needle is a prefix of the slice or equal to the slice.

+
§Examples
+
let v = [10, 40, 30];
+assert!(v.starts_with(&[10]));
+assert!(v.starts_with(&[10, 40]));
+assert!(v.starts_with(&v));
+assert!(!v.starts_with(&[50]));
+assert!(!v.starts_with(&[10, 50]));
+

Always returns true if needle is an empty slice:

+ +
let v = &[10, 40, 30];
+assert!(v.starts_with(&[]));
+let v: &[u8] = &[];
+assert!(v.starts_with(&[]));
+
1.0.0 · source

pub fn ends_with(&self, needle: &[T]) -> bool
where + T: PartialEq,

Returns true if needle is a suffix of the slice or equal to the slice.

+
§Examples
+
let v = [10, 40, 30];
+assert!(v.ends_with(&[30]));
+assert!(v.ends_with(&[40, 30]));
+assert!(v.ends_with(&v));
+assert!(!v.ends_with(&[50]));
+assert!(!v.ends_with(&[50, 30]));
+

Always returns true if needle is an empty slice:

+ +
let v = &[10, 40, 30];
+assert!(v.ends_with(&[]));
+let v: &[u8] = &[];
+assert!(v.ends_with(&[]));
+
1.51.0 · source

pub fn strip_prefix<P>(&self, prefix: &P) -> Option<&[T]>
where + P: SlicePattern<Item = T> + ?Sized, + T: PartialEq,

Returns a subslice with the prefix removed.

+

If the slice starts with prefix, returns the subslice after the prefix, wrapped in Some. +If prefix is empty, simply returns the original slice. If prefix is equal to the +original slice, returns an empty slice.

+

If the slice does not start with prefix, returns None.

+
§Examples
+
let v = &[10, 40, 30];
+assert_eq!(v.strip_prefix(&[10]), Some(&[40, 30][..]));
+assert_eq!(v.strip_prefix(&[10, 40]), Some(&[30][..]));
+assert_eq!(v.strip_prefix(&[10, 40, 30]), Some(&[][..]));
+assert_eq!(v.strip_prefix(&[50]), None);
+assert_eq!(v.strip_prefix(&[10, 50]), None);
+
+let prefix : &str = "he";
+assert_eq!(b"hello".strip_prefix(prefix.as_bytes()),
+           Some(b"llo".as_ref()));
+
1.51.0 · source

pub fn strip_suffix<P>(&self, suffix: &P) -> Option<&[T]>
where + P: SlicePattern<Item = T> + ?Sized, + T: PartialEq,

Returns a subslice with the suffix removed.

+

If the slice ends with suffix, returns the subslice before the suffix, wrapped in Some. +If suffix is empty, simply returns the original slice. If suffix is equal to the +original slice, returns an empty slice.

+

If the slice does not end with suffix, returns None.

+
§Examples
+
let v = &[10, 40, 30];
+assert_eq!(v.strip_suffix(&[30]), Some(&[10, 40][..]));
+assert_eq!(v.strip_suffix(&[40, 30]), Some(&[10][..]));
+assert_eq!(v.strip_suffix(&[10, 40, 30]), Some(&[][..]));
+assert_eq!(v.strip_suffix(&[50]), None);
+assert_eq!(v.strip_suffix(&[50, 30]), None);
+

Binary searches this slice for a given element. +If the slice is not sorted, the returned result is unspecified and +meaningless.

+

If the value is found then Result::Ok is returned, containing the +index of the matching element. If there are multiple matches, then any +one of the matches could be returned. The index is chosen +deterministically, but is subject to change in future versions of Rust. +If the value is not found then Result::Err is returned, containing +the index where a matching element could be inserted while maintaining +sorted order.

+

See also binary_search_by, binary_search_by_key, and partition_point.

+
§Examples
+

Looks up a series of four elements. The first is found, with a +uniquely determined position; the second and third are not +found; the fourth could match any position in [1, 4].

+ +
let s = [0, 1, 1, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55];
+
+assert_eq!(s.binary_search(&13),  Ok(9));
+assert_eq!(s.binary_search(&4),   Err(7));
+assert_eq!(s.binary_search(&100), Err(13));
+let r = s.binary_search(&1);
+assert!(match r { Ok(1..=4) => true, _ => false, });
+

If you want to find that whole range of matching items, rather than +an arbitrary matching one, that can be done using partition_point:

+ +
let s = [0, 1, 1, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55];
+
+let low = s.partition_point(|x| x < &1);
+assert_eq!(low, 1);
+let high = s.partition_point(|x| x <= &1);
+assert_eq!(high, 5);
+let r = s.binary_search(&1);
+assert!((low..high).contains(&r.unwrap()));
+
+assert!(s[..low].iter().all(|&x| x < 1));
+assert!(s[low..high].iter().all(|&x| x == 1));
+assert!(s[high..].iter().all(|&x| x > 1));
+
+// For something not found, the "range" of equal items is empty
+assert_eq!(s.partition_point(|x| x < &11), 9);
+assert_eq!(s.partition_point(|x| x <= &11), 9);
+assert_eq!(s.binary_search(&11), Err(9));
+

If you want to insert an item to a sorted vector, while maintaining +sort order, consider using partition_point:

+ +
let mut s = vec![0, 1, 1, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55];
+let num = 42;
+let idx = s.partition_point(|&x| x <= num);
+// If `num` is unique, `s.partition_point(|&x| x < num)` (with `<`) is equivalent to
+// `s.binary_search(&num).unwrap_or_else(|x| x)`, but using `<=` will allow `insert`
+// to shift less elements.
+s.insert(idx, num);
+assert_eq!(s, [0, 1, 1, 1, 1, 2, 3, 5, 8, 13, 21, 34, 42, 55]);
+
1.0.0 · source

pub fn binary_search_by<'a, F>(&'a self, f: F) -> Result<usize, usize>
where + F: FnMut(&'a T) -> Ordering,

Binary searches this slice with a comparator function.

+

The comparator function should return an order code that indicates +whether its argument is Less, Equal or Greater the desired +target. +If the slice is not sorted or if the comparator function does not +implement an order consistent with the sort order of the underlying +slice, the returned result is unspecified and meaningless.

+

If the value is found then Result::Ok is returned, containing the +index of the matching element. If there are multiple matches, then any +one of the matches could be returned. The index is chosen +deterministically, but is subject to change in future versions of Rust. +If the value is not found then Result::Err is returned, containing +the index where a matching element could be inserted while maintaining +sorted order.

+

See also binary_search, binary_search_by_key, and partition_point.

+
§Examples
+

Looks up a series of four elements. The first is found, with a +uniquely determined position; the second and third are not +found; the fourth could match any position in [1, 4].

+ +
let s = [0, 1, 1, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55];
+
+let seek = 13;
+assert_eq!(s.binary_search_by(|probe| probe.cmp(&seek)), Ok(9));
+let seek = 4;
+assert_eq!(s.binary_search_by(|probe| probe.cmp(&seek)), Err(7));
+let seek = 100;
+assert_eq!(s.binary_search_by(|probe| probe.cmp(&seek)), Err(13));
+let seek = 1;
+let r = s.binary_search_by(|probe| probe.cmp(&seek));
+assert!(match r { Ok(1..=4) => true, _ => false, });
+
1.10.0 · source

pub fn binary_search_by_key<'a, B, F>( + &'a self, + b: &B, + f: F, +) -> Result<usize, usize>
where + F: FnMut(&'a T) -> B, + B: Ord,

Binary searches this slice with a key extraction function.

+

Assumes that the slice is sorted by the key, for instance with +sort_by_key using the same key extraction function. +If the slice is not sorted by the key, the returned result is +unspecified and meaningless.

+

If the value is found then Result::Ok is returned, containing the +index of the matching element. If there are multiple matches, then any +one of the matches could be returned. The index is chosen +deterministically, but is subject to change in future versions of Rust. +If the value is not found then Result::Err is returned, containing +the index where a matching element could be inserted while maintaining +sorted order.

+

See also binary_search, binary_search_by, and partition_point.

+
§Examples
+

Looks up a series of four elements in a slice of pairs sorted by +their second elements. The first is found, with a uniquely +determined position; the second and third are not found; the +fourth could match any position in [1, 4].

+ +
let s = [(0, 0), (2, 1), (4, 1), (5, 1), (3, 1),
+         (1, 2), (2, 3), (4, 5), (5, 8), (3, 13),
+         (1, 21), (2, 34), (4, 55)];
+
+assert_eq!(s.binary_search_by_key(&13, |&(a, b)| b),  Ok(9));
+assert_eq!(s.binary_search_by_key(&4, |&(a, b)| b),   Err(7));
+assert_eq!(s.binary_search_by_key(&100, |&(a, b)| b), Err(13));
+let r = s.binary_search_by_key(&1, |&(a, b)| b);
+assert!(match r { Ok(1..=4) => true, _ => false, });
+
1.30.0 · source

pub unsafe fn align_to<U>(&self) -> (&[T], &[U], &[T])

Transmute the slice to a slice of another type, ensuring alignment of the types is +maintained.

+

This method splits the slice into three distinct slices: prefix, correctly aligned middle +slice of a new type, and the suffix slice. The middle part will be as big as possible under +the given alignment constraint and element size.

+

This method has no purpose when either input element T or output element U are +zero-sized and will return the original slice without splitting anything.

+
§Safety
+

This method is essentially a transmute with respect to the elements in the returned +middle slice, so all the usual caveats pertaining to transmute::<T, U> also apply here.

+
§Examples
+

Basic usage:

+ +
unsafe {
+    let bytes: [u8; 7] = [1, 2, 3, 4, 5, 6, 7];
+    let (prefix, shorts, suffix) = bytes.align_to::<u16>();
+    // less_efficient_algorithm_for_bytes(prefix);
+    // more_efficient_algorithm_for_aligned_shorts(shorts);
+    // less_efficient_algorithm_for_bytes(suffix);
+}
+
source

pub fn as_simd<const LANES: usize>(&self) -> (&[T], &[Simd<T, LANES>], &[T])
where + Simd<T, LANES>: AsRef<[T; LANES]>, + T: SimdElement, + LaneCount<LANES>: SupportedLaneCount,

🔬This is a nightly-only experimental API. (portable_simd)

Split a slice into a prefix, a middle of aligned SIMD types, and a suffix.

+

This is a safe wrapper around slice::align_to, so inherits the same +guarantees as that method.

+
§Panics
+

This will panic if the size of the SIMD type is different from +LANES times that of the scalar.

+

At the time of writing, the trait restrictions on Simd<T, LANES> keeps +that from ever happening, as only power-of-two numbers of lanes are +supported. It’s possible that, in the future, those restrictions might +be lifted in a way that would make it possible to see panics from this +method for something like LANES == 3.

+
§Examples
+
#![feature(portable_simd)]
+use core::simd::prelude::*;
+
+let short = &[1, 2, 3];
+let (prefix, middle, suffix) = short.as_simd::<4>();
+assert_eq!(middle, []); // Not enough elements for anything in the middle
+
+// They might be split in any possible way between prefix and suffix
+let it = prefix.iter().chain(suffix).copied();
+assert_eq!(it.collect::<Vec<_>>(), vec![1, 2, 3]);
+
+fn basic_simd_sum(x: &[f32]) -> f32 {
+    use std::ops::Add;
+    let (prefix, middle, suffix) = x.as_simd();
+    let sums = f32x4::from_array([
+        prefix.iter().copied().sum(),
+        0.0,
+        0.0,
+        suffix.iter().copied().sum(),
+    ]);
+    let sums = middle.iter().copied().fold(sums, f32x4::add);
+    sums.reduce_sum()
+}
+
+let numbers: Vec<f32> = (1..101).map(|x| x as _).collect();
+assert_eq!(basic_simd_sum(&numbers[1..99]), 4949.0);
+
source

pub fn is_sorted(&self) -> bool
where + T: PartialOrd,

🔬This is a nightly-only experimental API. (is_sorted)

Checks if the elements of this slice are sorted.

+

That is, for each element a and its following element b, a <= b must hold. If the +slice yields exactly zero or one element, true is returned.

+

Note that if Self::Item is only PartialOrd, but not Ord, the above definition +implies that this function returns false if any two consecutive items are not +comparable.

+
§Examples
+
#![feature(is_sorted)]
+let empty: [i32; 0] = [];
+
+assert!([1, 2, 2, 9].is_sorted());
+assert!(![1, 3, 2, 4].is_sorted());
+assert!([0].is_sorted());
+assert!(empty.is_sorted());
+assert!(![0.0, 1.0, f32::NAN].is_sorted());
+
source

pub fn is_sorted_by<'a, F>(&'a self, compare: F) -> bool
where + F: FnMut(&'a T, &'a T) -> bool,

🔬This is a nightly-only experimental API. (is_sorted)

Checks if the elements of this slice are sorted using the given comparator function.

+

Instead of using PartialOrd::partial_cmp, this function uses the given compare +function to determine whether two elements are to be considered in sorted order.

+
§Examples
+
#![feature(is_sorted)]
+
+assert!([1, 2, 2, 9].is_sorted_by(|a, b| a <= b));
+assert!(![1, 2, 2, 9].is_sorted_by(|a, b| a < b));
+
+assert!([0].is_sorted_by(|a, b| true));
+assert!([0].is_sorted_by(|a, b| false));
+
+let empty: [i32; 0] = [];
+assert!(empty.is_sorted_by(|a, b| false));
+assert!(empty.is_sorted_by(|a, b| true));
+
source

pub fn is_sorted_by_key<'a, F, K>(&'a self, f: F) -> bool
where + F: FnMut(&'a T) -> K, + K: PartialOrd,

🔬This is a nightly-only experimental API. (is_sorted)

Checks if the elements of this slice are sorted using the given key extraction function.

+

Instead of comparing the slice’s elements directly, this function compares the keys of the +elements, as determined by f. Apart from that, it’s equivalent to is_sorted; see its +documentation for more information.

+
§Examples
+
#![feature(is_sorted)]
+
+assert!(["c", "bb", "aaa"].is_sorted_by_key(|s| s.len()));
+assert!(![-2i32, -1, 0, 3].is_sorted_by_key(|n| n.abs()));
+
1.52.0 · source

pub fn partition_point<P>(&self, pred: P) -> usize
where + P: FnMut(&T) -> bool,

Returns the index of the partition point according to the given predicate +(the index of the first element of the second partition).

+

The slice is assumed to be partitioned according to the given predicate. +This means that all elements for which the predicate returns true are at the start of the slice +and all elements for which the predicate returns false are at the end. +For example, [7, 15, 3, 5, 4, 12, 6] is partitioned under the predicate x % 2 != 0 +(all odd numbers are at the start, all even at the end).

+

If this slice is not partitioned, the returned result is unspecified and meaningless, +as this method performs a kind of binary search.

+

See also binary_search, binary_search_by, and binary_search_by_key.

+
§Examples
+
let v = [1, 2, 3, 3, 5, 6, 7];
+let i = v.partition_point(|&x| x < 5);
+
+assert_eq!(i, 4);
+assert!(v[..i].iter().all(|&x| x < 5));
+assert!(v[i..].iter().all(|&x| !(x < 5)));
+

If all elements of the slice match the predicate, including if the slice +is empty, then the length of the slice will be returned:

+ +
let a = [2, 4, 8];
+assert_eq!(a.partition_point(|x| x < &100), a.len());
+let a: [i32; 0] = [];
+assert_eq!(a.partition_point(|x| x < &100), 0);
+

If you want to insert an item to a sorted vector, while maintaining +sort order:

+ +
let mut s = vec![0, 1, 1, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55];
+let num = 42;
+let idx = s.partition_point(|&x| x <= num);
+s.insert(idx, num);
+assert_eq!(s, [0, 1, 1, 1, 1, 2, 3, 5, 8, 13, 21, 34, 42, 55]);
+
1.23.0 · source

pub fn to_ascii_uppercase(&self) -> Vec<u8>

Returns a vector containing a copy of this slice where each byte +is mapped to its ASCII upper case equivalent.

+

ASCII letters ‘a’ to ‘z’ are mapped to ‘A’ to ‘Z’, +but non-ASCII letters are unchanged.

+

To uppercase the value in-place, use make_ascii_uppercase.

+
1.23.0 · source

pub fn to_ascii_lowercase(&self) -> Vec<u8>

Returns a vector containing a copy of this slice where each byte +is mapped to its ASCII lower case equivalent.

+

ASCII letters ‘A’ to ‘Z’ are mapped to ‘a’ to ‘z’, +but non-ASCII letters are unchanged.

+

To lowercase the value in-place, use make_ascii_lowercase.

+
1.0.0 · source

pub fn to_vec(&self) -> Vec<T>
where + T: Clone,

Copies self into a new Vec.

+
§Examples
+
let s = [10, 40, 30];
+let x = s.to_vec();
+// Here, `s` and `x` can be modified independently.
+
source

pub fn to_vec_in<A>(&self, alloc: A) -> Vec<T, A>
where + A: Allocator, + T: Clone,

🔬This is a nightly-only experimental API. (allocator_api)

Copies self into a new Vec with an allocator.

+
§Examples
+
#![feature(allocator_api)]
+
+use std::alloc::System;
+
+let s = [10, 40, 30];
+let x = s.to_vec_in(System);
+// Here, `s` and `x` can be modified independently.
+
1.40.0 · source

pub fn repeat(&self, n: usize) -> Vec<T>
where + T: Copy,

Creates a vector by copying a slice n times.

+
§Panics
+

This function will panic if the capacity would overflow.

+
§Examples
+

Basic usage:

+ +
assert_eq!([1, 2].repeat(3), vec![1, 2, 1, 2, 1, 2]);
+

A panic upon overflow:

+ +
// this will panic at runtime
+b"0123456789abcdef".repeat(usize::MAX);
+
1.0.0 · source

pub fn concat<Item>(&self) -> <[T] as Concat<Item>>::Output
where + [T]: Concat<Item>, + Item: ?Sized,

Flattens a slice of T into a single value Self::Output.

+
§Examples
+
assert_eq!(["hello", "world"].concat(), "helloworld");
+assert_eq!([[1, 2], [3, 4]].concat(), [1, 2, 3, 4]);
+
1.3.0 · source

pub fn join<Separator>( + &self, + sep: Separator, +) -> <[T] as Join<Separator>>::Output
where + [T]: Join<Separator>,

Flattens a slice of T into a single value Self::Output, placing a +given separator between each.

+
§Examples
+
assert_eq!(["hello", "world"].join(" "), "hello world");
+assert_eq!([[1, 2], [3, 4]].join(&0), [1, 2, 0, 3, 4]);
+assert_eq!([[1, 2], [3, 4]].join(&[0, 0][..]), [1, 2, 0, 0, 3, 4]);
+
1.0.0 · source

pub fn connect<Separator>( + &self, + sep: Separator, +) -> <[T] as Join<Separator>>::Output
where + [T]: Join<Separator>,

👎Deprecated since 1.3.0: renamed to join

Flattens a slice of T into a single value Self::Output, placing a +given separator between each.

+
§Examples
+
assert_eq!(["hello", "world"].connect(" "), "hello world");
+assert_eq!([[1, 2], [3, 4]].connect(&0), [1, 2, 0, 3, 4]);
+

Trait Implementations§

source§

impl Clone for SerializedCallArguments

source§

fn clone(&self) -> SerializedCallArguments

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for SerializedCallArguments

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Default for SerializedCallArguments

source§

fn default() -> SerializedCallArguments

Returns the “default value” for a type. Read more
source§

impl Deref for SerializedCallArguments

§

type Target = [u8]

The resulting type after dereferencing.
source§

fn deref(&self) -> &Self::Target

Dereferences the value.
source§

impl<'de> Deserialize<'de> for SerializedCallArguments

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl From<SerializedCallArguments> for Vec<u8>

source§

fn from(value: SerializedCallArguments) -> Self

Converts to this type from the input type.
source§

impl From<Vec<u8>> for SerializedCallArguments

source§

fn from(value: Vec<u8>) -> Self

Converts to this type from the input type.
source§

impl Hash for SerializedCallArguments

source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
source§

impl PartialEq for SerializedCallArguments

source§

fn eq(&self, other: &SerializedCallArguments) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl Serialize for SerializedCallArguments

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Eq for SerializedCallArguments

source§

impl StructuralPartialEq for SerializedCallArguments

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CallHasher for T
where + T: Hash + ?Sized,

§

default fn get_hash<H, B>(value: &H, build_hasher: &B) -> u64
where + H: Hash + ?Sized, + B: BuildHasher,

source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_interpreter_interface/struct.SerializedCallRequests.html b/air_interpreter_interface/struct.SerializedCallRequests.html new file mode 100644 index 00000000..b57393ae --- /dev/null +++ b/air_interpreter_interface/struct.SerializedCallRequests.html @@ -0,0 +1,1116 @@ +SerializedCallRequests in air_interpreter_interface - Rust
pub struct SerializedCallRequests { /* private fields */ }

Methods from Deref<Target = [u8]>§

1.80.0 · source

pub fn as_flattened(&self) -> &[T]

Takes a &[[T; N]], and flattens it to a &[T].

+
§Panics
+

This panics if the length of the resulting slice would overflow a usize.

+

This is only possible when flattening a slice of arrays of zero-sized +types, and thus tends to be irrelevant in practice. If +size_of::<T>() > 0, this will never panic.

+
§Examples
+
assert_eq!([[1, 2, 3], [4, 5, 6]].as_flattened(), &[1, 2, 3, 4, 5, 6]);
+
+assert_eq!(
+    [[1, 2, 3], [4, 5, 6]].as_flattened(),
+    [[1, 2], [3, 4], [5, 6]].as_flattened(),
+);
+
+let slice_of_empty_arrays: &[[i32; 0]] = &[[], [], [], [], []];
+assert!(slice_of_empty_arrays.as_flattened().is_empty());
+
+let empty_slice_of_arrays: &[[u32; 10]] = &[];
+assert!(empty_slice_of_arrays.as_flattened().is_empty());
+
source

pub fn as_str(&self) -> &str

🔬This is a nightly-only experimental API. (ascii_char)

Views this slice of ASCII characters as a UTF-8 str.

+
source

pub fn as_bytes(&self) -> &[u8]

🔬This is a nightly-only experimental API. (ascii_char)

Views this slice of ASCII characters as a slice of u8 bytes.

+
1.79.0 · source

pub fn utf8_chunks(&self) -> Utf8Chunks<'_>

Creates an iterator over the contiguous valid UTF-8 ranges of this +slice, and the non-UTF-8 fragments in between.

+
§Examples
+

This function formats arbitrary but mostly-UTF-8 bytes into Rust source +code in the form of a C-string literal (c"...").

+ +
use std::fmt::Write as _;
+
+pub fn cstr_literal(bytes: &[u8]) -> String {
+    let mut repr = String::new();
+    repr.push_str("c\"");
+    for chunk in bytes.utf8_chunks() {
+        for ch in chunk.valid().chars() {
+            // Escapes \0, \t, \r, \n, \\, \', \", and uses \u{...} for non-printable characters.
+            write!(repr, "{}", ch.escape_debug()).unwrap();
+        }
+        for byte in chunk.invalid() {
+            write!(repr, "\\x{:02X}", byte).unwrap();
+        }
+    }
+    repr.push('"');
+    repr
+}
+
+fn main() {
+    let lit = cstr_literal(b"\xferris the \xf0\x9f\xa6\x80\x07");
+    let expected = stringify!(c"\xFErris the 🦀\u{7}");
+    assert_eq!(lit, expected);
+}
+
1.23.0 · source

pub fn is_ascii(&self) -> bool

Checks if all bytes in this slice are within the ASCII range.

+
source

pub fn as_ascii(&self) -> Option<&[AsciiChar]>

🔬This is a nightly-only experimental API. (ascii_char)

If this slice is_ascii, returns it as a slice of +ASCII characters, otherwise returns None.

+
source

pub unsafe fn as_ascii_unchecked(&self) -> &[AsciiChar]

🔬This is a nightly-only experimental API. (ascii_char)

Converts this slice of bytes into a slice of ASCII characters, +without checking whether they’re valid.

+
§Safety
+

Every byte in the slice must be in 0..=127, or else this is UB.

+
1.23.0 · source

pub fn eq_ignore_ascii_case(&self, other: &[u8]) -> bool

Checks that two slices are an ASCII case-insensitive match.

+

Same as to_ascii_lowercase(a) == to_ascii_lowercase(b), +but without allocating and copying temporaries.

+
1.60.0 · source

pub fn escape_ascii(&self) -> EscapeAscii<'_>

Returns an iterator that produces an escaped version of this slice, +treating it as an ASCII string.

+
§Examples
+

+let s = b"0\t\r\n'\"\\\x9d";
+let escaped = s.escape_ascii().to_string();
+assert_eq!(escaped, "0\\t\\r\\n\\'\\\"\\\\\\x9d");
+
1.80.0 · source

pub fn trim_ascii_start(&self) -> &[u8]

Returns a byte slice with leading ASCII whitespace bytes removed.

+

‘Whitespace’ refers to the definition used by +u8::is_ascii_whitespace.

+
§Examples
+
assert_eq!(b" \t hello world\n".trim_ascii_start(), b"hello world\n");
+assert_eq!(b"  ".trim_ascii_start(), b"");
+assert_eq!(b"".trim_ascii_start(), b"");
+
1.80.0 · source

pub fn trim_ascii_end(&self) -> &[u8]

Returns a byte slice with trailing ASCII whitespace bytes removed.

+

‘Whitespace’ refers to the definition used by +u8::is_ascii_whitespace.

+
§Examples
+
assert_eq!(b"\r hello world\n ".trim_ascii_end(), b"\r hello world");
+assert_eq!(b"  ".trim_ascii_end(), b"");
+assert_eq!(b"".trim_ascii_end(), b"");
+
1.80.0 · source

pub fn trim_ascii(&self) -> &[u8]

Returns a byte slice with leading and trailing ASCII whitespace bytes +removed.

+

‘Whitespace’ refers to the definition used by +u8::is_ascii_whitespace.

+
§Examples
+
assert_eq!(b"\r hello world\n ".trim_ascii(), b"hello world");
+assert_eq!(b"  ".trim_ascii(), b"");
+assert_eq!(b"".trim_ascii(), b"");
+
1.0.0 · source

pub fn len(&self) -> usize

Returns the number of elements in the slice.

+
§Examples
+
let a = [1, 2, 3];
+assert_eq!(a.len(), 3);
+
1.0.0 · source

pub fn is_empty(&self) -> bool

Returns true if the slice has a length of 0.

+
§Examples
+
let a = [1, 2, 3];
+assert!(!a.is_empty());
+
+let b: &[i32] = &[];
+assert!(b.is_empty());
+
1.0.0 · source

pub fn first(&self) -> Option<&T>

Returns the first element of the slice, or None if it is empty.

+
§Examples
+
let v = [10, 40, 30];
+assert_eq!(Some(&10), v.first());
+
+let w: &[i32] = &[];
+assert_eq!(None, w.first());
+
1.5.0 · source

pub fn split_first(&self) -> Option<(&T, &[T])>

Returns the first and all the rest of the elements of the slice, or None if it is empty.

+
§Examples
+
let x = &[0, 1, 2];
+
+if let Some((first, elements)) = x.split_first() {
+    assert_eq!(first, &0);
+    assert_eq!(elements, &[1, 2]);
+}
+
1.5.0 · source

pub fn split_last(&self) -> Option<(&T, &[T])>

Returns the last and all the rest of the elements of the slice, or None if it is empty.

+
§Examples
+
let x = &[0, 1, 2];
+
+if let Some((last, elements)) = x.split_last() {
+    assert_eq!(last, &2);
+    assert_eq!(elements, &[0, 1]);
+}
+
1.0.0 · source

pub fn last(&self) -> Option<&T>

Returns the last element of the slice, or None if it is empty.

+
§Examples
+
let v = [10, 40, 30];
+assert_eq!(Some(&30), v.last());
+
+let w: &[i32] = &[];
+assert_eq!(None, w.last());
+
1.77.0 · source

pub fn first_chunk<const N: usize>(&self) -> Option<&[T; N]>

Return an array reference to the first N items in the slice.

+

If the slice is not at least N in length, this will return None.

+
§Examples
+
let u = [10, 40, 30];
+assert_eq!(Some(&[10, 40]), u.first_chunk::<2>());
+
+let v: &[i32] = &[10];
+assert_eq!(None, v.first_chunk::<2>());
+
+let w: &[i32] = &[];
+assert_eq!(Some(&[]), w.first_chunk::<0>());
+
1.77.0 · source

pub fn split_first_chunk<const N: usize>(&self) -> Option<(&[T; N], &[T])>

Return an array reference to the first N items in the slice and the remaining slice.

+

If the slice is not at least N in length, this will return None.

+
§Examples
+
let x = &[0, 1, 2];
+
+if let Some((first, elements)) = x.split_first_chunk::<2>() {
+    assert_eq!(first, &[0, 1]);
+    assert_eq!(elements, &[2]);
+}
+
+assert_eq!(None, x.split_first_chunk::<4>());
+
1.77.0 · source

pub fn split_last_chunk<const N: usize>(&self) -> Option<(&[T], &[T; N])>

Return an array reference to the last N items in the slice and the remaining slice.

+

If the slice is not at least N in length, this will return None.

+
§Examples
+
let x = &[0, 1, 2];
+
+if let Some((elements, last)) = x.split_last_chunk::<2>() {
+    assert_eq!(elements, &[0]);
+    assert_eq!(last, &[1, 2]);
+}
+
+assert_eq!(None, x.split_last_chunk::<4>());
+
1.77.0 · source

pub fn last_chunk<const N: usize>(&self) -> Option<&[T; N]>

Return an array reference to the last N items in the slice.

+

If the slice is not at least N in length, this will return None.

+
§Examples
+
let u = [10, 40, 30];
+assert_eq!(Some(&[40, 30]), u.last_chunk::<2>());
+
+let v: &[i32] = &[10];
+assert_eq!(None, v.last_chunk::<2>());
+
+let w: &[i32] = &[];
+assert_eq!(Some(&[]), w.last_chunk::<0>());
+
1.0.0 · source

pub fn get<I>(&self, index: I) -> Option<&<I as SliceIndex<[T]>>::Output>
where + I: SliceIndex<[T]>,

Returns a reference to an element or subslice depending on the type of +index.

+
    +
  • If given a position, returns a reference to the element at that +position or None if out of bounds.
  • +
  • If given a range, returns the subslice corresponding to that range, +or None if out of bounds.
  • +
+
§Examples
+
let v = [10, 40, 30];
+assert_eq!(Some(&40), v.get(1));
+assert_eq!(Some(&[10, 40][..]), v.get(0..2));
+assert_eq!(None, v.get(3));
+assert_eq!(None, v.get(0..4));
+
1.0.0 · source

pub unsafe fn get_unchecked<I>( + &self, + index: I, +) -> &<I as SliceIndex<[T]>>::Output
where + I: SliceIndex<[T]>,

Returns a reference to an element or subslice, without doing bounds +checking.

+

For a safe alternative see get.

+
§Safety
+

Calling this method with an out-of-bounds index is undefined behavior +even if the resulting reference is not used.

+

You can think of this like .get(index).unwrap_unchecked(). It’s UB +to call .get_unchecked(len), even if you immediately convert to a +pointer. And it’s UB to call .get_unchecked(..len + 1), +.get_unchecked(..=len), or similar.

+
§Examples
+
let x = &[1, 2, 4];
+
+unsafe {
+    assert_eq!(x.get_unchecked(1), &2);
+}
+
1.0.0 · source

pub fn as_ptr(&self) -> *const T

Returns a raw pointer to the slice’s buffer.

+

The caller must ensure that the slice outlives the pointer this +function returns, or else it will end up pointing to garbage.

+

The caller must also ensure that the memory the pointer (non-transitively) points to +is never written to (except inside an UnsafeCell) using this pointer or any pointer +derived from it. If you need to mutate the contents of the slice, use as_mut_ptr.

+

Modifying the container referenced by this slice may cause its buffer +to be reallocated, which would also make any pointers to it invalid.

+
§Examples
+
let x = &[1, 2, 4];
+let x_ptr = x.as_ptr();
+
+unsafe {
+    for i in 0..x.len() {
+        assert_eq!(x.get_unchecked(i), &*x_ptr.add(i));
+    }
+}
+
1.48.0 · source

pub fn as_ptr_range(&self) -> Range<*const T>

Returns the two raw pointers spanning the slice.

+

The returned range is half-open, which means that the end pointer +points one past the last element of the slice. This way, an empty +slice is represented by two equal pointers, and the difference between +the two pointers represents the size of the slice.

+

See as_ptr for warnings on using these pointers. The end pointer +requires extra caution, as it does not point to a valid element in the +slice.

+

This function is useful for interacting with foreign interfaces which +use two pointers to refer to a range of elements in memory, as is +common in C++.

+

It can also be useful to check if a pointer to an element refers to an +element of this slice:

+ +
let a = [1, 2, 3];
+let x = &a[1] as *const _;
+let y = &5 as *const _;
+
+assert!(a.as_ptr_range().contains(&x));
+assert!(!a.as_ptr_range().contains(&y));
+
1.0.0 · source

pub fn iter(&self) -> Iter<'_, T>

Returns an iterator over the slice.

+

The iterator yields all items from start to end.

+
§Examples
+
let x = &[1, 2, 4];
+let mut iterator = x.iter();
+
+assert_eq!(iterator.next(), Some(&1));
+assert_eq!(iterator.next(), Some(&2));
+assert_eq!(iterator.next(), Some(&4));
+assert_eq!(iterator.next(), None);
+
1.0.0 · source

pub fn windows(&self, size: usize) -> Windows<'_, T>

Returns an iterator over all contiguous windows of length +size. The windows overlap. If the slice is shorter than +size, the iterator returns no values.

+
§Panics
+

Panics if size is 0.

+
§Examples
+
let slice = ['l', 'o', 'r', 'e', 'm'];
+let mut iter = slice.windows(3);
+assert_eq!(iter.next().unwrap(), &['l', 'o', 'r']);
+assert_eq!(iter.next().unwrap(), &['o', 'r', 'e']);
+assert_eq!(iter.next().unwrap(), &['r', 'e', 'm']);
+assert!(iter.next().is_none());
+

If the slice is shorter than size:

+ +
let slice = ['f', 'o', 'o'];
+let mut iter = slice.windows(4);
+assert!(iter.next().is_none());
+

There’s no windows_mut, as that existing would let safe code violate the +“only one &mut at a time to the same thing” rule. However, you can sometimes +use Cell::as_slice_of_cells in +conjunction with windows to accomplish something similar:

+ +
use std::cell::Cell;
+
+let mut array = ['R', 'u', 's', 't', ' ', '2', '0', '1', '5'];
+let slice = &mut array[..];
+let slice_of_cells: &[Cell<char>] = Cell::from_mut(slice).as_slice_of_cells();
+for w in slice_of_cells.windows(3) {
+    Cell::swap(&w[0], &w[2]);
+}
+assert_eq!(array, ['s', 't', ' ', '2', '0', '1', '5', 'u', 'R']);
+
1.0.0 · source

pub fn chunks(&self, chunk_size: usize) -> Chunks<'_, T>

Returns an iterator over chunk_size elements of the slice at a time, starting at the +beginning of the slice.

+

The chunks are slices and do not overlap. If chunk_size does not divide the length of the +slice, then the last chunk will not have length chunk_size.

+

See chunks_exact for a variant of this iterator that returns chunks of always exactly +chunk_size elements, and rchunks for the same iterator but starting at the end of the +slice.

+
§Panics
+

Panics if chunk_size is 0.

+
§Examples
+
let slice = ['l', 'o', 'r', 'e', 'm'];
+let mut iter = slice.chunks(2);
+assert_eq!(iter.next().unwrap(), &['l', 'o']);
+assert_eq!(iter.next().unwrap(), &['r', 'e']);
+assert_eq!(iter.next().unwrap(), &['m']);
+assert!(iter.next().is_none());
+
1.31.0 · source

pub fn chunks_exact(&self, chunk_size: usize) -> ChunksExact<'_, T>

Returns an iterator over chunk_size elements of the slice at a time, starting at the +beginning of the slice.

+

The chunks are slices and do not overlap. If chunk_size does not divide the length of the +slice, then the last up to chunk_size-1 elements will be omitted and can be retrieved +from the remainder function of the iterator.

+

Due to each chunk having exactly chunk_size elements, the compiler can often optimize the +resulting code better than in the case of chunks.

+

See chunks for a variant of this iterator that also returns the remainder as a smaller +chunk, and rchunks_exact for the same iterator but starting at the end of the slice.

+
§Panics
+

Panics if chunk_size is 0.

+
§Examples
+
let slice = ['l', 'o', 'r', 'e', 'm'];
+let mut iter = slice.chunks_exact(2);
+assert_eq!(iter.next().unwrap(), &['l', 'o']);
+assert_eq!(iter.next().unwrap(), &['r', 'e']);
+assert!(iter.next().is_none());
+assert_eq!(iter.remainder(), &['m']);
+
source

pub unsafe fn as_chunks_unchecked<const N: usize>(&self) -> &[[T; N]]

🔬This is a nightly-only experimental API. (slice_as_chunks)

Splits the slice into a slice of N-element arrays, +assuming that there’s no remainder.

+
§Safety
+

This may only be called when

+
    +
  • The slice splits exactly into N-element chunks (aka self.len() % N == 0).
  • +
  • N != 0.
  • +
+
§Examples
+
#![feature(slice_as_chunks)]
+let slice: &[char] = &['l', 'o', 'r', 'e', 'm', '!'];
+let chunks: &[[char; 1]] =
+    // SAFETY: 1-element chunks never have remainder
+    unsafe { slice.as_chunks_unchecked() };
+assert_eq!(chunks, &[['l'], ['o'], ['r'], ['e'], ['m'], ['!']]);
+let chunks: &[[char; 3]] =
+    // SAFETY: The slice length (6) is a multiple of 3
+    unsafe { slice.as_chunks_unchecked() };
+assert_eq!(chunks, &[['l', 'o', 'r'], ['e', 'm', '!']]);
+
+// These would be unsound:
+// let chunks: &[[_; 5]] = slice.as_chunks_unchecked() // The slice length is not a multiple of 5
+// let chunks: &[[_; 0]] = slice.as_chunks_unchecked() // Zero-length chunks are never allowed
+
source

pub fn as_chunks<const N: usize>(&self) -> (&[[T; N]], &[T])

🔬This is a nightly-only experimental API. (slice_as_chunks)

Splits the slice into a slice of N-element arrays, +starting at the beginning of the slice, +and a remainder slice with length strictly less than N.

+
§Panics
+

Panics if N is 0. This check will most probably get changed to a compile time +error before this method gets stabilized.

+
§Examples
+
#![feature(slice_as_chunks)]
+let slice = ['l', 'o', 'r', 'e', 'm'];
+let (chunks, remainder) = slice.as_chunks();
+assert_eq!(chunks, &[['l', 'o'], ['r', 'e']]);
+assert_eq!(remainder, &['m']);
+

If you expect the slice to be an exact multiple, you can combine +let-else with an empty slice pattern:

+ +
#![feature(slice_as_chunks)]
+let slice = ['R', 'u', 's', 't'];
+let (chunks, []) = slice.as_chunks::<2>() else {
+    panic!("slice didn't have even length")
+};
+assert_eq!(chunks, &[['R', 'u'], ['s', 't']]);
+
source

pub fn as_rchunks<const N: usize>(&self) -> (&[T], &[[T; N]])

🔬This is a nightly-only experimental API. (slice_as_chunks)

Splits the slice into a slice of N-element arrays, +starting at the end of the slice, +and a remainder slice with length strictly less than N.

+
§Panics
+

Panics if N is 0. This check will most probably get changed to a compile time +error before this method gets stabilized.

+
§Examples
+
#![feature(slice_as_chunks)]
+let slice = ['l', 'o', 'r', 'e', 'm'];
+let (remainder, chunks) = slice.as_rchunks();
+assert_eq!(remainder, &['l']);
+assert_eq!(chunks, &[['o', 'r'], ['e', 'm']]);
+
source

pub fn array_chunks<const N: usize>(&self) -> ArrayChunks<'_, T, N>

🔬This is a nightly-only experimental API. (array_chunks)

Returns an iterator over N elements of the slice at a time, starting at the +beginning of the slice.

+

The chunks are array references and do not overlap. If N does not divide the +length of the slice, then the last up to N-1 elements will be omitted and can be +retrieved from the remainder function of the iterator.

+

This method is the const generic equivalent of chunks_exact.

+
§Panics
+

Panics if N is 0. This check will most probably get changed to a compile time +error before this method gets stabilized.

+
§Examples
+
#![feature(array_chunks)]
+let slice = ['l', 'o', 'r', 'e', 'm'];
+let mut iter = slice.array_chunks();
+assert_eq!(iter.next().unwrap(), &['l', 'o']);
+assert_eq!(iter.next().unwrap(), &['r', 'e']);
+assert!(iter.next().is_none());
+assert_eq!(iter.remainder(), &['m']);
+
source

pub fn array_windows<const N: usize>(&self) -> ArrayWindows<'_, T, N>

🔬This is a nightly-only experimental API. (array_windows)

Returns an iterator over overlapping windows of N elements of a slice, +starting at the beginning of the slice.

+

This is the const generic equivalent of windows.

+

If N is greater than the size of the slice, it will return no windows.

+
§Panics
+

Panics if N is 0. This check will most probably get changed to a compile time +error before this method gets stabilized.

+
§Examples
+
#![feature(array_windows)]
+let slice = [0, 1, 2, 3];
+let mut iter = slice.array_windows();
+assert_eq!(iter.next().unwrap(), &[0, 1]);
+assert_eq!(iter.next().unwrap(), &[1, 2]);
+assert_eq!(iter.next().unwrap(), &[2, 3]);
+assert!(iter.next().is_none());
+
1.31.0 · source

pub fn rchunks(&self, chunk_size: usize) -> RChunks<'_, T>

Returns an iterator over chunk_size elements of the slice at a time, starting at the end +of the slice.

+

The chunks are slices and do not overlap. If chunk_size does not divide the length of the +slice, then the last chunk will not have length chunk_size.

+

See rchunks_exact for a variant of this iterator that returns chunks of always exactly +chunk_size elements, and chunks for the same iterator but starting at the beginning +of the slice.

+
§Panics
+

Panics if chunk_size is 0.

+
§Examples
+
let slice = ['l', 'o', 'r', 'e', 'm'];
+let mut iter = slice.rchunks(2);
+assert_eq!(iter.next().unwrap(), &['e', 'm']);
+assert_eq!(iter.next().unwrap(), &['o', 'r']);
+assert_eq!(iter.next().unwrap(), &['l']);
+assert!(iter.next().is_none());
+
1.31.0 · source

pub fn rchunks_exact(&self, chunk_size: usize) -> RChunksExact<'_, T>

Returns an iterator over chunk_size elements of the slice at a time, starting at the +end of the slice.

+

The chunks are slices and do not overlap. If chunk_size does not divide the length of the +slice, then the last up to chunk_size-1 elements will be omitted and can be retrieved +from the remainder function of the iterator.

+

Due to each chunk having exactly chunk_size elements, the compiler can often optimize the +resulting code better than in the case of rchunks.

+

See rchunks for a variant of this iterator that also returns the remainder as a smaller +chunk, and chunks_exact for the same iterator but starting at the beginning of the +slice.

+
§Panics
+

Panics if chunk_size is 0.

+
§Examples
+
let slice = ['l', 'o', 'r', 'e', 'm'];
+let mut iter = slice.rchunks_exact(2);
+assert_eq!(iter.next().unwrap(), &['e', 'm']);
+assert_eq!(iter.next().unwrap(), &['o', 'r']);
+assert!(iter.next().is_none());
+assert_eq!(iter.remainder(), &['l']);
+
1.77.0 · source

pub fn chunk_by<F>(&self, pred: F) -> ChunkBy<'_, T, F>
where + F: FnMut(&T, &T) -> bool,

Returns an iterator over the slice producing non-overlapping runs +of elements using the predicate to separate them.

+

The predicate is called for every pair of consecutive elements, +meaning that it is called on slice[0] and slice[1], +followed by slice[1] and slice[2], and so on.

+
§Examples
+
let slice = &[1, 1, 1, 3, 3, 2, 2, 2];
+
+let mut iter = slice.chunk_by(|a, b| a == b);
+
+assert_eq!(iter.next(), Some(&[1, 1, 1][..]));
+assert_eq!(iter.next(), Some(&[3, 3][..]));
+assert_eq!(iter.next(), Some(&[2, 2, 2][..]));
+assert_eq!(iter.next(), None);
+

This method can be used to extract the sorted subslices:

+ +
let slice = &[1, 1, 2, 3, 2, 3, 2, 3, 4];
+
+let mut iter = slice.chunk_by(|a, b| a <= b);
+
+assert_eq!(iter.next(), Some(&[1, 1, 2, 3][..]));
+assert_eq!(iter.next(), Some(&[2, 3][..]));
+assert_eq!(iter.next(), Some(&[2, 3, 4][..]));
+assert_eq!(iter.next(), None);
+
1.0.0 · source

pub fn split_at(&self, mid: usize) -> (&[T], &[T])

Divides one slice into two at an index.

+

The first will contain all indices from [0, mid) (excluding +the index mid itself) and the second will contain all +indices from [mid, len) (excluding the index len itself).

+
§Panics
+

Panics if mid > len. For a non-panicking alternative see +split_at_checked.

+
§Examples
+
let v = [1, 2, 3, 4, 5, 6];
+
+{
+   let (left, right) = v.split_at(0);
+   assert_eq!(left, []);
+   assert_eq!(right, [1, 2, 3, 4, 5, 6]);
+}
+
+{
+    let (left, right) = v.split_at(2);
+    assert_eq!(left, [1, 2]);
+    assert_eq!(right, [3, 4, 5, 6]);
+}
+
+{
+    let (left, right) = v.split_at(6);
+    assert_eq!(left, [1, 2, 3, 4, 5, 6]);
+    assert_eq!(right, []);
+}
+
1.79.0 · source

pub unsafe fn split_at_unchecked(&self, mid: usize) -> (&[T], &[T])

Divides one slice into two at an index, without doing bounds checking.

+

The first will contain all indices from [0, mid) (excluding +the index mid itself) and the second will contain all +indices from [mid, len) (excluding the index len itself).

+

For a safe alternative see split_at.

+
§Safety
+

Calling this method with an out-of-bounds index is undefined behavior +even if the resulting reference is not used. The caller has to ensure that +0 <= mid <= self.len().

+
§Examples
+
let v = [1, 2, 3, 4, 5, 6];
+
+unsafe {
+   let (left, right) = v.split_at_unchecked(0);
+   assert_eq!(left, []);
+   assert_eq!(right, [1, 2, 3, 4, 5, 6]);
+}
+
+unsafe {
+    let (left, right) = v.split_at_unchecked(2);
+    assert_eq!(left, [1, 2]);
+    assert_eq!(right, [3, 4, 5, 6]);
+}
+
+unsafe {
+    let (left, right) = v.split_at_unchecked(6);
+    assert_eq!(left, [1, 2, 3, 4, 5, 6]);
+    assert_eq!(right, []);
+}
+
1.80.0 · source

pub fn split_at_checked(&self, mid: usize) -> Option<(&[T], &[T])>

Divides one slice into two at an index, returning None if the slice is +too short.

+

If mid ≤ len returns a pair of slices where the first will contain all +indices from [0, mid) (excluding the index mid itself) and the +second will contain all indices from [mid, len) (excluding the index +len itself).

+

Otherwise, if mid > len, returns None.

+
§Examples
+
let v = [1, -2, 3, -4, 5, -6];
+
+{
+   let (left, right) = v.split_at_checked(0).unwrap();
+   assert_eq!(left, []);
+   assert_eq!(right, [1, -2, 3, -4, 5, -6]);
+}
+
+{
+    let (left, right) = v.split_at_checked(2).unwrap();
+    assert_eq!(left, [1, -2]);
+    assert_eq!(right, [3, -4, 5, -6]);
+}
+
+{
+    let (left, right) = v.split_at_checked(6).unwrap();
+    assert_eq!(left, [1, -2, 3, -4, 5, -6]);
+    assert_eq!(right, []);
+}
+
+assert_eq!(None, v.split_at_checked(7));
+
1.0.0 · source

pub fn split<F>(&self, pred: F) -> Split<'_, T, F>
where + F: FnMut(&T) -> bool,

Returns an iterator over subslices separated by elements that match +pred. The matched element is not contained in the subslices.

+
§Examples
+
let slice = [10, 40, 33, 20];
+let mut iter = slice.split(|num| num % 3 == 0);
+
+assert_eq!(iter.next().unwrap(), &[10, 40]);
+assert_eq!(iter.next().unwrap(), &[20]);
+assert!(iter.next().is_none());
+

If the first element is matched, an empty slice will be the first item +returned by the iterator. Similarly, if the last element in the slice +is matched, an empty slice will be the last item returned by the +iterator:

+ +
let slice = [10, 40, 33];
+let mut iter = slice.split(|num| num % 3 == 0);
+
+assert_eq!(iter.next().unwrap(), &[10, 40]);
+assert_eq!(iter.next().unwrap(), &[]);
+assert!(iter.next().is_none());
+

If two matched elements are directly adjacent, an empty slice will be +present between them:

+ +
let slice = [10, 6, 33, 20];
+let mut iter = slice.split(|num| num % 3 == 0);
+
+assert_eq!(iter.next().unwrap(), &[10]);
+assert_eq!(iter.next().unwrap(), &[]);
+assert_eq!(iter.next().unwrap(), &[20]);
+assert!(iter.next().is_none());
+
1.51.0 · source

pub fn split_inclusive<F>(&self, pred: F) -> SplitInclusive<'_, T, F>
where + F: FnMut(&T) -> bool,

Returns an iterator over subslices separated by elements that match +pred. The matched element is contained in the end of the previous +subslice as a terminator.

+
§Examples
+
let slice = [10, 40, 33, 20];
+let mut iter = slice.split_inclusive(|num| num % 3 == 0);
+
+assert_eq!(iter.next().unwrap(), &[10, 40, 33]);
+assert_eq!(iter.next().unwrap(), &[20]);
+assert!(iter.next().is_none());
+

If the last element of the slice is matched, +that element will be considered the terminator of the preceding slice. +That slice will be the last item returned by the iterator.

+ +
let slice = [3, 10, 40, 33];
+let mut iter = slice.split_inclusive(|num| num % 3 == 0);
+
+assert_eq!(iter.next().unwrap(), &[3]);
+assert_eq!(iter.next().unwrap(), &[10, 40, 33]);
+assert!(iter.next().is_none());
+
1.27.0 · source

pub fn rsplit<F>(&self, pred: F) -> RSplit<'_, T, F>
where + F: FnMut(&T) -> bool,

Returns an iterator over subslices separated by elements that match +pred, starting at the end of the slice and working backwards. +The matched element is not contained in the subslices.

+
§Examples
+
let slice = [11, 22, 33, 0, 44, 55];
+let mut iter = slice.rsplit(|num| *num == 0);
+
+assert_eq!(iter.next().unwrap(), &[44, 55]);
+assert_eq!(iter.next().unwrap(), &[11, 22, 33]);
+assert_eq!(iter.next(), None);
+

As with split(), if the first or last element is matched, an empty +slice will be the first (or last) item returned by the iterator.

+ +
let v = &[0, 1, 1, 2, 3, 5, 8];
+let mut it = v.rsplit(|n| *n % 2 == 0);
+assert_eq!(it.next().unwrap(), &[]);
+assert_eq!(it.next().unwrap(), &[3, 5]);
+assert_eq!(it.next().unwrap(), &[1, 1]);
+assert_eq!(it.next().unwrap(), &[]);
+assert_eq!(it.next(), None);
+
1.0.0 · source

pub fn splitn<F>(&self, n: usize, pred: F) -> SplitN<'_, T, F>
where + F: FnMut(&T) -> bool,

Returns an iterator over subslices separated by elements that match +pred, limited to returning at most n items. The matched element is +not contained in the subslices.

+

The last element returned, if any, will contain the remainder of the +slice.

+
§Examples
+

Print the slice split once by numbers divisible by 3 (i.e., [10, 40], +[20, 60, 50]):

+ +
let v = [10, 40, 30, 20, 60, 50];
+
+for group in v.splitn(2, |num| *num % 3 == 0) {
+    println!("{group:?}");
+}
+
1.0.0 · source

pub fn rsplitn<F>(&self, n: usize, pred: F) -> RSplitN<'_, T, F>
where + F: FnMut(&T) -> bool,

Returns an iterator over subslices separated by elements that match +pred limited to returning at most n items. This starts at the end of +the slice and works backwards. The matched element is not contained in +the subslices.

+

The last element returned, if any, will contain the remainder of the +slice.

+
§Examples
+

Print the slice split once, starting from the end, by numbers divisible +by 3 (i.e., [50], [10, 40, 30, 20]):

+ +
let v = [10, 40, 30, 20, 60, 50];
+
+for group in v.rsplitn(2, |num| *num % 3 == 0) {
+    println!("{group:?}");
+}
+
source

pub fn split_once<F>(&self, pred: F) -> Option<(&[T], &[T])>
where + F: FnMut(&T) -> bool,

🔬This is a nightly-only experimental API. (slice_split_once)

Splits the slice on the first element that matches the specified +predicate.

+

If any matching elements are present in the slice, returns the prefix +before the match and suffix after. The matching element itself is not +included. If no elements match, returns None.

+
§Examples
+
#![feature(slice_split_once)]
+let s = [1, 2, 3, 2, 4];
+assert_eq!(s.split_once(|&x| x == 2), Some((
+    &[1][..],
+    &[3, 2, 4][..]
+)));
+assert_eq!(s.split_once(|&x| x == 0), None);
+
source

pub fn rsplit_once<F>(&self, pred: F) -> Option<(&[T], &[T])>
where + F: FnMut(&T) -> bool,

🔬This is a nightly-only experimental API. (slice_split_once)

Splits the slice on the last element that matches the specified +predicate.

+

If any matching elements are present in the slice, returns the prefix +before the match and suffix after. The matching element itself is not +included. If no elements match, returns None.

+
§Examples
+
#![feature(slice_split_once)]
+let s = [1, 2, 3, 2, 4];
+assert_eq!(s.rsplit_once(|&x| x == 2), Some((
+    &[1, 2, 3][..],
+    &[4][..]
+)));
+assert_eq!(s.rsplit_once(|&x| x == 0), None);
+
1.0.0 · source

pub fn contains(&self, x: &T) -> bool
where + T: PartialEq,

Returns true if the slice contains an element with the given value.

+

This operation is O(n).

+

Note that if you have a sorted slice, binary_search may be faster.

+
§Examples
+
let v = [10, 40, 30];
+assert!(v.contains(&30));
+assert!(!v.contains(&50));
+

If you do not have a &T, but some other value that you can compare +with one (for example, String implements PartialEq<str>), you can +use iter().any:

+ +
let v = [String::from("hello"), String::from("world")]; // slice of `String`
+assert!(v.iter().any(|e| e == "hello")); // search with `&str`
+assert!(!v.iter().any(|e| e == "hi"));
+
1.0.0 · source

pub fn starts_with(&self, needle: &[T]) -> bool
where + T: PartialEq,

Returns true if needle is a prefix of the slice or equal to the slice.

+
§Examples
+
let v = [10, 40, 30];
+assert!(v.starts_with(&[10]));
+assert!(v.starts_with(&[10, 40]));
+assert!(v.starts_with(&v));
+assert!(!v.starts_with(&[50]));
+assert!(!v.starts_with(&[10, 50]));
+

Always returns true if needle is an empty slice:

+ +
let v = &[10, 40, 30];
+assert!(v.starts_with(&[]));
+let v: &[u8] = &[];
+assert!(v.starts_with(&[]));
+
1.0.0 · source

pub fn ends_with(&self, needle: &[T]) -> bool
where + T: PartialEq,

Returns true if needle is a suffix of the slice or equal to the slice.

+
§Examples
+
let v = [10, 40, 30];
+assert!(v.ends_with(&[30]));
+assert!(v.ends_with(&[40, 30]));
+assert!(v.ends_with(&v));
+assert!(!v.ends_with(&[50]));
+assert!(!v.ends_with(&[50, 30]));
+

Always returns true if needle is an empty slice:

+ +
let v = &[10, 40, 30];
+assert!(v.ends_with(&[]));
+let v: &[u8] = &[];
+assert!(v.ends_with(&[]));
+
1.51.0 · source

pub fn strip_prefix<P>(&self, prefix: &P) -> Option<&[T]>
where + P: SlicePattern<Item = T> + ?Sized, + T: PartialEq,

Returns a subslice with the prefix removed.

+

If the slice starts with prefix, returns the subslice after the prefix, wrapped in Some. +If prefix is empty, simply returns the original slice. If prefix is equal to the +original slice, returns an empty slice.

+

If the slice does not start with prefix, returns None.

+
§Examples
+
let v = &[10, 40, 30];
+assert_eq!(v.strip_prefix(&[10]), Some(&[40, 30][..]));
+assert_eq!(v.strip_prefix(&[10, 40]), Some(&[30][..]));
+assert_eq!(v.strip_prefix(&[10, 40, 30]), Some(&[][..]));
+assert_eq!(v.strip_prefix(&[50]), None);
+assert_eq!(v.strip_prefix(&[10, 50]), None);
+
+let prefix : &str = "he";
+assert_eq!(b"hello".strip_prefix(prefix.as_bytes()),
+           Some(b"llo".as_ref()));
+
1.51.0 · source

pub fn strip_suffix<P>(&self, suffix: &P) -> Option<&[T]>
where + P: SlicePattern<Item = T> + ?Sized, + T: PartialEq,

Returns a subslice with the suffix removed.

+

If the slice ends with suffix, returns the subslice before the suffix, wrapped in Some. +If suffix is empty, simply returns the original slice. If suffix is equal to the +original slice, returns an empty slice.

+

If the slice does not end with suffix, returns None.

+
§Examples
+
let v = &[10, 40, 30];
+assert_eq!(v.strip_suffix(&[30]), Some(&[10, 40][..]));
+assert_eq!(v.strip_suffix(&[40, 30]), Some(&[10][..]));
+assert_eq!(v.strip_suffix(&[10, 40, 30]), Some(&[][..]));
+assert_eq!(v.strip_suffix(&[50]), None);
+assert_eq!(v.strip_suffix(&[50, 30]), None);
+

Binary searches this slice for a given element. +If the slice is not sorted, the returned result is unspecified and +meaningless.

+

If the value is found then Result::Ok is returned, containing the +index of the matching element. If there are multiple matches, then any +one of the matches could be returned. The index is chosen +deterministically, but is subject to change in future versions of Rust. +If the value is not found then Result::Err is returned, containing +the index where a matching element could be inserted while maintaining +sorted order.

+

See also binary_search_by, binary_search_by_key, and partition_point.

+
§Examples
+

Looks up a series of four elements. The first is found, with a +uniquely determined position; the second and third are not +found; the fourth could match any position in [1, 4].

+ +
let s = [0, 1, 1, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55];
+
+assert_eq!(s.binary_search(&13),  Ok(9));
+assert_eq!(s.binary_search(&4),   Err(7));
+assert_eq!(s.binary_search(&100), Err(13));
+let r = s.binary_search(&1);
+assert!(match r { Ok(1..=4) => true, _ => false, });
+

If you want to find that whole range of matching items, rather than +an arbitrary matching one, that can be done using partition_point:

+ +
let s = [0, 1, 1, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55];
+
+let low = s.partition_point(|x| x < &1);
+assert_eq!(low, 1);
+let high = s.partition_point(|x| x <= &1);
+assert_eq!(high, 5);
+let r = s.binary_search(&1);
+assert!((low..high).contains(&r.unwrap()));
+
+assert!(s[..low].iter().all(|&x| x < 1));
+assert!(s[low..high].iter().all(|&x| x == 1));
+assert!(s[high..].iter().all(|&x| x > 1));
+
+// For something not found, the "range" of equal items is empty
+assert_eq!(s.partition_point(|x| x < &11), 9);
+assert_eq!(s.partition_point(|x| x <= &11), 9);
+assert_eq!(s.binary_search(&11), Err(9));
+

If you want to insert an item to a sorted vector, while maintaining +sort order, consider using partition_point:

+ +
let mut s = vec![0, 1, 1, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55];
+let num = 42;
+let idx = s.partition_point(|&x| x <= num);
+// If `num` is unique, `s.partition_point(|&x| x < num)` (with `<`) is equivalent to
+// `s.binary_search(&num).unwrap_or_else(|x| x)`, but using `<=` will allow `insert`
+// to shift less elements.
+s.insert(idx, num);
+assert_eq!(s, [0, 1, 1, 1, 1, 2, 3, 5, 8, 13, 21, 34, 42, 55]);
+
1.0.0 · source

pub fn binary_search_by<'a, F>(&'a self, f: F) -> Result<usize, usize>
where + F: FnMut(&'a T) -> Ordering,

Binary searches this slice with a comparator function.

+

The comparator function should return an order code that indicates +whether its argument is Less, Equal or Greater the desired +target. +If the slice is not sorted or if the comparator function does not +implement an order consistent with the sort order of the underlying +slice, the returned result is unspecified and meaningless.

+

If the value is found then Result::Ok is returned, containing the +index of the matching element. If there are multiple matches, then any +one of the matches could be returned. The index is chosen +deterministically, but is subject to change in future versions of Rust. +If the value is not found then Result::Err is returned, containing +the index where a matching element could be inserted while maintaining +sorted order.

+

See also binary_search, binary_search_by_key, and partition_point.

+
§Examples
+

Looks up a series of four elements. The first is found, with a +uniquely determined position; the second and third are not +found; the fourth could match any position in [1, 4].

+ +
let s = [0, 1, 1, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55];
+
+let seek = 13;
+assert_eq!(s.binary_search_by(|probe| probe.cmp(&seek)), Ok(9));
+let seek = 4;
+assert_eq!(s.binary_search_by(|probe| probe.cmp(&seek)), Err(7));
+let seek = 100;
+assert_eq!(s.binary_search_by(|probe| probe.cmp(&seek)), Err(13));
+let seek = 1;
+let r = s.binary_search_by(|probe| probe.cmp(&seek));
+assert!(match r { Ok(1..=4) => true, _ => false, });
+
1.10.0 · source

pub fn binary_search_by_key<'a, B, F>( + &'a self, + b: &B, + f: F, +) -> Result<usize, usize>
where + F: FnMut(&'a T) -> B, + B: Ord,

Binary searches this slice with a key extraction function.

+

Assumes that the slice is sorted by the key, for instance with +sort_by_key using the same key extraction function. +If the slice is not sorted by the key, the returned result is +unspecified and meaningless.

+

If the value is found then Result::Ok is returned, containing the +index of the matching element. If there are multiple matches, then any +one of the matches could be returned. The index is chosen +deterministically, but is subject to change in future versions of Rust. +If the value is not found then Result::Err is returned, containing +the index where a matching element could be inserted while maintaining +sorted order.

+

See also binary_search, binary_search_by, and partition_point.

+
§Examples
+

Looks up a series of four elements in a slice of pairs sorted by +their second elements. The first is found, with a uniquely +determined position; the second and third are not found; the +fourth could match any position in [1, 4].

+ +
let s = [(0, 0), (2, 1), (4, 1), (5, 1), (3, 1),
+         (1, 2), (2, 3), (4, 5), (5, 8), (3, 13),
+         (1, 21), (2, 34), (4, 55)];
+
+assert_eq!(s.binary_search_by_key(&13, |&(a, b)| b),  Ok(9));
+assert_eq!(s.binary_search_by_key(&4, |&(a, b)| b),   Err(7));
+assert_eq!(s.binary_search_by_key(&100, |&(a, b)| b), Err(13));
+let r = s.binary_search_by_key(&1, |&(a, b)| b);
+assert!(match r { Ok(1..=4) => true, _ => false, });
+
1.30.0 · source

pub unsafe fn align_to<U>(&self) -> (&[T], &[U], &[T])

Transmute the slice to a slice of another type, ensuring alignment of the types is +maintained.

+

This method splits the slice into three distinct slices: prefix, correctly aligned middle +slice of a new type, and the suffix slice. The middle part will be as big as possible under +the given alignment constraint and element size.

+

This method has no purpose when either input element T or output element U are +zero-sized and will return the original slice without splitting anything.

+
§Safety
+

This method is essentially a transmute with respect to the elements in the returned +middle slice, so all the usual caveats pertaining to transmute::<T, U> also apply here.

+
§Examples
+

Basic usage:

+ +
unsafe {
+    let bytes: [u8; 7] = [1, 2, 3, 4, 5, 6, 7];
+    let (prefix, shorts, suffix) = bytes.align_to::<u16>();
+    // less_efficient_algorithm_for_bytes(prefix);
+    // more_efficient_algorithm_for_aligned_shorts(shorts);
+    // less_efficient_algorithm_for_bytes(suffix);
+}
+
source

pub fn as_simd<const LANES: usize>(&self) -> (&[T], &[Simd<T, LANES>], &[T])
where + Simd<T, LANES>: AsRef<[T; LANES]>, + T: SimdElement, + LaneCount<LANES>: SupportedLaneCount,

🔬This is a nightly-only experimental API. (portable_simd)

Split a slice into a prefix, a middle of aligned SIMD types, and a suffix.

+

This is a safe wrapper around slice::align_to, so inherits the same +guarantees as that method.

+
§Panics
+

This will panic if the size of the SIMD type is different from +LANES times that of the scalar.

+

At the time of writing, the trait restrictions on Simd<T, LANES> keeps +that from ever happening, as only power-of-two numbers of lanes are +supported. It’s possible that, in the future, those restrictions might +be lifted in a way that would make it possible to see panics from this +method for something like LANES == 3.

+
§Examples
+
#![feature(portable_simd)]
+use core::simd::prelude::*;
+
+let short = &[1, 2, 3];
+let (prefix, middle, suffix) = short.as_simd::<4>();
+assert_eq!(middle, []); // Not enough elements for anything in the middle
+
+// They might be split in any possible way between prefix and suffix
+let it = prefix.iter().chain(suffix).copied();
+assert_eq!(it.collect::<Vec<_>>(), vec![1, 2, 3]);
+
+fn basic_simd_sum(x: &[f32]) -> f32 {
+    use std::ops::Add;
+    let (prefix, middle, suffix) = x.as_simd();
+    let sums = f32x4::from_array([
+        prefix.iter().copied().sum(),
+        0.0,
+        0.0,
+        suffix.iter().copied().sum(),
+    ]);
+    let sums = middle.iter().copied().fold(sums, f32x4::add);
+    sums.reduce_sum()
+}
+
+let numbers: Vec<f32> = (1..101).map(|x| x as _).collect();
+assert_eq!(basic_simd_sum(&numbers[1..99]), 4949.0);
+
source

pub fn is_sorted(&self) -> bool
where + T: PartialOrd,

🔬This is a nightly-only experimental API. (is_sorted)

Checks if the elements of this slice are sorted.

+

That is, for each element a and its following element b, a <= b must hold. If the +slice yields exactly zero or one element, true is returned.

+

Note that if Self::Item is only PartialOrd, but not Ord, the above definition +implies that this function returns false if any two consecutive items are not +comparable.

+
§Examples
+
#![feature(is_sorted)]
+let empty: [i32; 0] = [];
+
+assert!([1, 2, 2, 9].is_sorted());
+assert!(![1, 3, 2, 4].is_sorted());
+assert!([0].is_sorted());
+assert!(empty.is_sorted());
+assert!(![0.0, 1.0, f32::NAN].is_sorted());
+
source

pub fn is_sorted_by<'a, F>(&'a self, compare: F) -> bool
where + F: FnMut(&'a T, &'a T) -> bool,

🔬This is a nightly-only experimental API. (is_sorted)

Checks if the elements of this slice are sorted using the given comparator function.

+

Instead of using PartialOrd::partial_cmp, this function uses the given compare +function to determine whether two elements are to be considered in sorted order.

+
§Examples
+
#![feature(is_sorted)]
+
+assert!([1, 2, 2, 9].is_sorted_by(|a, b| a <= b));
+assert!(![1, 2, 2, 9].is_sorted_by(|a, b| a < b));
+
+assert!([0].is_sorted_by(|a, b| true));
+assert!([0].is_sorted_by(|a, b| false));
+
+let empty: [i32; 0] = [];
+assert!(empty.is_sorted_by(|a, b| false));
+assert!(empty.is_sorted_by(|a, b| true));
+
source

pub fn is_sorted_by_key<'a, F, K>(&'a self, f: F) -> bool
where + F: FnMut(&'a T) -> K, + K: PartialOrd,

🔬This is a nightly-only experimental API. (is_sorted)

Checks if the elements of this slice are sorted using the given key extraction function.

+

Instead of comparing the slice’s elements directly, this function compares the keys of the +elements, as determined by f. Apart from that, it’s equivalent to is_sorted; see its +documentation for more information.

+
§Examples
+
#![feature(is_sorted)]
+
+assert!(["c", "bb", "aaa"].is_sorted_by_key(|s| s.len()));
+assert!(![-2i32, -1, 0, 3].is_sorted_by_key(|n| n.abs()));
+
1.52.0 · source

pub fn partition_point<P>(&self, pred: P) -> usize
where + P: FnMut(&T) -> bool,

Returns the index of the partition point according to the given predicate +(the index of the first element of the second partition).

+

The slice is assumed to be partitioned according to the given predicate. +This means that all elements for which the predicate returns true are at the start of the slice +and all elements for which the predicate returns false are at the end. +For example, [7, 15, 3, 5, 4, 12, 6] is partitioned under the predicate x % 2 != 0 +(all odd numbers are at the start, all even at the end).

+

If this slice is not partitioned, the returned result is unspecified and meaningless, +as this method performs a kind of binary search.

+

See also binary_search, binary_search_by, and binary_search_by_key.

+
§Examples
+
let v = [1, 2, 3, 3, 5, 6, 7];
+let i = v.partition_point(|&x| x < 5);
+
+assert_eq!(i, 4);
+assert!(v[..i].iter().all(|&x| x < 5));
+assert!(v[i..].iter().all(|&x| !(x < 5)));
+

If all elements of the slice match the predicate, including if the slice +is empty, then the length of the slice will be returned:

+ +
let a = [2, 4, 8];
+assert_eq!(a.partition_point(|x| x < &100), a.len());
+let a: [i32; 0] = [];
+assert_eq!(a.partition_point(|x| x < &100), 0);
+

If you want to insert an item to a sorted vector, while maintaining +sort order:

+ +
let mut s = vec![0, 1, 1, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55];
+let num = 42;
+let idx = s.partition_point(|&x| x <= num);
+s.insert(idx, num);
+assert_eq!(s, [0, 1, 1, 1, 1, 2, 3, 5, 8, 13, 21, 34, 42, 55]);
+
1.23.0 · source

pub fn to_ascii_uppercase(&self) -> Vec<u8>

Returns a vector containing a copy of this slice where each byte +is mapped to its ASCII upper case equivalent.

+

ASCII letters ‘a’ to ‘z’ are mapped to ‘A’ to ‘Z’, +but non-ASCII letters are unchanged.

+

To uppercase the value in-place, use make_ascii_uppercase.

+
1.23.0 · source

pub fn to_ascii_lowercase(&self) -> Vec<u8>

Returns a vector containing a copy of this slice where each byte +is mapped to its ASCII lower case equivalent.

+

ASCII letters ‘A’ to ‘Z’ are mapped to ‘a’ to ‘z’, +but non-ASCII letters are unchanged.

+

To lowercase the value in-place, use make_ascii_lowercase.

+
1.0.0 · source

pub fn to_vec(&self) -> Vec<T>
where + T: Clone,

Copies self into a new Vec.

+
§Examples
+
let s = [10, 40, 30];
+let x = s.to_vec();
+// Here, `s` and `x` can be modified independently.
+
source

pub fn to_vec_in<A>(&self, alloc: A) -> Vec<T, A>
where + A: Allocator, + T: Clone,

🔬This is a nightly-only experimental API. (allocator_api)

Copies self into a new Vec with an allocator.

+
§Examples
+
#![feature(allocator_api)]
+
+use std::alloc::System;
+
+let s = [10, 40, 30];
+let x = s.to_vec_in(System);
+// Here, `s` and `x` can be modified independently.
+
1.40.0 · source

pub fn repeat(&self, n: usize) -> Vec<T>
where + T: Copy,

Creates a vector by copying a slice n times.

+
§Panics
+

This function will panic if the capacity would overflow.

+
§Examples
+

Basic usage:

+ +
assert_eq!([1, 2].repeat(3), vec![1, 2, 1, 2, 1, 2]);
+

A panic upon overflow:

+ +
// this will panic at runtime
+b"0123456789abcdef".repeat(usize::MAX);
+
1.0.0 · source

pub fn concat<Item>(&self) -> <[T] as Concat<Item>>::Output
where + [T]: Concat<Item>, + Item: ?Sized,

Flattens a slice of T into a single value Self::Output.

+
§Examples
+
assert_eq!(["hello", "world"].concat(), "helloworld");
+assert_eq!([[1, 2], [3, 4]].concat(), [1, 2, 3, 4]);
+
1.3.0 · source

pub fn join<Separator>( + &self, + sep: Separator, +) -> <[T] as Join<Separator>>::Output
where + [T]: Join<Separator>,

Flattens a slice of T into a single value Self::Output, placing a +given separator between each.

+
§Examples
+
assert_eq!(["hello", "world"].join(" "), "hello world");
+assert_eq!([[1, 2], [3, 4]].join(&0), [1, 2, 0, 3, 4]);
+assert_eq!([[1, 2], [3, 4]].join(&[0, 0][..]), [1, 2, 0, 0, 3, 4]);
+
1.0.0 · source

pub fn connect<Separator>( + &self, + sep: Separator, +) -> <[T] as Join<Separator>>::Output
where + [T]: Join<Separator>,

👎Deprecated since 1.3.0: renamed to join

Flattens a slice of T into a single value Self::Output, placing a +given separator between each.

+
§Examples
+
assert_eq!(["hello", "world"].connect(" "), "hello world");
+assert_eq!([[1, 2], [3, 4]].connect(&0), [1, 2, 0, 3, 4]);
+

Trait Implementations§

source§

impl Clone for SerializedCallRequests

source§

fn clone(&self) -> SerializedCallRequests

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for SerializedCallRequests

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Default for SerializedCallRequests

source§

fn default() -> SerializedCallRequests

Returns the “default value” for a type. Read more
source§

impl Deref for SerializedCallRequests

§

type Target = [u8]

The resulting type after dereferencing.
source§

fn deref(&self) -> &Self::Target

Dereferences the value.
source§

impl<'de> Deserialize<'de> for SerializedCallRequests

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl From<SerializedCallRequests> for Vec<u8>

source§

fn from(value: SerializedCallRequests) -> Self

Converts to this type from the input type.
source§

impl From<Vec<u8>> for SerializedCallRequests

source§

fn from(value: Vec<u8>) -> Self

Converts to this type from the input type.
source§

impl Hash for SerializedCallRequests

source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
source§

impl PartialEq for SerializedCallRequests

source§

fn eq(&self, other: &SerializedCallRequests) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl Serialize for SerializedCallRequests

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Eq for SerializedCallRequests

source§

impl StructuralPartialEq for SerializedCallRequests

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CallHasher for T
where + T: Hash + ?Sized,

§

default fn get_hash<H, B>(value: &H, build_hasher: &B) -> u64
where + H: Hash + ?Sized, + B: BuildHasher,

source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_interpreter_interface/struct.SerializedCallResults.html b/air_interpreter_interface/struct.SerializedCallResults.html new file mode 100644 index 00000000..11c55ab9 --- /dev/null +++ b/air_interpreter_interface/struct.SerializedCallResults.html @@ -0,0 +1,1116 @@ +SerializedCallResults in air_interpreter_interface - Rust
pub struct SerializedCallResults { /* private fields */ }

Methods from Deref<Target = [u8]>§

1.80.0 · source

pub fn as_flattened(&self) -> &[T]

Takes a &[[T; N]], and flattens it to a &[T].

+
§Panics
+

This panics if the length of the resulting slice would overflow a usize.

+

This is only possible when flattening a slice of arrays of zero-sized +types, and thus tends to be irrelevant in practice. If +size_of::<T>() > 0, this will never panic.

+
§Examples
+
assert_eq!([[1, 2, 3], [4, 5, 6]].as_flattened(), &[1, 2, 3, 4, 5, 6]);
+
+assert_eq!(
+    [[1, 2, 3], [4, 5, 6]].as_flattened(),
+    [[1, 2], [3, 4], [5, 6]].as_flattened(),
+);
+
+let slice_of_empty_arrays: &[[i32; 0]] = &[[], [], [], [], []];
+assert!(slice_of_empty_arrays.as_flattened().is_empty());
+
+let empty_slice_of_arrays: &[[u32; 10]] = &[];
+assert!(empty_slice_of_arrays.as_flattened().is_empty());
+
source

pub fn as_str(&self) -> &str

🔬This is a nightly-only experimental API. (ascii_char)

Views this slice of ASCII characters as a UTF-8 str.

+
source

pub fn as_bytes(&self) -> &[u8]

🔬This is a nightly-only experimental API. (ascii_char)

Views this slice of ASCII characters as a slice of u8 bytes.

+
1.79.0 · source

pub fn utf8_chunks(&self) -> Utf8Chunks<'_>

Creates an iterator over the contiguous valid UTF-8 ranges of this +slice, and the non-UTF-8 fragments in between.

+
§Examples
+

This function formats arbitrary but mostly-UTF-8 bytes into Rust source +code in the form of a C-string literal (c"...").

+ +
use std::fmt::Write as _;
+
+pub fn cstr_literal(bytes: &[u8]) -> String {
+    let mut repr = String::new();
+    repr.push_str("c\"");
+    for chunk in bytes.utf8_chunks() {
+        for ch in chunk.valid().chars() {
+            // Escapes \0, \t, \r, \n, \\, \', \", and uses \u{...} for non-printable characters.
+            write!(repr, "{}", ch.escape_debug()).unwrap();
+        }
+        for byte in chunk.invalid() {
+            write!(repr, "\\x{:02X}", byte).unwrap();
+        }
+    }
+    repr.push('"');
+    repr
+}
+
+fn main() {
+    let lit = cstr_literal(b"\xferris the \xf0\x9f\xa6\x80\x07");
+    let expected = stringify!(c"\xFErris the 🦀\u{7}");
+    assert_eq!(lit, expected);
+}
+
1.23.0 · source

pub fn is_ascii(&self) -> bool

Checks if all bytes in this slice are within the ASCII range.

+
source

pub fn as_ascii(&self) -> Option<&[AsciiChar]>

🔬This is a nightly-only experimental API. (ascii_char)

If this slice is_ascii, returns it as a slice of +ASCII characters, otherwise returns None.

+
source

pub unsafe fn as_ascii_unchecked(&self) -> &[AsciiChar]

🔬This is a nightly-only experimental API. (ascii_char)

Converts this slice of bytes into a slice of ASCII characters, +without checking whether they’re valid.

+
§Safety
+

Every byte in the slice must be in 0..=127, or else this is UB.

+
1.23.0 · source

pub fn eq_ignore_ascii_case(&self, other: &[u8]) -> bool

Checks that two slices are an ASCII case-insensitive match.

+

Same as to_ascii_lowercase(a) == to_ascii_lowercase(b), +but without allocating and copying temporaries.

+
1.60.0 · source

pub fn escape_ascii(&self) -> EscapeAscii<'_>

Returns an iterator that produces an escaped version of this slice, +treating it as an ASCII string.

+
§Examples
+

+let s = b"0\t\r\n'\"\\\x9d";
+let escaped = s.escape_ascii().to_string();
+assert_eq!(escaped, "0\\t\\r\\n\\'\\\"\\\\\\x9d");
+
1.80.0 · source

pub fn trim_ascii_start(&self) -> &[u8]

Returns a byte slice with leading ASCII whitespace bytes removed.

+

‘Whitespace’ refers to the definition used by +u8::is_ascii_whitespace.

+
§Examples
+
assert_eq!(b" \t hello world\n".trim_ascii_start(), b"hello world\n");
+assert_eq!(b"  ".trim_ascii_start(), b"");
+assert_eq!(b"".trim_ascii_start(), b"");
+
1.80.0 · source

pub fn trim_ascii_end(&self) -> &[u8]

Returns a byte slice with trailing ASCII whitespace bytes removed.

+

‘Whitespace’ refers to the definition used by +u8::is_ascii_whitespace.

+
§Examples
+
assert_eq!(b"\r hello world\n ".trim_ascii_end(), b"\r hello world");
+assert_eq!(b"  ".trim_ascii_end(), b"");
+assert_eq!(b"".trim_ascii_end(), b"");
+
1.80.0 · source

pub fn trim_ascii(&self) -> &[u8]

Returns a byte slice with leading and trailing ASCII whitespace bytes +removed.

+

‘Whitespace’ refers to the definition used by +u8::is_ascii_whitespace.

+
§Examples
+
assert_eq!(b"\r hello world\n ".trim_ascii(), b"hello world");
+assert_eq!(b"  ".trim_ascii(), b"");
+assert_eq!(b"".trim_ascii(), b"");
+
1.0.0 · source

pub fn len(&self) -> usize

Returns the number of elements in the slice.

+
§Examples
+
let a = [1, 2, 3];
+assert_eq!(a.len(), 3);
+
1.0.0 · source

pub fn is_empty(&self) -> bool

Returns true if the slice has a length of 0.

+
§Examples
+
let a = [1, 2, 3];
+assert!(!a.is_empty());
+
+let b: &[i32] = &[];
+assert!(b.is_empty());
+
1.0.0 · source

pub fn first(&self) -> Option<&T>

Returns the first element of the slice, or None if it is empty.

+
§Examples
+
let v = [10, 40, 30];
+assert_eq!(Some(&10), v.first());
+
+let w: &[i32] = &[];
+assert_eq!(None, w.first());
+
1.5.0 · source

pub fn split_first(&self) -> Option<(&T, &[T])>

Returns the first and all the rest of the elements of the slice, or None if it is empty.

+
§Examples
+
let x = &[0, 1, 2];
+
+if let Some((first, elements)) = x.split_first() {
+    assert_eq!(first, &0);
+    assert_eq!(elements, &[1, 2]);
+}
+
1.5.0 · source

pub fn split_last(&self) -> Option<(&T, &[T])>

Returns the last and all the rest of the elements of the slice, or None if it is empty.

+
§Examples
+
let x = &[0, 1, 2];
+
+if let Some((last, elements)) = x.split_last() {
+    assert_eq!(last, &2);
+    assert_eq!(elements, &[0, 1]);
+}
+
1.0.0 · source

pub fn last(&self) -> Option<&T>

Returns the last element of the slice, or None if it is empty.

+
§Examples
+
let v = [10, 40, 30];
+assert_eq!(Some(&30), v.last());
+
+let w: &[i32] = &[];
+assert_eq!(None, w.last());
+
1.77.0 · source

pub fn first_chunk<const N: usize>(&self) -> Option<&[T; N]>

Return an array reference to the first N items in the slice.

+

If the slice is not at least N in length, this will return None.

+
§Examples
+
let u = [10, 40, 30];
+assert_eq!(Some(&[10, 40]), u.first_chunk::<2>());
+
+let v: &[i32] = &[10];
+assert_eq!(None, v.first_chunk::<2>());
+
+let w: &[i32] = &[];
+assert_eq!(Some(&[]), w.first_chunk::<0>());
+
1.77.0 · source

pub fn split_first_chunk<const N: usize>(&self) -> Option<(&[T; N], &[T])>

Return an array reference to the first N items in the slice and the remaining slice.

+

If the slice is not at least N in length, this will return None.

+
§Examples
+
let x = &[0, 1, 2];
+
+if let Some((first, elements)) = x.split_first_chunk::<2>() {
+    assert_eq!(first, &[0, 1]);
+    assert_eq!(elements, &[2]);
+}
+
+assert_eq!(None, x.split_first_chunk::<4>());
+
1.77.0 · source

pub fn split_last_chunk<const N: usize>(&self) -> Option<(&[T], &[T; N])>

Return an array reference to the last N items in the slice and the remaining slice.

+

If the slice is not at least N in length, this will return None.

+
§Examples
+
let x = &[0, 1, 2];
+
+if let Some((elements, last)) = x.split_last_chunk::<2>() {
+    assert_eq!(elements, &[0]);
+    assert_eq!(last, &[1, 2]);
+}
+
+assert_eq!(None, x.split_last_chunk::<4>());
+
1.77.0 · source

pub fn last_chunk<const N: usize>(&self) -> Option<&[T; N]>

Return an array reference to the last N items in the slice.

+

If the slice is not at least N in length, this will return None.

+
§Examples
+
let u = [10, 40, 30];
+assert_eq!(Some(&[40, 30]), u.last_chunk::<2>());
+
+let v: &[i32] = &[10];
+assert_eq!(None, v.last_chunk::<2>());
+
+let w: &[i32] = &[];
+assert_eq!(Some(&[]), w.last_chunk::<0>());
+
1.0.0 · source

pub fn get<I>(&self, index: I) -> Option<&<I as SliceIndex<[T]>>::Output>
where + I: SliceIndex<[T]>,

Returns a reference to an element or subslice depending on the type of +index.

+
    +
  • If given a position, returns a reference to the element at that +position or None if out of bounds.
  • +
  • If given a range, returns the subslice corresponding to that range, +or None if out of bounds.
  • +
+
§Examples
+
let v = [10, 40, 30];
+assert_eq!(Some(&40), v.get(1));
+assert_eq!(Some(&[10, 40][..]), v.get(0..2));
+assert_eq!(None, v.get(3));
+assert_eq!(None, v.get(0..4));
+
1.0.0 · source

pub unsafe fn get_unchecked<I>( + &self, + index: I, +) -> &<I as SliceIndex<[T]>>::Output
where + I: SliceIndex<[T]>,

Returns a reference to an element or subslice, without doing bounds +checking.

+

For a safe alternative see get.

+
§Safety
+

Calling this method with an out-of-bounds index is undefined behavior +even if the resulting reference is not used.

+

You can think of this like .get(index).unwrap_unchecked(). It’s UB +to call .get_unchecked(len), even if you immediately convert to a +pointer. And it’s UB to call .get_unchecked(..len + 1), +.get_unchecked(..=len), or similar.

+
§Examples
+
let x = &[1, 2, 4];
+
+unsafe {
+    assert_eq!(x.get_unchecked(1), &2);
+}
+
1.0.0 · source

pub fn as_ptr(&self) -> *const T

Returns a raw pointer to the slice’s buffer.

+

The caller must ensure that the slice outlives the pointer this +function returns, or else it will end up pointing to garbage.

+

The caller must also ensure that the memory the pointer (non-transitively) points to +is never written to (except inside an UnsafeCell) using this pointer or any pointer +derived from it. If you need to mutate the contents of the slice, use as_mut_ptr.

+

Modifying the container referenced by this slice may cause its buffer +to be reallocated, which would also make any pointers to it invalid.

+
§Examples
+
let x = &[1, 2, 4];
+let x_ptr = x.as_ptr();
+
+unsafe {
+    for i in 0..x.len() {
+        assert_eq!(x.get_unchecked(i), &*x_ptr.add(i));
+    }
+}
+
1.48.0 · source

pub fn as_ptr_range(&self) -> Range<*const T>

Returns the two raw pointers spanning the slice.

+

The returned range is half-open, which means that the end pointer +points one past the last element of the slice. This way, an empty +slice is represented by two equal pointers, and the difference between +the two pointers represents the size of the slice.

+

See as_ptr for warnings on using these pointers. The end pointer +requires extra caution, as it does not point to a valid element in the +slice.

+

This function is useful for interacting with foreign interfaces which +use two pointers to refer to a range of elements in memory, as is +common in C++.

+

It can also be useful to check if a pointer to an element refers to an +element of this slice:

+ +
let a = [1, 2, 3];
+let x = &a[1] as *const _;
+let y = &5 as *const _;
+
+assert!(a.as_ptr_range().contains(&x));
+assert!(!a.as_ptr_range().contains(&y));
+
1.0.0 · source

pub fn iter(&self) -> Iter<'_, T>

Returns an iterator over the slice.

+

The iterator yields all items from start to end.

+
§Examples
+
let x = &[1, 2, 4];
+let mut iterator = x.iter();
+
+assert_eq!(iterator.next(), Some(&1));
+assert_eq!(iterator.next(), Some(&2));
+assert_eq!(iterator.next(), Some(&4));
+assert_eq!(iterator.next(), None);
+
1.0.0 · source

pub fn windows(&self, size: usize) -> Windows<'_, T>

Returns an iterator over all contiguous windows of length +size. The windows overlap. If the slice is shorter than +size, the iterator returns no values.

+
§Panics
+

Panics if size is 0.

+
§Examples
+
let slice = ['l', 'o', 'r', 'e', 'm'];
+let mut iter = slice.windows(3);
+assert_eq!(iter.next().unwrap(), &['l', 'o', 'r']);
+assert_eq!(iter.next().unwrap(), &['o', 'r', 'e']);
+assert_eq!(iter.next().unwrap(), &['r', 'e', 'm']);
+assert!(iter.next().is_none());
+

If the slice is shorter than size:

+ +
let slice = ['f', 'o', 'o'];
+let mut iter = slice.windows(4);
+assert!(iter.next().is_none());
+

There’s no windows_mut, as that existing would let safe code violate the +“only one &mut at a time to the same thing” rule. However, you can sometimes +use Cell::as_slice_of_cells in +conjunction with windows to accomplish something similar:

+ +
use std::cell::Cell;
+
+let mut array = ['R', 'u', 's', 't', ' ', '2', '0', '1', '5'];
+let slice = &mut array[..];
+let slice_of_cells: &[Cell<char>] = Cell::from_mut(slice).as_slice_of_cells();
+for w in slice_of_cells.windows(3) {
+    Cell::swap(&w[0], &w[2]);
+}
+assert_eq!(array, ['s', 't', ' ', '2', '0', '1', '5', 'u', 'R']);
+
1.0.0 · source

pub fn chunks(&self, chunk_size: usize) -> Chunks<'_, T>

Returns an iterator over chunk_size elements of the slice at a time, starting at the +beginning of the slice.

+

The chunks are slices and do not overlap. If chunk_size does not divide the length of the +slice, then the last chunk will not have length chunk_size.

+

See chunks_exact for a variant of this iterator that returns chunks of always exactly +chunk_size elements, and rchunks for the same iterator but starting at the end of the +slice.

+
§Panics
+

Panics if chunk_size is 0.

+
§Examples
+
let slice = ['l', 'o', 'r', 'e', 'm'];
+let mut iter = slice.chunks(2);
+assert_eq!(iter.next().unwrap(), &['l', 'o']);
+assert_eq!(iter.next().unwrap(), &['r', 'e']);
+assert_eq!(iter.next().unwrap(), &['m']);
+assert!(iter.next().is_none());
+
1.31.0 · source

pub fn chunks_exact(&self, chunk_size: usize) -> ChunksExact<'_, T>

Returns an iterator over chunk_size elements of the slice at a time, starting at the +beginning of the slice.

+

The chunks are slices and do not overlap. If chunk_size does not divide the length of the +slice, then the last up to chunk_size-1 elements will be omitted and can be retrieved +from the remainder function of the iterator.

+

Due to each chunk having exactly chunk_size elements, the compiler can often optimize the +resulting code better than in the case of chunks.

+

See chunks for a variant of this iterator that also returns the remainder as a smaller +chunk, and rchunks_exact for the same iterator but starting at the end of the slice.

+
§Panics
+

Panics if chunk_size is 0.

+
§Examples
+
let slice = ['l', 'o', 'r', 'e', 'm'];
+let mut iter = slice.chunks_exact(2);
+assert_eq!(iter.next().unwrap(), &['l', 'o']);
+assert_eq!(iter.next().unwrap(), &['r', 'e']);
+assert!(iter.next().is_none());
+assert_eq!(iter.remainder(), &['m']);
+
source

pub unsafe fn as_chunks_unchecked<const N: usize>(&self) -> &[[T; N]]

🔬This is a nightly-only experimental API. (slice_as_chunks)

Splits the slice into a slice of N-element arrays, +assuming that there’s no remainder.

+
§Safety
+

This may only be called when

+
    +
  • The slice splits exactly into N-element chunks (aka self.len() % N == 0).
  • +
  • N != 0.
  • +
+
§Examples
+
#![feature(slice_as_chunks)]
+let slice: &[char] = &['l', 'o', 'r', 'e', 'm', '!'];
+let chunks: &[[char; 1]] =
+    // SAFETY: 1-element chunks never have remainder
+    unsafe { slice.as_chunks_unchecked() };
+assert_eq!(chunks, &[['l'], ['o'], ['r'], ['e'], ['m'], ['!']]);
+let chunks: &[[char; 3]] =
+    // SAFETY: The slice length (6) is a multiple of 3
+    unsafe { slice.as_chunks_unchecked() };
+assert_eq!(chunks, &[['l', 'o', 'r'], ['e', 'm', '!']]);
+
+// These would be unsound:
+// let chunks: &[[_; 5]] = slice.as_chunks_unchecked() // The slice length is not a multiple of 5
+// let chunks: &[[_; 0]] = slice.as_chunks_unchecked() // Zero-length chunks are never allowed
+
source

pub fn as_chunks<const N: usize>(&self) -> (&[[T; N]], &[T])

🔬This is a nightly-only experimental API. (slice_as_chunks)

Splits the slice into a slice of N-element arrays, +starting at the beginning of the slice, +and a remainder slice with length strictly less than N.

+
§Panics
+

Panics if N is 0. This check will most probably get changed to a compile time +error before this method gets stabilized.

+
§Examples
+
#![feature(slice_as_chunks)]
+let slice = ['l', 'o', 'r', 'e', 'm'];
+let (chunks, remainder) = slice.as_chunks();
+assert_eq!(chunks, &[['l', 'o'], ['r', 'e']]);
+assert_eq!(remainder, &['m']);
+

If you expect the slice to be an exact multiple, you can combine +let-else with an empty slice pattern:

+ +
#![feature(slice_as_chunks)]
+let slice = ['R', 'u', 's', 't'];
+let (chunks, []) = slice.as_chunks::<2>() else {
+    panic!("slice didn't have even length")
+};
+assert_eq!(chunks, &[['R', 'u'], ['s', 't']]);
+
source

pub fn as_rchunks<const N: usize>(&self) -> (&[T], &[[T; N]])

🔬This is a nightly-only experimental API. (slice_as_chunks)

Splits the slice into a slice of N-element arrays, +starting at the end of the slice, +and a remainder slice with length strictly less than N.

+
§Panics
+

Panics if N is 0. This check will most probably get changed to a compile time +error before this method gets stabilized.

+
§Examples
+
#![feature(slice_as_chunks)]
+let slice = ['l', 'o', 'r', 'e', 'm'];
+let (remainder, chunks) = slice.as_rchunks();
+assert_eq!(remainder, &['l']);
+assert_eq!(chunks, &[['o', 'r'], ['e', 'm']]);
+
source

pub fn array_chunks<const N: usize>(&self) -> ArrayChunks<'_, T, N>

🔬This is a nightly-only experimental API. (array_chunks)

Returns an iterator over N elements of the slice at a time, starting at the +beginning of the slice.

+

The chunks are array references and do not overlap. If N does not divide the +length of the slice, then the last up to N-1 elements will be omitted and can be +retrieved from the remainder function of the iterator.

+

This method is the const generic equivalent of chunks_exact.

+
§Panics
+

Panics if N is 0. This check will most probably get changed to a compile time +error before this method gets stabilized.

+
§Examples
+
#![feature(array_chunks)]
+let slice = ['l', 'o', 'r', 'e', 'm'];
+let mut iter = slice.array_chunks();
+assert_eq!(iter.next().unwrap(), &['l', 'o']);
+assert_eq!(iter.next().unwrap(), &['r', 'e']);
+assert!(iter.next().is_none());
+assert_eq!(iter.remainder(), &['m']);
+
source

pub fn array_windows<const N: usize>(&self) -> ArrayWindows<'_, T, N>

🔬This is a nightly-only experimental API. (array_windows)

Returns an iterator over overlapping windows of N elements of a slice, +starting at the beginning of the slice.

+

This is the const generic equivalent of windows.

+

If N is greater than the size of the slice, it will return no windows.

+
§Panics
+

Panics if N is 0. This check will most probably get changed to a compile time +error before this method gets stabilized.

+
§Examples
+
#![feature(array_windows)]
+let slice = [0, 1, 2, 3];
+let mut iter = slice.array_windows();
+assert_eq!(iter.next().unwrap(), &[0, 1]);
+assert_eq!(iter.next().unwrap(), &[1, 2]);
+assert_eq!(iter.next().unwrap(), &[2, 3]);
+assert!(iter.next().is_none());
+
1.31.0 · source

pub fn rchunks(&self, chunk_size: usize) -> RChunks<'_, T>

Returns an iterator over chunk_size elements of the slice at a time, starting at the end +of the slice.

+

The chunks are slices and do not overlap. If chunk_size does not divide the length of the +slice, then the last chunk will not have length chunk_size.

+

See rchunks_exact for a variant of this iterator that returns chunks of always exactly +chunk_size elements, and chunks for the same iterator but starting at the beginning +of the slice.

+
§Panics
+

Panics if chunk_size is 0.

+
§Examples
+
let slice = ['l', 'o', 'r', 'e', 'm'];
+let mut iter = slice.rchunks(2);
+assert_eq!(iter.next().unwrap(), &['e', 'm']);
+assert_eq!(iter.next().unwrap(), &['o', 'r']);
+assert_eq!(iter.next().unwrap(), &['l']);
+assert!(iter.next().is_none());
+
1.31.0 · source

pub fn rchunks_exact(&self, chunk_size: usize) -> RChunksExact<'_, T>

Returns an iterator over chunk_size elements of the slice at a time, starting at the +end of the slice.

+

The chunks are slices and do not overlap. If chunk_size does not divide the length of the +slice, then the last up to chunk_size-1 elements will be omitted and can be retrieved +from the remainder function of the iterator.

+

Due to each chunk having exactly chunk_size elements, the compiler can often optimize the +resulting code better than in the case of rchunks.

+

See rchunks for a variant of this iterator that also returns the remainder as a smaller +chunk, and chunks_exact for the same iterator but starting at the beginning of the +slice.

+
§Panics
+

Panics if chunk_size is 0.

+
§Examples
+
let slice = ['l', 'o', 'r', 'e', 'm'];
+let mut iter = slice.rchunks_exact(2);
+assert_eq!(iter.next().unwrap(), &['e', 'm']);
+assert_eq!(iter.next().unwrap(), &['o', 'r']);
+assert!(iter.next().is_none());
+assert_eq!(iter.remainder(), &['l']);
+
1.77.0 · source

pub fn chunk_by<F>(&self, pred: F) -> ChunkBy<'_, T, F>
where + F: FnMut(&T, &T) -> bool,

Returns an iterator over the slice producing non-overlapping runs +of elements using the predicate to separate them.

+

The predicate is called for every pair of consecutive elements, +meaning that it is called on slice[0] and slice[1], +followed by slice[1] and slice[2], and so on.

+
§Examples
+
let slice = &[1, 1, 1, 3, 3, 2, 2, 2];
+
+let mut iter = slice.chunk_by(|a, b| a == b);
+
+assert_eq!(iter.next(), Some(&[1, 1, 1][..]));
+assert_eq!(iter.next(), Some(&[3, 3][..]));
+assert_eq!(iter.next(), Some(&[2, 2, 2][..]));
+assert_eq!(iter.next(), None);
+

This method can be used to extract the sorted subslices:

+ +
let slice = &[1, 1, 2, 3, 2, 3, 2, 3, 4];
+
+let mut iter = slice.chunk_by(|a, b| a <= b);
+
+assert_eq!(iter.next(), Some(&[1, 1, 2, 3][..]));
+assert_eq!(iter.next(), Some(&[2, 3][..]));
+assert_eq!(iter.next(), Some(&[2, 3, 4][..]));
+assert_eq!(iter.next(), None);
+
1.0.0 · source

pub fn split_at(&self, mid: usize) -> (&[T], &[T])

Divides one slice into two at an index.

+

The first will contain all indices from [0, mid) (excluding +the index mid itself) and the second will contain all +indices from [mid, len) (excluding the index len itself).

+
§Panics
+

Panics if mid > len. For a non-panicking alternative see +split_at_checked.

+
§Examples
+
let v = [1, 2, 3, 4, 5, 6];
+
+{
+   let (left, right) = v.split_at(0);
+   assert_eq!(left, []);
+   assert_eq!(right, [1, 2, 3, 4, 5, 6]);
+}
+
+{
+    let (left, right) = v.split_at(2);
+    assert_eq!(left, [1, 2]);
+    assert_eq!(right, [3, 4, 5, 6]);
+}
+
+{
+    let (left, right) = v.split_at(6);
+    assert_eq!(left, [1, 2, 3, 4, 5, 6]);
+    assert_eq!(right, []);
+}
+
1.79.0 · source

pub unsafe fn split_at_unchecked(&self, mid: usize) -> (&[T], &[T])

Divides one slice into two at an index, without doing bounds checking.

+

The first will contain all indices from [0, mid) (excluding +the index mid itself) and the second will contain all +indices from [mid, len) (excluding the index len itself).

+

For a safe alternative see split_at.

+
§Safety
+

Calling this method with an out-of-bounds index is undefined behavior +even if the resulting reference is not used. The caller has to ensure that +0 <= mid <= self.len().

+
§Examples
+
let v = [1, 2, 3, 4, 5, 6];
+
+unsafe {
+   let (left, right) = v.split_at_unchecked(0);
+   assert_eq!(left, []);
+   assert_eq!(right, [1, 2, 3, 4, 5, 6]);
+}
+
+unsafe {
+    let (left, right) = v.split_at_unchecked(2);
+    assert_eq!(left, [1, 2]);
+    assert_eq!(right, [3, 4, 5, 6]);
+}
+
+unsafe {
+    let (left, right) = v.split_at_unchecked(6);
+    assert_eq!(left, [1, 2, 3, 4, 5, 6]);
+    assert_eq!(right, []);
+}
+
1.80.0 · source

pub fn split_at_checked(&self, mid: usize) -> Option<(&[T], &[T])>

Divides one slice into two at an index, returning None if the slice is +too short.

+

If mid ≤ len returns a pair of slices where the first will contain all +indices from [0, mid) (excluding the index mid itself) and the +second will contain all indices from [mid, len) (excluding the index +len itself).

+

Otherwise, if mid > len, returns None.

+
§Examples
+
let v = [1, -2, 3, -4, 5, -6];
+
+{
+   let (left, right) = v.split_at_checked(0).unwrap();
+   assert_eq!(left, []);
+   assert_eq!(right, [1, -2, 3, -4, 5, -6]);
+}
+
+{
+    let (left, right) = v.split_at_checked(2).unwrap();
+    assert_eq!(left, [1, -2]);
+    assert_eq!(right, [3, -4, 5, -6]);
+}
+
+{
+    let (left, right) = v.split_at_checked(6).unwrap();
+    assert_eq!(left, [1, -2, 3, -4, 5, -6]);
+    assert_eq!(right, []);
+}
+
+assert_eq!(None, v.split_at_checked(7));
+
1.0.0 · source

pub fn split<F>(&self, pred: F) -> Split<'_, T, F>
where + F: FnMut(&T) -> bool,

Returns an iterator over subslices separated by elements that match +pred. The matched element is not contained in the subslices.

+
§Examples
+
let slice = [10, 40, 33, 20];
+let mut iter = slice.split(|num| num % 3 == 0);
+
+assert_eq!(iter.next().unwrap(), &[10, 40]);
+assert_eq!(iter.next().unwrap(), &[20]);
+assert!(iter.next().is_none());
+

If the first element is matched, an empty slice will be the first item +returned by the iterator. Similarly, if the last element in the slice +is matched, an empty slice will be the last item returned by the +iterator:

+ +
let slice = [10, 40, 33];
+let mut iter = slice.split(|num| num % 3 == 0);
+
+assert_eq!(iter.next().unwrap(), &[10, 40]);
+assert_eq!(iter.next().unwrap(), &[]);
+assert!(iter.next().is_none());
+

If two matched elements are directly adjacent, an empty slice will be +present between them:

+ +
let slice = [10, 6, 33, 20];
+let mut iter = slice.split(|num| num % 3 == 0);
+
+assert_eq!(iter.next().unwrap(), &[10]);
+assert_eq!(iter.next().unwrap(), &[]);
+assert_eq!(iter.next().unwrap(), &[20]);
+assert!(iter.next().is_none());
+
1.51.0 · source

pub fn split_inclusive<F>(&self, pred: F) -> SplitInclusive<'_, T, F>
where + F: FnMut(&T) -> bool,

Returns an iterator over subslices separated by elements that match +pred. The matched element is contained in the end of the previous +subslice as a terminator.

+
§Examples
+
let slice = [10, 40, 33, 20];
+let mut iter = slice.split_inclusive(|num| num % 3 == 0);
+
+assert_eq!(iter.next().unwrap(), &[10, 40, 33]);
+assert_eq!(iter.next().unwrap(), &[20]);
+assert!(iter.next().is_none());
+

If the last element of the slice is matched, +that element will be considered the terminator of the preceding slice. +That slice will be the last item returned by the iterator.

+ +
let slice = [3, 10, 40, 33];
+let mut iter = slice.split_inclusive(|num| num % 3 == 0);
+
+assert_eq!(iter.next().unwrap(), &[3]);
+assert_eq!(iter.next().unwrap(), &[10, 40, 33]);
+assert!(iter.next().is_none());
+
1.27.0 · source

pub fn rsplit<F>(&self, pred: F) -> RSplit<'_, T, F>
where + F: FnMut(&T) -> bool,

Returns an iterator over subslices separated by elements that match +pred, starting at the end of the slice and working backwards. +The matched element is not contained in the subslices.

+
§Examples
+
let slice = [11, 22, 33, 0, 44, 55];
+let mut iter = slice.rsplit(|num| *num == 0);
+
+assert_eq!(iter.next().unwrap(), &[44, 55]);
+assert_eq!(iter.next().unwrap(), &[11, 22, 33]);
+assert_eq!(iter.next(), None);
+

As with split(), if the first or last element is matched, an empty +slice will be the first (or last) item returned by the iterator.

+ +
let v = &[0, 1, 1, 2, 3, 5, 8];
+let mut it = v.rsplit(|n| *n % 2 == 0);
+assert_eq!(it.next().unwrap(), &[]);
+assert_eq!(it.next().unwrap(), &[3, 5]);
+assert_eq!(it.next().unwrap(), &[1, 1]);
+assert_eq!(it.next().unwrap(), &[]);
+assert_eq!(it.next(), None);
+
1.0.0 · source

pub fn splitn<F>(&self, n: usize, pred: F) -> SplitN<'_, T, F>
where + F: FnMut(&T) -> bool,

Returns an iterator over subslices separated by elements that match +pred, limited to returning at most n items. The matched element is +not contained in the subslices.

+

The last element returned, if any, will contain the remainder of the +slice.

+
§Examples
+

Print the slice split once by numbers divisible by 3 (i.e., [10, 40], +[20, 60, 50]):

+ +
let v = [10, 40, 30, 20, 60, 50];
+
+for group in v.splitn(2, |num| *num % 3 == 0) {
+    println!("{group:?}");
+}
+
1.0.0 · source

pub fn rsplitn<F>(&self, n: usize, pred: F) -> RSplitN<'_, T, F>
where + F: FnMut(&T) -> bool,

Returns an iterator over subslices separated by elements that match +pred limited to returning at most n items. This starts at the end of +the slice and works backwards. The matched element is not contained in +the subslices.

+

The last element returned, if any, will contain the remainder of the +slice.

+
§Examples
+

Print the slice split once, starting from the end, by numbers divisible +by 3 (i.e., [50], [10, 40, 30, 20]):

+ +
let v = [10, 40, 30, 20, 60, 50];
+
+for group in v.rsplitn(2, |num| *num % 3 == 0) {
+    println!("{group:?}");
+}
+
source

pub fn split_once<F>(&self, pred: F) -> Option<(&[T], &[T])>
where + F: FnMut(&T) -> bool,

🔬This is a nightly-only experimental API. (slice_split_once)

Splits the slice on the first element that matches the specified +predicate.

+

If any matching elements are present in the slice, returns the prefix +before the match and suffix after. The matching element itself is not +included. If no elements match, returns None.

+
§Examples
+
#![feature(slice_split_once)]
+let s = [1, 2, 3, 2, 4];
+assert_eq!(s.split_once(|&x| x == 2), Some((
+    &[1][..],
+    &[3, 2, 4][..]
+)));
+assert_eq!(s.split_once(|&x| x == 0), None);
+
source

pub fn rsplit_once<F>(&self, pred: F) -> Option<(&[T], &[T])>
where + F: FnMut(&T) -> bool,

🔬This is a nightly-only experimental API. (slice_split_once)

Splits the slice on the last element that matches the specified +predicate.

+

If any matching elements are present in the slice, returns the prefix +before the match and suffix after. The matching element itself is not +included. If no elements match, returns None.

+
§Examples
+
#![feature(slice_split_once)]
+let s = [1, 2, 3, 2, 4];
+assert_eq!(s.rsplit_once(|&x| x == 2), Some((
+    &[1, 2, 3][..],
+    &[4][..]
+)));
+assert_eq!(s.rsplit_once(|&x| x == 0), None);
+
1.0.0 · source

pub fn contains(&self, x: &T) -> bool
where + T: PartialEq,

Returns true if the slice contains an element with the given value.

+

This operation is O(n).

+

Note that if you have a sorted slice, binary_search may be faster.

+
§Examples
+
let v = [10, 40, 30];
+assert!(v.contains(&30));
+assert!(!v.contains(&50));
+

If you do not have a &T, but some other value that you can compare +with one (for example, String implements PartialEq<str>), you can +use iter().any:

+ +
let v = [String::from("hello"), String::from("world")]; // slice of `String`
+assert!(v.iter().any(|e| e == "hello")); // search with `&str`
+assert!(!v.iter().any(|e| e == "hi"));
+
1.0.0 · source

pub fn starts_with(&self, needle: &[T]) -> bool
where + T: PartialEq,

Returns true if needle is a prefix of the slice or equal to the slice.

+
§Examples
+
let v = [10, 40, 30];
+assert!(v.starts_with(&[10]));
+assert!(v.starts_with(&[10, 40]));
+assert!(v.starts_with(&v));
+assert!(!v.starts_with(&[50]));
+assert!(!v.starts_with(&[10, 50]));
+

Always returns true if needle is an empty slice:

+ +
let v = &[10, 40, 30];
+assert!(v.starts_with(&[]));
+let v: &[u8] = &[];
+assert!(v.starts_with(&[]));
+
1.0.0 · source

pub fn ends_with(&self, needle: &[T]) -> bool
where + T: PartialEq,

Returns true if needle is a suffix of the slice or equal to the slice.

+
§Examples
+
let v = [10, 40, 30];
+assert!(v.ends_with(&[30]));
+assert!(v.ends_with(&[40, 30]));
+assert!(v.ends_with(&v));
+assert!(!v.ends_with(&[50]));
+assert!(!v.ends_with(&[50, 30]));
+

Always returns true if needle is an empty slice:

+ +
let v = &[10, 40, 30];
+assert!(v.ends_with(&[]));
+let v: &[u8] = &[];
+assert!(v.ends_with(&[]));
+
1.51.0 · source

pub fn strip_prefix<P>(&self, prefix: &P) -> Option<&[T]>
where + P: SlicePattern<Item = T> + ?Sized, + T: PartialEq,

Returns a subslice with the prefix removed.

+

If the slice starts with prefix, returns the subslice after the prefix, wrapped in Some. +If prefix is empty, simply returns the original slice. If prefix is equal to the +original slice, returns an empty slice.

+

If the slice does not start with prefix, returns None.

+
§Examples
+
let v = &[10, 40, 30];
+assert_eq!(v.strip_prefix(&[10]), Some(&[40, 30][..]));
+assert_eq!(v.strip_prefix(&[10, 40]), Some(&[30][..]));
+assert_eq!(v.strip_prefix(&[10, 40, 30]), Some(&[][..]));
+assert_eq!(v.strip_prefix(&[50]), None);
+assert_eq!(v.strip_prefix(&[10, 50]), None);
+
+let prefix : &str = "he";
+assert_eq!(b"hello".strip_prefix(prefix.as_bytes()),
+           Some(b"llo".as_ref()));
+
1.51.0 · source

pub fn strip_suffix<P>(&self, suffix: &P) -> Option<&[T]>
where + P: SlicePattern<Item = T> + ?Sized, + T: PartialEq,

Returns a subslice with the suffix removed.

+

If the slice ends with suffix, returns the subslice before the suffix, wrapped in Some. +If suffix is empty, simply returns the original slice. If suffix is equal to the +original slice, returns an empty slice.

+

If the slice does not end with suffix, returns None.

+
§Examples
+
let v = &[10, 40, 30];
+assert_eq!(v.strip_suffix(&[30]), Some(&[10, 40][..]));
+assert_eq!(v.strip_suffix(&[40, 30]), Some(&[10][..]));
+assert_eq!(v.strip_suffix(&[10, 40, 30]), Some(&[][..]));
+assert_eq!(v.strip_suffix(&[50]), None);
+assert_eq!(v.strip_suffix(&[50, 30]), None);
+

Binary searches this slice for a given element. +If the slice is not sorted, the returned result is unspecified and +meaningless.

+

If the value is found then Result::Ok is returned, containing the +index of the matching element. If there are multiple matches, then any +one of the matches could be returned. The index is chosen +deterministically, but is subject to change in future versions of Rust. +If the value is not found then Result::Err is returned, containing +the index where a matching element could be inserted while maintaining +sorted order.

+

See also binary_search_by, binary_search_by_key, and partition_point.

+
§Examples
+

Looks up a series of four elements. The first is found, with a +uniquely determined position; the second and third are not +found; the fourth could match any position in [1, 4].

+ +
let s = [0, 1, 1, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55];
+
+assert_eq!(s.binary_search(&13),  Ok(9));
+assert_eq!(s.binary_search(&4),   Err(7));
+assert_eq!(s.binary_search(&100), Err(13));
+let r = s.binary_search(&1);
+assert!(match r { Ok(1..=4) => true, _ => false, });
+

If you want to find that whole range of matching items, rather than +an arbitrary matching one, that can be done using partition_point:

+ +
let s = [0, 1, 1, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55];
+
+let low = s.partition_point(|x| x < &1);
+assert_eq!(low, 1);
+let high = s.partition_point(|x| x <= &1);
+assert_eq!(high, 5);
+let r = s.binary_search(&1);
+assert!((low..high).contains(&r.unwrap()));
+
+assert!(s[..low].iter().all(|&x| x < 1));
+assert!(s[low..high].iter().all(|&x| x == 1));
+assert!(s[high..].iter().all(|&x| x > 1));
+
+// For something not found, the "range" of equal items is empty
+assert_eq!(s.partition_point(|x| x < &11), 9);
+assert_eq!(s.partition_point(|x| x <= &11), 9);
+assert_eq!(s.binary_search(&11), Err(9));
+

If you want to insert an item to a sorted vector, while maintaining +sort order, consider using partition_point:

+ +
let mut s = vec![0, 1, 1, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55];
+let num = 42;
+let idx = s.partition_point(|&x| x <= num);
+// If `num` is unique, `s.partition_point(|&x| x < num)` (with `<`) is equivalent to
+// `s.binary_search(&num).unwrap_or_else(|x| x)`, but using `<=` will allow `insert`
+// to shift less elements.
+s.insert(idx, num);
+assert_eq!(s, [0, 1, 1, 1, 1, 2, 3, 5, 8, 13, 21, 34, 42, 55]);
+
1.0.0 · source

pub fn binary_search_by<'a, F>(&'a self, f: F) -> Result<usize, usize>
where + F: FnMut(&'a T) -> Ordering,

Binary searches this slice with a comparator function.

+

The comparator function should return an order code that indicates +whether its argument is Less, Equal or Greater the desired +target. +If the slice is not sorted or if the comparator function does not +implement an order consistent with the sort order of the underlying +slice, the returned result is unspecified and meaningless.

+

If the value is found then Result::Ok is returned, containing the +index of the matching element. If there are multiple matches, then any +one of the matches could be returned. The index is chosen +deterministically, but is subject to change in future versions of Rust. +If the value is not found then Result::Err is returned, containing +the index where a matching element could be inserted while maintaining +sorted order.

+

See also binary_search, binary_search_by_key, and partition_point.

+
§Examples
+

Looks up a series of four elements. The first is found, with a +uniquely determined position; the second and third are not +found; the fourth could match any position in [1, 4].

+ +
let s = [0, 1, 1, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55];
+
+let seek = 13;
+assert_eq!(s.binary_search_by(|probe| probe.cmp(&seek)), Ok(9));
+let seek = 4;
+assert_eq!(s.binary_search_by(|probe| probe.cmp(&seek)), Err(7));
+let seek = 100;
+assert_eq!(s.binary_search_by(|probe| probe.cmp(&seek)), Err(13));
+let seek = 1;
+let r = s.binary_search_by(|probe| probe.cmp(&seek));
+assert!(match r { Ok(1..=4) => true, _ => false, });
+
1.10.0 · source

pub fn binary_search_by_key<'a, B, F>( + &'a self, + b: &B, + f: F, +) -> Result<usize, usize>
where + F: FnMut(&'a T) -> B, + B: Ord,

Binary searches this slice with a key extraction function.

+

Assumes that the slice is sorted by the key, for instance with +sort_by_key using the same key extraction function. +If the slice is not sorted by the key, the returned result is +unspecified and meaningless.

+

If the value is found then Result::Ok is returned, containing the +index of the matching element. If there are multiple matches, then any +one of the matches could be returned. The index is chosen +deterministically, but is subject to change in future versions of Rust. +If the value is not found then Result::Err is returned, containing +the index where a matching element could be inserted while maintaining +sorted order.

+

See also binary_search, binary_search_by, and partition_point.

+
§Examples
+

Looks up a series of four elements in a slice of pairs sorted by +their second elements. The first is found, with a uniquely +determined position; the second and third are not found; the +fourth could match any position in [1, 4].

+ +
let s = [(0, 0), (2, 1), (4, 1), (5, 1), (3, 1),
+         (1, 2), (2, 3), (4, 5), (5, 8), (3, 13),
+         (1, 21), (2, 34), (4, 55)];
+
+assert_eq!(s.binary_search_by_key(&13, |&(a, b)| b),  Ok(9));
+assert_eq!(s.binary_search_by_key(&4, |&(a, b)| b),   Err(7));
+assert_eq!(s.binary_search_by_key(&100, |&(a, b)| b), Err(13));
+let r = s.binary_search_by_key(&1, |&(a, b)| b);
+assert!(match r { Ok(1..=4) => true, _ => false, });
+
1.30.0 · source

pub unsafe fn align_to<U>(&self) -> (&[T], &[U], &[T])

Transmute the slice to a slice of another type, ensuring alignment of the types is +maintained.

+

This method splits the slice into three distinct slices: prefix, correctly aligned middle +slice of a new type, and the suffix slice. The middle part will be as big as possible under +the given alignment constraint and element size.

+

This method has no purpose when either input element T or output element U are +zero-sized and will return the original slice without splitting anything.

+
§Safety
+

This method is essentially a transmute with respect to the elements in the returned +middle slice, so all the usual caveats pertaining to transmute::<T, U> also apply here.

+
§Examples
+

Basic usage:

+ +
unsafe {
+    let bytes: [u8; 7] = [1, 2, 3, 4, 5, 6, 7];
+    let (prefix, shorts, suffix) = bytes.align_to::<u16>();
+    // less_efficient_algorithm_for_bytes(prefix);
+    // more_efficient_algorithm_for_aligned_shorts(shorts);
+    // less_efficient_algorithm_for_bytes(suffix);
+}
+
source

pub fn as_simd<const LANES: usize>(&self) -> (&[T], &[Simd<T, LANES>], &[T])
where + Simd<T, LANES>: AsRef<[T; LANES]>, + T: SimdElement, + LaneCount<LANES>: SupportedLaneCount,

🔬This is a nightly-only experimental API. (portable_simd)

Split a slice into a prefix, a middle of aligned SIMD types, and a suffix.

+

This is a safe wrapper around slice::align_to, so inherits the same +guarantees as that method.

+
§Panics
+

This will panic if the size of the SIMD type is different from +LANES times that of the scalar.

+

At the time of writing, the trait restrictions on Simd<T, LANES> keeps +that from ever happening, as only power-of-two numbers of lanes are +supported. It’s possible that, in the future, those restrictions might +be lifted in a way that would make it possible to see panics from this +method for something like LANES == 3.

+
§Examples
+
#![feature(portable_simd)]
+use core::simd::prelude::*;
+
+let short = &[1, 2, 3];
+let (prefix, middle, suffix) = short.as_simd::<4>();
+assert_eq!(middle, []); // Not enough elements for anything in the middle
+
+// They might be split in any possible way between prefix and suffix
+let it = prefix.iter().chain(suffix).copied();
+assert_eq!(it.collect::<Vec<_>>(), vec![1, 2, 3]);
+
+fn basic_simd_sum(x: &[f32]) -> f32 {
+    use std::ops::Add;
+    let (prefix, middle, suffix) = x.as_simd();
+    let sums = f32x4::from_array([
+        prefix.iter().copied().sum(),
+        0.0,
+        0.0,
+        suffix.iter().copied().sum(),
+    ]);
+    let sums = middle.iter().copied().fold(sums, f32x4::add);
+    sums.reduce_sum()
+}
+
+let numbers: Vec<f32> = (1..101).map(|x| x as _).collect();
+assert_eq!(basic_simd_sum(&numbers[1..99]), 4949.0);
+
source

pub fn is_sorted(&self) -> bool
where + T: PartialOrd,

🔬This is a nightly-only experimental API. (is_sorted)

Checks if the elements of this slice are sorted.

+

That is, for each element a and its following element b, a <= b must hold. If the +slice yields exactly zero or one element, true is returned.

+

Note that if Self::Item is only PartialOrd, but not Ord, the above definition +implies that this function returns false if any two consecutive items are not +comparable.

+
§Examples
+
#![feature(is_sorted)]
+let empty: [i32; 0] = [];
+
+assert!([1, 2, 2, 9].is_sorted());
+assert!(![1, 3, 2, 4].is_sorted());
+assert!([0].is_sorted());
+assert!(empty.is_sorted());
+assert!(![0.0, 1.0, f32::NAN].is_sorted());
+
source

pub fn is_sorted_by<'a, F>(&'a self, compare: F) -> bool
where + F: FnMut(&'a T, &'a T) -> bool,

🔬This is a nightly-only experimental API. (is_sorted)

Checks if the elements of this slice are sorted using the given comparator function.

+

Instead of using PartialOrd::partial_cmp, this function uses the given compare +function to determine whether two elements are to be considered in sorted order.

+
§Examples
+
#![feature(is_sorted)]
+
+assert!([1, 2, 2, 9].is_sorted_by(|a, b| a <= b));
+assert!(![1, 2, 2, 9].is_sorted_by(|a, b| a < b));
+
+assert!([0].is_sorted_by(|a, b| true));
+assert!([0].is_sorted_by(|a, b| false));
+
+let empty: [i32; 0] = [];
+assert!(empty.is_sorted_by(|a, b| false));
+assert!(empty.is_sorted_by(|a, b| true));
+
source

pub fn is_sorted_by_key<'a, F, K>(&'a self, f: F) -> bool
where + F: FnMut(&'a T) -> K, + K: PartialOrd,

🔬This is a nightly-only experimental API. (is_sorted)

Checks if the elements of this slice are sorted using the given key extraction function.

+

Instead of comparing the slice’s elements directly, this function compares the keys of the +elements, as determined by f. Apart from that, it’s equivalent to is_sorted; see its +documentation for more information.

+
§Examples
+
#![feature(is_sorted)]
+
+assert!(["c", "bb", "aaa"].is_sorted_by_key(|s| s.len()));
+assert!(![-2i32, -1, 0, 3].is_sorted_by_key(|n| n.abs()));
+
1.52.0 · source

pub fn partition_point<P>(&self, pred: P) -> usize
where + P: FnMut(&T) -> bool,

Returns the index of the partition point according to the given predicate +(the index of the first element of the second partition).

+

The slice is assumed to be partitioned according to the given predicate. +This means that all elements for which the predicate returns true are at the start of the slice +and all elements for which the predicate returns false are at the end. +For example, [7, 15, 3, 5, 4, 12, 6] is partitioned under the predicate x % 2 != 0 +(all odd numbers are at the start, all even at the end).

+

If this slice is not partitioned, the returned result is unspecified and meaningless, +as this method performs a kind of binary search.

+

See also binary_search, binary_search_by, and binary_search_by_key.

+
§Examples
+
let v = [1, 2, 3, 3, 5, 6, 7];
+let i = v.partition_point(|&x| x < 5);
+
+assert_eq!(i, 4);
+assert!(v[..i].iter().all(|&x| x < 5));
+assert!(v[i..].iter().all(|&x| !(x < 5)));
+

If all elements of the slice match the predicate, including if the slice +is empty, then the length of the slice will be returned:

+ +
let a = [2, 4, 8];
+assert_eq!(a.partition_point(|x| x < &100), a.len());
+let a: [i32; 0] = [];
+assert_eq!(a.partition_point(|x| x < &100), 0);
+

If you want to insert an item to a sorted vector, while maintaining +sort order:

+ +
let mut s = vec![0, 1, 1, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55];
+let num = 42;
+let idx = s.partition_point(|&x| x <= num);
+s.insert(idx, num);
+assert_eq!(s, [0, 1, 1, 1, 1, 2, 3, 5, 8, 13, 21, 34, 42, 55]);
+
1.23.0 · source

pub fn to_ascii_uppercase(&self) -> Vec<u8>

Returns a vector containing a copy of this slice where each byte +is mapped to its ASCII upper case equivalent.

+

ASCII letters ‘a’ to ‘z’ are mapped to ‘A’ to ‘Z’, +but non-ASCII letters are unchanged.

+

To uppercase the value in-place, use make_ascii_uppercase.

+
1.23.0 · source

pub fn to_ascii_lowercase(&self) -> Vec<u8>

Returns a vector containing a copy of this slice where each byte +is mapped to its ASCII lower case equivalent.

+

ASCII letters ‘A’ to ‘Z’ are mapped to ‘a’ to ‘z’, +but non-ASCII letters are unchanged.

+

To lowercase the value in-place, use make_ascii_lowercase.

+
1.0.0 · source

pub fn to_vec(&self) -> Vec<T>
where + T: Clone,

Copies self into a new Vec.

+
§Examples
+
let s = [10, 40, 30];
+let x = s.to_vec();
+// Here, `s` and `x` can be modified independently.
+
source

pub fn to_vec_in<A>(&self, alloc: A) -> Vec<T, A>
where + A: Allocator, + T: Clone,

🔬This is a nightly-only experimental API. (allocator_api)

Copies self into a new Vec with an allocator.

+
§Examples
+
#![feature(allocator_api)]
+
+use std::alloc::System;
+
+let s = [10, 40, 30];
+let x = s.to_vec_in(System);
+// Here, `s` and `x` can be modified independently.
+
1.40.0 · source

pub fn repeat(&self, n: usize) -> Vec<T>
where + T: Copy,

Creates a vector by copying a slice n times.

+
§Panics
+

This function will panic if the capacity would overflow.

+
§Examples
+

Basic usage:

+ +
assert_eq!([1, 2].repeat(3), vec![1, 2, 1, 2, 1, 2]);
+

A panic upon overflow:

+ +
// this will panic at runtime
+b"0123456789abcdef".repeat(usize::MAX);
+
1.0.0 · source

pub fn concat<Item>(&self) -> <[T] as Concat<Item>>::Output
where + [T]: Concat<Item>, + Item: ?Sized,

Flattens a slice of T into a single value Self::Output.

+
§Examples
+
assert_eq!(["hello", "world"].concat(), "helloworld");
+assert_eq!([[1, 2], [3, 4]].concat(), [1, 2, 3, 4]);
+
1.3.0 · source

pub fn join<Separator>( + &self, + sep: Separator, +) -> <[T] as Join<Separator>>::Output
where + [T]: Join<Separator>,

Flattens a slice of T into a single value Self::Output, placing a +given separator between each.

+
§Examples
+
assert_eq!(["hello", "world"].join(" "), "hello world");
+assert_eq!([[1, 2], [3, 4]].join(&0), [1, 2, 0, 3, 4]);
+assert_eq!([[1, 2], [3, 4]].join(&[0, 0][..]), [1, 2, 0, 0, 3, 4]);
+
1.0.0 · source

pub fn connect<Separator>( + &self, + sep: Separator, +) -> <[T] as Join<Separator>>::Output
where + [T]: Join<Separator>,

👎Deprecated since 1.3.0: renamed to join

Flattens a slice of T into a single value Self::Output, placing a +given separator between each.

+
§Examples
+
assert_eq!(["hello", "world"].connect(" "), "hello world");
+assert_eq!([[1, 2], [3, 4]].connect(&0), [1, 2, 0, 3, 4]);
+

Trait Implementations§

source§

impl Clone for SerializedCallResults

source§

fn clone(&self) -> SerializedCallResults

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for SerializedCallResults

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Default for SerializedCallResults

source§

fn default() -> SerializedCallResults

Returns the “default value” for a type. Read more
source§

impl Deref for SerializedCallResults

§

type Target = [u8]

The resulting type after dereferencing.
source§

fn deref(&self) -> &Self::Target

Dereferences the value.
source§

impl<'de> Deserialize<'de> for SerializedCallResults

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl From<SerializedCallResults> for Vec<u8>

source§

fn from(value: SerializedCallResults) -> Self

Converts to this type from the input type.
source§

impl From<Vec<u8>> for SerializedCallResults

source§

fn from(value: Vec<u8>) -> Self

Converts to this type from the input type.
source§

impl Hash for SerializedCallResults

source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
source§

impl PartialEq for SerializedCallResults

source§

fn eq(&self, other: &SerializedCallResults) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl Serialize for SerializedCallResults

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Eq for SerializedCallResults

source§

impl StructuralPartialEq for SerializedCallResults

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CallHasher for T
where + T: Hash + ?Sized,

§

default fn get_hash<H, B>(value: &H, build_hasher: &B) -> u64
where + H: Hash + ?Sized, + B: BuildHasher,

source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_interpreter_interface/struct.SerializedTetraplets.html b/air_interpreter_interface/struct.SerializedTetraplets.html new file mode 100644 index 00000000..5740a62d --- /dev/null +++ b/air_interpreter_interface/struct.SerializedTetraplets.html @@ -0,0 +1,1116 @@ +SerializedTetraplets in air_interpreter_interface - Rust
pub struct SerializedTetraplets { /* private fields */ }

Methods from Deref<Target = [u8]>§

1.80.0 · source

pub fn as_flattened(&self) -> &[T]

Takes a &[[T; N]], and flattens it to a &[T].

+
§Panics
+

This panics if the length of the resulting slice would overflow a usize.

+

This is only possible when flattening a slice of arrays of zero-sized +types, and thus tends to be irrelevant in practice. If +size_of::<T>() > 0, this will never panic.

+
§Examples
+
assert_eq!([[1, 2, 3], [4, 5, 6]].as_flattened(), &[1, 2, 3, 4, 5, 6]);
+
+assert_eq!(
+    [[1, 2, 3], [4, 5, 6]].as_flattened(),
+    [[1, 2], [3, 4], [5, 6]].as_flattened(),
+);
+
+let slice_of_empty_arrays: &[[i32; 0]] = &[[], [], [], [], []];
+assert!(slice_of_empty_arrays.as_flattened().is_empty());
+
+let empty_slice_of_arrays: &[[u32; 10]] = &[];
+assert!(empty_slice_of_arrays.as_flattened().is_empty());
+
source

pub fn as_str(&self) -> &str

🔬This is a nightly-only experimental API. (ascii_char)

Views this slice of ASCII characters as a UTF-8 str.

+
source

pub fn as_bytes(&self) -> &[u8]

🔬This is a nightly-only experimental API. (ascii_char)

Views this slice of ASCII characters as a slice of u8 bytes.

+
1.79.0 · source

pub fn utf8_chunks(&self) -> Utf8Chunks<'_>

Creates an iterator over the contiguous valid UTF-8 ranges of this +slice, and the non-UTF-8 fragments in between.

+
§Examples
+

This function formats arbitrary but mostly-UTF-8 bytes into Rust source +code in the form of a C-string literal (c"...").

+ +
use std::fmt::Write as _;
+
+pub fn cstr_literal(bytes: &[u8]) -> String {
+    let mut repr = String::new();
+    repr.push_str("c\"");
+    for chunk in bytes.utf8_chunks() {
+        for ch in chunk.valid().chars() {
+            // Escapes \0, \t, \r, \n, \\, \', \", and uses \u{...} for non-printable characters.
+            write!(repr, "{}", ch.escape_debug()).unwrap();
+        }
+        for byte in chunk.invalid() {
+            write!(repr, "\\x{:02X}", byte).unwrap();
+        }
+    }
+    repr.push('"');
+    repr
+}
+
+fn main() {
+    let lit = cstr_literal(b"\xferris the \xf0\x9f\xa6\x80\x07");
+    let expected = stringify!(c"\xFErris the 🦀\u{7}");
+    assert_eq!(lit, expected);
+}
+
1.23.0 · source

pub fn is_ascii(&self) -> bool

Checks if all bytes in this slice are within the ASCII range.

+
source

pub fn as_ascii(&self) -> Option<&[AsciiChar]>

🔬This is a nightly-only experimental API. (ascii_char)

If this slice is_ascii, returns it as a slice of +ASCII characters, otherwise returns None.

+
source

pub unsafe fn as_ascii_unchecked(&self) -> &[AsciiChar]

🔬This is a nightly-only experimental API. (ascii_char)

Converts this slice of bytes into a slice of ASCII characters, +without checking whether they’re valid.

+
§Safety
+

Every byte in the slice must be in 0..=127, or else this is UB.

+
1.23.0 · source

pub fn eq_ignore_ascii_case(&self, other: &[u8]) -> bool

Checks that two slices are an ASCII case-insensitive match.

+

Same as to_ascii_lowercase(a) == to_ascii_lowercase(b), +but without allocating and copying temporaries.

+
1.60.0 · source

pub fn escape_ascii(&self) -> EscapeAscii<'_>

Returns an iterator that produces an escaped version of this slice, +treating it as an ASCII string.

+
§Examples
+

+let s = b"0\t\r\n'\"\\\x9d";
+let escaped = s.escape_ascii().to_string();
+assert_eq!(escaped, "0\\t\\r\\n\\'\\\"\\\\\\x9d");
+
1.80.0 · source

pub fn trim_ascii_start(&self) -> &[u8]

Returns a byte slice with leading ASCII whitespace bytes removed.

+

‘Whitespace’ refers to the definition used by +u8::is_ascii_whitespace.

+
§Examples
+
assert_eq!(b" \t hello world\n".trim_ascii_start(), b"hello world\n");
+assert_eq!(b"  ".trim_ascii_start(), b"");
+assert_eq!(b"".trim_ascii_start(), b"");
+
1.80.0 · source

pub fn trim_ascii_end(&self) -> &[u8]

Returns a byte slice with trailing ASCII whitespace bytes removed.

+

‘Whitespace’ refers to the definition used by +u8::is_ascii_whitespace.

+
§Examples
+
assert_eq!(b"\r hello world\n ".trim_ascii_end(), b"\r hello world");
+assert_eq!(b"  ".trim_ascii_end(), b"");
+assert_eq!(b"".trim_ascii_end(), b"");
+
1.80.0 · source

pub fn trim_ascii(&self) -> &[u8]

Returns a byte slice with leading and trailing ASCII whitespace bytes +removed.

+

‘Whitespace’ refers to the definition used by +u8::is_ascii_whitespace.

+
§Examples
+
assert_eq!(b"\r hello world\n ".trim_ascii(), b"hello world");
+assert_eq!(b"  ".trim_ascii(), b"");
+assert_eq!(b"".trim_ascii(), b"");
+
1.0.0 · source

pub fn len(&self) -> usize

Returns the number of elements in the slice.

+
§Examples
+
let a = [1, 2, 3];
+assert_eq!(a.len(), 3);
+
1.0.0 · source

pub fn is_empty(&self) -> bool

Returns true if the slice has a length of 0.

+
§Examples
+
let a = [1, 2, 3];
+assert!(!a.is_empty());
+
+let b: &[i32] = &[];
+assert!(b.is_empty());
+
1.0.0 · source

pub fn first(&self) -> Option<&T>

Returns the first element of the slice, or None if it is empty.

+
§Examples
+
let v = [10, 40, 30];
+assert_eq!(Some(&10), v.first());
+
+let w: &[i32] = &[];
+assert_eq!(None, w.first());
+
1.5.0 · source

pub fn split_first(&self) -> Option<(&T, &[T])>

Returns the first and all the rest of the elements of the slice, or None if it is empty.

+
§Examples
+
let x = &[0, 1, 2];
+
+if let Some((first, elements)) = x.split_first() {
+    assert_eq!(first, &0);
+    assert_eq!(elements, &[1, 2]);
+}
+
1.5.0 · source

pub fn split_last(&self) -> Option<(&T, &[T])>

Returns the last and all the rest of the elements of the slice, or None if it is empty.

+
§Examples
+
let x = &[0, 1, 2];
+
+if let Some((last, elements)) = x.split_last() {
+    assert_eq!(last, &2);
+    assert_eq!(elements, &[0, 1]);
+}
+
1.0.0 · source

pub fn last(&self) -> Option<&T>

Returns the last element of the slice, or None if it is empty.

+
§Examples
+
let v = [10, 40, 30];
+assert_eq!(Some(&30), v.last());
+
+let w: &[i32] = &[];
+assert_eq!(None, w.last());
+
1.77.0 · source

pub fn first_chunk<const N: usize>(&self) -> Option<&[T; N]>

Return an array reference to the first N items in the slice.

+

If the slice is not at least N in length, this will return None.

+
§Examples
+
let u = [10, 40, 30];
+assert_eq!(Some(&[10, 40]), u.first_chunk::<2>());
+
+let v: &[i32] = &[10];
+assert_eq!(None, v.first_chunk::<2>());
+
+let w: &[i32] = &[];
+assert_eq!(Some(&[]), w.first_chunk::<0>());
+
1.77.0 · source

pub fn split_first_chunk<const N: usize>(&self) -> Option<(&[T; N], &[T])>

Return an array reference to the first N items in the slice and the remaining slice.

+

If the slice is not at least N in length, this will return None.

+
§Examples
+
let x = &[0, 1, 2];
+
+if let Some((first, elements)) = x.split_first_chunk::<2>() {
+    assert_eq!(first, &[0, 1]);
+    assert_eq!(elements, &[2]);
+}
+
+assert_eq!(None, x.split_first_chunk::<4>());
+
1.77.0 · source

pub fn split_last_chunk<const N: usize>(&self) -> Option<(&[T], &[T; N])>

Return an array reference to the last N items in the slice and the remaining slice.

+

If the slice is not at least N in length, this will return None.

+
§Examples
+
let x = &[0, 1, 2];
+
+if let Some((elements, last)) = x.split_last_chunk::<2>() {
+    assert_eq!(elements, &[0]);
+    assert_eq!(last, &[1, 2]);
+}
+
+assert_eq!(None, x.split_last_chunk::<4>());
+
1.77.0 · source

pub fn last_chunk<const N: usize>(&self) -> Option<&[T; N]>

Return an array reference to the last N items in the slice.

+

If the slice is not at least N in length, this will return None.

+
§Examples
+
let u = [10, 40, 30];
+assert_eq!(Some(&[40, 30]), u.last_chunk::<2>());
+
+let v: &[i32] = &[10];
+assert_eq!(None, v.last_chunk::<2>());
+
+let w: &[i32] = &[];
+assert_eq!(Some(&[]), w.last_chunk::<0>());
+
1.0.0 · source

pub fn get<I>(&self, index: I) -> Option<&<I as SliceIndex<[T]>>::Output>
where + I: SliceIndex<[T]>,

Returns a reference to an element or subslice depending on the type of +index.

+
    +
  • If given a position, returns a reference to the element at that +position or None if out of bounds.
  • +
  • If given a range, returns the subslice corresponding to that range, +or None if out of bounds.
  • +
+
§Examples
+
let v = [10, 40, 30];
+assert_eq!(Some(&40), v.get(1));
+assert_eq!(Some(&[10, 40][..]), v.get(0..2));
+assert_eq!(None, v.get(3));
+assert_eq!(None, v.get(0..4));
+
1.0.0 · source

pub unsafe fn get_unchecked<I>( + &self, + index: I, +) -> &<I as SliceIndex<[T]>>::Output
where + I: SliceIndex<[T]>,

Returns a reference to an element or subslice, without doing bounds +checking.

+

For a safe alternative see get.

+
§Safety
+

Calling this method with an out-of-bounds index is undefined behavior +even if the resulting reference is not used.

+

You can think of this like .get(index).unwrap_unchecked(). It’s UB +to call .get_unchecked(len), even if you immediately convert to a +pointer. And it’s UB to call .get_unchecked(..len + 1), +.get_unchecked(..=len), or similar.

+
§Examples
+
let x = &[1, 2, 4];
+
+unsafe {
+    assert_eq!(x.get_unchecked(1), &2);
+}
+
1.0.0 · source

pub fn as_ptr(&self) -> *const T

Returns a raw pointer to the slice’s buffer.

+

The caller must ensure that the slice outlives the pointer this +function returns, or else it will end up pointing to garbage.

+

The caller must also ensure that the memory the pointer (non-transitively) points to +is never written to (except inside an UnsafeCell) using this pointer or any pointer +derived from it. If you need to mutate the contents of the slice, use as_mut_ptr.

+

Modifying the container referenced by this slice may cause its buffer +to be reallocated, which would also make any pointers to it invalid.

+
§Examples
+
let x = &[1, 2, 4];
+let x_ptr = x.as_ptr();
+
+unsafe {
+    for i in 0..x.len() {
+        assert_eq!(x.get_unchecked(i), &*x_ptr.add(i));
+    }
+}
+
1.48.0 · source

pub fn as_ptr_range(&self) -> Range<*const T>

Returns the two raw pointers spanning the slice.

+

The returned range is half-open, which means that the end pointer +points one past the last element of the slice. This way, an empty +slice is represented by two equal pointers, and the difference between +the two pointers represents the size of the slice.

+

See as_ptr for warnings on using these pointers. The end pointer +requires extra caution, as it does not point to a valid element in the +slice.

+

This function is useful for interacting with foreign interfaces which +use two pointers to refer to a range of elements in memory, as is +common in C++.

+

It can also be useful to check if a pointer to an element refers to an +element of this slice:

+ +
let a = [1, 2, 3];
+let x = &a[1] as *const _;
+let y = &5 as *const _;
+
+assert!(a.as_ptr_range().contains(&x));
+assert!(!a.as_ptr_range().contains(&y));
+
1.0.0 · source

pub fn iter(&self) -> Iter<'_, T>

Returns an iterator over the slice.

+

The iterator yields all items from start to end.

+
§Examples
+
let x = &[1, 2, 4];
+let mut iterator = x.iter();
+
+assert_eq!(iterator.next(), Some(&1));
+assert_eq!(iterator.next(), Some(&2));
+assert_eq!(iterator.next(), Some(&4));
+assert_eq!(iterator.next(), None);
+
1.0.0 · source

pub fn windows(&self, size: usize) -> Windows<'_, T>

Returns an iterator over all contiguous windows of length +size. The windows overlap. If the slice is shorter than +size, the iterator returns no values.

+
§Panics
+

Panics if size is 0.

+
§Examples
+
let slice = ['l', 'o', 'r', 'e', 'm'];
+let mut iter = slice.windows(3);
+assert_eq!(iter.next().unwrap(), &['l', 'o', 'r']);
+assert_eq!(iter.next().unwrap(), &['o', 'r', 'e']);
+assert_eq!(iter.next().unwrap(), &['r', 'e', 'm']);
+assert!(iter.next().is_none());
+

If the slice is shorter than size:

+ +
let slice = ['f', 'o', 'o'];
+let mut iter = slice.windows(4);
+assert!(iter.next().is_none());
+

There’s no windows_mut, as that existing would let safe code violate the +“only one &mut at a time to the same thing” rule. However, you can sometimes +use Cell::as_slice_of_cells in +conjunction with windows to accomplish something similar:

+ +
use std::cell::Cell;
+
+let mut array = ['R', 'u', 's', 't', ' ', '2', '0', '1', '5'];
+let slice = &mut array[..];
+let slice_of_cells: &[Cell<char>] = Cell::from_mut(slice).as_slice_of_cells();
+for w in slice_of_cells.windows(3) {
+    Cell::swap(&w[0], &w[2]);
+}
+assert_eq!(array, ['s', 't', ' ', '2', '0', '1', '5', 'u', 'R']);
+
1.0.0 · source

pub fn chunks(&self, chunk_size: usize) -> Chunks<'_, T>

Returns an iterator over chunk_size elements of the slice at a time, starting at the +beginning of the slice.

+

The chunks are slices and do not overlap. If chunk_size does not divide the length of the +slice, then the last chunk will not have length chunk_size.

+

See chunks_exact for a variant of this iterator that returns chunks of always exactly +chunk_size elements, and rchunks for the same iterator but starting at the end of the +slice.

+
§Panics
+

Panics if chunk_size is 0.

+
§Examples
+
let slice = ['l', 'o', 'r', 'e', 'm'];
+let mut iter = slice.chunks(2);
+assert_eq!(iter.next().unwrap(), &['l', 'o']);
+assert_eq!(iter.next().unwrap(), &['r', 'e']);
+assert_eq!(iter.next().unwrap(), &['m']);
+assert!(iter.next().is_none());
+
1.31.0 · source

pub fn chunks_exact(&self, chunk_size: usize) -> ChunksExact<'_, T>

Returns an iterator over chunk_size elements of the slice at a time, starting at the +beginning of the slice.

+

The chunks are slices and do not overlap. If chunk_size does not divide the length of the +slice, then the last up to chunk_size-1 elements will be omitted and can be retrieved +from the remainder function of the iterator.

+

Due to each chunk having exactly chunk_size elements, the compiler can often optimize the +resulting code better than in the case of chunks.

+

See chunks for a variant of this iterator that also returns the remainder as a smaller +chunk, and rchunks_exact for the same iterator but starting at the end of the slice.

+
§Panics
+

Panics if chunk_size is 0.

+
§Examples
+
let slice = ['l', 'o', 'r', 'e', 'm'];
+let mut iter = slice.chunks_exact(2);
+assert_eq!(iter.next().unwrap(), &['l', 'o']);
+assert_eq!(iter.next().unwrap(), &['r', 'e']);
+assert!(iter.next().is_none());
+assert_eq!(iter.remainder(), &['m']);
+
source

pub unsafe fn as_chunks_unchecked<const N: usize>(&self) -> &[[T; N]]

🔬This is a nightly-only experimental API. (slice_as_chunks)

Splits the slice into a slice of N-element arrays, +assuming that there’s no remainder.

+
§Safety
+

This may only be called when

+
    +
  • The slice splits exactly into N-element chunks (aka self.len() % N == 0).
  • +
  • N != 0.
  • +
+
§Examples
+
#![feature(slice_as_chunks)]
+let slice: &[char] = &['l', 'o', 'r', 'e', 'm', '!'];
+let chunks: &[[char; 1]] =
+    // SAFETY: 1-element chunks never have remainder
+    unsafe { slice.as_chunks_unchecked() };
+assert_eq!(chunks, &[['l'], ['o'], ['r'], ['e'], ['m'], ['!']]);
+let chunks: &[[char; 3]] =
+    // SAFETY: The slice length (6) is a multiple of 3
+    unsafe { slice.as_chunks_unchecked() };
+assert_eq!(chunks, &[['l', 'o', 'r'], ['e', 'm', '!']]);
+
+// These would be unsound:
+// let chunks: &[[_; 5]] = slice.as_chunks_unchecked() // The slice length is not a multiple of 5
+// let chunks: &[[_; 0]] = slice.as_chunks_unchecked() // Zero-length chunks are never allowed
+
source

pub fn as_chunks<const N: usize>(&self) -> (&[[T; N]], &[T])

🔬This is a nightly-only experimental API. (slice_as_chunks)

Splits the slice into a slice of N-element arrays, +starting at the beginning of the slice, +and a remainder slice with length strictly less than N.

+
§Panics
+

Panics if N is 0. This check will most probably get changed to a compile time +error before this method gets stabilized.

+
§Examples
+
#![feature(slice_as_chunks)]
+let slice = ['l', 'o', 'r', 'e', 'm'];
+let (chunks, remainder) = slice.as_chunks();
+assert_eq!(chunks, &[['l', 'o'], ['r', 'e']]);
+assert_eq!(remainder, &['m']);
+

If you expect the slice to be an exact multiple, you can combine +let-else with an empty slice pattern:

+ +
#![feature(slice_as_chunks)]
+let slice = ['R', 'u', 's', 't'];
+let (chunks, []) = slice.as_chunks::<2>() else {
+    panic!("slice didn't have even length")
+};
+assert_eq!(chunks, &[['R', 'u'], ['s', 't']]);
+
source

pub fn as_rchunks<const N: usize>(&self) -> (&[T], &[[T; N]])

🔬This is a nightly-only experimental API. (slice_as_chunks)

Splits the slice into a slice of N-element arrays, +starting at the end of the slice, +and a remainder slice with length strictly less than N.

+
§Panics
+

Panics if N is 0. This check will most probably get changed to a compile time +error before this method gets stabilized.

+
§Examples
+
#![feature(slice_as_chunks)]
+let slice = ['l', 'o', 'r', 'e', 'm'];
+let (remainder, chunks) = slice.as_rchunks();
+assert_eq!(remainder, &['l']);
+assert_eq!(chunks, &[['o', 'r'], ['e', 'm']]);
+
source

pub fn array_chunks<const N: usize>(&self) -> ArrayChunks<'_, T, N>

🔬This is a nightly-only experimental API. (array_chunks)

Returns an iterator over N elements of the slice at a time, starting at the +beginning of the slice.

+

The chunks are array references and do not overlap. If N does not divide the +length of the slice, then the last up to N-1 elements will be omitted and can be +retrieved from the remainder function of the iterator.

+

This method is the const generic equivalent of chunks_exact.

+
§Panics
+

Panics if N is 0. This check will most probably get changed to a compile time +error before this method gets stabilized.

+
§Examples
+
#![feature(array_chunks)]
+let slice = ['l', 'o', 'r', 'e', 'm'];
+let mut iter = slice.array_chunks();
+assert_eq!(iter.next().unwrap(), &['l', 'o']);
+assert_eq!(iter.next().unwrap(), &['r', 'e']);
+assert!(iter.next().is_none());
+assert_eq!(iter.remainder(), &['m']);
+
source

pub fn array_windows<const N: usize>(&self) -> ArrayWindows<'_, T, N>

🔬This is a nightly-only experimental API. (array_windows)

Returns an iterator over overlapping windows of N elements of a slice, +starting at the beginning of the slice.

+

This is the const generic equivalent of windows.

+

If N is greater than the size of the slice, it will return no windows.

+
§Panics
+

Panics if N is 0. This check will most probably get changed to a compile time +error before this method gets stabilized.

+
§Examples
+
#![feature(array_windows)]
+let slice = [0, 1, 2, 3];
+let mut iter = slice.array_windows();
+assert_eq!(iter.next().unwrap(), &[0, 1]);
+assert_eq!(iter.next().unwrap(), &[1, 2]);
+assert_eq!(iter.next().unwrap(), &[2, 3]);
+assert!(iter.next().is_none());
+
1.31.0 · source

pub fn rchunks(&self, chunk_size: usize) -> RChunks<'_, T>

Returns an iterator over chunk_size elements of the slice at a time, starting at the end +of the slice.

+

The chunks are slices and do not overlap. If chunk_size does not divide the length of the +slice, then the last chunk will not have length chunk_size.

+

See rchunks_exact for a variant of this iterator that returns chunks of always exactly +chunk_size elements, and chunks for the same iterator but starting at the beginning +of the slice.

+
§Panics
+

Panics if chunk_size is 0.

+
§Examples
+
let slice = ['l', 'o', 'r', 'e', 'm'];
+let mut iter = slice.rchunks(2);
+assert_eq!(iter.next().unwrap(), &['e', 'm']);
+assert_eq!(iter.next().unwrap(), &['o', 'r']);
+assert_eq!(iter.next().unwrap(), &['l']);
+assert!(iter.next().is_none());
+
1.31.0 · source

pub fn rchunks_exact(&self, chunk_size: usize) -> RChunksExact<'_, T>

Returns an iterator over chunk_size elements of the slice at a time, starting at the +end of the slice.

+

The chunks are slices and do not overlap. If chunk_size does not divide the length of the +slice, then the last up to chunk_size-1 elements will be omitted and can be retrieved +from the remainder function of the iterator.

+

Due to each chunk having exactly chunk_size elements, the compiler can often optimize the +resulting code better than in the case of rchunks.

+

See rchunks for a variant of this iterator that also returns the remainder as a smaller +chunk, and chunks_exact for the same iterator but starting at the beginning of the +slice.

+
§Panics
+

Panics if chunk_size is 0.

+
§Examples
+
let slice = ['l', 'o', 'r', 'e', 'm'];
+let mut iter = slice.rchunks_exact(2);
+assert_eq!(iter.next().unwrap(), &['e', 'm']);
+assert_eq!(iter.next().unwrap(), &['o', 'r']);
+assert!(iter.next().is_none());
+assert_eq!(iter.remainder(), &['l']);
+
1.77.0 · source

pub fn chunk_by<F>(&self, pred: F) -> ChunkBy<'_, T, F>
where + F: FnMut(&T, &T) -> bool,

Returns an iterator over the slice producing non-overlapping runs +of elements using the predicate to separate them.

+

The predicate is called for every pair of consecutive elements, +meaning that it is called on slice[0] and slice[1], +followed by slice[1] and slice[2], and so on.

+
§Examples
+
let slice = &[1, 1, 1, 3, 3, 2, 2, 2];
+
+let mut iter = slice.chunk_by(|a, b| a == b);
+
+assert_eq!(iter.next(), Some(&[1, 1, 1][..]));
+assert_eq!(iter.next(), Some(&[3, 3][..]));
+assert_eq!(iter.next(), Some(&[2, 2, 2][..]));
+assert_eq!(iter.next(), None);
+

This method can be used to extract the sorted subslices:

+ +
let slice = &[1, 1, 2, 3, 2, 3, 2, 3, 4];
+
+let mut iter = slice.chunk_by(|a, b| a <= b);
+
+assert_eq!(iter.next(), Some(&[1, 1, 2, 3][..]));
+assert_eq!(iter.next(), Some(&[2, 3][..]));
+assert_eq!(iter.next(), Some(&[2, 3, 4][..]));
+assert_eq!(iter.next(), None);
+
1.0.0 · source

pub fn split_at(&self, mid: usize) -> (&[T], &[T])

Divides one slice into two at an index.

+

The first will contain all indices from [0, mid) (excluding +the index mid itself) and the second will contain all +indices from [mid, len) (excluding the index len itself).

+
§Panics
+

Panics if mid > len. For a non-panicking alternative see +split_at_checked.

+
§Examples
+
let v = [1, 2, 3, 4, 5, 6];
+
+{
+   let (left, right) = v.split_at(0);
+   assert_eq!(left, []);
+   assert_eq!(right, [1, 2, 3, 4, 5, 6]);
+}
+
+{
+    let (left, right) = v.split_at(2);
+    assert_eq!(left, [1, 2]);
+    assert_eq!(right, [3, 4, 5, 6]);
+}
+
+{
+    let (left, right) = v.split_at(6);
+    assert_eq!(left, [1, 2, 3, 4, 5, 6]);
+    assert_eq!(right, []);
+}
+
1.79.0 · source

pub unsafe fn split_at_unchecked(&self, mid: usize) -> (&[T], &[T])

Divides one slice into two at an index, without doing bounds checking.

+

The first will contain all indices from [0, mid) (excluding +the index mid itself) and the second will contain all +indices from [mid, len) (excluding the index len itself).

+

For a safe alternative see split_at.

+
§Safety
+

Calling this method with an out-of-bounds index is undefined behavior +even if the resulting reference is not used. The caller has to ensure that +0 <= mid <= self.len().

+
§Examples
+
let v = [1, 2, 3, 4, 5, 6];
+
+unsafe {
+   let (left, right) = v.split_at_unchecked(0);
+   assert_eq!(left, []);
+   assert_eq!(right, [1, 2, 3, 4, 5, 6]);
+}
+
+unsafe {
+    let (left, right) = v.split_at_unchecked(2);
+    assert_eq!(left, [1, 2]);
+    assert_eq!(right, [3, 4, 5, 6]);
+}
+
+unsafe {
+    let (left, right) = v.split_at_unchecked(6);
+    assert_eq!(left, [1, 2, 3, 4, 5, 6]);
+    assert_eq!(right, []);
+}
+
1.80.0 · source

pub fn split_at_checked(&self, mid: usize) -> Option<(&[T], &[T])>

Divides one slice into two at an index, returning None if the slice is +too short.

+

If mid ≤ len returns a pair of slices where the first will contain all +indices from [0, mid) (excluding the index mid itself) and the +second will contain all indices from [mid, len) (excluding the index +len itself).

+

Otherwise, if mid > len, returns None.

+
§Examples
+
let v = [1, -2, 3, -4, 5, -6];
+
+{
+   let (left, right) = v.split_at_checked(0).unwrap();
+   assert_eq!(left, []);
+   assert_eq!(right, [1, -2, 3, -4, 5, -6]);
+}
+
+{
+    let (left, right) = v.split_at_checked(2).unwrap();
+    assert_eq!(left, [1, -2]);
+    assert_eq!(right, [3, -4, 5, -6]);
+}
+
+{
+    let (left, right) = v.split_at_checked(6).unwrap();
+    assert_eq!(left, [1, -2, 3, -4, 5, -6]);
+    assert_eq!(right, []);
+}
+
+assert_eq!(None, v.split_at_checked(7));
+
1.0.0 · source

pub fn split<F>(&self, pred: F) -> Split<'_, T, F>
where + F: FnMut(&T) -> bool,

Returns an iterator over subslices separated by elements that match +pred. The matched element is not contained in the subslices.

+
§Examples
+
let slice = [10, 40, 33, 20];
+let mut iter = slice.split(|num| num % 3 == 0);
+
+assert_eq!(iter.next().unwrap(), &[10, 40]);
+assert_eq!(iter.next().unwrap(), &[20]);
+assert!(iter.next().is_none());
+

If the first element is matched, an empty slice will be the first item +returned by the iterator. Similarly, if the last element in the slice +is matched, an empty slice will be the last item returned by the +iterator:

+ +
let slice = [10, 40, 33];
+let mut iter = slice.split(|num| num % 3 == 0);
+
+assert_eq!(iter.next().unwrap(), &[10, 40]);
+assert_eq!(iter.next().unwrap(), &[]);
+assert!(iter.next().is_none());
+

If two matched elements are directly adjacent, an empty slice will be +present between them:

+ +
let slice = [10, 6, 33, 20];
+let mut iter = slice.split(|num| num % 3 == 0);
+
+assert_eq!(iter.next().unwrap(), &[10]);
+assert_eq!(iter.next().unwrap(), &[]);
+assert_eq!(iter.next().unwrap(), &[20]);
+assert!(iter.next().is_none());
+
1.51.0 · source

pub fn split_inclusive<F>(&self, pred: F) -> SplitInclusive<'_, T, F>
where + F: FnMut(&T) -> bool,

Returns an iterator over subslices separated by elements that match +pred. The matched element is contained in the end of the previous +subslice as a terminator.

+
§Examples
+
let slice = [10, 40, 33, 20];
+let mut iter = slice.split_inclusive(|num| num % 3 == 0);
+
+assert_eq!(iter.next().unwrap(), &[10, 40, 33]);
+assert_eq!(iter.next().unwrap(), &[20]);
+assert!(iter.next().is_none());
+

If the last element of the slice is matched, +that element will be considered the terminator of the preceding slice. +That slice will be the last item returned by the iterator.

+ +
let slice = [3, 10, 40, 33];
+let mut iter = slice.split_inclusive(|num| num % 3 == 0);
+
+assert_eq!(iter.next().unwrap(), &[3]);
+assert_eq!(iter.next().unwrap(), &[10, 40, 33]);
+assert!(iter.next().is_none());
+
1.27.0 · source

pub fn rsplit<F>(&self, pred: F) -> RSplit<'_, T, F>
where + F: FnMut(&T) -> bool,

Returns an iterator over subslices separated by elements that match +pred, starting at the end of the slice and working backwards. +The matched element is not contained in the subslices.

+
§Examples
+
let slice = [11, 22, 33, 0, 44, 55];
+let mut iter = slice.rsplit(|num| *num == 0);
+
+assert_eq!(iter.next().unwrap(), &[44, 55]);
+assert_eq!(iter.next().unwrap(), &[11, 22, 33]);
+assert_eq!(iter.next(), None);
+

As with split(), if the first or last element is matched, an empty +slice will be the first (or last) item returned by the iterator.

+ +
let v = &[0, 1, 1, 2, 3, 5, 8];
+let mut it = v.rsplit(|n| *n % 2 == 0);
+assert_eq!(it.next().unwrap(), &[]);
+assert_eq!(it.next().unwrap(), &[3, 5]);
+assert_eq!(it.next().unwrap(), &[1, 1]);
+assert_eq!(it.next().unwrap(), &[]);
+assert_eq!(it.next(), None);
+
1.0.0 · source

pub fn splitn<F>(&self, n: usize, pred: F) -> SplitN<'_, T, F>
where + F: FnMut(&T) -> bool,

Returns an iterator over subslices separated by elements that match +pred, limited to returning at most n items. The matched element is +not contained in the subslices.

+

The last element returned, if any, will contain the remainder of the +slice.

+
§Examples
+

Print the slice split once by numbers divisible by 3 (i.e., [10, 40], +[20, 60, 50]):

+ +
let v = [10, 40, 30, 20, 60, 50];
+
+for group in v.splitn(2, |num| *num % 3 == 0) {
+    println!("{group:?}");
+}
+
1.0.0 · source

pub fn rsplitn<F>(&self, n: usize, pred: F) -> RSplitN<'_, T, F>
where + F: FnMut(&T) -> bool,

Returns an iterator over subslices separated by elements that match +pred limited to returning at most n items. This starts at the end of +the slice and works backwards. The matched element is not contained in +the subslices.

+

The last element returned, if any, will contain the remainder of the +slice.

+
§Examples
+

Print the slice split once, starting from the end, by numbers divisible +by 3 (i.e., [50], [10, 40, 30, 20]):

+ +
let v = [10, 40, 30, 20, 60, 50];
+
+for group in v.rsplitn(2, |num| *num % 3 == 0) {
+    println!("{group:?}");
+}
+
source

pub fn split_once<F>(&self, pred: F) -> Option<(&[T], &[T])>
where + F: FnMut(&T) -> bool,

🔬This is a nightly-only experimental API. (slice_split_once)

Splits the slice on the first element that matches the specified +predicate.

+

If any matching elements are present in the slice, returns the prefix +before the match and suffix after. The matching element itself is not +included. If no elements match, returns None.

+
§Examples
+
#![feature(slice_split_once)]
+let s = [1, 2, 3, 2, 4];
+assert_eq!(s.split_once(|&x| x == 2), Some((
+    &[1][..],
+    &[3, 2, 4][..]
+)));
+assert_eq!(s.split_once(|&x| x == 0), None);
+
source

pub fn rsplit_once<F>(&self, pred: F) -> Option<(&[T], &[T])>
where + F: FnMut(&T) -> bool,

🔬This is a nightly-only experimental API. (slice_split_once)

Splits the slice on the last element that matches the specified +predicate.

+

If any matching elements are present in the slice, returns the prefix +before the match and suffix after. The matching element itself is not +included. If no elements match, returns None.

+
§Examples
+
#![feature(slice_split_once)]
+let s = [1, 2, 3, 2, 4];
+assert_eq!(s.rsplit_once(|&x| x == 2), Some((
+    &[1, 2, 3][..],
+    &[4][..]
+)));
+assert_eq!(s.rsplit_once(|&x| x == 0), None);
+
1.0.0 · source

pub fn contains(&self, x: &T) -> bool
where + T: PartialEq,

Returns true if the slice contains an element with the given value.

+

This operation is O(n).

+

Note that if you have a sorted slice, binary_search may be faster.

+
§Examples
+
let v = [10, 40, 30];
+assert!(v.contains(&30));
+assert!(!v.contains(&50));
+

If you do not have a &T, but some other value that you can compare +with one (for example, String implements PartialEq<str>), you can +use iter().any:

+ +
let v = [String::from("hello"), String::from("world")]; // slice of `String`
+assert!(v.iter().any(|e| e == "hello")); // search with `&str`
+assert!(!v.iter().any(|e| e == "hi"));
+
1.0.0 · source

pub fn starts_with(&self, needle: &[T]) -> bool
where + T: PartialEq,

Returns true if needle is a prefix of the slice or equal to the slice.

+
§Examples
+
let v = [10, 40, 30];
+assert!(v.starts_with(&[10]));
+assert!(v.starts_with(&[10, 40]));
+assert!(v.starts_with(&v));
+assert!(!v.starts_with(&[50]));
+assert!(!v.starts_with(&[10, 50]));
+

Always returns true if needle is an empty slice:

+ +
let v = &[10, 40, 30];
+assert!(v.starts_with(&[]));
+let v: &[u8] = &[];
+assert!(v.starts_with(&[]));
+
1.0.0 · source

pub fn ends_with(&self, needle: &[T]) -> bool
where + T: PartialEq,

Returns true if needle is a suffix of the slice or equal to the slice.

+
§Examples
+
let v = [10, 40, 30];
+assert!(v.ends_with(&[30]));
+assert!(v.ends_with(&[40, 30]));
+assert!(v.ends_with(&v));
+assert!(!v.ends_with(&[50]));
+assert!(!v.ends_with(&[50, 30]));
+

Always returns true if needle is an empty slice:

+ +
let v = &[10, 40, 30];
+assert!(v.ends_with(&[]));
+let v: &[u8] = &[];
+assert!(v.ends_with(&[]));
+
1.51.0 · source

pub fn strip_prefix<P>(&self, prefix: &P) -> Option<&[T]>
where + P: SlicePattern<Item = T> + ?Sized, + T: PartialEq,

Returns a subslice with the prefix removed.

+

If the slice starts with prefix, returns the subslice after the prefix, wrapped in Some. +If prefix is empty, simply returns the original slice. If prefix is equal to the +original slice, returns an empty slice.

+

If the slice does not start with prefix, returns None.

+
§Examples
+
let v = &[10, 40, 30];
+assert_eq!(v.strip_prefix(&[10]), Some(&[40, 30][..]));
+assert_eq!(v.strip_prefix(&[10, 40]), Some(&[30][..]));
+assert_eq!(v.strip_prefix(&[10, 40, 30]), Some(&[][..]));
+assert_eq!(v.strip_prefix(&[50]), None);
+assert_eq!(v.strip_prefix(&[10, 50]), None);
+
+let prefix : &str = "he";
+assert_eq!(b"hello".strip_prefix(prefix.as_bytes()),
+           Some(b"llo".as_ref()));
+
1.51.0 · source

pub fn strip_suffix<P>(&self, suffix: &P) -> Option<&[T]>
where + P: SlicePattern<Item = T> + ?Sized, + T: PartialEq,

Returns a subslice with the suffix removed.

+

If the slice ends with suffix, returns the subslice before the suffix, wrapped in Some. +If suffix is empty, simply returns the original slice. If suffix is equal to the +original slice, returns an empty slice.

+

If the slice does not end with suffix, returns None.

+
§Examples
+
let v = &[10, 40, 30];
+assert_eq!(v.strip_suffix(&[30]), Some(&[10, 40][..]));
+assert_eq!(v.strip_suffix(&[40, 30]), Some(&[10][..]));
+assert_eq!(v.strip_suffix(&[10, 40, 30]), Some(&[][..]));
+assert_eq!(v.strip_suffix(&[50]), None);
+assert_eq!(v.strip_suffix(&[50, 30]), None);
+

Binary searches this slice for a given element. +If the slice is not sorted, the returned result is unspecified and +meaningless.

+

If the value is found then Result::Ok is returned, containing the +index of the matching element. If there are multiple matches, then any +one of the matches could be returned. The index is chosen +deterministically, but is subject to change in future versions of Rust. +If the value is not found then Result::Err is returned, containing +the index where a matching element could be inserted while maintaining +sorted order.

+

See also binary_search_by, binary_search_by_key, and partition_point.

+
§Examples
+

Looks up a series of four elements. The first is found, with a +uniquely determined position; the second and third are not +found; the fourth could match any position in [1, 4].

+ +
let s = [0, 1, 1, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55];
+
+assert_eq!(s.binary_search(&13),  Ok(9));
+assert_eq!(s.binary_search(&4),   Err(7));
+assert_eq!(s.binary_search(&100), Err(13));
+let r = s.binary_search(&1);
+assert!(match r { Ok(1..=4) => true, _ => false, });
+

If you want to find that whole range of matching items, rather than +an arbitrary matching one, that can be done using partition_point:

+ +
let s = [0, 1, 1, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55];
+
+let low = s.partition_point(|x| x < &1);
+assert_eq!(low, 1);
+let high = s.partition_point(|x| x <= &1);
+assert_eq!(high, 5);
+let r = s.binary_search(&1);
+assert!((low..high).contains(&r.unwrap()));
+
+assert!(s[..low].iter().all(|&x| x < 1));
+assert!(s[low..high].iter().all(|&x| x == 1));
+assert!(s[high..].iter().all(|&x| x > 1));
+
+// For something not found, the "range" of equal items is empty
+assert_eq!(s.partition_point(|x| x < &11), 9);
+assert_eq!(s.partition_point(|x| x <= &11), 9);
+assert_eq!(s.binary_search(&11), Err(9));
+

If you want to insert an item to a sorted vector, while maintaining +sort order, consider using partition_point:

+ +
let mut s = vec![0, 1, 1, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55];
+let num = 42;
+let idx = s.partition_point(|&x| x <= num);
+// If `num` is unique, `s.partition_point(|&x| x < num)` (with `<`) is equivalent to
+// `s.binary_search(&num).unwrap_or_else(|x| x)`, but using `<=` will allow `insert`
+// to shift less elements.
+s.insert(idx, num);
+assert_eq!(s, [0, 1, 1, 1, 1, 2, 3, 5, 8, 13, 21, 34, 42, 55]);
+
1.0.0 · source

pub fn binary_search_by<'a, F>(&'a self, f: F) -> Result<usize, usize>
where + F: FnMut(&'a T) -> Ordering,

Binary searches this slice with a comparator function.

+

The comparator function should return an order code that indicates +whether its argument is Less, Equal or Greater the desired +target. +If the slice is not sorted or if the comparator function does not +implement an order consistent with the sort order of the underlying +slice, the returned result is unspecified and meaningless.

+

If the value is found then Result::Ok is returned, containing the +index of the matching element. If there are multiple matches, then any +one of the matches could be returned. The index is chosen +deterministically, but is subject to change in future versions of Rust. +If the value is not found then Result::Err is returned, containing +the index where a matching element could be inserted while maintaining +sorted order.

+

See also binary_search, binary_search_by_key, and partition_point.

+
§Examples
+

Looks up a series of four elements. The first is found, with a +uniquely determined position; the second and third are not +found; the fourth could match any position in [1, 4].

+ +
let s = [0, 1, 1, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55];
+
+let seek = 13;
+assert_eq!(s.binary_search_by(|probe| probe.cmp(&seek)), Ok(9));
+let seek = 4;
+assert_eq!(s.binary_search_by(|probe| probe.cmp(&seek)), Err(7));
+let seek = 100;
+assert_eq!(s.binary_search_by(|probe| probe.cmp(&seek)), Err(13));
+let seek = 1;
+let r = s.binary_search_by(|probe| probe.cmp(&seek));
+assert!(match r { Ok(1..=4) => true, _ => false, });
+
1.10.0 · source

pub fn binary_search_by_key<'a, B, F>( + &'a self, + b: &B, + f: F, +) -> Result<usize, usize>
where + F: FnMut(&'a T) -> B, + B: Ord,

Binary searches this slice with a key extraction function.

+

Assumes that the slice is sorted by the key, for instance with +sort_by_key using the same key extraction function. +If the slice is not sorted by the key, the returned result is +unspecified and meaningless.

+

If the value is found then Result::Ok is returned, containing the +index of the matching element. If there are multiple matches, then any +one of the matches could be returned. The index is chosen +deterministically, but is subject to change in future versions of Rust. +If the value is not found then Result::Err is returned, containing +the index where a matching element could be inserted while maintaining +sorted order.

+

See also binary_search, binary_search_by, and partition_point.

+
§Examples
+

Looks up a series of four elements in a slice of pairs sorted by +their second elements. The first is found, with a uniquely +determined position; the second and third are not found; the +fourth could match any position in [1, 4].

+ +
let s = [(0, 0), (2, 1), (4, 1), (5, 1), (3, 1),
+         (1, 2), (2, 3), (4, 5), (5, 8), (3, 13),
+         (1, 21), (2, 34), (4, 55)];
+
+assert_eq!(s.binary_search_by_key(&13, |&(a, b)| b),  Ok(9));
+assert_eq!(s.binary_search_by_key(&4, |&(a, b)| b),   Err(7));
+assert_eq!(s.binary_search_by_key(&100, |&(a, b)| b), Err(13));
+let r = s.binary_search_by_key(&1, |&(a, b)| b);
+assert!(match r { Ok(1..=4) => true, _ => false, });
+
1.30.0 · source

pub unsafe fn align_to<U>(&self) -> (&[T], &[U], &[T])

Transmute the slice to a slice of another type, ensuring alignment of the types is +maintained.

+

This method splits the slice into three distinct slices: prefix, correctly aligned middle +slice of a new type, and the suffix slice. The middle part will be as big as possible under +the given alignment constraint and element size.

+

This method has no purpose when either input element T or output element U are +zero-sized and will return the original slice without splitting anything.

+
§Safety
+

This method is essentially a transmute with respect to the elements in the returned +middle slice, so all the usual caveats pertaining to transmute::<T, U> also apply here.

+
§Examples
+

Basic usage:

+ +
unsafe {
+    let bytes: [u8; 7] = [1, 2, 3, 4, 5, 6, 7];
+    let (prefix, shorts, suffix) = bytes.align_to::<u16>();
+    // less_efficient_algorithm_for_bytes(prefix);
+    // more_efficient_algorithm_for_aligned_shorts(shorts);
+    // less_efficient_algorithm_for_bytes(suffix);
+}
+
source

pub fn as_simd<const LANES: usize>(&self) -> (&[T], &[Simd<T, LANES>], &[T])
where + Simd<T, LANES>: AsRef<[T; LANES]>, + T: SimdElement, + LaneCount<LANES>: SupportedLaneCount,

🔬This is a nightly-only experimental API. (portable_simd)

Split a slice into a prefix, a middle of aligned SIMD types, and a suffix.

+

This is a safe wrapper around slice::align_to, so inherits the same +guarantees as that method.

+
§Panics
+

This will panic if the size of the SIMD type is different from +LANES times that of the scalar.

+

At the time of writing, the trait restrictions on Simd<T, LANES> keeps +that from ever happening, as only power-of-two numbers of lanes are +supported. It’s possible that, in the future, those restrictions might +be lifted in a way that would make it possible to see panics from this +method for something like LANES == 3.

+
§Examples
+
#![feature(portable_simd)]
+use core::simd::prelude::*;
+
+let short = &[1, 2, 3];
+let (prefix, middle, suffix) = short.as_simd::<4>();
+assert_eq!(middle, []); // Not enough elements for anything in the middle
+
+// They might be split in any possible way between prefix and suffix
+let it = prefix.iter().chain(suffix).copied();
+assert_eq!(it.collect::<Vec<_>>(), vec![1, 2, 3]);
+
+fn basic_simd_sum(x: &[f32]) -> f32 {
+    use std::ops::Add;
+    let (prefix, middle, suffix) = x.as_simd();
+    let sums = f32x4::from_array([
+        prefix.iter().copied().sum(),
+        0.0,
+        0.0,
+        suffix.iter().copied().sum(),
+    ]);
+    let sums = middle.iter().copied().fold(sums, f32x4::add);
+    sums.reduce_sum()
+}
+
+let numbers: Vec<f32> = (1..101).map(|x| x as _).collect();
+assert_eq!(basic_simd_sum(&numbers[1..99]), 4949.0);
+
source

pub fn is_sorted(&self) -> bool
where + T: PartialOrd,

🔬This is a nightly-only experimental API. (is_sorted)

Checks if the elements of this slice are sorted.

+

That is, for each element a and its following element b, a <= b must hold. If the +slice yields exactly zero or one element, true is returned.

+

Note that if Self::Item is only PartialOrd, but not Ord, the above definition +implies that this function returns false if any two consecutive items are not +comparable.

+
§Examples
+
#![feature(is_sorted)]
+let empty: [i32; 0] = [];
+
+assert!([1, 2, 2, 9].is_sorted());
+assert!(![1, 3, 2, 4].is_sorted());
+assert!([0].is_sorted());
+assert!(empty.is_sorted());
+assert!(![0.0, 1.0, f32::NAN].is_sorted());
+
source

pub fn is_sorted_by<'a, F>(&'a self, compare: F) -> bool
where + F: FnMut(&'a T, &'a T) -> bool,

🔬This is a nightly-only experimental API. (is_sorted)

Checks if the elements of this slice are sorted using the given comparator function.

+

Instead of using PartialOrd::partial_cmp, this function uses the given compare +function to determine whether two elements are to be considered in sorted order.

+
§Examples
+
#![feature(is_sorted)]
+
+assert!([1, 2, 2, 9].is_sorted_by(|a, b| a <= b));
+assert!(![1, 2, 2, 9].is_sorted_by(|a, b| a < b));
+
+assert!([0].is_sorted_by(|a, b| true));
+assert!([0].is_sorted_by(|a, b| false));
+
+let empty: [i32; 0] = [];
+assert!(empty.is_sorted_by(|a, b| false));
+assert!(empty.is_sorted_by(|a, b| true));
+
source

pub fn is_sorted_by_key<'a, F, K>(&'a self, f: F) -> bool
where + F: FnMut(&'a T) -> K, + K: PartialOrd,

🔬This is a nightly-only experimental API. (is_sorted)

Checks if the elements of this slice are sorted using the given key extraction function.

+

Instead of comparing the slice’s elements directly, this function compares the keys of the +elements, as determined by f. Apart from that, it’s equivalent to is_sorted; see its +documentation for more information.

+
§Examples
+
#![feature(is_sorted)]
+
+assert!(["c", "bb", "aaa"].is_sorted_by_key(|s| s.len()));
+assert!(![-2i32, -1, 0, 3].is_sorted_by_key(|n| n.abs()));
+
1.52.0 · source

pub fn partition_point<P>(&self, pred: P) -> usize
where + P: FnMut(&T) -> bool,

Returns the index of the partition point according to the given predicate +(the index of the first element of the second partition).

+

The slice is assumed to be partitioned according to the given predicate. +This means that all elements for which the predicate returns true are at the start of the slice +and all elements for which the predicate returns false are at the end. +For example, [7, 15, 3, 5, 4, 12, 6] is partitioned under the predicate x % 2 != 0 +(all odd numbers are at the start, all even at the end).

+

If this slice is not partitioned, the returned result is unspecified and meaningless, +as this method performs a kind of binary search.

+

See also binary_search, binary_search_by, and binary_search_by_key.

+
§Examples
+
let v = [1, 2, 3, 3, 5, 6, 7];
+let i = v.partition_point(|&x| x < 5);
+
+assert_eq!(i, 4);
+assert!(v[..i].iter().all(|&x| x < 5));
+assert!(v[i..].iter().all(|&x| !(x < 5)));
+

If all elements of the slice match the predicate, including if the slice +is empty, then the length of the slice will be returned:

+ +
let a = [2, 4, 8];
+assert_eq!(a.partition_point(|x| x < &100), a.len());
+let a: [i32; 0] = [];
+assert_eq!(a.partition_point(|x| x < &100), 0);
+

If you want to insert an item to a sorted vector, while maintaining +sort order:

+ +
let mut s = vec![0, 1, 1, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55];
+let num = 42;
+let idx = s.partition_point(|&x| x <= num);
+s.insert(idx, num);
+assert_eq!(s, [0, 1, 1, 1, 1, 2, 3, 5, 8, 13, 21, 34, 42, 55]);
+
1.23.0 · source

pub fn to_ascii_uppercase(&self) -> Vec<u8>

Returns a vector containing a copy of this slice where each byte +is mapped to its ASCII upper case equivalent.

+

ASCII letters ‘a’ to ‘z’ are mapped to ‘A’ to ‘Z’, +but non-ASCII letters are unchanged.

+

To uppercase the value in-place, use make_ascii_uppercase.

+
1.23.0 · source

pub fn to_ascii_lowercase(&self) -> Vec<u8>

Returns a vector containing a copy of this slice where each byte +is mapped to its ASCII lower case equivalent.

+

ASCII letters ‘A’ to ‘Z’ are mapped to ‘a’ to ‘z’, +but non-ASCII letters are unchanged.

+

To lowercase the value in-place, use make_ascii_lowercase.

+
1.0.0 · source

pub fn to_vec(&self) -> Vec<T>
where + T: Clone,

Copies self into a new Vec.

+
§Examples
+
let s = [10, 40, 30];
+let x = s.to_vec();
+// Here, `s` and `x` can be modified independently.
+
source

pub fn to_vec_in<A>(&self, alloc: A) -> Vec<T, A>
where + A: Allocator, + T: Clone,

🔬This is a nightly-only experimental API. (allocator_api)

Copies self into a new Vec with an allocator.

+
§Examples
+
#![feature(allocator_api)]
+
+use std::alloc::System;
+
+let s = [10, 40, 30];
+let x = s.to_vec_in(System);
+// Here, `s` and `x` can be modified independently.
+
1.40.0 · source

pub fn repeat(&self, n: usize) -> Vec<T>
where + T: Copy,

Creates a vector by copying a slice n times.

+
§Panics
+

This function will panic if the capacity would overflow.

+
§Examples
+

Basic usage:

+ +
assert_eq!([1, 2].repeat(3), vec![1, 2, 1, 2, 1, 2]);
+

A panic upon overflow:

+ +
// this will panic at runtime
+b"0123456789abcdef".repeat(usize::MAX);
+
1.0.0 · source

pub fn concat<Item>(&self) -> <[T] as Concat<Item>>::Output
where + [T]: Concat<Item>, + Item: ?Sized,

Flattens a slice of T into a single value Self::Output.

+
§Examples
+
assert_eq!(["hello", "world"].concat(), "helloworld");
+assert_eq!([[1, 2], [3, 4]].concat(), [1, 2, 3, 4]);
+
1.3.0 · source

pub fn join<Separator>( + &self, + sep: Separator, +) -> <[T] as Join<Separator>>::Output
where + [T]: Join<Separator>,

Flattens a slice of T into a single value Self::Output, placing a +given separator between each.

+
§Examples
+
assert_eq!(["hello", "world"].join(" "), "hello world");
+assert_eq!([[1, 2], [3, 4]].join(&0), [1, 2, 0, 3, 4]);
+assert_eq!([[1, 2], [3, 4]].join(&[0, 0][..]), [1, 2, 0, 0, 3, 4]);
+
1.0.0 · source

pub fn connect<Separator>( + &self, + sep: Separator, +) -> <[T] as Join<Separator>>::Output
where + [T]: Join<Separator>,

👎Deprecated since 1.3.0: renamed to join

Flattens a slice of T into a single value Self::Output, placing a +given separator between each.

+
§Examples
+
assert_eq!(["hello", "world"].connect(" "), "hello world");
+assert_eq!([[1, 2], [3, 4]].connect(&0), [1, 2, 0, 3, 4]);
+

Trait Implementations§

source§

impl Clone for SerializedTetraplets

source§

fn clone(&self) -> SerializedTetraplets

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for SerializedTetraplets

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Default for SerializedTetraplets

source§

fn default() -> SerializedTetraplets

Returns the “default value” for a type. Read more
source§

impl Deref for SerializedTetraplets

§

type Target = [u8]

The resulting type after dereferencing.
source§

fn deref(&self) -> &Self::Target

Dereferences the value.
source§

impl<'de> Deserialize<'de> for SerializedTetraplets

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl From<SerializedTetraplets> for Vec<u8>

source§

fn from(value: SerializedTetraplets) -> Self

Converts to this type from the input type.
source§

impl From<Vec<u8>> for SerializedTetraplets

source§

fn from(value: Vec<u8>) -> Self

Converts to this type from the input type.
source§

impl Hash for SerializedTetraplets

source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
source§

impl PartialEq for SerializedTetraplets

source§

fn eq(&self, other: &SerializedTetraplets) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl Serialize for SerializedTetraplets

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Eq for SerializedTetraplets

source§

impl StructuralPartialEq for SerializedTetraplets

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CallHasher for T
where + T: Hash + ?Sized,

§

default fn get_hash<H, B>(value: &H, build_hasher: &B) -> u64
where + H: Hash + ?Sized, + B: BuildHasher,

source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_interpreter_interface/struct.SoftLimitsTriggering.html b/air_interpreter_interface/struct.SoftLimitsTriggering.html new file mode 100644 index 00000000..16d8cfae --- /dev/null +++ b/air_interpreter_interface/struct.SoftLimitsTriggering.html @@ -0,0 +1,36 @@ +SoftLimitsTriggering in air_interpreter_interface - Rust
pub struct SoftLimitsTriggering {
+    pub air_size_limit_exceeded: bool,
+    pub particle_size_limit_exceeded: bool,
+    pub call_result_size_limit_exceeded: bool,
+}
Expand description

This stores soft limits triggering flags.

+

Fields§

§air_size_limit_exceeded: bool§particle_size_limit_exceeded: bool§call_result_size_limit_exceeded: bool

Implementations§

source§

impl SoftLimitsTriggering

source

pub fn new( + air_size_limit_exceeded: bool, + particle_size_limit_exceeded: bool, + call_result_size_limit_exceeded: bool, +) -> Self

source

pub fn are_limits_exceeded(&self) -> bool

Trait Implementations§

source§

impl Clone for SoftLimitsTriggering

source§

fn clone(&self) -> SoftLimitsTriggering

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for SoftLimitsTriggering

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Default for SoftLimitsTriggering

source§

fn default() -> SoftLimitsTriggering

Returns the “default value” for a type. Read more
source§

impl<'de> Deserialize<'de> for SoftLimitsTriggering

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl PartialEq for SoftLimitsTriggering

source§

fn eq(&self, other: &SoftLimitsTriggering) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl Serialize for SoftLimitsTriggering

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Copy for SoftLimitsTriggering

source§

impl Eq for SoftLimitsTriggering

source§

impl StructuralPartialEq for SoftLimitsTriggering

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
source§

impl<T> CloneToUninit for T
where + T: Copy,

source§

unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_interpreter_interface/struct.TetrapletsRepr.html b/air_interpreter_interface/struct.TetrapletsRepr.html new file mode 100644 index 00000000..b975d72e --- /dev/null +++ b/air_interpreter_interface/struct.TetrapletsRepr.html @@ -0,0 +1,32 @@ +TetrapletsRepr in air_interpreter_interface - Rust

Struct air_interpreter_interface::TetrapletsRepr

source ·
pub struct TetrapletsRepr;

Trait Implementations§

source§

impl Default for TetrapletsRepr

source§

fn default() -> TetrapletsRepr

Returns the “default value” for a type. Read more
source§

impl FromSerialized<Vec<Vec<Rc<SecurityTetraplet>>>> for TetrapletsRepr

source§

fn deserialize( + &self, + repr: &[u8], +) -> Result<Vec<Vec<Rc<SecurityTetraplet>>>, Self::DeserializeError>

source§

impl FromSerialized<Vec<Vec<SecurityTetraplet>>> for TetrapletsRepr

source§

fn deserialize( + &self, + repr: &[u8], +) -> Result<Vec<Vec<SecurityTetraplet>>, Self::DeserializeError>

source§

impl Representation for TetrapletsRepr

source§

impl ToSerialized<Vec<Vec<Rc<SecurityTetraplet>>>> for TetrapletsRepr

source§

fn serialize( + &self, + value: &Vec<Vec<Rc<SecurityTetraplet>>>, +) -> Result<SerializedTetraplets, Self::SerializeError>

source§

impl ToWriter<Vec<Vec<Rc<SecurityTetraplet>>>> for TetrapletsRepr

source§

fn to_writer<W: Write>( + &self, + value: &Vec<Vec<Rc<SecurityTetraplet>>>, + writer: &mut W, +) -> Result<(), Self::WriteError>

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/air_interpreter_interface/type.CallArgumentsDeserializeError.html b/air_interpreter_interface/type.CallArgumentsDeserializeError.html new file mode 100644 index 00000000..49015206 --- /dev/null +++ b/air_interpreter_interface/type.CallArgumentsDeserializeError.html @@ -0,0 +1 @@ +CallArgumentsDeserializeError in air_interpreter_interface - Rust
pub type CallArgumentsDeserializeError = <CallArgumentsRepr as Representation>::DeserializeError;
\ No newline at end of file diff --git a/air_interpreter_interface/type.CallArgumentsFormat.html b/air_interpreter_interface/type.CallArgumentsFormat.html new file mode 100644 index 00000000..6bfff061 --- /dev/null +++ b/air_interpreter_interface/type.CallArgumentsFormat.html @@ -0,0 +1 @@ +CallArgumentsFormat in air_interpreter_interface - Rust

Type Alias air_interpreter_interface::CallArgumentsFormat

source ·
pub type CallArgumentsFormat = MsgPackFormat;

Aliased Type§

struct CallArgumentsFormat;
\ No newline at end of file diff --git a/air_interpreter_interface/type.CallRequests.html b/air_interpreter_interface/type.CallRequests.html new file mode 100644 index 00000000..7de65378 --- /dev/null +++ b/air_interpreter_interface/type.CallRequests.html @@ -0,0 +1 @@ +CallRequests in air_interpreter_interface - Rust

Type Alias air_interpreter_interface::CallRequests

source ·
pub type CallRequests = HashMap<u32, CallRequestParams>;

Aliased Type§

struct CallRequests { /* private fields */ }
\ No newline at end of file diff --git a/air_interpreter_interface/type.CallRequestsDeserializeError.html b/air_interpreter_interface/type.CallRequestsDeserializeError.html new file mode 100644 index 00000000..176a7888 --- /dev/null +++ b/air_interpreter_interface/type.CallRequestsDeserializeError.html @@ -0,0 +1 @@ +CallRequestsDeserializeError in air_interpreter_interface - Rust
pub type CallRequestsDeserializeError = <CallRequestsRepr as Representation>::DeserializeError;
\ No newline at end of file diff --git a/air_interpreter_interface/type.CallRequestsFormat.html b/air_interpreter_interface/type.CallRequestsFormat.html new file mode 100644 index 00000000..a605543e --- /dev/null +++ b/air_interpreter_interface/type.CallRequestsFormat.html @@ -0,0 +1 @@ +CallRequestsFormat in air_interpreter_interface - Rust

Type Alias air_interpreter_interface::CallRequestsFormat

source ·
pub type CallRequestsFormat = MsgPackMultiformat;

Aliased Type§

struct CallRequestsFormat;
\ No newline at end of file diff --git a/air_interpreter_interface/type.CallResults.html b/air_interpreter_interface/type.CallResults.html new file mode 100644 index 00000000..e57ae073 --- /dev/null +++ b/air_interpreter_interface/type.CallResults.html @@ -0,0 +1,3 @@ +CallResults in air_interpreter_interface - Rust

Type Alias air_interpreter_interface::CallResults

source ·
pub type CallResults = HashMap<String, CallServiceResult>;
Expand description

This is a map from a String to a service result for compatibility with JavaScript. +Binary format implementations like rmp-serde do not convert keys from strings, unlike serde_json.

+

Aliased Type§

struct CallResults { /* private fields */ }
\ No newline at end of file diff --git a/air_interpreter_interface/type.CallResultsDeserializeError.html b/air_interpreter_interface/type.CallResultsDeserializeError.html new file mode 100644 index 00000000..1221b0ba --- /dev/null +++ b/air_interpreter_interface/type.CallResultsDeserializeError.html @@ -0,0 +1 @@ +CallResultsDeserializeError in air_interpreter_interface - Rust
pub type CallResultsDeserializeError = <CallResultsRepr as Representation>::DeserializeError;
\ No newline at end of file diff --git a/air_interpreter_interface/type.CallResultsFormat.html b/air_interpreter_interface/type.CallResultsFormat.html new file mode 100644 index 00000000..3b6f8765 --- /dev/null +++ b/air_interpreter_interface/type.CallResultsFormat.html @@ -0,0 +1 @@ +CallResultsFormat in air_interpreter_interface - Rust

Type Alias air_interpreter_interface::CallResultsFormat

source ·
pub type CallResultsFormat = MsgPackMultiformat;

Aliased Type§

struct CallResultsFormat;
\ No newline at end of file diff --git a/air_interpreter_interface/type.CallResultsSerializeError.html b/air_interpreter_interface/type.CallResultsSerializeError.html new file mode 100644 index 00000000..45c15909 --- /dev/null +++ b/air_interpreter_interface/type.CallResultsSerializeError.html @@ -0,0 +1 @@ +CallResultsSerializeError in air_interpreter_interface - Rust
pub type CallResultsSerializeError = <CallResultsRepr as Representation>::SerializeError;
\ No newline at end of file diff --git a/air_interpreter_interface/type.TetrapletDeserializeError.html b/air_interpreter_interface/type.TetrapletDeserializeError.html new file mode 100644 index 00000000..2c85c0c4 --- /dev/null +++ b/air_interpreter_interface/type.TetrapletDeserializeError.html @@ -0,0 +1 @@ +TetrapletDeserializeError in air_interpreter_interface - Rust
pub type TetrapletDeserializeError = <TetrapletsRepr as Representation>::DeserializeError;
\ No newline at end of file diff --git a/air_interpreter_interface/type.TetrapletsFormat.html b/air_interpreter_interface/type.TetrapletsFormat.html new file mode 100644 index 00000000..327b87e3 --- /dev/null +++ b/air_interpreter_interface/type.TetrapletsFormat.html @@ -0,0 +1 @@ +TetrapletsFormat in air_interpreter_interface - Rust

Type Alias air_interpreter_interface::TetrapletsFormat

source ·
pub type TetrapletsFormat = MsgPackFormat;

Aliased Type§

struct TetrapletsFormat;
\ No newline at end of file diff --git a/air_interpreter_sede/all.html b/air_interpreter_sede/all.html new file mode 100644 index 00000000..f48b21a8 --- /dev/null +++ b/air_interpreter_sede/all.html @@ -0,0 +1 @@ +List of all items in this crate
\ No newline at end of file diff --git a/air_interpreter_sede/format/trait.Format.html b/air_interpreter_sede/format/trait.Format.html new file mode 100644 index 00000000..dbf6f992 --- /dev/null +++ b/air_interpreter_sede/format/trait.Format.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_sede/trait.Format.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_sede/index.html b/air_interpreter_sede/index.html new file mode 100644 index 00000000..cb8a1d12 --- /dev/null +++ b/air_interpreter_sede/index.html @@ -0,0 +1,2 @@ +air_interpreter_sede - Rust

Crate air_interpreter_sede

source ·

Modules§

Macros§

Structs§

Traits§

  • Borrow deserialization trait restricted to for particular type.
  • Owned deserialization trait restricted to for particular type.
  • A formatter intended for particular type, a base type that defines generic behavior +used by particular implementations.
  • Serialization trait restricted to for particular type.
  • Writing deserialization trait restricted to for particular type.
\ No newline at end of file diff --git a/air_interpreter_sede/macro.define_simple_representation!.html b/air_interpreter_sede/macro.define_simple_representation!.html new file mode 100644 index 00000000..9b3b5c4a --- /dev/null +++ b/air_interpreter_sede/macro.define_simple_representation!.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to macro.define_simple_representation.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_sede/macro.define_simple_representation.html b/air_interpreter_sede/macro.define_simple_representation.html new file mode 100644 index 00000000..7bb366fe --- /dev/null +++ b/air_interpreter_sede/macro.define_simple_representation.html @@ -0,0 +1,3 @@ +define_simple_representation in air_interpreter_sede - Rust
macro_rules! define_simple_representation {
+    ($repr_type:ident, $value_type:ty, $format_type:ty, $serialized_value:ty) => { ... };
+}
\ No newline at end of file diff --git a/air_interpreter_sede/macro.derive_serialized_type!.html b/air_interpreter_sede/macro.derive_serialized_type!.html new file mode 100644 index 00000000..3efcb157 --- /dev/null +++ b/air_interpreter_sede/macro.derive_serialized_type!.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to macro.derive_serialized_type.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_sede/macro.derive_serialized_type.html b/air_interpreter_sede/macro.derive_serialized_type.html new file mode 100644 index 00000000..590d9913 --- /dev/null +++ b/air_interpreter_sede/macro.derive_serialized_type.html @@ -0,0 +1,4 @@ +derive_serialized_type in air_interpreter_sede - Rust
macro_rules! derive_serialized_type {
+    ($type_name:ident) => { ... };
+    ($type_name:ident, $decl:meta) => { ... };
+}
\ No newline at end of file diff --git a/air_interpreter_sede/multiformat/enum.DecodeError.html b/air_interpreter_sede/multiformat/enum.DecodeError.html new file mode 100644 index 00000000..8cdfcc27 --- /dev/null +++ b/air_interpreter_sede/multiformat/enum.DecodeError.html @@ -0,0 +1,25 @@ +DecodeError in air_interpreter_sede::multiformat - Rust

Enum air_interpreter_sede::multiformat::DecodeError

source ·
pub enum DecodeError<FormatError> {
+    Format(FormatError),
+    Codec(SerializationCodec),
+    VarInt(Error),
+}

Variants§

§

Format(FormatError)

§

Codec(SerializationCodec)

§

VarInt(Error)

Trait Implementations§

source§

impl<FormatError: Debug> Debug for DecodeError<FormatError>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<FormatError> Display for DecodeError<FormatError>
where + FormatError: Display,

source§

fn fmt(&self, __formatter: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<FormatError> Error for DecodeError<FormatError>
where + FormatError: Error, + Self: Debug + Display,

source§

fn source(&self) -> Option<&(dyn Error + 'static)>

The lower-level source of this error, if any. Read more
1.0.0 · source§

fn description(&self) -> &str

👎Deprecated since 1.42.0: use the Display impl or to_string()
1.0.0 · source§

fn cause(&self) -> Option<&dyn Error>

👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
source§

fn provide<'a>(&'a self, request: &mut Request<'a>)

🔬This is a nightly-only experimental API. (error_generic_member_access)
Provides type based access to context intended for error reports. Read more
source§

impl<FormatError> From<Error> for DecodeError<FormatError>

source§

fn from(source: Error) -> Self

Converts to this type from the input type.

Auto Trait Implementations§

§

impl<FormatError> Freeze for DecodeError<FormatError>
where + FormatError: Freeze,

§

impl<FormatError> RefUnwindSafe for DecodeError<FormatError>
where + FormatError: RefUnwindSafe,

§

impl<FormatError> Send for DecodeError<FormatError>
where + FormatError: Send,

§

impl<FormatError> Sync for DecodeError<FormatError>
where + FormatError: Sync,

§

impl<FormatError> Unpin for DecodeError<FormatError>
where + FormatError: Unpin,

§

impl<FormatError> UnwindSafe for DecodeError<FormatError>
where + FormatError: UnwindSafe,

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/air_interpreter_sede/multiformat/enum.EncodeError.html b/air_interpreter_sede/multiformat/enum.EncodeError.html new file mode 100644 index 00000000..ad9f5dec --- /dev/null +++ b/air_interpreter_sede/multiformat/enum.EncodeError.html @@ -0,0 +1,22 @@ +EncodeError in air_interpreter_sede::multiformat - Rust

Enum air_interpreter_sede::multiformat::EncodeError

source ·
pub enum EncodeError<FormatError> {
+    Format(FormatError),
+    Io(Error),
+}

Variants§

§

Format(FormatError)

§

Io(Error)

Trait Implementations§

source§

impl<FormatError: Debug> Debug for EncodeError<FormatError>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<FormatError> Display for EncodeError<FormatError>
where + FormatError: Display,

source§

fn fmt(&self, __formatter: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<FormatError> Error for EncodeError<FormatError>
where + FormatError: Error, + Self: Debug + Display,

source§

fn source(&self) -> Option<&(dyn Error + 'static)>

The lower-level source of this error, if any. Read more
1.0.0 · source§

fn description(&self) -> &str

👎Deprecated since 1.42.0: use the Display impl or to_string()
1.0.0 · source§

fn cause(&self) -> Option<&dyn Error>

👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
source§

fn provide<'a>(&'a self, request: &mut Request<'a>)

🔬This is a nightly-only experimental API. (error_generic_member_access)
Provides type based access to context intended for error reports. Read more
source§

impl<FormatError> From<Error> for EncodeError<FormatError>

source§

fn from(source: Error) -> Self

Converts to this type from the input type.

Auto Trait Implementations§

§

impl<FormatError> Freeze for EncodeError<FormatError>
where + FormatError: Freeze,

§

impl<FormatError> !RefUnwindSafe for EncodeError<FormatError>

§

impl<FormatError> Send for EncodeError<FormatError>
where + FormatError: Send,

§

impl<FormatError> Sync for EncodeError<FormatError>
where + FormatError: Sync,

§

impl<FormatError> Unpin for EncodeError<FormatError>
where + FormatError: Unpin,

§

impl<FormatError> !UnwindSafe for EncodeError<FormatError>

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/air_interpreter_sede/multiformat/fn.decode_multiformat.html b/air_interpreter_sede/multiformat/fn.decode_multiformat.html new file mode 100644 index 00000000..002c2909 --- /dev/null +++ b/air_interpreter_sede/multiformat/fn.decode_multiformat.html @@ -0,0 +1,5 @@ +decode_multiformat in air_interpreter_sede::multiformat - Rust
pub fn decode_multiformat<Value, Fmt: Format<Value>>(
+    multiformat_data: &[u8],
+    expected_codec: SerializationCodec,
+    format: &Fmt,
+) -> Result<Value, DecodeError<<Fmt as Format<Value>>::DeserializationError>>
\ No newline at end of file diff --git a/air_interpreter_sede/multiformat/fn.encode_multiformat.html b/air_interpreter_sede/multiformat/fn.encode_multiformat.html new file mode 100644 index 00000000..e14ed39b --- /dev/null +++ b/air_interpreter_sede/multiformat/fn.encode_multiformat.html @@ -0,0 +1,5 @@ +encode_multiformat in air_interpreter_sede::multiformat - Rust
pub fn encode_multiformat<Value, Fmt: Format<Value>>(
+    data: &Value,
+    codec: SerializationCodec,
+    format: &Fmt,
+) -> Result<Vec<u8>, EncodeError<<Fmt as Format<Value>>::WriteError>>
\ No newline at end of file diff --git a/air_interpreter_sede/multiformat/fn.parse_multiformat_bytes.html b/air_interpreter_sede/multiformat/fn.parse_multiformat_bytes.html new file mode 100644 index 00000000..f5d6d71f --- /dev/null +++ b/air_interpreter_sede/multiformat/fn.parse_multiformat_bytes.html @@ -0,0 +1,3 @@ +parse_multiformat_bytes in air_interpreter_sede::multiformat - Rust
pub fn parse_multiformat_bytes(
+    data: &[u8],
+) -> Result<(SerializationCodec, &[u8]), Error>
\ No newline at end of file diff --git a/air_interpreter_sede/multiformat/fn.write_multiformat.html b/air_interpreter_sede/multiformat/fn.write_multiformat.html new file mode 100644 index 00000000..2d6cdda4 --- /dev/null +++ b/air_interpreter_sede/multiformat/fn.write_multiformat.html @@ -0,0 +1,6 @@ +write_multiformat in air_interpreter_sede::multiformat - Rust

Function air_interpreter_sede::multiformat::write_multiformat

source ·
pub fn write_multiformat<Value, Fmt: Format<Value>, W: Write>(
+    data: &Value,
+    codec: SerializationCodec,
+    format: &Fmt,
+    output: &mut W,
+) -> Result<(), EncodeError<<Fmt as Format<Value>>::WriteError>>
\ No newline at end of file diff --git a/air_interpreter_sede/multiformat/index.html b/air_interpreter_sede/multiformat/index.html new file mode 100644 index 00000000..3060c097 --- /dev/null +++ b/air_interpreter_sede/multiformat/index.html @@ -0,0 +1 @@ +air_interpreter_sede::multiformat - Rust
\ No newline at end of file diff --git a/air_interpreter_sede/multiformat/sidebar-items.js b/air_interpreter_sede/multiformat/sidebar-items.js new file mode 100644 index 00000000..c7cffb31 --- /dev/null +++ b/air_interpreter_sede/multiformat/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"enum":["DecodeError","EncodeError"],"fn":["decode_multiformat","encode_multiformat","parse_multiformat_bytes","write_multiformat"],"type":["SerializationCodec"]}; \ No newline at end of file diff --git a/air_interpreter_sede/multiformat/type.SerializationCodec.html b/air_interpreter_sede/multiformat/type.SerializationCodec.html new file mode 100644 index 00000000..289e8c96 --- /dev/null +++ b/air_interpreter_sede/multiformat/type.SerializationCodec.html @@ -0,0 +1 @@ +SerializationCodec in air_interpreter_sede::multiformat - Rust

Type Alias air_interpreter_sede::multiformat::SerializationCodec

source ·
pub type SerializationCodec = u32;
\ No newline at end of file diff --git a/air_interpreter_sede/representation/trait.FromSerialiedBorrow.html b/air_interpreter_sede/representation/trait.FromSerialiedBorrow.html new file mode 100644 index 00000000..eb0850e1 --- /dev/null +++ b/air_interpreter_sede/representation/trait.FromSerialiedBorrow.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_sede/trait.FromSerialiedBorrow.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_sede/representation/trait.FromSerialized.html b/air_interpreter_sede/representation/trait.FromSerialized.html new file mode 100644 index 00000000..c3622682 --- /dev/null +++ b/air_interpreter_sede/representation/trait.FromSerialized.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_sede/trait.FromSerialized.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_sede/representation/trait.Representation.html b/air_interpreter_sede/representation/trait.Representation.html new file mode 100644 index 00000000..791db90c --- /dev/null +++ b/air_interpreter_sede/representation/trait.Representation.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_sede/trait.Representation.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_sede/representation/trait.ToSerialized.html b/air_interpreter_sede/representation/trait.ToSerialized.html new file mode 100644 index 00000000..d0dc0f27 --- /dev/null +++ b/air_interpreter_sede/representation/trait.ToSerialized.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_sede/trait.ToSerialized.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_sede/representation/trait.ToWriter.html b/air_interpreter_sede/representation/trait.ToWriter.html new file mode 100644 index 00000000..9db9f0b6 --- /dev/null +++ b/air_interpreter_sede/representation/trait.ToWriter.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_sede/trait.ToWriter.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_sede/rmp_serde/struct.RmpSerdeFormat.html b/air_interpreter_sede/rmp_serde/struct.RmpSerdeFormat.html new file mode 100644 index 00000000..1b88142f --- /dev/null +++ b/air_interpreter_sede/rmp_serde/struct.RmpSerdeFormat.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_sede/struct.RmpSerdeFormat.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_sede/rmp_serde/struct.RmpSerdeMultiformat.html b/air_interpreter_sede/rmp_serde/struct.RmpSerdeMultiformat.html new file mode 100644 index 00000000..c3dc02b6 --- /dev/null +++ b/air_interpreter_sede/rmp_serde/struct.RmpSerdeMultiformat.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_sede/struct.RmpSerdeMultiformat.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_sede/sidebar-items.js b/air_interpreter_sede/sidebar-items.js new file mode 100644 index 00000000..2281c1af --- /dev/null +++ b/air_interpreter_sede/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"macro":["define_simple_representation","derive_serialized_type"],"mod":["multiformat"],"struct":["MsgPackFormat","MsgPackMultiformat","RmpSerdeFormat","RmpSerdeMultiformat"],"trait":["Format","FromSerialiedBorrow","FromSerialized","Representation","ToSerialized","ToWriter"]}; \ No newline at end of file diff --git a/air_interpreter_sede/struct.MsgPackFormat.html b/air_interpreter_sede/struct.MsgPackFormat.html new file mode 100644 index 00000000..d6dbcd53 --- /dev/null +++ b/air_interpreter_sede/struct.MsgPackFormat.html @@ -0,0 +1,19 @@ +MsgPackFormat in air_interpreter_sede - Rust

Struct air_interpreter_sede::MsgPackFormat

source ·
pub struct MsgPackFormat;

Trait Implementations§

source§

impl Clone for RmpSerdeFormat

source§

fn clone(&self) -> RmpSerdeFormat

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Default for RmpSerdeFormat

source§

fn default() -> RmpSerdeFormat

Returns the “default value” for a type. Read more
source§

impl<Value> Format<Value> for RmpSerdeFormat
where + Value: Serialize + DeserializeOwned,

§

type SerializationError = Error

§

type DeserializationError = Error

§

type WriteError = Error

source§

fn to_vec(&self, val: &Value) -> Result<Vec<u8>, Self::SerializationError>

source§

fn from_slice(&self, slice: &[u8]) -> Result<Value, Self::DeserializationError>

source§

fn to_writer<W: Write>( + &self, + value: &Value, + write: &mut W, +) -> Result<(), Self::WriteError>

source§

impl Copy for RmpSerdeFormat

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
source§

impl<T> CloneToUninit for T
where + T: Copy,

source§

unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/air_interpreter_sede/struct.MsgPackMultiformat.html b/air_interpreter_sede/struct.MsgPackMultiformat.html new file mode 100644 index 00000000..bdb1afa9 --- /dev/null +++ b/air_interpreter_sede/struct.MsgPackMultiformat.html @@ -0,0 +1,19 @@ +MsgPackMultiformat in air_interpreter_sede - Rust

Struct air_interpreter_sede::MsgPackMultiformat

source ·
pub struct MsgPackMultiformat;

Trait Implementations§

source§

impl Clone for RmpSerdeMultiformat

source§

fn clone(&self) -> RmpSerdeMultiformat

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Default for RmpSerdeMultiformat

source§

fn default() -> RmpSerdeMultiformat

Returns the “default value” for a type. Read more
source§

impl<Value> Format<Value> for RmpSerdeMultiformat
where + Value: Serialize + DeserializeOwned,

§

type SerializationError = EncodeError<Error>

§

type DeserializationError = DecodeError<Error>

§

type WriteError = EncodeError<Error>

source§

fn to_vec(&self, value: &Value) -> Result<Vec<u8>, Self::SerializationError>

source§

fn from_slice(&self, slice: &[u8]) -> Result<Value, Self::DeserializationError>

source§

fn to_writer<W: Write>( + &self, + value: &Value, + write: &mut W, +) -> Result<(), Self::WriteError>

source§

impl Copy for RmpSerdeMultiformat

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
source§

impl<T> CloneToUninit for T
where + T: Copy,

source§

unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/air_interpreter_sede/struct.RmpSerdeFormat.html b/air_interpreter_sede/struct.RmpSerdeFormat.html new file mode 100644 index 00000000..e554691a --- /dev/null +++ b/air_interpreter_sede/struct.RmpSerdeFormat.html @@ -0,0 +1,19 @@ +RmpSerdeFormat in air_interpreter_sede - Rust

Struct air_interpreter_sede::RmpSerdeFormat

source ·
pub struct RmpSerdeFormat;

Trait Implementations§

source§

impl Clone for RmpSerdeFormat

source§

fn clone(&self) -> RmpSerdeFormat

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Default for RmpSerdeFormat

source§

fn default() -> RmpSerdeFormat

Returns the “default value” for a type. Read more
source§

impl<Value> Format<Value> for RmpSerdeFormat
where + Value: Serialize + DeserializeOwned,

§

type SerializationError = Error

§

type DeserializationError = Error

§

type WriteError = Error

source§

fn to_vec(&self, val: &Value) -> Result<Vec<u8>, Self::SerializationError>

source§

fn from_slice(&self, slice: &[u8]) -> Result<Value, Self::DeserializationError>

source§

fn to_writer<W: Write>( + &self, + value: &Value, + write: &mut W, +) -> Result<(), Self::WriteError>

source§

impl Copy for RmpSerdeFormat

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
source§

impl<T> CloneToUninit for T
where + T: Copy,

source§

unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/air_interpreter_sede/struct.RmpSerdeMultiformat.html b/air_interpreter_sede/struct.RmpSerdeMultiformat.html new file mode 100644 index 00000000..533b35c4 --- /dev/null +++ b/air_interpreter_sede/struct.RmpSerdeMultiformat.html @@ -0,0 +1,19 @@ +RmpSerdeMultiformat in air_interpreter_sede - Rust

Struct air_interpreter_sede::RmpSerdeMultiformat

source ·
pub struct RmpSerdeMultiformat;

Trait Implementations§

source§

impl Clone for RmpSerdeMultiformat

source§

fn clone(&self) -> RmpSerdeMultiformat

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Default for RmpSerdeMultiformat

source§

fn default() -> RmpSerdeMultiformat

Returns the “default value” for a type. Read more
source§

impl<Value> Format<Value> for RmpSerdeMultiformat
where + Value: Serialize + DeserializeOwned,

§

type SerializationError = EncodeError<Error>

§

type DeserializationError = DecodeError<Error>

§

type WriteError = EncodeError<Error>

source§

fn to_vec(&self, value: &Value) -> Result<Vec<u8>, Self::SerializationError>

source§

fn from_slice(&self, slice: &[u8]) -> Result<Value, Self::DeserializationError>

source§

fn to_writer<W: Write>( + &self, + value: &Value, + write: &mut W, +) -> Result<(), Self::WriteError>

source§

impl Copy for RmpSerdeMultiformat

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
source§

impl<T> CloneToUninit for T
where + T: Copy,

source§

unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/air_interpreter_sede/trait.Format.html b/air_interpreter_sede/trait.Format.html new file mode 100644 index 00000000..4c57a49e --- /dev/null +++ b/air_interpreter_sede/trait.Format.html @@ -0,0 +1,23 @@ +Format in air_interpreter_sede - Rust

Trait air_interpreter_sede::Format

source ·
pub trait Format<Value> {
+    type SerializationError: Debug;
+    type DeserializationError: Debug;
+    type WriteError: Debug;
+
+    // Required methods
+    fn to_vec(&self, val: &Value) -> Result<Vec<u8>, Self::SerializationError>;
+    fn from_slice(
+        &self,
+        slice: &[u8],
+    ) -> Result<Value, Self::DeserializationError>;
+    fn to_writer<W: Write>(
+        &self,
+        value: &Value,
+        write: &mut W,
+    ) -> Result<(), Self::WriteError>;
+}

Required Associated Types§

Required Methods§

source

fn to_vec(&self, val: &Value) -> Result<Vec<u8>, Self::SerializationError>

source

fn from_slice(&self, slice: &[u8]) -> Result<Value, Self::DeserializationError>

source

fn to_writer<W: Write>( + &self, + value: &Value, + write: &mut W, +) -> Result<(), Self::WriteError>

Object Safety§

This trait is not object safe.

Implementors§

source§

impl<Value> Format<Value> for RmpSerdeFormat
where + Value: Serialize + DeserializeOwned,

§

type SerializationError = Error

§

type DeserializationError = Error

§

type WriteError = Error

source§

impl<Value> Format<Value> for RmpSerdeMultiformat
where + Value: Serialize + DeserializeOwned,

\ No newline at end of file diff --git a/air_interpreter_sede/trait.FromSerialiedBorrow.html b/air_interpreter_sede/trait.FromSerialiedBorrow.html new file mode 100644 index 00000000..0d4fc7e8 --- /dev/null +++ b/air_interpreter_sede/trait.FromSerialiedBorrow.html @@ -0,0 +1,11 @@ +FromSerialiedBorrow in air_interpreter_sede - Rust

Trait air_interpreter_sede::FromSerialiedBorrow

source ·
pub trait FromSerialiedBorrow<'data, Value: 'data>: Representation {
+    // Required method
+    fn deserialize_borrow(
+        &self,
+        repr: &'data [u8],
+    ) -> Result<Value, Self::DeserializeError>;
+}
Expand description

Borrow deserialization trait restricted to for particular type.

+

Required Methods§

source

fn deserialize_borrow( + &self, + repr: &'data [u8], +) -> Result<Value, Self::DeserializeError>

Implementors§

\ No newline at end of file diff --git a/air_interpreter_sede/trait.FromSerialized.html b/air_interpreter_sede/trait.FromSerialized.html new file mode 100644 index 00000000..bf16eec3 --- /dev/null +++ b/air_interpreter_sede/trait.FromSerialized.html @@ -0,0 +1,5 @@ +FromSerialized in air_interpreter_sede - Rust

Trait air_interpreter_sede::FromSerialized

source ·
pub trait FromSerialized<Value>: Representation {
+    // Required method
+    fn deserialize(&self, repr: &[u8]) -> Result<Value, Self::DeserializeError>;
+}
Expand description

Owned deserialization trait restricted to for particular type.

+

Required Methods§

source

fn deserialize(&self, repr: &[u8]) -> Result<Value, Self::DeserializeError>

Implementors§

\ No newline at end of file diff --git a/air_interpreter_sede/trait.Representation.html b/air_interpreter_sede/trait.Representation.html new file mode 100644 index 00000000..e0f65da8 --- /dev/null +++ b/air_interpreter_sede/trait.Representation.html @@ -0,0 +1,12 @@ +Representation in air_interpreter_sede - Rust

Trait air_interpreter_sede::Representation

source ·
pub trait Representation {
+    type SerializeError;
+    type DeserializeError;
+    type WriteError;
+    type Format;
+    type SerializedValue: Deref<Target = [u8]>;
+
+    // Required method
+    fn get_format(&self) -> Self::Format;
+}
Expand description

A formatter intended for particular type, a base type that defines generic behavior +used by particular implementations.

+

Required Associated Types§

Required Methods§

source

fn get_format(&self) -> Self::Format

Implementors§

\ No newline at end of file diff --git a/air_interpreter_sede/trait.ToSerialized.html b/air_interpreter_sede/trait.ToSerialized.html new file mode 100644 index 00000000..2fea0580 --- /dev/null +++ b/air_interpreter_sede/trait.ToSerialized.html @@ -0,0 +1,11 @@ +ToSerialized in air_interpreter_sede - Rust

Trait air_interpreter_sede::ToSerialized

source ·
pub trait ToSerialized<Value>: Representation {
+    // Required method
+    fn serialize(
+        &self,
+        value: &Value,
+    ) -> Result<Self::SerializedValue, Self::SerializeError>;
+}
Expand description

Serialization trait restricted to for particular type.

+

Required Methods§

source

fn serialize( + &self, + value: &Value, +) -> Result<Self::SerializedValue, Self::SerializeError>

Implementors§

\ No newline at end of file diff --git a/air_interpreter_sede/trait.ToWriter.html b/air_interpreter_sede/trait.ToWriter.html new file mode 100644 index 00000000..604fd574 --- /dev/null +++ b/air_interpreter_sede/trait.ToWriter.html @@ -0,0 +1,13 @@ +ToWriter in air_interpreter_sede - Rust

Trait air_interpreter_sede::ToWriter

source ·
pub trait ToWriter<Value>: Representation {
+    // Required method
+    fn to_writer<W: Write>(
+        &self,
+        value: &Value,
+        writer: &mut W,
+    ) -> Result<(), Self::WriteError>;
+}
Expand description

Writing deserialization trait restricted to for particular type.

+

Required Methods§

source

fn to_writer<W: Write>( + &self, + value: &Value, + writer: &mut W, +) -> Result<(), Self::WriteError>

Object Safety§

This trait is not object safe.

Implementors§

\ No newline at end of file diff --git a/air_interpreter_server/all.html b/air_interpreter_server/all.html new file mode 100644 index 00000000..d1896d20 --- /dev/null +++ b/air_interpreter_server/all.html @@ -0,0 +1 @@ +List of all items in this crate
\ No newline at end of file diff --git a/air_interpreter_server/ast/fn.ast.html b/air_interpreter_server/ast/fn.ast.html new file mode 100644 index 00000000..5680a85a --- /dev/null +++ b/air_interpreter_server/ast/fn.ast.html @@ -0,0 +1,2 @@ +ast in air_interpreter_server::ast - Rust

Function air_interpreter_server::ast::ast

source ·
pub fn ast(script: String) -> String
Expand description

Parse AIR script and return it as minified JSON

+
\ No newline at end of file diff --git a/air_interpreter_server/ast/index.html b/air_interpreter_server/ast/index.html new file mode 100644 index 00000000..58b0e3dc --- /dev/null +++ b/air_interpreter_server/ast/index.html @@ -0,0 +1 @@ +air_interpreter_server::ast - Rust

Module air_interpreter_server::ast

source ·

Functions§

  • Parse AIR script and return it as minified JSON
\ No newline at end of file diff --git a/air_interpreter_server/ast/sidebar-items.js b/air_interpreter_server/ast/sidebar-items.js new file mode 100644 index 00000000..a31326e4 --- /dev/null +++ b/air_interpreter_server/ast/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"fn":["ast"]}; \ No newline at end of file diff --git a/air_interpreter_server/fn.ast.html b/air_interpreter_server/fn.ast.html new file mode 100644 index 00000000..4147e0d7 --- /dev/null +++ b/air_interpreter_server/fn.ast.html @@ -0,0 +1 @@ +ast in air_interpreter_server - Rust

Function air_interpreter_server::ast

source ·
pub fn ast(script: String) -> String
\ No newline at end of file diff --git a/air_interpreter_server/fn.invoke.html b/air_interpreter_server/fn.invoke.html new file mode 100644 index 00000000..3ec62a94 --- /dev/null +++ b/air_interpreter_server/fn.invoke.html @@ -0,0 +1,7 @@ +invoke in air_interpreter_server - Rust

Function air_interpreter_server::invoke

source ·
pub fn invoke(
+    air: String,
+    prev_data: Vec<u8>,
+    data: Vec<u8>,
+    params: RunParameters,
+    call_results: Vec<u8>,
+) -> InterpreterOutcome
\ No newline at end of file diff --git a/air_interpreter_server/fn.invoke_tracing.html b/air_interpreter_server/fn.invoke_tracing.html new file mode 100644 index 00000000..687d7e11 --- /dev/null +++ b/air_interpreter_server/fn.invoke_tracing.html @@ -0,0 +1,9 @@ +invoke_tracing in air_interpreter_server - Rust

Function air_interpreter_server::invoke_tracing

source ·
pub fn invoke_tracing(
+    air: String,
+    prev_data: Vec<u8>,
+    data: Vec<u8>,
+    params: RunParameters,
+    call_results: Vec<u8>,
+    tracing_params: String,
+    tracing_output_mode: u8,
+) -> InterpreterOutcome
\ No newline at end of file diff --git a/air_interpreter_server/fn.main.html b/air_interpreter_server/fn.main.html new file mode 100644 index 00000000..7d67fd36 --- /dev/null +++ b/air_interpreter_server/fn.main.html @@ -0,0 +1 @@ +main in air_interpreter_server - Rust

Function air_interpreter_server::main

source ·
pub fn main()
\ No newline at end of file diff --git a/air_interpreter_server/fn.to_human_readable_data.html b/air_interpreter_server/fn.to_human_readable_data.html new file mode 100644 index 00000000..69f25ffc --- /dev/null +++ b/air_interpreter_server/fn.to_human_readable_data.html @@ -0,0 +1,2 @@ +to_human_readable_data in air_interpreter_server - Rust

Function air_interpreter_server::to_human_readable_data

source ·
pub fn to_human_readable_data(data: Vec<u8>) -> String
Expand description

Like ast, this function is intended to be run localy by tools.

+
\ No newline at end of file diff --git a/air_interpreter_server/index.html b/air_interpreter_server/index.html new file mode 100644 index 00000000..d023a1e2 --- /dev/null +++ b/air_interpreter_server/index.html @@ -0,0 +1 @@ +air_interpreter_server - Rust

Crate air_interpreter_server

source ·

Modules§

Functions§

\ No newline at end of file diff --git a/air_interpreter_server/logger/fn.init_logger.html b/air_interpreter_server/logger/fn.init_logger.html new file mode 100644 index 00000000..1fab9cfa --- /dev/null +++ b/air_interpreter_server/logger/fn.init_logger.html @@ -0,0 +1 @@ +init_logger in air_interpreter_server::logger - Rust

Function air_interpreter_server::logger::init_logger

source ·
pub fn init_logger(default_level: Option<LevelFilter>)
\ No newline at end of file diff --git a/air_interpreter_server/logger/fn.json_output_mode.html b/air_interpreter_server/logger/fn.json_output_mode.html new file mode 100644 index 00000000..903cc5b5 --- /dev/null +++ b/air_interpreter_server/logger/fn.json_output_mode.html @@ -0,0 +1 @@ +json_output_mode in air_interpreter_server::logger - Rust

Function air_interpreter_server::logger::json_output_mode

source ·
pub fn json_output_mode(trace_mode: u8) -> bool
\ No newline at end of file diff --git a/air_interpreter_server/logger/index.html b/air_interpreter_server/logger/index.html new file mode 100644 index 00000000..85fd99e4 --- /dev/null +++ b/air_interpreter_server/logger/index.html @@ -0,0 +1 @@ +air_interpreter_server::logger - Rust
\ No newline at end of file diff --git a/air_interpreter_server/logger/sidebar-items.js b/air_interpreter_server/logger/sidebar-items.js new file mode 100644 index 00000000..6964ec3f --- /dev/null +++ b/air_interpreter_server/logger/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"fn":["init_logger","json_output_mode"]}; \ No newline at end of file diff --git a/air_interpreter_server/sidebar-items.js b/air_interpreter_server/sidebar-items.js new file mode 100644 index 00000000..039686b1 --- /dev/null +++ b/air_interpreter_server/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"fn":["ast","invoke","invoke_tracing","main","to_human_readable_data"],"mod":["ast","logger"]}; \ No newline at end of file diff --git a/air_interpreter_signatures/all.html b/air_interpreter_signatures/all.html new file mode 100644 index 00000000..4b6a2515 --- /dev/null +++ b/air_interpreter_signatures/all.html @@ -0,0 +1 @@ +List of all items in this crate
\ No newline at end of file diff --git a/air_interpreter_signatures/enum.KeyError.html b/air_interpreter_signatures/enum.KeyError.html new file mode 100644 index 00000000..d425e606 --- /dev/null +++ b/air_interpreter_signatures/enum.KeyError.html @@ -0,0 +1,30 @@ +KeyError in air_interpreter_signatures - Rust

Enum air_interpreter_signatures::KeyError

source ·
pub enum KeyError {
+    AlgorithmNotWhitelisted(KeyFormat),
+    InvalidKeyData(DecodingError),
+}

Variants§

§

AlgorithmNotWhitelisted(KeyFormat)

§

InvalidKeyData(DecodingError)

Trait Implementations§

source§

impl Debug for KeyError

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Display for KeyError

source§

fn fmt(&self, __formatter: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Error for KeyError

source§

fn source(&self) -> Option<&(dyn Error + 'static)>

The lower-level source of this error, if any. Read more
1.0.0 · source§

fn description(&self) -> &str

👎Deprecated since 1.42.0: use the Display impl or to_string()
1.0.0 · source§

fn cause(&self) -> Option<&dyn Error>

👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
source§

fn provide<'a>(&'a self, request: &mut Request<'a>)

🔬This is a nightly-only experimental API. (error_generic_member_access)
Provides type based access to context intended for error reports. Read more
source§

impl From<DecodingError> for KeyError

source§

fn from(source: DecodingError) -> Self

Converts to this type from the input type.

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
§

impl<T> Error for T
where + T: Error + 'static,

§

fn as_error(&self) -> &(dyn Error + 'static)

Gets this error as an std::error::Error.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_interpreter_signatures/enum.KeyFormat.html b/air_interpreter_signatures/enum.KeyFormat.html new file mode 100644 index 00000000..b2e1438f --- /dev/null +++ b/air_interpreter_signatures/enum.KeyFormat.html @@ -0,0 +1,42 @@ +KeyFormat in air_interpreter_signatures - Rust

Enum air_interpreter_signatures::KeyFormat

pub enum KeyFormat {
+    Ed25519,
+    Rsa,
+    Secp256k1,
+}
Expand description

Identity keypair of a node.

+

§Example: Generating RSA keys with OpenSSL

openssl genrsa -out private.pem 2048
+openssl pkcs8 -in private.pem -inform PEM -topk8 -out private.pk8 -outform DER -nocrypt
+rm private.pem      # optional
+
+

Loading the keys:

+
let mut bytes = std::fs::read("private.pk8").unwrap();
+let keypair = Keypair::rsa_from_pkcs8(&mut bytes);
+

Variants§

§

Ed25519

§

Rsa

§

Secp256k1

Trait Implementations§

§

impl Clone for KeyFormat

§

fn clone(&self) -> KeyFormat

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
§

impl Debug for KeyFormat

§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
§

impl FromStr for KeyFormat

§

type Err = Error

The associated error which can be returned from parsing.
§

fn from_str(s: &str) -> Result<KeyFormat, <KeyFormat as FromStr>::Err>

Parses a string s to return a value of this type. Read more
§

impl PartialEq for KeyFormat

§

fn eq(&self, other: &KeyFormat) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
§

impl TryFrom<u8> for KeyFormat

§

type Error = DecodingError

The type returned in the event of a conversion error.
§

fn try_from(value: u8) -> Result<KeyFormat, <KeyFormat as TryFrom<u8>>::Error>

Performs the conversion.
§

impl Copy for KeyFormat

§

impl Eq for KeyFormat

§

impl StructuralPartialEq for KeyFormat

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
source§

impl<T> CloneToUninit for T
where + T: Copy,

source§

unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_interpreter_signatures/enum.VerificationError.html b/air_interpreter_signatures/enum.VerificationError.html new file mode 100644 index 00000000..67e064d9 --- /dev/null +++ b/air_interpreter_signatures/enum.VerificationError.html @@ -0,0 +1,31 @@ +VerificationError in air_interpreter_signatures - Rust
pub enum VerificationError {
+    InvalidKey(DecodingError),
+    InvalidSignature(DecodingError),
+    Verification(VerificationError),
+}

Variants§

§

InvalidKey(DecodingError)

§

InvalidSignature(DecodingError)

§

Verification(VerificationError)

Trait Implementations§

source§

impl Debug for VerificationError

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Display for VerificationError

source§

fn fmt(&self, __formatter: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Error for VerificationError

source§

fn source(&self) -> Option<&(dyn Error + 'static)>

The lower-level source of this error, if any. Read more
1.0.0 · source§

fn description(&self) -> &str

👎Deprecated since 1.42.0: use the Display impl or to_string()
1.0.0 · source§

fn cause(&self) -> Option<&dyn Error>

👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
source§

fn provide<'a>(&'a self, request: &mut Request<'a>)

🔬This is a nightly-only experimental API. (error_generic_member_access)
Provides type based access to context intended for error reports. Read more
source§

impl From<VerificationError> for VerificationError

source§

fn from(source: VerificationError) -> Self

Converts to this type from the input type.

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
§

impl<T> Error for T
where + T: Error + 'static,

§

fn as_error(&self) -> &(dyn Error + 'static)

Gets this error as an std::error::Error.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_interpreter_signatures/fn.sign_cids.html b/air_interpreter_signatures/fn.sign_cids.html new file mode 100644 index 00000000..09f96709 --- /dev/null +++ b/air_interpreter_signatures/fn.sign_cids.html @@ -0,0 +1,5 @@ +sign_cids in air_interpreter_signatures - Rust

Function air_interpreter_signatures::sign_cids

source ·
pub fn sign_cids(
+    cids: Vec<Rc<CidRef>>,
+    salt: &str,
+    keypair: &KeyPair,
+) -> Result<Signature, SigningError>
\ No newline at end of file diff --git a/air_interpreter_signatures/index.html b/air_interpreter_signatures/index.html new file mode 100644 index 00000000..2d0312ba --- /dev/null +++ b/air_interpreter_signatures/index.html @@ -0,0 +1 @@ +air_interpreter_signatures - Rust

Crate air_interpreter_signatures

source ·

Structs§

Enums§

Functions§

\ No newline at end of file diff --git a/air_interpreter_signatures/sidebar-items.js b/air_interpreter_signatures/sidebar-items.js new file mode 100644 index 00000000..078fd0b1 --- /dev/null +++ b/air_interpreter_signatures/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"enum":["KeyError","KeyFormat","VerificationError"],"fn":["sign_cids"],"struct":["ArchivedPublicKey","ArchivedSignature","ArchivedSignatureStore","KeyPair","PeerCidTracker","PublicKey","PublicKeyResolver","Signature","SignatureResolver","SignatureStore","SignatureStoreResolver"]}; \ No newline at end of file diff --git a/air_interpreter_signatures/stores/struct.ArchivedSignatureStore.html b/air_interpreter_signatures/stores/struct.ArchivedSignatureStore.html new file mode 100644 index 00000000..2c092486 --- /dev/null +++ b/air_interpreter_signatures/stores/struct.ArchivedSignatureStore.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_signatures/struct.ArchivedSignatureStore.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_signatures/stores/struct.SignatureStore.html b/air_interpreter_signatures/stores/struct.SignatureStore.html new file mode 100644 index 00000000..782274fd --- /dev/null +++ b/air_interpreter_signatures/stores/struct.SignatureStore.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_signatures/struct.SignatureStore.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_signatures/stores/struct.SignatureStoreResolver.html b/air_interpreter_signatures/stores/struct.SignatureStoreResolver.html new file mode 100644 index 00000000..db49cc1d --- /dev/null +++ b/air_interpreter_signatures/stores/struct.SignatureStoreResolver.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_signatures/struct.SignatureStoreResolver.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_signatures/struct.ArchivedPublicKey.html b/air_interpreter_signatures/struct.ArchivedPublicKey.html new file mode 100644 index 00000000..aee0516b --- /dev/null +++ b/air_interpreter_signatures/struct.ArchivedPublicKey.html @@ -0,0 +1,45 @@ +ArchivedPublicKey in air_interpreter_signatures - Rust
#[repr(C)]
pub struct ArchivedPublicKey(/* private fields */) +where + Box<[u8]>: Archive;
Expand description

An archived PublicKey

+

Trait Implementations§

source§

impl<__C: ?Sized> CheckBytes<__C> for ArchivedPublicKey
where + Box<[u8]>: Archive, + Archived<Box<[u8]>>: CheckBytes<__C>,

§

type Error = TupleStructCheckError

The error that may result from checking the type.
source§

unsafe fn check_bytes<'__bytecheck>( + value: *const Self, + context: &mut __C, +) -> Result<&'__bytecheck Self, TupleStructCheckError>

Checks whether the given pointer points to a valid value within the +given context. Read more
source§

impl Hash for ArchivedPublicKey
where + Box<[u8]>: Archive,

source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
source§

impl PartialEq for ArchivedPublicKey
where + Box<[u8]>: Archive,

source§

fn eq(&self, other: &ArchivedPublicKey) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl Eq for ArchivedPublicKey
where + Box<[u8]>: Archive,

source§

impl StructuralPartialEq for ArchivedPublicKey
where + Box<[u8]>: Archive,

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CallHasher for T
where + T: Hash + ?Sized,

§

default fn get_hash<H, B>(value: &H, build_hasher: &B) -> u64
where + H: Hash + ?Sized, + B: BuildHasher,

§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_interpreter_signatures/struct.ArchivedSignature.html b/air_interpreter_signatures/struct.ArchivedSignature.html new file mode 100644 index 00000000..f616edbe --- /dev/null +++ b/air_interpreter_signatures/struct.ArchivedSignature.html @@ -0,0 +1,34 @@ +ArchivedSignature in air_interpreter_signatures - Rust
#[repr(C)]
pub struct ArchivedSignature(/* private fields */) +where + Box<[u8]>: Archive;
Expand description

An archived Signature

+

Trait Implementations§

source§

impl<__C: ?Sized> CheckBytes<__C> for ArchivedSignature
where + Box<[u8]>: Archive, + Archived<Box<[u8]>>: CheckBytes<__C>,

§

type Error = TupleStructCheckError

The error that may result from checking the type.
source§

unsafe fn check_bytes<'__bytecheck>( + value: *const Self, + context: &mut __C, +) -> Result<&'__bytecheck Self, TupleStructCheckError>

Checks whether the given pointer points to a valid value within the +given context. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_interpreter_signatures/struct.ArchivedSignatureStore.html b/air_interpreter_signatures/struct.ArchivedSignatureStore.html new file mode 100644 index 00000000..6177a54b --- /dev/null +++ b/air_interpreter_signatures/struct.ArchivedSignatureStore.html @@ -0,0 +1,34 @@ +ArchivedSignatureStore in air_interpreter_signatures - Rust
#[repr(C)]
pub struct ArchivedSignatureStore<Key: Hash + Eq = PublicKey, Sign = Signature>(/* private fields */) +where + With<HashMap<Key, Sign>, AsVec>: Archive;
Expand description

An archived SignatureStore

+

Trait Implementations§

source§

impl<__C: ?Sized, Key: Hash + Eq, Sign> CheckBytes<__C> for ArchivedSignatureStore<Key, Sign>
where + With<HashMap<Key, Sign>, AsVec>: Archive, + Archived<With<HashMap<Key, Sign>, AsVec>>: CheckBytes<__C>,

§

type Error = TupleStructCheckError

The error that may result from checking the type.
source§

unsafe fn check_bytes<'__bytecheck>( + value: *const Self, + context: &mut __C, +) -> Result<&'__bytecheck Self, TupleStructCheckError>

Checks whether the given pointer points to a valid value within the +given context. Read more

Auto Trait Implementations§

§

impl<Key = PublicKey, Sign = Signature> !Freeze for ArchivedSignatureStore<Key, Sign>

§

impl<Key = PublicKey, Sign = Signature> !RefUnwindSafe for ArchivedSignatureStore<Key, Sign>

§

impl<Key = PublicKey, Sign = Signature> !Send for ArchivedSignatureStore<Key, Sign>

§

impl<Key = PublicKey, Sign = Signature> !Sync for ArchivedSignatureStore<Key, Sign>

§

impl<Key = PublicKey, Sign = Signature> !Unpin for ArchivedSignatureStore<Key, Sign>

§

impl<Key = PublicKey, Sign = Signature> !UnwindSafe for ArchivedSignatureStore<Key, Sign>

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_interpreter_signatures/struct.KeyPair.html b/air_interpreter_signatures/struct.KeyPair.html new file mode 100644 index 00000000..ecd965f3 --- /dev/null +++ b/air_interpreter_signatures/struct.KeyPair.html @@ -0,0 +1,30 @@ +KeyPair in air_interpreter_signatures - Rust

Struct air_interpreter_signatures::KeyPair

source ·
pub struct KeyPair(/* private fields */);

Implementations§

source§

impl KeyPair

source

pub fn new(inner: KeyPair) -> Result<Self, KeyError>

source

pub fn from_secret_key( + secret_key: Vec<u8>, + key_format: KeyFormat, +) -> Result<Self, KeyError>

source

pub fn public(&self) -> PublicKey

source

pub fn key_format(&self) -> KeyFormat

source

pub fn sign(&self, msg: &[u8]) -> Result<Signature, SigningError>

source

pub fn secret(&self) -> Vec<u8>

source

pub fn into_inner(self) -> KeyPair

source

pub fn as_inner(&self) -> &KeyPair

Trait Implementations§

source§

impl Clone for KeyPair

source§

fn clone(&self) -> KeyPair

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl From<KeyPair> for KeyPair

source§

fn from(value: KeyPair) -> Self

Converts to this type from the input type.
source§

impl TryFrom<KeyPair> for KeyPair

§

type Error = KeyError

The type returned in the event of a conversion error.
source§

fn try_from(value: KeyPair) -> Result<Self, Self::Error>

Performs the conversion.

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_interpreter_signatures/struct.PeerCidTracker.html b/air_interpreter_signatures/struct.PeerCidTracker.html new file mode 100644 index 00000000..0269d86e --- /dev/null +++ b/air_interpreter_signatures/struct.PeerCidTracker.html @@ -0,0 +1,30 @@ +PeerCidTracker in air_interpreter_signatures - Rust

Struct air_interpreter_signatures::PeerCidTracker

source ·
pub struct PeerCidTracker { /* private fields */ }
Expand description

The tracker that collect current peer’s CIDs only.

+

Implementations§

source§

impl PeerCidTracker

source

pub fn new(current_peer_id: impl Into<Rc<String>>) -> Self

source

pub fn register<T>(&mut self, peer: &str, cid: &CID<T>)

source

pub fn gen_signature( + &self, + salt: &str, + keypair: &KeyPair, +) -> Result<Signature, SigningError>

Trait Implementations§

source§

impl Debug for PeerCidTracker

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_interpreter_signatures/struct.PublicKey.html b/air_interpreter_signatures/struct.PublicKey.html new file mode 100644 index 00000000..a9f5901d --- /dev/null +++ b/air_interpreter_signatures/struct.PublicKey.html @@ -0,0 +1,75 @@ +PublicKey in air_interpreter_signatures - Rust

Struct air_interpreter_signatures::PublicKey

source ·
pub struct PublicKey(/* private fields */);
Expand description

An opaque serializable representation of a public key.

+

It can be a string or a binary, you shouldn’t care about it unless you change serialization format.

+

Implementations§

source§

impl PublicKey

source

pub fn new(inner: PublicKey) -> Self

source

pub fn verify<T: BorshSerialize + ?Sized>( + &self, + value: &T, + salt: &str, + signature: &Signature, +) -> Result<(), VerificationError>

source

pub fn to_peer_id(&self) -> Result<String, KeyError>

source

pub fn validate(&self) -> Result<(), KeyError>

Trait Implementations§

source§

impl Archive for PublicKey
where + Box<[u8]>: Archive,

§

type Archived = ArchivedPublicKey

The archived representation of this type. Read more
§

type Resolver = PublicKeyResolver

The resolver for this type. It must contain all the additional information from serializing +needed to make the archived type from the normal type.
source§

unsafe fn resolve( + &self, + pos: usize, + resolver: Self::Resolver, + out: *mut Self::Archived, +)

Creates the archived version of this value at the given position and writes it to the given +output. Read more
source§

impl Clone for PublicKey

source§

fn clone(&self) -> PublicKey

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for PublicKey

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'de> Deserialize<'de> for PublicKey

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl<__D: Fallible + ?Sized> Deserialize<PublicKey, __D> for Archived<PublicKey>
where + Box<[u8]>: Archive, + Archived<Box<[u8]>>: Deserialize<Box<[u8]>, __D>,

source§

fn deserialize(&self, deserializer: &mut __D) -> Result<PublicKey, __D::Error>

Deserializes using the given deserializer
source§

impl Hash for PublicKey

source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
source§

impl PartialEq for PublicKey

source§

fn eq(&self, other: &PublicKey) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl<__S: Fallible + ?Sized> Serialize<__S> for PublicKey
where + Box<[u8]>: Serialize<__S>,

source§

fn serialize(&self, serializer: &mut __S) -> Result<Self::Resolver, __S::Error>

Writes the dependencies for the object and returns a resolver that can create the archived +type.
source§

impl Serialize for PublicKey

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl ToString for PublicKey

source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl Eq for PublicKey

source§

impl StructuralPartialEq for PublicKey

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
§

impl<T> ArchiveUnsized for T
where + T: Archive,

§

type Archived = <T as Archive>::Archived

The archived counterpart of this type. Unlike Archive, it may be unsized. Read more
§

type MetadataResolver = ()

The resolver for the metadata of this type. Read more
§

unsafe fn resolve_metadata( + &self, + _: usize, + _: <T as ArchiveUnsized>::MetadataResolver, + _: *mut <<T as ArchiveUnsized>::Archived as ArchivePointee>::ArchivedMetadata, +)

Creates the archived version of the metadata for this value at the given position and writes +it to the given output. Read more
§

unsafe fn resolve_unsized( + &self, + from: usize, + to: usize, + resolver: Self::MetadataResolver, + out: *mut RelPtr<Self::Archived, <isize as Archive>::Archived>, +)

Resolves a relative pointer to this value with the given from and to and writes it to +the given output. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CallHasher for T
where + T: Hash + ?Sized,

§

default fn get_hash<H, B>(value: &H, build_hasher: &B) -> u64
where + H: Hash + ?Sized, + B: BuildHasher,

source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
§

impl<T, S> SerializeUnsized<S> for T
where + T: Serialize<S>, + S: Serializer + ?Sized,

§

fn serialize_unsized( + &self, + serializer: &mut S, +) -> Result<usize, <S as Fallible>::Error>

Writes the object and returns the position of the archived type.
§

fn serialize_metadata(&self, _: &mut S) -> Result<(), <S as Fallible>::Error>

Serializes the metadata for the given type.
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_interpreter_signatures/struct.PublicKeyResolver.html b/air_interpreter_signatures/struct.PublicKeyResolver.html new file mode 100644 index 00000000..09191d14 --- /dev/null +++ b/air_interpreter_signatures/struct.PublicKeyResolver.html @@ -0,0 +1,28 @@ +PublicKeyResolver in air_interpreter_signatures - Rust
pub struct PublicKeyResolver(/* private fields */)
+where
+    Box<[u8]>: Archive;
Expand description

The resolver for an archived PublicKey

+

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_interpreter_signatures/struct.Signature.html b/air_interpreter_signatures/struct.Signature.html new file mode 100644 index 00000000..60c45ac2 --- /dev/null +++ b/air_interpreter_signatures/struct.Signature.html @@ -0,0 +1,65 @@ +Signature in air_interpreter_signatures - Rust

Struct air_interpreter_signatures::Signature

source ·
pub struct Signature(/* private fields */);
Expand description

An opaque serializable representation of signature key.

+

It can be string or binary, you shouldn’t care about it unless you change serialization format.

+

Trait Implementations§

source§

impl Archive for Signature
where + Box<[u8]>: Archive,

§

type Archived = ArchivedSignature

The archived representation of this type. Read more
§

type Resolver = SignatureResolver

The resolver for this type. It must contain all the additional information from serializing +needed to make the archived type from the normal type.
source§

unsafe fn resolve( + &self, + pos: usize, + resolver: Self::Resolver, + out: *mut Self::Archived, +)

Creates the archived version of this value at the given position and writes it to the given +output. Read more
source§

impl Clone for Signature

source§

fn clone(&self) -> Signature

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for Signature

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'de> Deserialize<'de> for Signature

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl<__D: Fallible + ?Sized> Deserialize<Signature, __D> for Archived<Signature>
where + Box<[u8]>: Archive, + Archived<Box<[u8]>>: Deserialize<Box<[u8]>, __D>,

source§

fn deserialize(&self, deserializer: &mut __D) -> Result<Signature, __D::Error>

Deserializes using the given deserializer
source§

impl From<Signature> for Signature

source§

fn from(value: Signature) -> Self

Converts to this type from the input type.
source§

impl PartialEq for Signature

source§

fn eq(&self, other: &Signature) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl<__S: Fallible + ?Sized> Serialize<__S> for Signature
where + Box<[u8]>: Serialize<__S>,

source§

fn serialize(&self, serializer: &mut __S) -> Result<Self::Resolver, __S::Error>

Writes the dependencies for the object and returns a resolver that can create the archived +type.
source§

impl Serialize for Signature

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Eq for Signature

source§

impl StructuralPartialEq for Signature

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
§

impl<T> ArchiveUnsized for T
where + T: Archive,

§

type Archived = <T as Archive>::Archived

The archived counterpart of this type. Unlike Archive, it may be unsized. Read more
§

type MetadataResolver = ()

The resolver for the metadata of this type. Read more
§

unsafe fn resolve_metadata( + &self, + _: usize, + _: <T as ArchiveUnsized>::MetadataResolver, + _: *mut <<T as ArchiveUnsized>::Archived as ArchivePointee>::ArchivedMetadata, +)

Creates the archived version of the metadata for this value at the given position and writes +it to the given output. Read more
§

unsafe fn resolve_unsized( + &self, + from: usize, + to: usize, + resolver: Self::MetadataResolver, + out: *mut RelPtr<Self::Archived, <isize as Archive>::Archived>, +)

Resolves a relative pointer to this value with the given from and to and writes it to +the given output. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
§

impl<T, S> SerializeUnsized<S> for T
where + T: Serialize<S>, + S: Serializer + ?Sized,

§

fn serialize_unsized( + &self, + serializer: &mut S, +) -> Result<usize, <S as Fallible>::Error>

Writes the object and returns the position of the archived type.
§

fn serialize_metadata(&self, _: &mut S) -> Result<(), <S as Fallible>::Error>

Serializes the metadata for the given type.
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_interpreter_signatures/struct.SignatureResolver.html b/air_interpreter_signatures/struct.SignatureResolver.html new file mode 100644 index 00000000..9b24b1fe --- /dev/null +++ b/air_interpreter_signatures/struct.SignatureResolver.html @@ -0,0 +1,28 @@ +SignatureResolver in air_interpreter_signatures - Rust
pub struct SignatureResolver(/* private fields */)
+where
+    Box<[u8]>: Archive;
Expand description

The resolver for an archived Signature

+

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_interpreter_signatures/struct.SignatureStore.html b/air_interpreter_signatures/struct.SignatureStore.html new file mode 100644 index 00000000..8f11d0b5 --- /dev/null +++ b/air_interpreter_signatures/struct.SignatureStore.html @@ -0,0 +1,81 @@ +SignatureStore in air_interpreter_signatures - Rust

Struct air_interpreter_signatures::SignatureStore

source ·
pub struct SignatureStore<Key: Hash + Eq = PublicKey, Sign = Signature>(/* private fields */);
Expand description

A dictionary-like structure that stores peer public keys and their particle data signatures.

+

Implementations§

source§

impl<Key: Hash + Eq, Sign> SignatureStore<Key, Sign>

source

pub fn new() -> Self

source

pub fn is_empty(&self) -> bool

source

pub fn len(&self) -> usize

source

pub fn get<Q>(&self, peer_pk: &Q) -> Option<&Sign>
where + Key: Borrow<Q>, + Q: Hash + Eq + ?Sized,

source

pub fn put(&mut self, peer_pk: Key, signature: Sign)

source

pub fn iter(&self) -> <&HashMap<Key, Sign> as IntoIterator>::IntoIter

Trait Implementations§

source§

impl<Key: Hash + Eq, Sign> Archive for SignatureStore<Key, Sign>
where + With<HashMap<Key, Sign>, AsVec>: Archive,

§

type Archived = ArchivedSignatureStore<Key, Sign>

The archived representation of this type. Read more
§

type Resolver = SignatureStoreResolver<Key, Sign>

The resolver for this type. It must contain all the additional information from serializing +needed to make the archived type from the normal type.
source§

unsafe fn resolve( + &self, + pos: usize, + resolver: Self::Resolver, + out: *mut Self::Archived, +)

Creates the archived version of this value at the given position and writes it to the given +output. Read more
source§

impl<Key: Clone + Hash + Eq, Sign: Clone> Clone for SignatureStore<Key, Sign>

source§

fn clone(&self) -> SignatureStore<Key, Sign>

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl<Key: Debug + Hash + Eq, Sign: Debug> Debug for SignatureStore<Key, Sign>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<Key: Hash + Eq, Sign> Default for SignatureStore<Key, Sign>

source§

fn default() -> Self

Returns the “default value” for a type. Read more
source§

impl<'de, Key, Sign> Deserialize<'de> for SignatureStore<Key, Sign>
where + Key: Deserialize<'de> + Hash + Eq, + Sign: Deserialize<'de>,

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl<__D: Fallible + ?Sized, Key: Hash + Eq, Sign> Deserialize<SignatureStore<Key, Sign>, __D> for Archived<SignatureStore<Key, Sign>>
where + With<HashMap<Key, Sign>, AsVec>: Archive, + Archived<With<HashMap<Key, Sign>, AsVec>>: Deserialize<With<HashMap<Key, Sign>, AsVec>, __D>,

source§

fn deserialize( + &self, + deserializer: &mut __D, +) -> Result<SignatureStore<Key, Sign>, __D::Error>

Deserializes using the given deserializer
source§

impl<__S: Fallible + ?Sized, Key: Hash + Eq, Sign> Serialize<__S> for SignatureStore<Key, Sign>
where + With<HashMap<Key, Sign>, AsVec>: Serialize<__S>,

source§

fn serialize(&self, serializer: &mut __S) -> Result<Self::Resolver, __S::Error>

Writes the dependencies for the object and returns a resolver that can create the archived +type.
source§

impl<Key, Sign> Serialize for SignatureStore<Key, Sign>
where + Key: Serialize + Hash + Eq, + Sign: Serialize,

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more

Auto Trait Implementations§

§

impl<Key, Sign> Freeze for SignatureStore<Key, Sign>

§

impl<Key, Sign> RefUnwindSafe for SignatureStore<Key, Sign>
where + Key: RefUnwindSafe, + Sign: RefUnwindSafe,

§

impl<Key, Sign> Send for SignatureStore<Key, Sign>
where + Key: Send, + Sign: Send,

§

impl<Key, Sign> Sync for SignatureStore<Key, Sign>
where + Key: Sync, + Sign: Sync,

§

impl<Key, Sign> Unpin for SignatureStore<Key, Sign>
where + Key: Unpin, + Sign: Unpin,

§

impl<Key, Sign> UnwindSafe for SignatureStore<Key, Sign>
where + Key: UnwindSafe, + Sign: UnwindSafe,

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
§

impl<T> ArchiveUnsized for T
where + T: Archive,

§

type Archived = <T as Archive>::Archived

The archived counterpart of this type. Unlike Archive, it may be unsized. Read more
§

type MetadataResolver = ()

The resolver for the metadata of this type. Read more
§

unsafe fn resolve_metadata( + &self, + _: usize, + _: <T as ArchiveUnsized>::MetadataResolver, + _: *mut <<T as ArchiveUnsized>::Archived as ArchivePointee>::ArchivedMetadata, +)

Creates the archived version of the metadata for this value at the given position and writes +it to the given output. Read more
§

unsafe fn resolve_unsized( + &self, + from: usize, + to: usize, + resolver: Self::MetadataResolver, + out: *mut RelPtr<Self::Archived, <isize as Archive>::Archived>, +)

Resolves a relative pointer to this value with the given from and to and writes it to +the given output. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
§

impl<T, S> SerializeUnsized<S> for T
where + T: Serialize<S>, + S: Serializer + ?Sized,

§

fn serialize_unsized( + &self, + serializer: &mut S, +) -> Result<usize, <S as Fallible>::Error>

Writes the object and returns the position of the archived type.
§

fn serialize_metadata(&self, _: &mut S) -> Result<(), <S as Fallible>::Error>

Serializes the metadata for the given type.
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_interpreter_signatures/struct.SignatureStoreResolver.html b/air_interpreter_signatures/struct.SignatureStoreResolver.html new file mode 100644 index 00000000..7565ec27 --- /dev/null +++ b/air_interpreter_signatures/struct.SignatureStoreResolver.html @@ -0,0 +1,28 @@ +SignatureStoreResolver in air_interpreter_signatures - Rust
pub struct SignatureStoreResolver<Key: Hash + Eq = PublicKey, Sign = Signature>(/* private fields */)
+where
+    With<HashMap<Key, Sign>, AsVec>: Archive;
Expand description

The resolver for an archived SignatureStore

+

Auto Trait Implementations§

§

impl<Key = PublicKey, Sign = Signature> !Freeze for SignatureStoreResolver<Key, Sign>

§

impl<Key = PublicKey, Sign = Signature> !RefUnwindSafe for SignatureStoreResolver<Key, Sign>

§

impl<Key = PublicKey, Sign = Signature> !Send for SignatureStoreResolver<Key, Sign>

§

impl<Key = PublicKey, Sign = Signature> !Sync for SignatureStoreResolver<Key, Sign>

§

impl<Key = PublicKey, Sign = Signature> !Unpin for SignatureStoreResolver<Key, Sign>

§

impl<Key = PublicKey, Sign = Signature> !UnwindSafe for SignatureStoreResolver<Key, Sign>

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_interpreter_signatures/trackers/fn.sign_cids.html b/air_interpreter_signatures/trackers/fn.sign_cids.html new file mode 100644 index 00000000..f822204b --- /dev/null +++ b/air_interpreter_signatures/trackers/fn.sign_cids.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_signatures/fn.sign_cids.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_signatures/trackers/struct.PeerCidTracker.html b/air_interpreter_signatures/trackers/struct.PeerCidTracker.html new file mode 100644 index 00000000..cbd8a8b8 --- /dev/null +++ b/air_interpreter_signatures/trackers/struct.PeerCidTracker.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_signatures/struct.PeerCidTracker.html...

+ + + \ No newline at end of file diff --git a/air_interpreter_value/all.html b/air_interpreter_value/all.html new file mode 100644 index 00000000..6781fee8 --- /dev/null +++ b/air_interpreter_value/all.html @@ -0,0 +1 @@ +List of all items in this crate

List of all items

Enums

Type Aliases

\ No newline at end of file diff --git a/air_interpreter_value/enum.JValue.html b/air_interpreter_value/enum.JValue.html new file mode 100644 index 00000000..2cb65dbd --- /dev/null +++ b/air_interpreter_value/enum.JValue.html @@ -0,0 +1,323 @@ +JValue in air_interpreter_value - Rust

Enum air_interpreter_value::JValue

source ·
pub enum JValue {
+    Null,
+    Bool(bool),
+    Number(Number),
+    String(JsonString),
+    Array(Rc<[JValue]>),
+    Object(Rc<Map<JsonString, JValue>>),
+}
Expand description

Represents any valid JSON value with a cheap to clone Rc-based representation.

+

Variants§

§

Null

Represents a JSON null value.

+
§

Bool(bool)

Represents a JSON boolean.

+
§

Number(Number)

Represents a JSON number, whether integer or floating point.

+
§

String(JsonString)

Represents a JSON string.

+
§

Array(Rc<[JValue]>)

Represents a JSON array.

+
§

Object(Rc<Map<JsonString, JValue>>)

Represents a JSON object.

+

By default the map is backed by a BTreeMap. Enable the preserve_order +feature of serde_json to use IndexMap instead, which preserves +entries in the order they are inserted into the map. In particular, this +allows JSON data to be deserialized into a JValue and serialized to a +string while retaining the order of map keys in the input.

+

Implementations§

source§

impl JValue

source

pub fn string(s: impl Into<Rc<str>>) -> Self

source

pub fn array(vec: impl Into<Rc<[JValue]>>) -> Self

source

pub fn array_from_iter( + into_iter: impl IntoIterator<Item = impl Into<JValue>>, +) -> Self

source

pub fn object(map: impl Into<Map<JsonString, JValue>>) -> Self

source

pub fn object_from_pairs( + into_iter: impl IntoIterator<Item = (impl Into<JsonString>, impl Into<JValue>)>, +) -> Self

source

pub fn get<I: Index>(&self, index: I) -> Option<&JValue>

Index into a JSON array or map. A string index can be used to access a +value in a map, and a usize index can be used to access an element of an +array.

+

Returns None if the type of self does not match the type of the +index, for example if the index is a string and self is an array or a +number. Also returns None if the given key does not exist in the map +or the given index is not within the bounds of the array.

+

Square brackets can also be used to index into a value in a more concise +way. This returns JValue::Null in cases where get would have returned +None.

+
source

pub fn is_object(&self) -> bool

Returns true if the JValue is an Object. Returns false otherwise.

+

For any JValue on which is_object returns true, as_object and +as_object_mut are guaranteed to return the map representation of the +object.

+
source

pub fn as_object(&self) -> Option<&Map<JsonString, JValue>>

If the JValue is an Object, returns the associated Map. Returns None +otherwise.

+
source

pub fn is_array(&self) -> bool

Returns true if the JValue is an Array. Returns false otherwise.

+

For any JValue on which is_array returns true, as_array and +as_array_mut are guaranteed to return the vector representing the +array.

+
source

pub fn as_array(&self) -> Option<&[JValue]>

If the JValue is an Array, returns the associated vector. Returns None +otherwise.

+
source

pub fn is_string(&self) -> bool

Returns true if the JValue is a String. Returns false otherwise.

+

For any JValue on which is_string returns true, as_str is guaranteed +to return the string slice.

+
source

pub fn as_str(&self) -> Option<&JsonString>

If the JValue is a string, returns the associated str. Returns None +otherwise.

+
source

pub fn is_number(&self) -> bool

Returns true if the JValue is a Number. Returns false otherwise.

+
source

pub fn as_number(&self) -> Option<&Number>

If the JValue is a Number, returns the associated Number. Returns +None otherwise.

+
source

pub fn is_i64(&self) -> bool

Returns true if the JValue is an integer between i64::MIN and +i64::MAX.

+

For any JValue on which is_i64 returns true, as_i64 is guaranteed to +return the integer value.

+
source

pub fn is_u64(&self) -> bool

Returns true if the JValue is an integer between zero and u64::MAX.

+

For any JValue on which is_u64 returns true, as_u64 is guaranteed to +return the integer value.

+
source

pub fn is_f64(&self) -> bool

Returns true if the JValue is a number that can be represented by f64.

+

For any JValue on which is_f64 returns true, as_f64 is guaranteed to +return the floating point value.

+

Currently this function returns true if and only if both is_i64 and +is_u64 return false but this is not a guarantee in the future.

+
source

pub fn as_i64(&self) -> Option<i64>

If the JValue is an integer, represent it as i64 if possible. Returns +None otherwise.

+
source

pub fn as_u64(&self) -> Option<u64>

If the JValue is an integer, represent it as u64 if possible. Returns +None otherwise.

+
source

pub fn as_f64(&self) -> Option<f64>

If the JValue is a number, represent it as f64 if possible. Returns +None otherwise.

+
source

pub fn is_boolean(&self) -> bool

Returns true if the JValue is a Boolean. Returns false otherwise.

+

For any JValue on which is_boolean returns true, as_bool is +guaranteed to return the boolean value.

+
source

pub fn as_bool(&self) -> Option<bool>

If the JValue is a Boolean, returns the associated bool. Returns None +otherwise.

+
source

pub fn is_null(&self) -> bool

Returns true if the JValue is a Null. Returns false otherwise.

+

For any JValue on which is_null returns true, as_null is guaranteed +to return Some(()).

+
source

pub fn as_null(&self) -> Option<()>

If the JValue is a Null, returns (). Returns None otherwise.

+
source

pub fn pointer(&self, pointer: &str) -> Option<&JValue>

Looks up a value by a JSON Pointer.

+

JSON Pointer defines a string syntax for identifying a specific value +within a JavaScript Object Notation (JSON) document.

+

A Pointer is a Unicode string with the reference tokens separated by /. +Inside tokens / is replaced by ~1 and ~ is replaced by ~0. The +addressed value is returned and if there is no such value None is +returned.

+

For more information read RFC6901.

+
source

pub fn take(&mut self) -> JValue

Takes the value out of the JValue, leaving a Null in its place.

+

Trait Implementations§

source§

impl Clone for JValue

source§

fn clone(&self) -> JValue

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for JValue

source§

fn fmt(&self, formatter: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Default for JValue

The default value is JValue::Null.

+
source§

fn default() -> JValue

Returns the “default value” for a type. Read more
source§

impl<'de> Deserialize<'de> for JValue

source§

fn deserialize<D>(deserializer: D) -> Result<JValue, D::Error>
where + D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl Display for JValue

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Display a JSON value as a string.

+
source§

impl<T: Clone + Into<JValue>> From<&[T]> for JValue

source§

fn from(f: &[T]) -> Self

Convert a slice to JValue::Array.

+
§Examples
+
use air_interpreter_value::JValue;
+
+let v: &[&str] = &["lorem", "ipsum", "dolor"];
+let x: JValue = v.into();
+
source§

impl From<&Value> for JValue

source§

fn from(value: &Value) -> Self

Converts to this type from the input type.
source§

impl From<&str> for JValue

source§

fn from(f: &str) -> Self

Convert string slice to JValue::String.

+
§Examples
+
use air_interpreter_value::JValue;
+
+let s: &str = "lorem";
+let x: JValue = s.into();
+
source§

impl From<()> for JValue

source§

fn from((): ()) -> Self

Convert () to JValue::Null.

+
§Examples
+
use air_interpreter_value::JValue;
+
+let u = ();
+let x: JValue = u.into();
+
source§

impl From<BTreeMap<Rc<str>, JValue>> for JValue

source§

fn from(f: Map<JsonString, JValue>) -> Self

Convert map (with string keys) to JValue::Object.

+
§Examples
+
use air_interpreter_value::{Map, JValue, JsonString};
+
+let mut m = Map::<JsonString, JValue>::new();
+m.insert("Lorem".into(), "ipsum".into());
+let x: JValue = m.into();
+
source§

impl<'a> From<Cow<'a, str>> for JValue

source§

fn from(f: Cow<'a, str>) -> Self

Convert copy-on-write string to JValue::String.

+
§Examples
+
use air_interpreter_value::JValue;
+use std::borrow::Cow;
+
+let s: Cow<str> = Cow::Borrowed("lorem");
+let x: JValue = s.into();
+ +
use air_interpreter_value::JValue;
+use std::borrow::Cow;
+
+let s: Cow<str> = Cow::Owned("lorem".to_string());
+let x: JValue = s.into();
+
source§

impl<K: Into<JsonString>, V: Into<JValue>> From<HashMap<K, V>> for JValue

source§

fn from(f: HashMap<K, V>) -> Self

Convert map (with string keys) to JValue::Object.

+
§Examples
+
use air_interpreter_value::JValue;
+use std::collections::HashMap;
+
+let mut m = HashMap::<&str, &str>::new();
+m.insert("Lorem", "ipsum");
+let x: JValue = m.into();
+
source§

impl From<Number> for JValue

source§

fn from(f: Number) -> Self

Convert serde_json::Number to JValue::Number.

+
§Examples
+
use serde_json::Number;
+use air_interpreter_value::JValue;
+
+let n = Number::from(7);
+let x: JValue = n.into();
+
source§

impl<T> From<Option<T>> for JValue
where + T: Into<JValue>,

source§

fn from(opt: Option<T>) -> Self

Converts to this type from the input type.
source§

impl From<Rc<str>> for JValue

source§

fn from(f: JsonString) -> Self

Convert JsonString to JValue::String.

+
§Examples
+
use air_interpreter_value::JValue;
+
+let s: String = "lorem".to_string();
+let x: JValue = s.into();
+
source§

impl From<String> for JValue

source§

fn from(f: String) -> Self

Convert String to JValue::String.

+
§Examples
+
use air_interpreter_value::JValue;
+
+let s: String = "lorem".to_string();
+let x: JValue = s.into();
+
source§

impl From<Value> for JValue

source§

fn from(value: Value) -> Self

Converts to this type from the input type.
source§

impl<T: Into<JValue>> From<Vec<T>> for JValue

source§

fn from(f: Vec<T>) -> Self

Convert a Vec to JValue::Array.

+
§Examples
+
use air_interpreter_value::JValue;
+
+let v = vec!["lorem", "ipsum", "dolor"];
+let x: JValue = v.into();
+
source§

impl From<bool> for JValue

source§

fn from(f: bool) -> Self

Convert boolean to JValue::Bool.

+
§Examples
+
use air_interpreter_value::JValue;
+
+let b = false;
+let x: JValue = b.into();
+
source§

impl From<f32> for JValue

source§

fn from(f: f32) -> Self

Convert 32-bit floating point number to JValue::Number, or +JValue::Null if infinite or NaN.

+
§Examples
+
use air_interpreter_value::JValue;
+
+let f: f32 = 13.37;
+let x: JValue = f.into();
+
source§

impl From<f64> for JValue

source§

fn from(f: f64) -> Self

Convert 64-bit floating point number to JValue::Number, or +JValue::Null if infinite or NaN.

+
§Examples
+
use air_interpreter_value::JValue;
+
+let f: f64 = 13.37;
+let x: JValue = f.into();
+
source§

impl From<i16> for JValue

source§

fn from(n: i16) -> Self

Converts to this type from the input type.
source§

impl From<i32> for JValue

source§

fn from(n: i32) -> Self

Converts to this type from the input type.
source§

impl From<i64> for JValue

source§

fn from(n: i64) -> Self

Converts to this type from the input type.
source§

impl From<i8> for JValue

source§

fn from(n: i8) -> Self

Converts to this type from the input type.
source§

impl From<isize> for JValue

source§

fn from(n: isize) -> Self

Converts to this type from the input type.
source§

impl From<u16> for JValue

source§

fn from(n: u16) -> Self

Converts to this type from the input type.
source§

impl From<u32> for JValue

source§

fn from(n: u32) -> Self

Converts to this type from the input type.
source§

impl From<u64> for JValue

source§

fn from(n: u64) -> Self

Converts to this type from the input type.
source§

impl From<u8> for JValue

source§

fn from(n: u8) -> Self

Converts to this type from the input type.
source§

impl From<usize> for JValue

source§

fn from(n: usize) -> Self

Converts to this type from the input type.
source§

impl<K: Into<JsonString>, V: Into<JValue>> FromIterator<(K, V)> for JValue

source§

fn from_iter<I: IntoIterator<Item = (K, V)>>(iter: I) -> Self

Create a JValue::Object by collecting an iterator of key-value pairs.

+
§Examples
+
use air_interpreter_value::JValue;
+
+let v: Vec<_> = vec![("lorem", 40), ("ipsum", 2)];
+let x: JValue = v.into_iter().collect();
+
source§

impl<T: Into<JValue>> FromIterator<T> for JValue

source§

fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> Self

Create a JValue::Array by collecting an iterator of array elements.

+
§Examples
+
use air_interpreter_value::JValue;
+
+let v = std::iter::repeat(42).take(5);
+let x: JValue = v.collect();
+ +
use air_interpreter_value::JValue;
+
+let v: Vec<_> = vec!["lorem", "ipsum", "dolor"];
+let x: JValue = v.into_iter().collect();
+ +
use std::iter::FromIterator;
+use air_interpreter_value::JValue;
+
+let x: JValue = JValue::from_iter(vec!["lorem", "ipsum", "dolor"]);
+
source§

impl<I> Index<I> for JValue
where + I: Index,

source§

fn index(&self, index: I) -> &JValue

Index into a air_interpreter_value::JValue using the syntax value[0] or +value["k"].

+

Returns JValue::Null if the type of self does not match the type of +the index, for example if the index is a string and self is an array +or a number. Also returns JValue::Null if the given key does not exist +in the map or the given index is not within the bounds of the array.

+

For retrieving deeply nested values, you should have a look at the +JValue::pointer method.

+
§

type Output = JValue

The returned type after indexing.
source§

impl PartialEq<&str> for JValue

source§

fn eq(&self, other: &&str) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl PartialEq<JValue> for &str

source§

fn eq(&self, other: &JValue) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl PartialEq<JValue> for String

source§

fn eq(&self, other: &JValue) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl PartialEq<JValue> for bool

source§

fn eq(&self, other: &JValue) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl PartialEq<JValue> for f32

source§

fn eq(&self, other: &JValue) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl PartialEq<JValue> for f64

source§

fn eq(&self, other: &JValue) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl PartialEq<JValue> for i16

source§

fn eq(&self, other: &JValue) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl PartialEq<JValue> for i32

source§

fn eq(&self, other: &JValue) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl PartialEq<JValue> for i64

source§

fn eq(&self, other: &JValue) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl PartialEq<JValue> for i8

source§

fn eq(&self, other: &JValue) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl PartialEq<JValue> for isize

source§

fn eq(&self, other: &JValue) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl PartialEq<JValue> for str

source§

fn eq(&self, other: &JValue) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl PartialEq<JValue> for u16

source§

fn eq(&self, other: &JValue) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl PartialEq<JValue> for u32

source§

fn eq(&self, other: &JValue) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl PartialEq<JValue> for u64

source§

fn eq(&self, other: &JValue) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl PartialEq<JValue> for u8

source§

fn eq(&self, other: &JValue) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl PartialEq<JValue> for usize

source§

fn eq(&self, other: &JValue) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl PartialEq<String> for JValue

source§

fn eq(&self, other: &String) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl<'a> PartialEq<bool> for &'a JValue

source§

fn eq(&self, other: &bool) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl PartialEq<bool> for JValue

source§

fn eq(&self, other: &bool) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl<'a> PartialEq<f32> for &'a JValue

source§

fn eq(&self, other: &f32) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl PartialEq<f32> for JValue

source§

fn eq(&self, other: &f32) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl<'a> PartialEq<f64> for &'a JValue

source§

fn eq(&self, other: &f64) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl PartialEq<f64> for JValue

source§

fn eq(&self, other: &f64) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl<'a> PartialEq<i16> for &'a JValue

source§

fn eq(&self, other: &i16) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl PartialEq<i16> for JValue

source§

fn eq(&self, other: &i16) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl<'a> PartialEq<i32> for &'a JValue

source§

fn eq(&self, other: &i32) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl PartialEq<i32> for JValue

source§

fn eq(&self, other: &i32) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl<'a> PartialEq<i64> for &'a JValue

source§

fn eq(&self, other: &i64) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl PartialEq<i64> for JValue

source§

fn eq(&self, other: &i64) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl<'a> PartialEq<i8> for &'a JValue

source§

fn eq(&self, other: &i8) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl PartialEq<i8> for JValue

source§

fn eq(&self, other: &i8) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl<'a> PartialEq<isize> for &'a JValue

source§

fn eq(&self, other: &isize) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl PartialEq<isize> for JValue

source§

fn eq(&self, other: &isize) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl PartialEq<str> for JValue

source§

fn eq(&self, other: &str) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl<'a> PartialEq<u16> for &'a JValue

source§

fn eq(&self, other: &u16) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl PartialEq<u16> for JValue

source§

fn eq(&self, other: &u16) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl<'a> PartialEq<u32> for &'a JValue

source§

fn eq(&self, other: &u32) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl PartialEq<u32> for JValue

source§

fn eq(&self, other: &u32) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl<'a> PartialEq<u64> for &'a JValue

source§

fn eq(&self, other: &u64) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl PartialEq<u64> for JValue

source§

fn eq(&self, other: &u64) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl<'a> PartialEq<u8> for &'a JValue

source§

fn eq(&self, other: &u8) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl PartialEq<u8> for JValue

source§

fn eq(&self, other: &u8) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl<'a> PartialEq<usize> for &'a JValue

source§

fn eq(&self, other: &usize) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl PartialEq<usize> for JValue

source§

fn eq(&self, other: &usize) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl PartialEq for JValue

source§

fn eq(&self, other: &JValue) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl Serialize for JValue

source§

fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where + S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Eq for JValue

source§

impl StructuralPartialEq for JValue

Auto Trait Implementations§

§

impl Freeze for JValue

§

impl RefUnwindSafe for JValue

§

impl !Send for JValue

§

impl !Sync for JValue

§

impl Unpin for JValue

§

impl UnwindSafe for JValue

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_interpreter_value/index.html b/air_interpreter_value/index.html new file mode 100644 index 00000000..869e26cd --- /dev/null +++ b/air_interpreter_value/index.html @@ -0,0 +1 @@ +air_interpreter_value - Rust

Crate air_interpreter_value

source ·

Enums§

  • Represents any valid JSON value with a cheap to clone Rc-based representation.

Type Aliases§

\ No newline at end of file diff --git a/air_interpreter_value/sidebar-items.js b/air_interpreter_value/sidebar-items.js new file mode 100644 index 00000000..bb7b118a --- /dev/null +++ b/air_interpreter_value/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"enum":["JValue"],"type":["JsonString","Map"]}; \ No newline at end of file diff --git a/air_interpreter_value/type.JsonString.html b/air_interpreter_value/type.JsonString.html new file mode 100644 index 00000000..a23e746f --- /dev/null +++ b/air_interpreter_value/type.JsonString.html @@ -0,0 +1 @@ +JsonString in air_interpreter_value - Rust

Type Alias air_interpreter_value::JsonString

source ·
pub type JsonString = Rc<str>;

Aliased Type§

struct JsonString { /* private fields */ }
\ No newline at end of file diff --git a/air_interpreter_value/type.Map.html b/air_interpreter_value/type.Map.html new file mode 100644 index 00000000..7dc905fa --- /dev/null +++ b/air_interpreter_value/type.Map.html @@ -0,0 +1 @@ +Map in air_interpreter_value - Rust

Type Alias air_interpreter_value::Map

source ·
pub type Map<K, V> = BTreeMap<K, V>;

Aliased Type§

struct Map<K, V> { /* private fields */ }
\ No newline at end of file diff --git a/air_interpreter_value/value/enum.JValue.html b/air_interpreter_value/value/enum.JValue.html new file mode 100644 index 00000000..359bb9c4 --- /dev/null +++ b/air_interpreter_value/value/enum.JValue.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_interpreter_value/enum.JValue.html...

+ + + \ No newline at end of file diff --git a/air_lambda_ast/all.html b/air_lambda_ast/all.html new file mode 100644 index 00000000..4120fa84 --- /dev/null +++ b/air_lambda_ast/all.html @@ -0,0 +1 @@ +List of all items in this crate

List of all items

Enums

\ No newline at end of file diff --git a/air_lambda_ast/ast/enum.Functor.html b/air_lambda_ast/ast/enum.Functor.html new file mode 100644 index 00000000..c82c5b6c --- /dev/null +++ b/air_lambda_ast/ast/enum.Functor.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_lambda_ast/enum.Functor.html...

+ + + \ No newline at end of file diff --git a/air_lambda_ast/ast/enum.LambdaAST.html b/air_lambda_ast/ast/enum.LambdaAST.html new file mode 100644 index 00000000..f4672c98 --- /dev/null +++ b/air_lambda_ast/ast/enum.LambdaAST.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_lambda_ast/enum.LambdaAST.html...

+ + + \ No newline at end of file diff --git a/air_lambda_ast/ast/enum.ValueAccessor.html b/air_lambda_ast/ast/enum.ValueAccessor.html new file mode 100644 index 00000000..d568cdd8 --- /dev/null +++ b/air_lambda_ast/ast/enum.ValueAccessor.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_lambda_ast/enum.ValueAccessor.html...

+ + + \ No newline at end of file diff --git a/air_lambda_ast/enum.Functor.html b/air_lambda_ast/enum.Functor.html new file mode 100644 index 00000000..5fa9f924 --- /dev/null +++ b/air_lambda_ast/enum.Functor.html @@ -0,0 +1,24 @@ +Functor in air_lambda_ast - Rust

Enum air_lambda_ast::Functor

source ·
pub enum Functor {
+    Length,
+}

Variants§

§

Length

Returns a length of a value if this value has array type (json array or canon stream) +or a error if not.

+

Trait Implementations§

source§

impl Clone for Functor

source§

fn clone(&self) -> Functor

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for Functor

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'de> Deserialize<'de> for Functor

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl Display for Functor

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl PartialEq for Functor

source§

fn eq(&self, other: &Functor) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl Serialize for Functor

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Copy for Functor

source§

impl Eq for Functor

source§

impl StructuralPartialEq for Functor

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
source§

impl<T> CloneToUninit for T
where + T: Copy,

source§

unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_lambda_ast/enum.LambdaAST.html b/air_lambda_ast/enum.LambdaAST.html new file mode 100644 index 00000000..1abf94fe --- /dev/null +++ b/air_lambda_ast/enum.LambdaAST.html @@ -0,0 +1,27 @@ +LambdaAST in air_lambda_ast - Rust

Enum air_lambda_ast::LambdaAST

source ·
pub enum LambdaAST<'input> {
+    Functor(Functor),
+    ValuePath(NonEmpty<ValueAccessor<'input>>),
+}

Variants§

§

Functor(Functor)

Various functors that could applied to a value.

+
§

ValuePath(NonEmpty<ValueAccessor<'input>>)

Each value in AIR could be represented as a tree and +this variant acts as a path in such trees.

+

Implementations§

source§

impl<'input> LambdaAST<'input>

source

pub fn try_from_accessors( + accessors: Vec<ValueAccessor<'input>>, +) -> Result<Self, EmptyError>

source

pub fn from_functor(functor: Functor) -> Self

Trait Implementations§

source§

impl<'input> Clone for LambdaAST<'input>

source§

fn clone(&self) -> LambdaAST<'input>

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl<'input> Debug for LambdaAST<'input>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'de: 'input, 'input> Deserialize<'de> for LambdaAST<'input>

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl Display for LambdaAST<'_>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'input> PartialEq for LambdaAST<'input>

source§

fn eq(&self, other: &LambdaAST<'input>) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl<'input> Serialize for LambdaAST<'input>

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl<'input> Eq for LambdaAST<'input>

source§

impl<'input> StructuralPartialEq for LambdaAST<'input>

Auto Trait Implementations§

§

impl<'input> Freeze for LambdaAST<'input>

§

impl<'input> RefUnwindSafe for LambdaAST<'input>

§

impl<'input> Send for LambdaAST<'input>

§

impl<'input> Sync for LambdaAST<'input>

§

impl<'input> Unpin for LambdaAST<'input>

§

impl<'input> UnwindSafe for LambdaAST<'input>

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_lambda_ast/enum.ValueAccessor.html b/air_lambda_ast/enum.ValueAccessor.html new file mode 100644 index 00000000..f488f0f6 --- /dev/null +++ b/air_lambda_ast/enum.ValueAccessor.html @@ -0,0 +1,31 @@ +ValueAccessor in air_lambda_ast - Rust

Enum air_lambda_ast::ValueAccessor

source ·
pub enum ValueAccessor<'input> {
+    ArrayAccess {
+        idx: u32,
+    },
+    FieldAccessByName {
+        field_name: &'input str,
+    },
+    FieldAccessByScalar {
+        scalar_name: &'input str,
+    },
+    Error,
+}

Variants§

§

ArrayAccess

Fields

§idx: u32
§

FieldAccessByName

Fields

§field_name: &'input str
§

FieldAccessByScalar

Fields

§scalar_name: &'input str
§

Error

Trait Implementations§

source§

impl<'input> Clone for ValueAccessor<'input>

source§

fn clone(&self) -> ValueAccessor<'input>

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl<'input> Debug for ValueAccessor<'input>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'de: 'input, 'input> Deserialize<'de> for ValueAccessor<'input>

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl Display for ValueAccessor<'_>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'input> PartialEq for ValueAccessor<'input>

source§

fn eq(&self, other: &ValueAccessor<'input>) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl<'input> Serialize for ValueAccessor<'input>

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl<'input> Copy for ValueAccessor<'input>

source§

impl<'input> Eq for ValueAccessor<'input>

source§

impl<'input> StructuralPartialEq for ValueAccessor<'input>

Auto Trait Implementations§

§

impl<'input> Freeze for ValueAccessor<'input>

§

impl<'input> RefUnwindSafe for ValueAccessor<'input>

§

impl<'input> Send for ValueAccessor<'input>

§

impl<'input> Sync for ValueAccessor<'input>

§

impl<'input> Unpin for ValueAccessor<'input>

§

impl<'input> UnwindSafe for ValueAccessor<'input>

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
source§

impl<T> CloneToUninit for T
where + T: Copy,

source§

unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_lambda_ast/index.html b/air_lambda_ast/index.html new file mode 100644 index 00000000..95962357 --- /dev/null +++ b/air_lambda_ast/index.html @@ -0,0 +1 @@ +air_lambda_ast - Rust

Crate air_lambda_ast

source ·

Enums§

\ No newline at end of file diff --git a/air_lambda_ast/sidebar-items.js b/air_lambda_ast/sidebar-items.js new file mode 100644 index 00000000..e874e420 --- /dev/null +++ b/air_lambda_ast/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"enum":["Functor","LambdaAST","ValueAccessor"]}; \ No newline at end of file diff --git a/air_lambda_parser/all.html b/air_lambda_parser/all.html new file mode 100644 index 00000000..d6dc198f --- /dev/null +++ b/air_lambda_parser/all.html @@ -0,0 +1 @@ +List of all items in this crate
\ No newline at end of file diff --git a/air_lambda_parser/enum.Functor.html b/air_lambda_parser/enum.Functor.html new file mode 100644 index 00000000..19233a50 --- /dev/null +++ b/air_lambda_parser/enum.Functor.html @@ -0,0 +1,29 @@ +Functor in air_lambda_parser - Rust

Enum air_lambda_parser::Functor

pub enum Functor {
+    Length,
+}

Variants§

§

Length

Returns a length of a value if this value has array type (json array or canon stream) +or a error if not.

+

Trait Implementations§

§

impl Clone for Functor

§

fn clone(&self) -> Functor

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
§

impl Debug for Functor

§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
§

impl<'de> Deserialize<'de> for Functor

§

fn deserialize<__D>( + __deserializer: __D, +) -> Result<Functor, <__D as Deserializer<'de>>::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
§

impl Display for Functor

§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
§

impl PartialEq for Functor

§

fn eq(&self, other: &Functor) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
§

impl Serialize for Functor

§

fn serialize<__S>( + &self, + __serializer: __S, +) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
§

impl Copy for Functor

§

impl Eq for Functor

§

impl StructuralPartialEq for Functor

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
source§

impl<T> CloneToUninit for T
where + T: Copy,

source§

unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_lambda_parser/enum.LambdaAST.html b/air_lambda_parser/enum.LambdaAST.html new file mode 100644 index 00000000..b1efb1fd --- /dev/null +++ b/air_lambda_parser/enum.LambdaAST.html @@ -0,0 +1,33 @@ +LambdaAST in air_lambda_parser - Rust

Enum air_lambda_parser::LambdaAST

pub enum LambdaAST<'input> {
+    Functor(Functor),
+    ValuePath(NonEmpty<ValueAccessor<'input>>),
+}

Variants§

§

Functor(Functor)

Various functors that could applied to a value.

+
§

ValuePath(NonEmpty<ValueAccessor<'input>>)

Each value in AIR could be represented as a tree and +this variant acts as a path in such trees.

+

Implementations§

§

impl<'input> LambdaAST<'input>

pub fn try_from_accessors( + accessors: Vec<ValueAccessor<'input>>, +) -> Result<LambdaAST<'input>, EmptyError>

pub fn from_functor(functor: Functor) -> LambdaAST<'input>

Trait Implementations§

§

impl<'input> Clone for LambdaAST<'input>

§

fn clone(&self) -> LambdaAST<'input>

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
§

impl<'input> Debug for LambdaAST<'input>

§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
§

impl<'de, 'input> Deserialize<'de> for LambdaAST<'input>
where + 'de: 'input,

§

fn deserialize<__D>( + __deserializer: __D, +) -> Result<LambdaAST<'input>, <__D as Deserializer<'de>>::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
§

impl Display for LambdaAST<'_>

§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
§

impl<'input> PartialEq for LambdaAST<'input>

§

fn eq(&self, other: &LambdaAST<'input>) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
§

impl<'input> Serialize for LambdaAST<'input>

§

fn serialize<__S>( + &self, + __serializer: __S, +) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
§

impl<'input> Eq for LambdaAST<'input>

§

impl<'input> StructuralPartialEq for LambdaAST<'input>

Auto Trait Implementations§

§

impl<'input> Freeze for LambdaAST<'input>

§

impl<'input> RefUnwindSafe for LambdaAST<'input>

§

impl<'input> Send for LambdaAST<'input>

§

impl<'input> Sync for LambdaAST<'input>

§

impl<'input> Unpin for LambdaAST<'input>

§

impl<'input> UnwindSafe for LambdaAST<'input>

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_lambda_parser/enum.LambdaParserError.html b/air_lambda_parser/enum.LambdaParserError.html new file mode 100644 index 00000000..8064b4c8 --- /dev/null +++ b/air_lambda_parser/enum.LambdaParserError.html @@ -0,0 +1,21 @@ +LambdaParserError in air_lambda_parser - Rust

Enum air_lambda_parser::LambdaParserError

source ·
pub enum LambdaParserError<'input> {
+    LexerError(LexerError),
+    LambdaError(IncorrectLambdaError),
+    ParseError(ParseError<usize, Token<'input>, LexerError>),
+    RecoveryErrors(Vec<ErrorRecovery<usize, Token<'input>, LexerError>>),
+}

Variants§

§

LexerError(LexerError)

§

LambdaError(IncorrectLambdaError)

§

ParseError(ParseError<usize, Token<'input>, LexerError>)

§

RecoveryErrors(Vec<ErrorRecovery<usize, Token<'input>, LexerError>>)

Trait Implementations§

source§

impl<'input> Clone for LambdaParserError<'input>

source§

fn clone(&self) -> LambdaParserError<'input>

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl<'input> Debug for LambdaParserError<'input>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'input> Display for LambdaParserError<'input>

source§

fn fmt(&self, __formatter: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'input> Error for LambdaParserError<'input>

source§

fn source(&self) -> Option<&(dyn Error + 'static)>

The lower-level source of this error, if any. Read more
1.0.0 · source§

fn description(&self) -> &str

👎Deprecated since 1.42.0: use the Display impl or to_string()
1.0.0 · source§

fn cause(&self) -> Option<&dyn Error>

👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
source§

fn provide<'a>(&'a self, request: &mut Request<'a>)

🔬This is a nightly-only experimental API. (error_generic_member_access)
Provides type based access to context intended for error reports. Read more
source§

impl<'input> From<LexerError> for LambdaParserError<'input>

source§

fn from(source: LexerError) -> Self

Converts to this type from the input type.
source§

impl<'input> From<ParseError<usize, Token<'input>, LexerError>> for LambdaParserError<'input>

source§

fn from(e: ParseError<usize, Token<'input>, LexerError>) -> Self

Converts to this type from the input type.
source§

impl<'input> From<Vec<ErrorRecovery<usize, Token<'input>, LexerError>>> for LambdaParserError<'input>

source§

fn from(errors: Vec<ErrorRecovery<usize, Token<'input>, LexerError>>) -> Self

Converts to this type from the input type.
source§

impl<'input> PartialEq for LambdaParserError<'input>

source§

fn eq(&self, other: &LambdaParserError<'input>) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl<'input> Eq for LambdaParserError<'input>

source§

impl<'input> StructuralPartialEq for LambdaParserError<'input>

Auto Trait Implementations§

§

impl<'input> Freeze for LambdaParserError<'input>

§

impl<'input> RefUnwindSafe for LambdaParserError<'input>

§

impl<'input> Send for LambdaParserError<'input>

§

impl<'input> Sync for LambdaParserError<'input>

§

impl<'input> Unpin for LambdaParserError<'input>

§

impl<'input> UnwindSafe for LambdaParserError<'input>

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/air_lambda_parser/enum.LexerError.html b/air_lambda_parser/enum.LexerError.html new file mode 100644 index 00000000..3e4f8d51 --- /dev/null +++ b/air_lambda_parser/enum.LexerError.html @@ -0,0 +1,19 @@ +LexerError in air_lambda_parser - Rust

Enum air_lambda_parser::LexerError

source ·
pub enum LexerError {
+    UnexpectedSymbol(usize, usize),
+    ParseIntError(usize, usize, ParseIntError),
+}

Variants§

§

UnexpectedSymbol(usize, usize)

§

ParseIntError(usize, usize, ParseIntError)

Trait Implementations§

source§

impl Clone for LexerError

source§

fn clone(&self) -> LexerError

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for LexerError

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Display for LexerError

source§

fn fmt(&self, __formatter: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Error for LexerError

source§

fn source(&self) -> Option<&(dyn Error + 'static)>

The lower-level source of this error, if any. Read more
1.0.0 · source§

fn description(&self) -> &str

👎Deprecated since 1.42.0: use the Display impl or to_string()
1.0.0 · source§

fn cause(&self) -> Option<&dyn Error>

👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
source§

fn provide<'a>(&'a self, request: &mut Request<'a>)

🔬This is a nightly-only experimental API. (error_generic_member_access)
Provides type based access to context intended for error reports. Read more
source§

impl<'input> From<LexerError> for LambdaParserError<'input>

source§

fn from(source: LexerError) -> Self

Converts to this type from the input type.
source§

impl PartialEq for LexerError

source§

fn eq(&self, other: &LexerError) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl Eq for LexerError

source§

impl StructuralPartialEq for LexerError

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/air_lambda_parser/enum.ValueAccessor.html b/air_lambda_parser/enum.ValueAccessor.html new file mode 100644 index 00000000..c153013b --- /dev/null +++ b/air_lambda_parser/enum.ValueAccessor.html @@ -0,0 +1,37 @@ +ValueAccessor in air_lambda_parser - Rust

Enum air_lambda_parser::ValueAccessor

pub enum ValueAccessor<'input> {
+    ArrayAccess {
+        idx: u32,
+    },
+    FieldAccessByName {
+        field_name: &'input str,
+    },
+    FieldAccessByScalar {
+        scalar_name: &'input str,
+    },
+    Error,
+}

Variants§

§

ArrayAccess

Fields

§idx: u32
§

FieldAccessByName

Fields

§field_name: &'input str
§

FieldAccessByScalar

Fields

§scalar_name: &'input str
§

Error

Trait Implementations§

§

impl<'input> Clone for ValueAccessor<'input>

§

fn clone(&self) -> ValueAccessor<'input>

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
§

impl<'input> Debug for ValueAccessor<'input>

§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
§

impl<'de, 'input> Deserialize<'de> for ValueAccessor<'input>
where + 'de: 'input,

§

fn deserialize<__D>( + __deserializer: __D, +) -> Result<ValueAccessor<'input>, <__D as Deserializer<'de>>::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
§

impl Display for ValueAccessor<'_>

§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
§

impl<'input> PartialEq for ValueAccessor<'input>

§

fn eq(&self, other: &ValueAccessor<'input>) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
§

impl<'input> Serialize for ValueAccessor<'input>

§

fn serialize<__S>( + &self, + __serializer: __S, +) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
§

impl<'input> Copy for ValueAccessor<'input>

§

impl<'input> Eq for ValueAccessor<'input>

§

impl<'input> StructuralPartialEq for ValueAccessor<'input>

Auto Trait Implementations§

§

impl<'input> Freeze for ValueAccessor<'input>

§

impl<'input> RefUnwindSafe for ValueAccessor<'input>

§

impl<'input> Send for ValueAccessor<'input>

§

impl<'input> Sync for ValueAccessor<'input>

§

impl<'input> Unpin for ValueAccessor<'input>

§

impl<'input> UnwindSafe for ValueAccessor<'input>

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
source§

impl<T> CloneToUninit for T
where + T: Copy,

source§

unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_lambda_parser/fn.parse.html b/air_lambda_parser/fn.parse.html new file mode 100644 index 00000000..c6cf9ccd --- /dev/null +++ b/air_lambda_parser/fn.parse.html @@ -0,0 +1,2 @@ +parse in air_lambda_parser - Rust

Function air_lambda_parser::parse

source ·
pub fn parse(lambda: &str) -> Result<LambdaAST<'_>, LambdaParserError<'_>>
Expand description

Parse AIR lambda ast to LambdaAST

+
\ No newline at end of file diff --git a/air_lambda_parser/index.html b/air_lambda_parser/index.html new file mode 100644 index 00000000..8ba53de7 --- /dev/null +++ b/air_lambda_parser/index.html @@ -0,0 +1 @@ +air_lambda_parser - Rust

Crate air_lambda_parser

source ·

Structs§

Enums§

Functions§

  • Parse AIR lambda ast to LambdaAST
\ No newline at end of file diff --git a/air_lambda_parser/parser/errors/enum.LambdaParserError.html b/air_lambda_parser/parser/errors/enum.LambdaParserError.html new file mode 100644 index 00000000..f624a166 --- /dev/null +++ b/air_lambda_parser/parser/errors/enum.LambdaParserError.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../air_lambda_parser/enum.LambdaParserError.html...

+ + + \ No newline at end of file diff --git a/air_lambda_parser/parser/lambda_parser/fn.parse.html b/air_lambda_parser/parser/lambda_parser/fn.parse.html new file mode 100644 index 00000000..97572de1 --- /dev/null +++ b/air_lambda_parser/parser/lambda_parser/fn.parse.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../air_lambda_parser/fn.parse.html...

+ + + \ No newline at end of file diff --git a/air_lambda_parser/parser/lexer/errors/enum.LexerError.html b/air_lambda_parser/parser/lexer/errors/enum.LexerError.html new file mode 100644 index 00000000..17594878 --- /dev/null +++ b/air_lambda_parser/parser/lexer/errors/enum.LexerError.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../../air_lambda_parser/enum.LexerError.html...

+ + + \ No newline at end of file diff --git a/air_lambda_parser/parser/lexer/lambda_ast_lexer/struct.LambdaASTLexer.html b/air_lambda_parser/parser/lexer/lambda_ast_lexer/struct.LambdaASTLexer.html new file mode 100644 index 00000000..3ee7022c --- /dev/null +++ b/air_lambda_parser/parser/lexer/lambda_ast_lexer/struct.LambdaASTLexer.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../../air_lambda_parser/struct.LambdaASTLexer.html...

+ + + \ No newline at end of file diff --git a/air_lambda_parser/sidebar-items.js b/air_lambda_parser/sidebar-items.js new file mode 100644 index 00000000..69450efe --- /dev/null +++ b/air_lambda_parser/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"enum":["Functor","LambdaAST","LambdaParserError","LexerError","ValueAccessor"],"fn":["parse"],"struct":["LambdaASTLexer"]}; \ No newline at end of file diff --git a/air_lambda_parser/struct.LambdaASTLexer.html b/air_lambda_parser/struct.LambdaASTLexer.html new file mode 100644 index 00000000..170c993e --- /dev/null +++ b/air_lambda_parser/struct.LambdaASTLexer.html @@ -0,0 +1,573 @@ +LambdaASTLexer in air_lambda_parser - Rust

Struct air_lambda_parser::LambdaASTLexer

source ·
pub struct LambdaASTLexer<'input> { /* private fields */ }

Implementations§

source§

impl<'input> LambdaASTLexer<'input>

source

pub fn new(input: &'input str) -> Self

source

pub fn next_token( + &mut self, +) -> Option<Result<(usize, Token<'input>, usize), LexerError>>

Trait Implementations§

source§

impl<'input> Iterator for LambdaASTLexer<'input>

§

type Item = Result<(usize, Token<'input>, usize), LexerError>

The type of the elements being iterated over.
source§

fn next(&mut self) -> Option<Self::Item>

Advances the iterator and returns the next value. Read more
source§

fn next_chunk<const N: usize>( + &mut self, +) -> Result<[Self::Item; N], IntoIter<Self::Item, N>>
where + Self: Sized,

🔬This is a nightly-only experimental API. (iter_next_chunk)
Advances the iterator and returns an array containing the next N values. Read more
1.0.0 · source§

fn size_hint(&self) -> (usize, Option<usize>)

Returns the bounds on the remaining length of the iterator. Read more
1.0.0 · source§

fn count(self) -> usize
where + Self: Sized,

Consumes the iterator, counting the number of iterations and returning it. Read more
1.0.0 · source§

fn last(self) -> Option<Self::Item>
where + Self: Sized,

Consumes the iterator, returning the last element. Read more
source§

fn advance_by(&mut self, n: usize) -> Result<(), NonZero<usize>>

🔬This is a nightly-only experimental API. (iter_advance_by)
Advances the iterator by n elements. Read more
1.0.0 · source§

fn nth(&mut self, n: usize) -> Option<Self::Item>

Returns the nth element of the iterator. Read more
1.28.0 · source§

fn step_by(self, step: usize) -> StepBy<Self>
where + Self: Sized,

Creates an iterator starting at the same point, but stepping by +the given amount at each iteration. Read more
1.0.0 · source§

fn chain<U>(self, other: U) -> Chain<Self, <U as IntoIterator>::IntoIter>
where + Self: Sized, + U: IntoIterator<Item = Self::Item>,

Takes two iterators and creates a new iterator over both in sequence. Read more
1.0.0 · source§

fn zip<U>(self, other: U) -> Zip<Self, <U as IntoIterator>::IntoIter>
where + Self: Sized, + U: IntoIterator,

‘Zips up’ two iterators into a single iterator of pairs. Read more
source§

fn intersperse_with<G>(self, separator: G) -> IntersperseWith<Self, G>
where + Self: Sized, + G: FnMut() -> Self::Item,

🔬This is a nightly-only experimental API. (iter_intersperse)
Creates a new iterator which places an item generated by separator +between adjacent items of the original iterator. Read more
1.0.0 · source§

fn map<B, F>(self, f: F) -> Map<Self, F>
where + Self: Sized, + F: FnMut(Self::Item) -> B,

Takes a closure and creates an iterator which calls that closure on each +element. Read more
1.21.0 · source§

fn for_each<F>(self, f: F)
where + Self: Sized, + F: FnMut(Self::Item),

Calls a closure on each element of an iterator. Read more
1.0.0 · source§

fn filter<P>(self, predicate: P) -> Filter<Self, P>
where + Self: Sized, + P: FnMut(&Self::Item) -> bool,

Creates an iterator which uses a closure to determine if an element +should be yielded. Read more
1.0.0 · source§

fn filter_map<B, F>(self, f: F) -> FilterMap<Self, F>
where + Self: Sized, + F: FnMut(Self::Item) -> Option<B>,

Creates an iterator that both filters and maps. Read more
1.0.0 · source§

fn enumerate(self) -> Enumerate<Self>
where + Self: Sized,

Creates an iterator which gives the current iteration count as well as +the next value. Read more
1.0.0 · source§

fn peekable(self) -> Peekable<Self>
where + Self: Sized,

Creates an iterator which can use the peek and peek_mut methods +to look at the next element of the iterator without consuming it. See +their documentation for more information. Read more
1.0.0 · source§

fn skip_while<P>(self, predicate: P) -> SkipWhile<Self, P>
where + Self: Sized, + P: FnMut(&Self::Item) -> bool,

Creates an iterator that skips elements based on a predicate. Read more
1.0.0 · source§

fn take_while<P>(self, predicate: P) -> TakeWhile<Self, P>
where + Self: Sized, + P: FnMut(&Self::Item) -> bool,

Creates an iterator that yields elements based on a predicate. Read more
1.57.0 · source§

fn map_while<B, P>(self, predicate: P) -> MapWhile<Self, P>
where + Self: Sized, + P: FnMut(Self::Item) -> Option<B>,

Creates an iterator that both yields elements based on a predicate and maps. Read more
1.0.0 · source§

fn skip(self, n: usize) -> Skip<Self>
where + Self: Sized,

Creates an iterator that skips the first n elements. Read more
1.0.0 · source§

fn take(self, n: usize) -> Take<Self>
where + Self: Sized,

Creates an iterator that yields the first n elements, or fewer +if the underlying iterator ends sooner. Read more
1.0.0 · source§

fn scan<St, B, F>(self, initial_state: St, f: F) -> Scan<Self, St, F>
where + Self: Sized, + F: FnMut(&mut St, Self::Item) -> Option<B>,

An iterator adapter which, like fold, holds internal state, but +unlike fold, produces a new iterator. Read more
1.0.0 · source§

fn flat_map<U, F>(self, f: F) -> FlatMap<Self, U, F>
where + Self: Sized, + U: IntoIterator, + F: FnMut(Self::Item) -> U,

Creates an iterator that works like map, but flattens nested structure. Read more
source§

fn map_windows<F, R, const N: usize>(self, f: F) -> MapWindows<Self, F, N>
where + Self: Sized, + F: FnMut(&[Self::Item; N]) -> R,

🔬This is a nightly-only experimental API. (iter_map_windows)
Calls the given function f for each contiguous window of size N over +self and returns an iterator over the outputs of f. Like slice::windows(), +the windows during mapping overlap as well. Read more
1.0.0 · source§

fn fuse(self) -> Fuse<Self>
where + Self: Sized,

Creates an iterator which ends after the first None. Read more
1.0.0 · source§

fn inspect<F>(self, f: F) -> Inspect<Self, F>
where + Self: Sized, + F: FnMut(&Self::Item),

Does something with each element of an iterator, passing the value on. Read more
1.0.0 · source§

fn by_ref(&mut self) -> &mut Self
where + Self: Sized,

Borrows an iterator, rather than consuming it. Read more
1.0.0 · source§

fn collect<B>(self) -> B
where + B: FromIterator<Self::Item>, + Self: Sized,

Transforms an iterator into a collection. Read more
source§

fn collect_into<E>(self, collection: &mut E) -> &mut E
where + E: Extend<Self::Item>, + Self: Sized,

🔬This is a nightly-only experimental API. (iter_collect_into)
Collects all the items from an iterator into a collection. Read more
1.0.0 · source§

fn partition<B, F>(self, f: F) -> (B, B)
where + Self: Sized, + B: Default + Extend<Self::Item>, + F: FnMut(&Self::Item) -> bool,

Consumes an iterator, creating two collections from it. Read more
source§

fn is_partitioned<P>(self, predicate: P) -> bool
where + Self: Sized, + P: FnMut(Self::Item) -> bool,

🔬This is a nightly-only experimental API. (iter_is_partitioned)
Checks if the elements of this iterator are partitioned according to the given predicate, +such that all those that return true precede all those that return false. Read more
1.27.0 · source§

fn try_fold<B, F, R>(&mut self, init: B, f: F) -> R
where + Self: Sized, + F: FnMut(B, Self::Item) -> R, + R: Try<Output = B>,

An iterator method that applies a function as long as it returns +successfully, producing a single, final value. Read more
1.27.0 · source§

fn try_for_each<F, R>(&mut self, f: F) -> R
where + Self: Sized, + F: FnMut(Self::Item) -> R, + R: Try<Output = ()>,

An iterator method that applies a fallible function to each item in the +iterator, stopping at the first error and returning that error. Read more
1.0.0 · source§

fn fold<B, F>(self, init: B, f: F) -> B
where + Self: Sized, + F: FnMut(B, Self::Item) -> B,

Folds every element into an accumulator by applying an operation, +returning the final result. Read more
1.51.0 · source§

fn reduce<F>(self, f: F) -> Option<Self::Item>
where + Self: Sized, + F: FnMut(Self::Item, Self::Item) -> Self::Item,

Reduces the elements to a single one, by repeatedly applying a reducing +operation. Read more
source§

fn try_reduce<R>( + &mut self, + f: impl FnMut(Self::Item, Self::Item) -> R, +) -> <<R as Try>::Residual as Residual<Option<<R as Try>::Output>>>::TryType
where + Self: Sized, + R: Try<Output = Self::Item>, + <R as Try>::Residual: Residual<Option<Self::Item>>,

🔬This is a nightly-only experimental API. (iterator_try_reduce)
Reduces the elements to a single one by repeatedly applying a reducing operation. If the +closure returns a failure, the failure is propagated back to the caller immediately. Read more
1.0.0 · source§

fn all<F>(&mut self, f: F) -> bool
where + Self: Sized, + F: FnMut(Self::Item) -> bool,

Tests if every element of the iterator matches a predicate. Read more
1.0.0 · source§

fn any<F>(&mut self, f: F) -> bool
where + Self: Sized, + F: FnMut(Self::Item) -> bool,

Tests if any element of the iterator matches a predicate. Read more
1.0.0 · source§

fn find<P>(&mut self, predicate: P) -> Option<Self::Item>
where + Self: Sized, + P: FnMut(&Self::Item) -> bool,

Searches for an element of an iterator that satisfies a predicate. Read more
1.30.0 · source§

fn find_map<B, F>(&mut self, f: F) -> Option<B>
where + Self: Sized, + F: FnMut(Self::Item) -> Option<B>,

Applies function to the elements of iterator and returns +the first non-none result. Read more
source§

fn try_find<R>( + &mut self, + f: impl FnMut(&Self::Item) -> R, +) -> <<R as Try>::Residual as Residual<Option<Self::Item>>>::TryType
where + Self: Sized, + R: Try<Output = bool>, + <R as Try>::Residual: Residual<Option<Self::Item>>,

🔬This is a nightly-only experimental API. (try_find)
Applies function to the elements of iterator and returns +the first true result or the first error. Read more
1.0.0 · source§

fn position<P>(&mut self, predicate: P) -> Option<usize>
where + Self: Sized, + P: FnMut(Self::Item) -> bool,

Searches for an element in an iterator, returning its index. Read more
1.6.0 · source§

fn max_by_key<B, F>(self, f: F) -> Option<Self::Item>
where + B: Ord, + Self: Sized, + F: FnMut(&Self::Item) -> B,

Returns the element that gives the maximum value from the +specified function. Read more
1.15.0 · source§

fn max_by<F>(self, compare: F) -> Option<Self::Item>
where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> Ordering,

Returns the element that gives the maximum value with respect to the +specified comparison function. Read more
1.6.0 · source§

fn min_by_key<B, F>(self, f: F) -> Option<Self::Item>
where + B: Ord, + Self: Sized, + F: FnMut(&Self::Item) -> B,

Returns the element that gives the minimum value from the +specified function. Read more
1.15.0 · source§

fn min_by<F>(self, compare: F) -> Option<Self::Item>
where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> Ordering,

Returns the element that gives the minimum value with respect to the +specified comparison function. Read more
1.0.0 · source§

fn unzip<A, B, FromA, FromB>(self) -> (FromA, FromB)
where + FromA: Default + Extend<A>, + FromB: Default + Extend<B>, + Self: Sized + Iterator<Item = (A, B)>,

Converts an iterator of pairs into a pair of containers. Read more
1.36.0 · source§

fn copied<'a, T>(self) -> Copied<Self>
where + T: 'a + Copy, + Self: Sized + Iterator<Item = &'a T>,

Creates an iterator which copies all of its elements. Read more
1.0.0 · source§

fn cloned<'a, T>(self) -> Cloned<Self>
where + T: 'a + Clone, + Self: Sized + Iterator<Item = &'a T>,

Creates an iterator which clones all of its elements. Read more
source§

fn array_chunks<const N: usize>(self) -> ArrayChunks<Self, N>
where + Self: Sized,

🔬This is a nightly-only experimental API. (iter_array_chunks)
Returns an iterator over N elements of the iterator at a time. Read more
1.11.0 · source§

fn sum<S>(self) -> S
where + Self: Sized, + S: Sum<Self::Item>,

Sums the elements of an iterator. Read more
1.11.0 · source§

fn product<P>(self) -> P
where + Self: Sized, + P: Product<Self::Item>,

Iterates over the entire iterator, multiplying all the elements Read more
source§

fn cmp_by<I, F>(self, other: I, cmp: F) -> Ordering
where + Self: Sized, + I: IntoIterator, + F: FnMut(Self::Item, <I as IntoIterator>::Item) -> Ordering,

🔬This is a nightly-only experimental API. (iter_order_by)
Lexicographically compares the elements of this Iterator with those +of another with respect to the specified comparison function. Read more
1.5.0 · source§

fn partial_cmp<I>(self, other: I) -> Option<Ordering>
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Lexicographically compares the PartialOrd elements of +this Iterator with those of another. The comparison works like short-circuit +evaluation, returning a result without comparing the remaining elements. +As soon as an order can be determined, the evaluation stops and a result is returned. Read more
source§

fn partial_cmp_by<I, F>(self, other: I, partial_cmp: F) -> Option<Ordering>
where + Self: Sized, + I: IntoIterator, + F: FnMut(Self::Item, <I as IntoIterator>::Item) -> Option<Ordering>,

🔬This is a nightly-only experimental API. (iter_order_by)
Lexicographically compares the elements of this Iterator with those +of another with respect to the specified comparison function. Read more
1.5.0 · source§

fn eq<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialEq<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are equal to those of +another. Read more
source§

fn eq_by<I, F>(self, other: I, eq: F) -> bool
where + Self: Sized, + I: IntoIterator, + F: FnMut(Self::Item, <I as IntoIterator>::Item) -> bool,

🔬This is a nightly-only experimental API. (iter_order_by)
Determines if the elements of this Iterator are equal to those of +another with respect to the specified equality function. Read more
1.5.0 · source§

fn ne<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialEq<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are not equal to those of +another. Read more
1.5.0 · source§

fn lt<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are lexicographically +less than those of another. Read more
1.5.0 · source§

fn le<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are lexicographically +less or equal to those of another. Read more
1.5.0 · source§

fn gt<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are lexicographically +greater than those of another. Read more
1.5.0 · source§

fn ge<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are lexicographically +greater than or equal to those of another. Read more
source§

fn is_sorted_by<F>(self, compare: F) -> bool
where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> bool,

🔬This is a nightly-only experimental API. (is_sorted)
Checks if the elements of this iterator are sorted using the given comparator function. Read more
source§

fn is_sorted_by_key<F, K>(self, f: F) -> bool
where + Self: Sized, + F: FnMut(Self::Item) -> K, + K: PartialOrd,

🔬This is a nightly-only experimental API. (is_sorted)
Checks if the elements of this iterator are sorted using the given key extraction +function. Read more

Auto Trait Implementations§

§

impl<'input> Freeze for LambdaASTLexer<'input>

§

impl<'input> RefUnwindSafe for LambdaASTLexer<'input>

§

impl<'input> Send for LambdaASTLexer<'input>

§

impl<'input> Sync for LambdaASTLexer<'input>

§

impl<'input> Unpin for LambdaASTLexer<'input>

§

impl<'input> UnwindSafe for LambdaASTLexer<'input>

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<I> IntoIterator for I
where + I: Iterator,

§

type Item = <I as Iterator>::Item

The type of the elements being iterated over.
§

type IntoIter = I

Which kind of iterator are we turning this into?
source§

fn into_iter(self) -> I

Creates an iterator from a value. Read more
source§

impl<T> Itertools for T
where + T: Iterator + ?Sized,

source§

fn interleave<J>( + self, + other: J, +) -> Interleave<Self, <J as IntoIterator>::IntoIter>
where + J: IntoIterator<Item = Self::Item>, + Self: Sized,

Alternate elements from two iterators until both have run out. Read more
source§

fn interleave_shortest<J>( + self, + other: J, +) -> InterleaveShortest<Self, <J as IntoIterator>::IntoIter>
where + J: IntoIterator<Item = Self::Item>, + Self: Sized,

Alternate elements from two iterators until at least one of them has run +out. Read more
source§

fn intersperse( + self, + element: Self::Item, +) -> IntersperseWith<Self, IntersperseElementSimple<Self::Item>>
where + Self: Sized, + Self::Item: Clone,

An iterator adaptor to insert a particular value +between each element of the adapted iterator. Read more
source§

fn intersperse_with<F>(self, element: F) -> IntersperseWith<Self, F>
where + Self: Sized, + F: FnMut() -> Self::Item,

An iterator adaptor to insert a particular value created by a function +between each element of the adapted iterator. Read more
source§

fn zip_longest<J>( + self, + other: J, +) -> ZipLongest<Self, <J as IntoIterator>::IntoIter>
where + J: IntoIterator, + Self: Sized,

Create an iterator which iterates over both this and the specified +iterator simultaneously, yielding pairs of two optional elements. Read more
source§

fn zip_eq<J>(self, other: J) -> ZipEq<Self, <J as IntoIterator>::IntoIter>
where + J: IntoIterator, + Self: Sized,

Create an iterator which iterates over both this and the specified +iterator simultaneously, yielding pairs of elements. Read more
source§

fn batching<B, F>(self, f: F) -> Batching<Self, F>
where + F: FnMut(&mut Self) -> Option<B>, + Self: Sized,

A “meta iterator adaptor”. Its closure receives a reference to the +iterator and may pick off as many elements as it likes, to produce the +next iterator element. Read more
source§

fn group_by<K, F>(self, key: F) -> GroupBy<K, Self, F>
where + Self: Sized, + F: FnMut(&Self::Item) -> K, + K: PartialEq,

Return an iterable that can group iterator elements. +Consecutive elements that map to the same key (“runs”), are assigned +to the same group. Read more
source§

fn chunks(self, size: usize) -> IntoChunks<Self>
where + Self: Sized,

Return an iterable that can chunk the iterator. Read more
source§

fn tuple_windows<T>(self) -> TupleWindows<Self, T>
where + Self: Sized + Iterator<Item = <T as TupleCollect>::Item>, + T: HomogeneousTuple, + <T as TupleCollect>::Item: Clone,

Return an iterator over all contiguous windows producing tuples of +a specific size (up to 12). Read more
source§

fn circular_tuple_windows<T>(self) -> CircularTupleWindows<Self, T>
where + Self: Sized + Clone + Iterator<Item = <T as TupleCollect>::Item> + ExactSizeIterator, + T: TupleCollect + Clone, + <T as TupleCollect>::Item: Clone,

Return an iterator over all windows, wrapping back to the first +elements when the window would otherwise exceed the length of the +iterator, producing tuples of a specific size (up to 12). Read more
source§

fn tuples<T>(self) -> Tuples<Self, T>
where + Self: Sized + Iterator<Item = <T as TupleCollect>::Item>, + T: HomogeneousTuple,

Return an iterator that groups the items in tuples of a specific size +(up to 12). Read more
source§

fn tee(self) -> (Tee<Self>, Tee<Self>)
where + Self: Sized, + Self::Item: Clone,

Split into an iterator pair that both yield all elements from +the original iterator. Read more
source§

fn step(self, n: usize) -> Step<Self>
where + Self: Sized,

👎Deprecated since 0.8.0: Use std .step_by() instead
Return an iterator adaptor that steps n elements in the base iterator +for each iteration. Read more
source§

fn map_into<R>(self) -> MapSpecialCase<Self, MapSpecialCaseFnInto<R>>
where + Self: Sized, + Self::Item: Into<R>,

Convert each item of the iterator using the Into trait. Read more
source§

fn map_results<F, T, U, E>( + self, + f: F, +) -> MapSpecialCase<Self, MapSpecialCaseFnOk<F>>
where + Self: Sized + Iterator<Item = Result<T, E>>, + F: FnMut(T) -> U,

👎Deprecated since 0.10.0: Use .map_ok() instead
source§

fn map_ok<F, T, U, E>(self, f: F) -> MapSpecialCase<Self, MapSpecialCaseFnOk<F>>
where + Self: Sized + Iterator<Item = Result<T, E>>, + F: FnMut(T) -> U,

Return an iterator adaptor that applies the provided closure +to every Result::Ok value. Result::Err values are +unchanged. Read more
source§

fn filter_ok<F, T, E>(self, f: F) -> FilterOk<Self, F>
where + Self: Sized + Iterator<Item = Result<T, E>>, + F: FnMut(&T) -> bool,

Return an iterator adaptor that filters every Result::Ok +value with the provided closure. Result::Err values are +unchanged. Read more
source§

fn filter_map_ok<F, T, U, E>(self, f: F) -> FilterMapOk<Self, F>
where + Self: Sized + Iterator<Item = Result<T, E>>, + F: FnMut(T) -> Option<U>,

Return an iterator adaptor that filters and transforms every +Result::Ok value with the provided closure. Result::Err +values are unchanged. Read more
source§

fn flatten_ok<T, E>(self) -> FlattenOk<Self, T, E>
where + Self: Sized + Iterator<Item = Result<T, E>>, + T: IntoIterator,

Return an iterator adaptor that flattens every Result::Ok value into +a series of Result::Ok values. Result::Err values are unchanged. Read more
source§

fn merge<J>( + self, + other: J, +) -> MergeBy<Self, <J as IntoIterator>::IntoIter, MergeLte>
where + Self: Sized, + Self::Item: PartialOrd, + J: IntoIterator<Item = Self::Item>,

Return an iterator adaptor that merges the two base iterators in +ascending order. If both base iterators are sorted (ascending), the +result is sorted. Read more
source§

fn merge_by<J, F>( + self, + other: J, + is_first: F, +) -> MergeBy<Self, <J as IntoIterator>::IntoIter, F>
where + Self: Sized, + J: IntoIterator<Item = Self::Item>, + F: FnMut(&Self::Item, &Self::Item) -> bool,

Return an iterator adaptor that merges the two base iterators in order. +This is much like .merge() but allows for a custom ordering. Read more
source§

fn merge_join_by<J, F>( + self, + other: J, + cmp_fn: F, +) -> MergeJoinBy<Self, <J as IntoIterator>::IntoIter, F>
where + J: IntoIterator, + F: FnMut(&Self::Item, &<J as IntoIterator>::Item) -> Ordering, + Self: Sized,

Create an iterator that merges items from both this and the specified +iterator in ascending order. Read more
source§

fn kmerge(self) -> KMergeBy<<Self::Item as IntoIterator>::IntoIter, KMergeByLt>
where + Self: Sized, + Self::Item: IntoIterator, + <Self::Item as IntoIterator>::Item: PartialOrd,

Return an iterator adaptor that flattens an iterator of iterators by +merging them in ascending order. Read more
source§

fn kmerge_by<F>( + self, + first: F, +) -> KMergeBy<<Self::Item as IntoIterator>::IntoIter, F>
where + Self: Sized, + Self::Item: IntoIterator, + F: FnMut(&<Self::Item as IntoIterator>::Item, &<Self::Item as IntoIterator>::Item) -> bool,

Return an iterator adaptor that flattens an iterator of iterators by +merging them according to the given closure. Read more
source§

fn cartesian_product<J>( + self, + other: J, +) -> Product<Self, <J as IntoIterator>::IntoIter>
where + Self: Sized, + Self::Item: Clone, + J: IntoIterator, + <J as IntoIterator>::IntoIter: Clone,

Return an iterator adaptor that iterates over the cartesian product of +the element sets of two iterators self and J. Read more
source§

fn multi_cartesian_product( + self, +) -> MultiProduct<<Self::Item as IntoIterator>::IntoIter>
where + Self: Sized, + Self::Item: IntoIterator, + <Self::Item as IntoIterator>::IntoIter: Clone, + <Self::Item as IntoIterator>::Item: Clone,

Return an iterator adaptor that iterates over the cartesian product of +all subiterators returned by meta-iterator self. Read more
source§

fn coalesce<F>(self, f: F) -> CoalesceBy<Self, F, Self::Item>
where + Self: Sized, + F: FnMut(Self::Item, Self::Item) -> Result<Self::Item, (Self::Item, Self::Item)>,

Return an iterator adaptor that uses the passed-in closure to +optionally merge together consecutive elements. Read more
source§

fn dedup(self) -> CoalesceBy<Self, DedupPred2CoalescePred<DedupEq>, Self::Item>
where + Self: Sized, + Self::Item: PartialEq,

Remove duplicates from sections of consecutive identical elements. +If the iterator is sorted, all elements will be unique. Read more
source§

fn dedup_by<Cmp>( + self, + cmp: Cmp, +) -> CoalesceBy<Self, DedupPred2CoalescePred<Cmp>, Self::Item>
where + Self: Sized, + Cmp: FnMut(&Self::Item, &Self::Item) -> bool,

Remove duplicates from sections of consecutive identical elements, +determining equality using a comparison function. +If the iterator is sorted, all elements will be unique. Read more
source§

fn dedup_with_count( + self, +) -> CoalesceBy<Self, DedupPredWithCount2CoalescePred<DedupEq>, (usize, Self::Item)>
where + Self: Sized,

Remove duplicates from sections of consecutive identical elements, while keeping a count of +how many repeated elements were present. +If the iterator is sorted, all elements will be unique. Read more
source§

fn dedup_by_with_count<Cmp>( + self, + cmp: Cmp, +) -> CoalesceBy<Self, DedupPredWithCount2CoalescePred<Cmp>, (usize, Self::Item)>
where + Self: Sized, + Cmp: FnMut(&Self::Item, &Self::Item) -> bool,

Remove duplicates from sections of consecutive identical elements, while keeping a count of +how many repeated elements were present. +This will determine equality using a comparison function. +If the iterator is sorted, all elements will be unique. Read more
source§

fn duplicates(self) -> DuplicatesBy<Self, Self::Item, ById>
where + Self: Sized, + Self::Item: Eq + Hash,

Return an iterator adaptor that produces elements that appear more than once during the +iteration. Duplicates are detected using hash and equality. Read more
source§

fn duplicates_by<V, F>(self, f: F) -> DuplicatesBy<Self, V, ByFn<F>>
where + Self: Sized, + V: Eq + Hash, + F: FnMut(&Self::Item) -> V,

Return an iterator adaptor that produces elements that appear more than once during the +iteration. Duplicates are detected using hash and equality. Read more
source§

fn unique(self) -> Unique<Self>
where + Self: Sized, + Self::Item: Clone + Eq + Hash,

Return an iterator adaptor that filters out elements that have +already been produced once during the iteration. Duplicates +are detected using hash and equality. Read more
source§

fn unique_by<V, F>(self, f: F) -> UniqueBy<Self, V, F>
where + Self: Sized, + V: Eq + Hash, + F: FnMut(&Self::Item) -> V,

Return an iterator adaptor that filters out elements that have +already been produced once during the iteration. Read more
source§

fn peeking_take_while<F>(&mut self, accept: F) -> PeekingTakeWhile<'_, Self, F>
where + Self: Sized + PeekingNext, + F: FnMut(&Self::Item) -> bool,

Return an iterator adaptor that borrows from this iterator and +takes items while the closure accept returns true. Read more
source§

fn take_while_ref<F>(&mut self, accept: F) -> TakeWhileRef<'_, Self, F>
where + Self: Clone, + F: FnMut(&Self::Item) -> bool,

Return an iterator adaptor that borrows from a Clone-able iterator +to only pick off elements while the predicate accept returns true. Read more
source§

fn while_some<A>(self) -> WhileSome<Self>
where + Self: Sized + Iterator<Item = Option<A>>,

Return an iterator adaptor that filters Option<A> iterator elements +and produces A. Stops on the first None encountered. Read more
source§

fn tuple_combinations<T>(self) -> TupleCombinations<Self, T>
where + Self: Sized + Clone, + Self::Item: Clone, + T: HasCombination<Self>,

Return an iterator adaptor that iterates over the combinations of the +elements from an iterator. Read more
source§

fn combinations(self, k: usize) -> Combinations<Self>
where + Self: Sized, + Self::Item: Clone,

Return an iterator adaptor that iterates over the k-length combinations of +the elements from an iterator. Read more
source§

fn combinations_with_replacement( + self, + k: usize, +) -> CombinationsWithReplacement<Self>
where + Self: Sized, + Self::Item: Clone,

Return an iterator that iterates over the k-length combinations of +the elements from an iterator, with replacement. Read more
source§

fn permutations(self, k: usize) -> Permutations<Self>
where + Self: Sized, + Self::Item: Clone,

Return an iterator adaptor that iterates over all k-permutations of the +elements from an iterator. Read more
source§

fn powerset(self) -> Powerset<Self>
where + Self: Sized, + Self::Item: Clone,

Return an iterator that iterates through the powerset of the elements from an +iterator. Read more
source§

fn pad_using<F>(self, min: usize, f: F) -> PadUsing<Self, F>
where + Self: Sized, + F: FnMut(usize) -> Self::Item,

Return an iterator adaptor that pads the sequence to a minimum length of +min by filling missing elements using a closure f. Read more
source§

fn with_position(self) -> WithPosition<Self>
where + Self: Sized,

Return an iterator adaptor that wraps each element in a Position to +ease special-case handling of the first or last elements. Read more
source§

fn positions<P>(self, predicate: P) -> Positions<Self, P>
where + Self: Sized, + P: FnMut(Self::Item) -> bool,

Return an iterator adaptor that yields the indices of all elements +satisfying a predicate, counted from the start of the iterator. Read more
source§

fn update<F>(self, updater: F) -> Update<Self, F>
where + Self: Sized, + F: FnMut(&mut Self::Item),

Return an iterator adaptor that applies a mutating function +to each element before yielding it. Read more
source§

fn next_tuple<T>(&mut self) -> Option<T>
where + Self: Sized + Iterator<Item = <T as TupleCollect>::Item>, + T: HomogeneousTuple,

Advances the iterator and returns the next items grouped in a tuple of +a specific size (up to 12). Read more
source§

fn collect_tuple<T>(self) -> Option<T>
where + Self: Sized + Iterator<Item = <T as TupleCollect>::Item>, + T: HomogeneousTuple,

Collects all items from the iterator into a tuple of a specific size +(up to 12). Read more
source§

fn find_position<P>(&mut self, pred: P) -> Option<(usize, Self::Item)>
where + P: FnMut(&Self::Item) -> bool,

Find the position and value of the first element satisfying a predicate. Read more
source§

fn find_or_last<P>(self, predicate: P) -> Option<Self::Item>
where + Self: Sized, + P: FnMut(&Self::Item) -> bool,

Find the value of the first element satisfying a predicate or return the last element, if any. Read more
source§

fn find_or_first<P>(self, predicate: P) -> Option<Self::Item>
where + Self: Sized, + P: FnMut(&Self::Item) -> bool,

Find the value of the first element satisfying a predicate or return the first element, if any. Read more
source§

fn contains<Q>(&mut self, query: &Q) -> bool
where + Self: Sized, + Self::Item: Borrow<Q>, + Q: PartialEq,

Returns true if the given item is present in this iterator. Read more
source§

fn all_equal(&mut self) -> bool
where + Self: Sized, + Self::Item: PartialEq,

Check whether all elements compare equal. Read more
source§

fn all_unique(&mut self) -> bool
where + Self: Sized, + Self::Item: Eq + Hash,

Check whether all elements are unique (non equal). Read more
source§

fn dropping(self, n: usize) -> Self
where + Self: Sized,

Consume the first n elements from the iterator eagerly, +and return the same iterator again. Read more
source§

fn dropping_back(self, n: usize) -> Self
where + Self: Sized + DoubleEndedIterator,

Consume the last n elements from the iterator eagerly, +and return the same iterator again. Read more
source§

fn foreach<F>(self, f: F)
where + F: FnMut(Self::Item), + Self: Sized,

👎Deprecated since 0.8.0: Use .for_each() instead
Run the closure f eagerly on each element of the iterator. Read more
source§

fn concat(self) -> Self::Item
where + Self: Sized, + Self::Item: Extend<<Self::Item as IntoIterator>::Item> + IntoIterator + Default,

Combine all an iterator’s elements into one element by using Extend. Read more
source§

fn collect_vec(self) -> Vec<Self::Item>
where + Self: Sized,

.collect_vec() is simply a type specialization of Iterator::collect, +for convenience.
source§

fn try_collect<T, U, E>(self) -> Result<U, E>
where + Self: Sized + Iterator<Item = Result<T, E>>, + Result<U, E>: FromIterator<Result<T, E>>,

.try_collect() is more convenient way of writing +.collect::<Result<_, _>>() Read more
source§

fn set_from<'a, A, J>(&mut self, from: J) -> usize
where + A: 'a, + Self: Iterator<Item = &'a mut A>, + J: IntoIterator<Item = A>,

Assign to each reference in self from the from iterator, +stopping at the shortest of the two iterators. Read more
source§

fn join(&mut self, sep: &str) -> String
where + Self::Item: Display,

Combine all iterator elements into one String, separated by sep. Read more
source§

fn format(self, sep: &str) -> Format<'_, Self>
where + Self: Sized,

Format all iterator elements, separated by sep. Read more
source§

fn format_with<F>(self, sep: &str, format: F) -> FormatWith<'_, Self, F>
where + Self: Sized, + F: FnMut(Self::Item, &mut dyn FnMut(&dyn Display) -> Result<(), Error>) -> Result<(), Error>,

Format all iterator elements, separated by sep. Read more
source§

fn fold_results<A, E, B, F>(&mut self, start: B, f: F) -> Result<B, E>
where + Self: Iterator<Item = Result<A, E>>, + F: FnMut(B, A) -> B,

👎Deprecated since 0.10.0: Use .fold_ok() instead
source§

fn fold_ok<A, E, B, F>(&mut self, start: B, f: F) -> Result<B, E>
where + Self: Iterator<Item = Result<A, E>>, + F: FnMut(B, A) -> B,

Fold Result values from an iterator. Read more
source§

fn fold_options<A, B, F>(&mut self, start: B, f: F) -> Option<B>
where + Self: Iterator<Item = Option<A>>, + F: FnMut(B, A) -> B,

Fold Option values from an iterator. Read more
source§

fn fold1<F>(self, f: F) -> Option<Self::Item>
where + F: FnMut(Self::Item, Self::Item) -> Self::Item, + Self: Sized,

👎Deprecated since 0.10.2: Use Iterator::reduce instead
Accumulator of the elements in the iterator. Read more
source§

fn tree_fold1<F>(self, f: F) -> Option<Self::Item>
where + F: FnMut(Self::Item, Self::Item) -> Self::Item, + Self: Sized,

Accumulate the elements in the iterator in a tree-like manner. Read more
source§

fn fold_while<B, F>(&mut self, init: B, f: F) -> FoldWhile<B>
where + Self: Sized, + F: FnMut(B, Self::Item) -> FoldWhile<B>,

An iterator method that applies a function, producing a single, final value. Read more
source§

fn sum1<S>(self) -> Option<S>
where + Self: Sized, + S: Sum<Self::Item>,

Iterate over the entire iterator and add all the elements. Read more
source§

fn product1<P>(self) -> Option<P>
where + Self: Sized, + P: Product<Self::Item>,

Iterate over the entire iterator and multiply all the elements. Read more
source§

fn sorted_unstable(self) -> IntoIter<Self::Item>
where + Self: Sized, + Self::Item: Ord,

Sort all iterator elements into a new iterator in ascending order. Read more
source§

fn sorted_unstable_by<F>(self, cmp: F) -> IntoIter<Self::Item>
where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> Ordering,

Sort all iterator elements into a new iterator in ascending order. Read more
source§

fn sorted_unstable_by_key<K, F>(self, f: F) -> IntoIter<Self::Item>
where + Self: Sized, + K: Ord, + F: FnMut(&Self::Item) -> K,

Sort all iterator elements into a new iterator in ascending order. Read more
source§

fn sorted(self) -> IntoIter<Self::Item>
where + Self: Sized, + Self::Item: Ord,

Sort all iterator elements into a new iterator in ascending order. Read more
source§

fn sorted_by<F>(self, cmp: F) -> IntoIter<Self::Item>
where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> Ordering,

Sort all iterator elements into a new iterator in ascending order. Read more
source§

fn sorted_by_key<K, F>(self, f: F) -> IntoIter<Self::Item>
where + Self: Sized, + K: Ord, + F: FnMut(&Self::Item) -> K,

Sort all iterator elements into a new iterator in ascending order. Read more
source§

fn sorted_by_cached_key<K, F>(self, f: F) -> IntoIter<Self::Item>
where + Self: Sized, + K: Ord, + F: FnMut(&Self::Item) -> K,

Sort all iterator elements into a new iterator in ascending order. The key function is +called exactly once per key. Read more
source§

fn k_smallest(self, k: usize) -> IntoIter<Self::Item>
where + Self: Sized, + Self::Item: Ord,

Sort the k smallest elements into a new iterator, in ascending order. Read more
source§

fn partition_map<A, B, F, L, R>(self, predicate: F) -> (A, B)
where + Self: Sized, + F: FnMut(Self::Item) -> Either<L, R>, + A: Default + Extend<L>, + B: Default + Extend<R>,

Collect all iterator elements into one of two +partitions. Unlike Iterator::partition, each partition may +have a distinct type. Read more
source§

fn partition_result<A, B, T, E>(self) -> (A, B)
where + Self: Sized + Iterator<Item = Result<T, E>>, + A: Default + Extend<T>, + B: Default + Extend<E>,

Partition a sequence of Results into one list of all the Ok elements +and another list of all the Err elements. Read more
source§

fn into_group_map<K, V>(self) -> HashMap<K, Vec<V>>
where + Self: Sized + Iterator<Item = (K, V)>, + K: Hash + Eq,

Return a HashMap of keys mapped to Vecs of values. Keys and values +are taken from (Key, Value) tuple pairs yielded by the input iterator. Read more
source§

fn into_group_map_by<K, V, F>(self, f: F) -> HashMap<K, Vec<V>>
where + Self: Sized + Iterator<Item = V>, + K: Hash + Eq, + F: Fn(&V) -> K,

Return an Iterator on a HashMap. Keys mapped to Vecs of values. The key is specified +in the closure. Read more
source§

fn into_grouping_map<K, V>(self) -> GroupingMap<Self>
where + Self: Sized + Iterator<Item = (K, V)>, + K: Hash + Eq,

Constructs a GroupingMap to be used later with one of the efficient +group-and-fold operations it allows to perform. Read more
source§

fn into_grouping_map_by<K, V, F>( + self, + key_mapper: F, +) -> GroupingMap<MapForGrouping<Self, F>>
where + Self: Sized + Iterator<Item = V>, + K: Hash + Eq, + F: FnMut(&V) -> K,

Constructs a GroupingMap to be used later with one of the efficient +group-and-fold operations it allows to perform. Read more
source§

fn min_set(self) -> Vec<Self::Item>
where + Self: Sized, + Self::Item: Ord,

Return all minimum elements of an iterator. Read more
source§

fn min_set_by<F>(self, compare: F) -> Vec<Self::Item>
where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> Ordering,

Return all minimum elements of an iterator, as determined by +the specified function. Read more
source§

fn min_set_by_key<K, F>(self, key: F) -> Vec<Self::Item>
where + Self: Sized, + K: Ord, + F: FnMut(&Self::Item) -> K,

Return all minimum elements of an iterator, as determined by +the specified function. Read more
source§

fn max_set(self) -> Vec<Self::Item>
where + Self: Sized, + Self::Item: Ord,

Return all maximum elements of an iterator. Read more
source§

fn max_set_by<F>(self, compare: F) -> Vec<Self::Item>
where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> Ordering,

Return all maximum elements of an iterator, as determined by +the specified function. Read more
source§

fn max_set_by_key<K, F>(self, key: F) -> Vec<Self::Item>
where + Self: Sized, + K: Ord, + F: FnMut(&Self::Item) -> K,

Return all minimum elements of an iterator, as determined by +the specified function. Read more
source§

fn minmax(self) -> MinMaxResult<Self::Item>
where + Self: Sized, + Self::Item: PartialOrd,

Return the minimum and maximum elements in the iterator. Read more
source§

fn minmax_by_key<K, F>(self, key: F) -> MinMaxResult<Self::Item>
where + Self: Sized, + K: PartialOrd, + F: FnMut(&Self::Item) -> K,

Return the minimum and maximum element of an iterator, as determined by +the specified function. Read more
source§

fn minmax_by<F>(self, compare: F) -> MinMaxResult<Self::Item>
where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> Ordering,

Return the minimum and maximum element of an iterator, as determined by +the specified comparison function. Read more
source§

fn position_max(self) -> Option<usize>
where + Self: Sized, + Self::Item: Ord,

Return the position of the maximum element in the iterator. Read more
source§

fn position_max_by_key<K, F>(self, key: F) -> Option<usize>
where + Self: Sized, + K: Ord, + F: FnMut(&Self::Item) -> K,

Return the position of the maximum element in the iterator, as +determined by the specified function. Read more
source§

fn position_max_by<F>(self, compare: F) -> Option<usize>
where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> Ordering,

Return the position of the maximum element in the iterator, as +determined by the specified comparison function. Read more
source§

fn position_min(self) -> Option<usize>
where + Self: Sized, + Self::Item: Ord,

Return the position of the minimum element in the iterator. Read more
source§

fn position_min_by_key<K, F>(self, key: F) -> Option<usize>
where + Self: Sized, + K: Ord, + F: FnMut(&Self::Item) -> K,

Return the position of the minimum element in the iterator, as +determined by the specified function. Read more
source§

fn position_min_by<F>(self, compare: F) -> Option<usize>
where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> Ordering,

Return the position of the minimum element in the iterator, as +determined by the specified comparison function. Read more
source§

fn position_minmax(self) -> MinMaxResult<usize>
where + Self: Sized, + Self::Item: PartialOrd,

Return the positions of the minimum and maximum elements in +the iterator. Read more
source§

fn position_minmax_by_key<K, F>(self, key: F) -> MinMaxResult<usize>
where + Self: Sized, + K: PartialOrd, + F: FnMut(&Self::Item) -> K,

Return the postions of the minimum and maximum elements of an +iterator, as determined by the specified function. Read more
source§

fn position_minmax_by<F>(self, compare: F) -> MinMaxResult<usize>
where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> Ordering,

Return the postions of the minimum and maximum elements of an +iterator, as determined by the specified comparison function. Read more
source§

fn exactly_one(self) -> Result<Self::Item, ExactlyOneError<Self>>
where + Self: Sized,

If the iterator yields exactly one element, that element will be returned, otherwise +an error will be returned containing an iterator that has the same output as the input +iterator. Read more
source§

fn at_most_one(self) -> Result<Option<Self::Item>, ExactlyOneError<Self>>
where + Self: Sized,

If the iterator yields no elements, Ok(None) will be returned. If the iterator yields +exactly one element, that element will be returned, otherwise an error will be returned +containing an iterator that has the same output as the input iterator. Read more
source§

fn multipeek(self) -> MultiPeek<Self>
where + Self: Sized,

An iterator adaptor that allows the user to peek at multiple .next() +values without advancing the base iterator. Read more
source§

fn counts(self) -> HashMap<Self::Item, usize>
where + Self: Sized, + Self::Item: Eq + Hash,

Collect the items in this iterator and return a HashMap which +contains each item that appears in the iterator and the number +of times it appears. Read more
source§

fn counts_by<K, F>(self, f: F) -> HashMap<K, usize>
where + Self: Sized, + K: Eq + Hash, + F: FnMut(Self::Item) -> K,

Collect the items in this iterator and return a HashMap which +contains each item that appears in the iterator and the number +of times it appears, +determining identity using a keying function. Read more
source§

fn multiunzip<FromI>(self) -> FromI
where + Self: Sized + MultiUnzip<FromI>,

Converts an iterator of tuples into a tuple of containers. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/air_log_targets/all.html b/air_log_targets/all.html new file mode 100644 index 00000000..1c1403f9 --- /dev/null +++ b/air_log_targets/all.html @@ -0,0 +1 @@ +List of all items in this crate
\ No newline at end of file diff --git a/air_log_targets/constant.DATA_CACHE.html b/air_log_targets/constant.DATA_CACHE.html new file mode 100644 index 00000000..7d341d60 --- /dev/null +++ b/air_log_targets/constant.DATA_CACHE.html @@ -0,0 +1,2 @@ +DATA_CACHE in air_log_targets - Rust

Constant air_log_targets::DATA_CACHE

source ·
pub const DATA_CACHE: &str = "data_cache";
Expand description

Print out data cache at the beginning of each instruction execution_step.

+
\ No newline at end of file diff --git a/air_log_targets/constant.EXECUTED_STATE_CHANGING.html b/air_log_targets/constant.EXECUTED_STATE_CHANGING.html new file mode 100644 index 00000000..377d7dd5 --- /dev/null +++ b/air_log_targets/constant.EXECUTED_STATE_CHANGING.html @@ -0,0 +1,2 @@ +EXECUTED_STATE_CHANGING in air_log_targets - Rust

Constant air_log_targets::EXECUTED_STATE_CHANGING

source ·
pub const EXECUTED_STATE_CHANGING: &str = "executed_state_changing";
Expand description

Print out state of data cache at the beginning of each instruction execution_step.

+
\ No newline at end of file diff --git a/air_log_targets/constant.EXECUTED_TRACE_MERGE.html b/air_log_targets/constant.EXECUTED_TRACE_MERGE.html new file mode 100644 index 00000000..82d3fedf --- /dev/null +++ b/air_log_targets/constant.EXECUTED_TRACE_MERGE.html @@ -0,0 +1,2 @@ +EXECUTED_TRACE_MERGE in air_log_targets - Rust

Constant air_log_targets::EXECUTED_TRACE_MERGE

source ·
pub const EXECUTED_TRACE_MERGE: &str = "executed_trace_merge";
Expand description

Print out logs at the executed states merging stage.

+
\ No newline at end of file diff --git a/air_log_targets/constant.INSTRUCTION.html b/air_log_targets/constant.INSTRUCTION.html new file mode 100644 index 00000000..f6ff7363 --- /dev/null +++ b/air_log_targets/constant.INSTRUCTION.html @@ -0,0 +1,2 @@ +INSTRUCTION in air_log_targets - Rust

Constant air_log_targets::INSTRUCTION

source ·
pub const INSTRUCTION: &str = "instruction";
Expand description

Print out each instruction name at the beginning of its execution_step.

+
\ No newline at end of file diff --git a/air_log_targets/constant.JOIN_BEHAVIOUR.html b/air_log_targets/constant.JOIN_BEHAVIOUR.html new file mode 100644 index 00000000..8aa7fb05 --- /dev/null +++ b/air_log_targets/constant.JOIN_BEHAVIOUR.html @@ -0,0 +1,2 @@ +JOIN_BEHAVIOUR in air_log_targets - Rust

Constant air_log_targets::JOIN_BEHAVIOUR

source ·
pub const JOIN_BEHAVIOUR: &str = "join_behaviour";
Expand description

Print log if call is postponed due the join behaviour.

+
\ No newline at end of file diff --git a/air_log_targets/constant.NEW_EXECUTED_TRACE.html b/air_log_targets/constant.NEW_EXECUTED_TRACE.html new file mode 100644 index 00000000..d528957a --- /dev/null +++ b/air_log_targets/constant.NEW_EXECUTED_TRACE.html @@ -0,0 +1,2 @@ +NEW_EXECUTED_TRACE in air_log_targets - Rust

Constant air_log_targets::NEW_EXECUTED_TRACE

source ·
pub const NEW_EXECUTED_TRACE: &str = "new_executed_trace";
Expand description

Print out state of data cache at the beginning of each instruction execution_step.

+
\ No newline at end of file diff --git a/air_log_targets/constant.NEXT_PEER_PKS.html b/air_log_targets/constant.NEXT_PEER_PKS.html new file mode 100644 index 00000000..29554a6c --- /dev/null +++ b/air_log_targets/constant.NEXT_PEER_PKS.html @@ -0,0 +1,2 @@ +NEXT_PEER_PKS in air_log_targets - Rust

Constant air_log_targets::NEXT_PEER_PKS

source ·
pub const NEXT_PEER_PKS: &str = "next_peer_pks";
Expand description

Print out next_peer_pks at the beginning of each instruction execution_step.

+
\ No newline at end of file diff --git a/air_log_targets/constant.RUN_PARAMS.html b/air_log_targets/constant.RUN_PARAMS.html new file mode 100644 index 00000000..eb2b9c07 --- /dev/null +++ b/air_log_targets/constant.RUN_PARAMS.html @@ -0,0 +1,2 @@ +RUN_PARAMS in air_log_targets - Rust

Constant air_log_targets::RUN_PARAMS

source ·
pub const RUN_PARAMS: &str = "initial_params";
Expand description

Print out running arguments and params of a script.

+
\ No newline at end of file diff --git a/air_log_targets/constant.SUBGRAPH_COMPLETE.html b/air_log_targets/constant.SUBGRAPH_COMPLETE.html new file mode 100644 index 00000000..6228d681 --- /dev/null +++ b/air_log_targets/constant.SUBGRAPH_COMPLETE.html @@ -0,0 +1,2 @@ +SUBGRAPH_COMPLETE in air_log_targets - Rust

Constant air_log_targets::SUBGRAPH_COMPLETE

source ·
pub const SUBGRAPH_COMPLETE: &str = "subgraph_complete";
Expand description

Print out subgraph_complete value at the beginning of each instruction execution_step.

+
\ No newline at end of file diff --git a/air_log_targets/constant.SUBGRAPH_ELEMENTS.html b/air_log_targets/constant.SUBGRAPH_ELEMENTS.html new file mode 100644 index 00000000..e5c86f6a --- /dev/null +++ b/air_log_targets/constant.SUBGRAPH_ELEMENTS.html @@ -0,0 +1,2 @@ +SUBGRAPH_ELEMENTS in air_log_targets - Rust

Constant air_log_targets::SUBGRAPH_ELEMENTS

source ·
pub const SUBGRAPH_ELEMENTS: &str = "subgraph_elements_count";
Expand description

Print out count of element in the current subgraph at the beginning of each instruction execution_step.

+
\ No newline at end of file diff --git a/air_log_targets/constant.TARGET_MAP.html b/air_log_targets/constant.TARGET_MAP.html new file mode 100644 index 00000000..c4b5f53f --- /dev/null +++ b/air_log_targets/constant.TARGET_MAP.html @@ -0,0 +1,2 @@ +TARGET_MAP in air_log_targets - Rust

Constant air_log_targets::TARGET_MAP

source ·
pub const TARGET_MAP: [(&str, i32); 10];
Expand description

This map should be used by rust-sdk logger that allows print only necessary targets by id.

+
\ No newline at end of file diff --git a/air_log_targets/index.html b/air_log_targets/index.html new file mode 100644 index 00000000..1a894086 --- /dev/null +++ b/air_log_targets/index.html @@ -0,0 +1 @@ +air_log_targets - Rust

Crate air_log_targets

source ·

Constants§

  • Print out data cache at the beginning of each instruction execution_step.
  • Print out state of data cache at the beginning of each instruction execution_step.
  • Print out logs at the executed states merging stage.
  • Print out each instruction name at the beginning of its execution_step.
  • Print log if call is postponed due the join behaviour.
  • Print out state of data cache at the beginning of each instruction execution_step.
  • Print out next_peer_pks at the beginning of each instruction execution_step.
  • Print out running arguments and params of a script.
  • Print out subgraph_complete value at the beginning of each instruction execution_step.
  • Print out count of element in the current subgraph at the beginning of each instruction execution_step.
  • This map should be used by rust-sdk logger that allows print only necessary targets by id.
\ No newline at end of file diff --git a/air_log_targets/sidebar-items.js b/air_log_targets/sidebar-items.js new file mode 100644 index 00000000..abad3aa5 --- /dev/null +++ b/air_log_targets/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"constant":["DATA_CACHE","EXECUTED_STATE_CHANGING","EXECUTED_TRACE_MERGE","INSTRUCTION","JOIN_BEHAVIOUR","NEW_EXECUTED_TRACE","NEXT_PEER_PKS","RUN_PARAMS","SUBGRAPH_COMPLETE","SUBGRAPH_ELEMENTS","TARGET_MAP"]}; \ No newline at end of file diff --git a/air_parser/all.html b/air_parser/all.html new file mode 100644 index 00000000..400324d2 --- /dev/null +++ b/air_parser/all.html @@ -0,0 +1 @@ +List of all items in this crate
\ No newline at end of file diff --git a/air_parser/ast/enum.ApArgument.html b/air_parser/ast/enum.ApArgument.html new file mode 100644 index 00000000..70c60aad --- /dev/null +++ b/air_parser/ast/enum.ApArgument.html @@ -0,0 +1,40 @@ +ApArgument in air_parser::ast - Rust

Enum air_parser::ast::ApArgument

source ·
pub enum ApArgument<'i> {
+
Show 15 variants InitPeerId, + Timestamp, + TTL, + Error(InstructionErrorAST<'i>), + LastError(Option<LambdaAST<'i>>), + Literal(JsonString), + Number(Number), + Boolean(bool), + EmptyArray, + Scalar(Scalar<'i>), + ScalarWithLambda(ScalarWithLambda<'i>), + CanonStream(CanonStream<'i>), + CanonStreamMap(CanonStreamMap<'i>), + CanonStreamWithLambda(CanonStreamWithLambda<'i>), + CanonStreamMapWithLambda(CanonStreamMapWithLambda<'i>), +
}

Variants§

§

InitPeerId

§

Timestamp

§

TTL

§

Error(InstructionErrorAST<'i>)

§

LastError(Option<LambdaAST<'i>>)

§

Literal(JsonString)

§

Number(Number)

§

Boolean(bool)

§

EmptyArray

§

Scalar(Scalar<'i>)

§

ScalarWithLambda(ScalarWithLambda<'i>)

§

CanonStream(CanonStream<'i>)

§

CanonStreamMap(CanonStreamMap<'i>)

§

CanonStreamWithLambda(CanonStreamWithLambda<'i>)

§

CanonStreamMapWithLambda(CanonStreamMapWithLambda<'i>)

Trait Implementations§

source§

impl<'i> Clone for ApArgument<'i>

source§

fn clone(&self) -> ApArgument<'i>

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl<'i> Debug for ApArgument<'i>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'de: 'i, 'i> Deserialize<'de> for ApArgument<'i>

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl Display for ApArgument<'_>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'i> PartialEq for ApArgument<'i>

source§

fn eq(&self, other: &ApArgument<'i>) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl<'i> Serialize for ApArgument<'i>

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl<'i> StructuralPartialEq for ApArgument<'i>

Auto Trait Implementations§

§

impl<'i> Freeze for ApArgument<'i>

§

impl<'i> RefUnwindSafe for ApArgument<'i>

§

impl<'i> !Send for ApArgument<'i>

§

impl<'i> !Sync for ApArgument<'i>

§

impl<'i> Unpin for ApArgument<'i>

§

impl<'i> UnwindSafe for ApArgument<'i>

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_parser/ast/enum.ApResult.html b/air_parser/ast/enum.ApResult.html new file mode 100644 index 00000000..cafd4603 --- /dev/null +++ b/air_parser/ast/enum.ApResult.html @@ -0,0 +1,27 @@ +ApResult in air_parser::ast - Rust

Enum air_parser::ast::ApResult

source ·
pub enum ApResult<'i> {
+    Scalar(Scalar<'i>),
+    Stream(Stream<'i>),
+}

Variants§

§

Scalar(Scalar<'i>)

§

Stream(Stream<'i>)

Implementations§

source§

impl<'i> ApResult<'i>

source

pub fn scalar(name: &'i str, position: AirPos) -> Self

source

pub fn stream(name: &'i str, position: AirPos) -> Self

source

pub fn name(&self) -> &'i str

Trait Implementations§

source§

impl<'i> Clone for ApResult<'i>

source§

fn clone(&self) -> ApResult<'i>

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl<'i> Debug for ApResult<'i>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'de: 'i, 'i> Deserialize<'de> for ApResult<'i>

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl Display for ApResult<'_>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'i> PartialEq for ApResult<'i>

source§

fn eq(&self, other: &ApResult<'i>) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl<'i> Serialize for ApResult<'i>

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl<'i> Eq for ApResult<'i>

source§

impl<'i> StructuralPartialEq for ApResult<'i>

Auto Trait Implementations§

§

impl<'i> Freeze for ApResult<'i>

§

impl<'i> RefUnwindSafe for ApResult<'i>

§

impl<'i> Send for ApResult<'i>

§

impl<'i> Sync for ApResult<'i>

§

impl<'i> Unpin for ApResult<'i>

§

impl<'i> UnwindSafe for ApResult<'i>

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_parser/ast/enum.CallOutputValue.html b/air_parser/ast/enum.CallOutputValue.html new file mode 100644 index 00000000..583cb04a --- /dev/null +++ b/air_parser/ast/enum.CallOutputValue.html @@ -0,0 +1,26 @@ +CallOutputValue in air_parser::ast - Rust

Enum air_parser::ast::CallOutputValue

source ·
pub enum CallOutputValue<'i> {
+    Scalar(Scalar<'i>),
+    Stream(Stream<'i>),
+    None,
+}

Variants§

§

Scalar(Scalar<'i>)

§

Stream(Stream<'i>)

§

None

Implementations§

source§

impl<'i> CallOutputValue<'i>

source

pub fn scalar(name: &'i str, position: AirPos) -> Self

source

pub fn stream(name: &'i str, position: AirPos) -> Self

Trait Implementations§

source§

impl<'i> Clone for CallOutputValue<'i>

source§

fn clone(&self) -> CallOutputValue<'i>

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl<'i> Debug for CallOutputValue<'i>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Display for CallOutputValue<'_>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'i> PartialEq for CallOutputValue<'i>

source§

fn eq(&self, other: &CallOutputValue<'i>) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl<'i> Serialize for CallOutputValue<'i>

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl<'i> Eq for CallOutputValue<'i>

source§

impl<'i> StructuralPartialEq for CallOutputValue<'i>

Auto Trait Implementations§

§

impl<'i> Freeze for CallOutputValue<'i>

§

impl<'i> RefUnwindSafe for CallOutputValue<'i>

§

impl<'i> Send for CallOutputValue<'i>

§

impl<'i> Sync for CallOutputValue<'i>

§

impl<'i> Unpin for CallOutputValue<'i>

§

impl<'i> UnwindSafe for CallOutputValue<'i>

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_parser/ast/enum.Fail.html b/air_parser/ast/enum.Fail.html new file mode 100644 index 00000000..cdd3e2a3 --- /dev/null +++ b/air_parser/ast/enum.Fail.html @@ -0,0 +1,33 @@ +Fail in air_parser::ast - Rust

Enum air_parser::ast::Fail

source ·
pub enum Fail<'i> {
+    Scalar(Scalar<'i>),
+    ScalarWithLambda(ScalarWithLambda<'i>),
+    Literal {
+        ret_code: i64,
+        error_message: &'i str,
+    },
+    CanonStreamWithLambda(CanonStreamWithLambda<'i>),
+    LastError,
+    Error,
+}
Expand description

(fail 1337 “error message”) +(fail %last_error%) +(fail value)

+

Variants§

§

Scalar(Scalar<'i>)

§

ScalarWithLambda(ScalarWithLambda<'i>)

§

Literal

Fields

§ret_code: i64
§error_message: &'i str
§

CanonStreamWithLambda(CanonStreamWithLambda<'i>)

§

LastError

§

Error

Trait Implementations§

source§

impl<'i> Debug for Fail<'i>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Display for Fail<'_>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'i> PartialEq for Fail<'i>

source§

fn eq(&self, other: &Fail<'i>) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl PeerIDErrorLogable for Fail<'_>

source§

impl<'i> Serialize for Fail<'i>

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl<'i> Eq for Fail<'i>

source§

impl<'i> StructuralPartialEq for Fail<'i>

Auto Trait Implementations§

§

impl<'i> Freeze for Fail<'i>

§

impl<'i> RefUnwindSafe for Fail<'i>

§

impl<'i> Send for Fail<'i>

§

impl<'i> Sync for Fail<'i>

§

impl<'i> Unpin for Fail<'i>

§

impl<'i> UnwindSafe for Fail<'i>

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_parser/ast/enum.FoldScalarIterable.html b/air_parser/ast/enum.FoldScalarIterable.html new file mode 100644 index 00000000..44ffd79f --- /dev/null +++ b/air_parser/ast/enum.FoldScalarIterable.html @@ -0,0 +1,31 @@ +FoldScalarIterable in air_parser::ast - Rust

Enum air_parser::ast::FoldScalarIterable

source ·
pub enum FoldScalarIterable<'i> {
+    Scalar(Scalar<'i>),
+    ScalarWithLambda(ScalarWithLambda<'i>),
+    CanonStream(CanonStream<'i>),
+    CanonStreamMap(CanonStreamMap<'i>),
+    CanonStreamMapWithLambda(CanonStreamMapWithLambda<'i>),
+    EmptyArray,
+}

Variants§

§

Scalar(Scalar<'i>)

§

ScalarWithLambda(ScalarWithLambda<'i>)

§

CanonStream(CanonStream<'i>)

§

CanonStreamMap(CanonStreamMap<'i>)

§

CanonStreamMapWithLambda(CanonStreamMapWithLambda<'i>)

§

EmptyArray

Trait Implementations§

source§

impl<'i> Clone for FoldScalarIterable<'i>

source§

fn clone(&self) -> FoldScalarIterable<'i>

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl<'i> Debug for FoldScalarIterable<'i>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'de: 'i, 'i> Deserialize<'de> for FoldScalarIterable<'i>

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl Display for FoldScalarIterable<'_>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'i> PartialEq for FoldScalarIterable<'i>

source§

fn eq(&self, other: &FoldScalarIterable<'i>) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl<'i> Serialize for FoldScalarIterable<'i>

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl<'i> Eq for FoldScalarIterable<'i>

source§

impl<'i> StructuralPartialEq for FoldScalarIterable<'i>

Auto Trait Implementations§

§

impl<'i> Freeze for FoldScalarIterable<'i>

§

impl<'i> RefUnwindSafe for FoldScalarIterable<'i>

§

impl<'i> Send for FoldScalarIterable<'i>

§

impl<'i> Sync for FoldScalarIterable<'i>

§

impl<'i> Unpin for FoldScalarIterable<'i>

§

impl<'i> UnwindSafe for FoldScalarIterable<'i>

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_parser/ast/enum.ImmutableValue.html b/air_parser/ast/enum.ImmutableValue.html new file mode 100644 index 00000000..c78d7d99 --- /dev/null +++ b/air_parser/ast/enum.ImmutableValue.html @@ -0,0 +1,37 @@ +ImmutableValue in air_parser::ast - Rust

Enum air_parser::ast::ImmutableValue

source ·
pub enum ImmutableValue<'i> {
+    InitPeerId,
+    Error(InstructionErrorAST<'i>),
+    LastError(Option<LambdaAST<'i>>),
+    Timestamp,
+    TTL,
+    Literal(JsonString),
+    Number(Number),
+    Boolean(bool),
+    EmptyArray,
+    Variable(ImmutableVariable<'i>),
+    VariableWithLambda(ImmutableVariableWithLambda<'i>),
+}
Expand description

Represents all immutable values that is possible to set in AIR scripts.

+

Variants§

§

InitPeerId

§

Error(InstructionErrorAST<'i>)

§

LastError(Option<LambdaAST<'i>>)

§

Timestamp

§

TTL

§

Literal(JsonString)

§

Number(Number)

§

Boolean(bool)

§

EmptyArray

§

Variable(ImmutableVariable<'i>)

§

VariableWithLambda(ImmutableVariableWithLambda<'i>)

Trait Implementations§

source§

impl<'i> Clone for ImmutableValue<'i>

source§

fn clone(&self) -> ImmutableValue<'i>

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl<'i> Debug for ImmutableValue<'i>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'de: 'i, 'i> Deserialize<'de> for ImmutableValue<'i>

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl Display for ImmutableValue<'_>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'i> PartialEq for ImmutableValue<'i>

source§

fn eq(&self, other: &ImmutableValue<'i>) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl<'i> Serialize for ImmutableValue<'i>

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl<'i> StructuralPartialEq for ImmutableValue<'i>

Auto Trait Implementations§

§

impl<'i> Freeze for ImmutableValue<'i>

§

impl<'i> RefUnwindSafe for ImmutableValue<'i>

§

impl<'i> !Send for ImmutableValue<'i>

§

impl<'i> !Sync for ImmutableValue<'i>

§

impl<'i> Unpin for ImmutableValue<'i>

§

impl<'i> UnwindSafe for ImmutableValue<'i>

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_parser/ast/enum.ImmutableVariable.html b/air_parser/ast/enum.ImmutableVariable.html new file mode 100644 index 00000000..42605b0f --- /dev/null +++ b/air_parser/ast/enum.ImmutableVariable.html @@ -0,0 +1,29 @@ +ImmutableVariable in air_parser::ast - Rust

Enum air_parser::ast::ImmutableVariable

source ·
pub enum ImmutableVariable<'i> {
+    Scalar(Scalar<'i>),
+    CanonStream(CanonStream<'i>),
+    CanonStreamMap(CanonStreamMap<'i>),
+}
Expand description

A variable that could be either scalar or stream without lambda.

+

Variants§

§

Scalar(Scalar<'i>)

§

CanonStream(CanonStream<'i>)

§

CanonStreamMap(CanonStreamMap<'i>)

Implementations§

source§

impl<'i> ImmutableVariable<'i>

source

pub fn scalar(name: &'i str, position: AirPos) -> Self

source

pub fn canon_stream(name: &'i str, position: AirPos) -> Self

source

pub fn canon_stream_map(name: &'i str, position: AirPos) -> Self

source

pub fn name(&self) -> &'i str

Trait Implementations§

source§

impl<'i> Clone for ImmutableVariable<'i>

source§

fn clone(&self) -> ImmutableVariable<'i>

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl<'i> Debug for ImmutableVariable<'i>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'de: 'i, 'i> Deserialize<'de> for ImmutableVariable<'i>

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl Display for ImmutableVariable<'_>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'i> PartialEq for ImmutableVariable<'i>

source§

fn eq(&self, other: &ImmutableVariable<'i>) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl<'i> Serialize for ImmutableVariable<'i>

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl<'i> Eq for ImmutableVariable<'i>

source§

impl<'i> StructuralPartialEq for ImmutableVariable<'i>

Auto Trait Implementations§

§

impl<'i> Freeze for ImmutableVariable<'i>

§

impl<'i> RefUnwindSafe for ImmutableVariable<'i>

§

impl<'i> Send for ImmutableVariable<'i>

§

impl<'i> Sync for ImmutableVariable<'i>

§

impl<'i> Unpin for ImmutableVariable<'i>

§

impl<'i> UnwindSafe for ImmutableVariable<'i>

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_parser/ast/enum.ImmutableVariableWithLambda.html b/air_parser/ast/enum.ImmutableVariableWithLambda.html new file mode 100644 index 00000000..92649c5b --- /dev/null +++ b/air_parser/ast/enum.ImmutableVariableWithLambda.html @@ -0,0 +1,37 @@ +ImmutableVariableWithLambda in air_parser::ast - Rust

Enum air_parser::ast::ImmutableVariableWithLambda

source ·
pub enum ImmutableVariableWithLambda<'i> {
+    Scalar(ScalarWithLambda<'i>),
+    CanonStream(CanonStreamWithLambda<'i>),
+    CanonStreamMap(CanonStreamMapWithLambda<'i>),
+}
Expand description

A variable that could be either scalar or stream with possible lambda expression.

+

Variants§

§

Scalar(ScalarWithLambda<'i>)

§

CanonStream(CanonStreamWithLambda<'i>)

§

CanonStreamMap(CanonStreamMapWithLambda<'i>)

Implementations§

source§

impl<'i> ImmutableVariableWithLambda<'i>

source

pub fn scalar(name: &'i str, lambda: LambdaAST<'i>, position: AirPos) -> Self

source

pub fn canon_stream( + name: &'i str, + lambda: LambdaAST<'i>, + position: AirPos, +) -> Self

source

pub fn canon_stream_map( + name: &'i str, + lambda: LambdaAST<'i>, + position: AirPos, +) -> Self

source

pub fn name(&self) -> &'i str

source

pub fn lambda(&self) -> &LambdaAST<'i>

Trait Implementations§

source§

impl<'i> Clone for ImmutableVariableWithLambda<'i>

source§

fn clone(&self) -> ImmutableVariableWithLambda<'i>

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl<'i> Debug for ImmutableVariableWithLambda<'i>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'de: 'i, 'i> Deserialize<'de> for ImmutableVariableWithLambda<'i>

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl Display for ImmutableVariableWithLambda<'_>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'i> PartialEq for ImmutableVariableWithLambda<'i>

source§

fn eq(&self, other: &ImmutableVariableWithLambda<'i>) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl<'i> Serialize for ImmutableVariableWithLambda<'i>

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl<'i> Eq for ImmutableVariableWithLambda<'i>

source§

impl<'i> StructuralPartialEq for ImmutableVariableWithLambda<'i>

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_parser/ast/enum.Instruction.html b/air_parser/ast/enum.Instruction.html new file mode 100644 index 00000000..f12f2183 --- /dev/null +++ b/air_parser/ast/enum.Instruction.html @@ -0,0 +1,41 @@ +Instruction in air_parser::ast - Rust

Enum air_parser::ast::Instruction

source ·
pub enum Instruction<'i> {
+
Show 20 variants Call(Box<Call<'i>>), + Ap(Box<Ap<'i>>), + ApMap(Box<ApMap<'i>>), + Canon(Box<Canon<'i>>), + CanonMap(Box<CanonMap<'i>>), + CanonStreamMapScalar(Box<CanonStreamMapScalar<'i>>), + Seq(Box<Seq<'i>>), + Par(Box<Par<'i>>), + Xor(Box<Xor<'i>>), + Match(Box<Match<'i>>), + MisMatch(Box<MisMatch<'i>>), + Fail(Box<Fail<'i>>), + FoldScalar(Box<FoldScalar<'i>>), + FoldStream(Box<FoldStream<'i>>), + FoldStreamMap(Box<FoldStreamMap<'i>>), + Never(Never), + New(Box<New<'i>>), + Next(Box<Next<'i>>), + Null(Null), + Error, +
}

Variants§

§

Call(Box<Call<'i>>)

§

Ap(Box<Ap<'i>>)

§

ApMap(Box<ApMap<'i>>)

§

Canon(Box<Canon<'i>>)

§

CanonMap(Box<CanonMap<'i>>)

§

CanonStreamMapScalar(Box<CanonStreamMapScalar<'i>>)

§

Seq(Box<Seq<'i>>)

§

Par(Box<Par<'i>>)

§

Xor(Box<Xor<'i>>)

§

Match(Box<Match<'i>>)

§

MisMatch(Box<MisMatch<'i>>)

§

Fail(Box<Fail<'i>>)

§

FoldScalar(Box<FoldScalar<'i>>)

§

FoldStream(Box<FoldStream<'i>>)

§

FoldStreamMap(Box<FoldStreamMap<'i>>)

§

Never(Never)

§

New(Box<New<'i>>)

§

Next(Box<Next<'i>>)

§

Null(Null)

§

Error

Trait Implementations§

source§

impl<'i> Debug for Instruction<'i>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Display for Instruction<'_>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'i> PartialEq for Instruction<'i>

source§

fn eq(&self, other: &Instruction<'i>) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl<'i> Serialize for Instruction<'i>

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl<'i> StructuralPartialEq for Instruction<'i>

Auto Trait Implementations§

§

impl<'i> Freeze for Instruction<'i>

§

impl<'i> RefUnwindSafe for Instruction<'i>

§

impl<'i> !Send for Instruction<'i>

§

impl<'i> !Sync for Instruction<'i>

§

impl<'i> Unpin for Instruction<'i>

§

impl<'i> UnwindSafe for Instruction<'i>

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_parser/ast/enum.NewArgument.html b/air_parser/ast/enum.NewArgument.html new file mode 100644 index 00000000..391b1371 --- /dev/null +++ b/air_parser/ast/enum.NewArgument.html @@ -0,0 +1,30 @@ +NewArgument in air_parser::ast - Rust

Enum air_parser::ast::NewArgument

source ·
pub enum NewArgument<'i> {
+    Scalar(Scalar<'i>),
+    Stream(Stream<'i>),
+    StreamMap(StreamMap<'i>),
+    CanonStream(CanonStream<'i>),
+    CanonStreamMap(CanonStreamMap<'i>),
+}

Variants§

§

Scalar(Scalar<'i>)

§

Stream(Stream<'i>)

§

StreamMap(StreamMap<'i>)

§

CanonStream(CanonStream<'i>)

§

CanonStreamMap(CanonStreamMap<'i>)

Implementations§

source§

impl<'i> NewArgument<'i>

source

pub fn name(&self) -> &'i str

Trait Implementations§

source§

impl<'i> Clone for NewArgument<'i>

source§

fn clone(&self) -> NewArgument<'i>

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl<'i> Debug for NewArgument<'i>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'de: 'i, 'i> Deserialize<'de> for NewArgument<'i>

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl Display for NewArgument<'_>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'i> PartialEq for NewArgument<'i>

source§

fn eq(&self, other: &NewArgument<'i>) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl<'i> Serialize for NewArgument<'i>

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl<'i> Eq for NewArgument<'i>

source§

impl<'i> StructuralPartialEq for NewArgument<'i>

Auto Trait Implementations§

§

impl<'i> Freeze for NewArgument<'i>

§

impl<'i> RefUnwindSafe for NewArgument<'i>

§

impl<'i> Send for NewArgument<'i>

§

impl<'i> Sync for NewArgument<'i>

§

impl<'i> Unpin for NewArgument<'i>

§

impl<'i> UnwindSafe for NewArgument<'i>

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_parser/ast/enum.Number.html b/air_parser/ast/enum.Number.html new file mode 100644 index 00000000..60edf838 --- /dev/null +++ b/air_parser/ast/enum.Number.html @@ -0,0 +1,27 @@ +Number in air_parser::ast - Rust

Enum air_parser::ast::Number

source ·
pub enum Number {
+    Int(i64),
+    Float(f64),
+}

Variants§

§

Int(i64)

§

Float(f64)

Trait Implementations§

source§

impl Clone for Number

source§

fn clone(&self) -> Number

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for Number

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'de> Deserialize<'de> for Number

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl Display for Number

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl From<&Number> for JValue

source§

fn from(number: &Number) -> Self

Converts to this type from the input type.
source§

impl From<&Number> for Value

source§

fn from(number: &Number) -> Self

Converts to this type from the input type.
source§

impl From<Number> for Value

source§

fn from(number: Number) -> Self

Converts to this type from the input type.
source§

impl PartialEq for Number

source§

fn eq(&self, other: &Number) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl Serialize for Number

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl StructuralPartialEq for Number

Auto Trait Implementations§

§

impl Freeze for Number

§

impl RefUnwindSafe for Number

§

impl Send for Number

§

impl Sync for Number

§

impl Unpin for Number

§

impl UnwindSafe for Number

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_parser/ast/enum.ResolvableToPeerIdVariable.html b/air_parser/ast/enum.ResolvableToPeerIdVariable.html new file mode 100644 index 00000000..353dad7b --- /dev/null +++ b/air_parser/ast/enum.ResolvableToPeerIdVariable.html @@ -0,0 +1,32 @@ +ResolvableToPeerIdVariable in air_parser::ast - Rust

Enum air_parser::ast::ResolvableToPeerIdVariable

source ·
pub enum ResolvableToPeerIdVariable<'i> {
+    InitPeerId,
+    Literal(&'i str),
+    Scalar(Scalar<'i>),
+    ScalarWithLambda(ScalarWithLambda<'i>),
+    CanonStreamWithLambda(CanonStreamWithLambda<'i>),
+    CanonStreamMapWithLambda(CanonStreamMapWithLambda<'i>),
+}
Expand description

Contains all variable variants that could be resolved to a peer id.

+

Variants§

§

InitPeerId

§

Literal(&'i str)

§

Scalar(Scalar<'i>)

§

ScalarWithLambda(ScalarWithLambda<'i>)

§

CanonStreamWithLambda(CanonStreamWithLambda<'i>)

§

CanonStreamMapWithLambda(CanonStreamMapWithLambda<'i>)

Trait Implementations§

source§

impl<'i> Clone for ResolvableToPeerIdVariable<'i>

source§

fn clone(&self) -> ResolvableToPeerIdVariable<'i>

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl<'i> Debug for ResolvableToPeerIdVariable<'i>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'de: 'i, 'i> Deserialize<'de> for ResolvableToPeerIdVariable<'i>

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl Display for ResolvableToPeerIdVariable<'_>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'i> PartialEq for ResolvableToPeerIdVariable<'i>

source§

fn eq(&self, other: &ResolvableToPeerIdVariable<'i>) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl<'i> Serialize for ResolvableToPeerIdVariable<'i>

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl<'i> Eq for ResolvableToPeerIdVariable<'i>

source§

impl<'i> StructuralPartialEq for ResolvableToPeerIdVariable<'i>

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_parser/ast/enum.ResolvableToStringVariable.html b/air_parser/ast/enum.ResolvableToStringVariable.html new file mode 100644 index 00000000..7f228cd2 --- /dev/null +++ b/air_parser/ast/enum.ResolvableToStringVariable.html @@ -0,0 +1,31 @@ +ResolvableToStringVariable in air_parser::ast - Rust

Enum air_parser::ast::ResolvableToStringVariable

source ·
pub enum ResolvableToStringVariable<'i> {
+    Literal(&'i str),
+    Scalar(Scalar<'i>),
+    ScalarWithLambda(ScalarWithLambda<'i>),
+    CanonStreamWithLambda(CanonStreamWithLambda<'i>),
+    CanonStreamMapWithLambda(CanonStreamMapWithLambda<'i>),
+}
Expand description

Contains all variable variants that could be resolved to a string type.

+

Variants§

§

Literal(&'i str)

§

Scalar(Scalar<'i>)

§

ScalarWithLambda(ScalarWithLambda<'i>)

§

CanonStreamWithLambda(CanonStreamWithLambda<'i>)

§

CanonStreamMapWithLambda(CanonStreamMapWithLambda<'i>)

Trait Implementations§

source§

impl<'i> Clone for ResolvableToStringVariable<'i>

source§

fn clone(&self) -> ResolvableToStringVariable<'i>

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl<'i> Debug for ResolvableToStringVariable<'i>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'de: 'i, 'i> Deserialize<'de> for ResolvableToStringVariable<'i>

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl Display for ResolvableToStringVariable<'_>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'i> PartialEq for ResolvableToStringVariable<'i>

source§

fn eq(&self, other: &ResolvableToStringVariable<'i>) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl<'i> Serialize for ResolvableToStringVariable<'i>

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl<'i> Eq for ResolvableToStringVariable<'i>

source§

impl<'i> StructuralPartialEq for ResolvableToStringVariable<'i>

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_parser/ast/enum.StreamMapKeyClause.html b/air_parser/ast/enum.StreamMapKeyClause.html new file mode 100644 index 00000000..e74a6d1e --- /dev/null +++ b/air_parser/ast/enum.StreamMapKeyClause.html @@ -0,0 +1,30 @@ +StreamMapKeyClause in air_parser::ast - Rust

Enum air_parser::ast::StreamMapKeyClause

source ·
pub enum StreamMapKeyClause<'i> {
+    Literal(JsonString),
+    Int(i64),
+    Scalar(Scalar<'i>),
+    ScalarWithLambda(ScalarWithLambda<'i>),
+    CanonStreamWithLambda(CanonStreamWithLambda<'i>),
+}

Variants§

§

Literal(JsonString)

§

Int(i64)

§

Scalar(Scalar<'i>)

§

ScalarWithLambda(ScalarWithLambda<'i>)

§

CanonStreamWithLambda(CanonStreamWithLambda<'i>)

Trait Implementations§

source§

impl<'i> Clone for StreamMapKeyClause<'i>

source§

fn clone(&self) -> StreamMapKeyClause<'i>

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl<'i> Debug for StreamMapKeyClause<'i>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'de: 'i, 'i> Deserialize<'de> for StreamMapKeyClause<'i>

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl Display for StreamMapKeyClause<'_>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'i> PartialEq for StreamMapKeyClause<'i>

source§

fn eq(&self, other: &StreamMapKeyClause<'i>) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl<'i> Serialize for StreamMapKeyClause<'i>

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl<'i> StructuralPartialEq for StreamMapKeyClause<'i>

Auto Trait Implementations§

§

impl<'i> Freeze for StreamMapKeyClause<'i>

§

impl<'i> RefUnwindSafe for StreamMapKeyClause<'i>

§

impl<'i> !Send for StreamMapKeyClause<'i>

§

impl<'i> !Sync for StreamMapKeyClause<'i>

§

impl<'i> Unpin for StreamMapKeyClause<'i>

§

impl<'i> UnwindSafe for StreamMapKeyClause<'i>

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_parser/ast/index.html b/air_parser/ast/index.html new file mode 100644 index 00000000..a32aa3c2 --- /dev/null +++ b/air_parser/ast/index.html @@ -0,0 +1,4 @@ +air_parser::ast - Rust

Module air_parser::ast

source ·

Structs§

  • (ap argument result)
  • (ap key value %map)
  • (call (peer part of a triplet: PeerPart) (function part of a triplet: FunctionPart) [arguments] output)
  • (canon peer_id $stream #canon_stream)
  • (canon peer_id %stream_map #%canon_stream_map)
  • A canonicalized stream without a lambda.
  • A canonicalized stream map without a lambda.
  • (canon peer_id %stream_map scalar)
  • A canonicalized stream map with a lambda.
  • A canonicalized stream with a lambda.
  • (fold scalar_iterable iterator instruction)
  • (fold stream_iterable iterator instruction)
  • (fold stream_map_iterable iterator instruction)
  • An error wrapper with an optional lens.
  • (match left_value right_value instruction)
  • (mismatch left_value right_value instruction)
  • (never)
  • (new variable instruction)
  • (fold stream_iterable iterator instruction)
  • (null)
  • (par instruction instruction)
  • A scalar value without a lambda.
  • A scalar value with a lambda expression.
  • (seq instruction instruction)
  • A stream without a lambda.
  • A map based on top of a stream.
  • Triplet represents a location of the executable code in the network. +It is build from PeerPart and FunctionPart of a Call instruction.
  • (xor instruction instruction)

Enums§

Traits§

\ No newline at end of file diff --git a/air_parser/ast/instruction_arguments/enum.ApArgument.html b/air_parser/ast/instruction_arguments/enum.ApArgument.html new file mode 100644 index 00000000..1f19ed4d --- /dev/null +++ b/air_parser/ast/instruction_arguments/enum.ApArgument.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../air_parser/ast/enum.ApArgument.html...

+ + + \ No newline at end of file diff --git a/air_parser/ast/instruction_arguments/enum.ApResult.html b/air_parser/ast/instruction_arguments/enum.ApResult.html new file mode 100644 index 00000000..64571ef8 --- /dev/null +++ b/air_parser/ast/instruction_arguments/enum.ApResult.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../air_parser/ast/enum.ApResult.html...

+ + + \ No newline at end of file diff --git a/air_parser/ast/instruction_arguments/enum.CallOutputValue.html b/air_parser/ast/instruction_arguments/enum.CallOutputValue.html new file mode 100644 index 00000000..e99e7415 --- /dev/null +++ b/air_parser/ast/instruction_arguments/enum.CallOutputValue.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../air_parser/ast/enum.CallOutputValue.html...

+ + + \ No newline at end of file diff --git a/air_parser/ast/instruction_arguments/enum.FoldScalarIterable.html b/air_parser/ast/instruction_arguments/enum.FoldScalarIterable.html new file mode 100644 index 00000000..f2f7e382 --- /dev/null +++ b/air_parser/ast/instruction_arguments/enum.FoldScalarIterable.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../air_parser/ast/enum.FoldScalarIterable.html...

+ + + \ No newline at end of file diff --git a/air_parser/ast/instruction_arguments/enum.ImmutableValue.html b/air_parser/ast/instruction_arguments/enum.ImmutableValue.html new file mode 100644 index 00000000..583b76db --- /dev/null +++ b/air_parser/ast/instruction_arguments/enum.ImmutableValue.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../air_parser/ast/enum.ImmutableValue.html...

+ + + \ No newline at end of file diff --git a/air_parser/ast/instruction_arguments/enum.NewArgument.html b/air_parser/ast/instruction_arguments/enum.NewArgument.html new file mode 100644 index 00000000..b2c967fa --- /dev/null +++ b/air_parser/ast/instruction_arguments/enum.NewArgument.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../air_parser/ast/enum.NewArgument.html...

+ + + \ No newline at end of file diff --git a/air_parser/ast/instruction_arguments/enum.Number.html b/air_parser/ast/instruction_arguments/enum.Number.html new file mode 100644 index 00000000..9ea83bee --- /dev/null +++ b/air_parser/ast/instruction_arguments/enum.Number.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../air_parser/ast/enum.Number.html...

+ + + \ No newline at end of file diff --git a/air_parser/ast/instruction_arguments/enum.ResolvableToPeerIdVariable.html b/air_parser/ast/instruction_arguments/enum.ResolvableToPeerIdVariable.html new file mode 100644 index 00000000..8063ee70 --- /dev/null +++ b/air_parser/ast/instruction_arguments/enum.ResolvableToPeerIdVariable.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../air_parser/ast/enum.ResolvableToPeerIdVariable.html...

+ + + \ No newline at end of file diff --git a/air_parser/ast/instruction_arguments/enum.ResolvableToStringVariable.html b/air_parser/ast/instruction_arguments/enum.ResolvableToStringVariable.html new file mode 100644 index 00000000..c18c7cb0 --- /dev/null +++ b/air_parser/ast/instruction_arguments/enum.ResolvableToStringVariable.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../air_parser/ast/enum.ResolvableToStringVariable.html...

+ + + \ No newline at end of file diff --git a/air_parser/ast/instruction_arguments/enum.StreamMapKeyClause.html b/air_parser/ast/instruction_arguments/enum.StreamMapKeyClause.html new file mode 100644 index 00000000..9ea0e028 --- /dev/null +++ b/air_parser/ast/instruction_arguments/enum.StreamMapKeyClause.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../air_parser/ast/enum.StreamMapKeyClause.html...

+ + + \ No newline at end of file diff --git a/air_parser/ast/instruction_arguments/struct.Triplet.html b/air_parser/ast/instruction_arguments/struct.Triplet.html new file mode 100644 index 00000000..10c7b201 --- /dev/null +++ b/air_parser/ast/instruction_arguments/struct.Triplet.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../air_parser/ast/struct.Triplet.html...

+ + + \ No newline at end of file diff --git a/air_parser/ast/instructions/enum.Fail.html b/air_parser/ast/instructions/enum.Fail.html new file mode 100644 index 00000000..6daced3d --- /dev/null +++ b/air_parser/ast/instructions/enum.Fail.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../air_parser/ast/enum.Fail.html...

+ + + \ No newline at end of file diff --git a/air_parser/ast/instructions/enum.Instruction.html b/air_parser/ast/instructions/enum.Instruction.html new file mode 100644 index 00000000..f84fdf1f --- /dev/null +++ b/air_parser/ast/instructions/enum.Instruction.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../air_parser/ast/enum.Instruction.html...

+ + + \ No newline at end of file diff --git a/air_parser/ast/instructions/struct.Ap.html b/air_parser/ast/instructions/struct.Ap.html new file mode 100644 index 00000000..45fc759e --- /dev/null +++ b/air_parser/ast/instructions/struct.Ap.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../air_parser/ast/struct.Ap.html...

+ + + \ No newline at end of file diff --git a/air_parser/ast/instructions/struct.ApMap.html b/air_parser/ast/instructions/struct.ApMap.html new file mode 100644 index 00000000..d86d99ef --- /dev/null +++ b/air_parser/ast/instructions/struct.ApMap.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../air_parser/ast/struct.ApMap.html...

+ + + \ No newline at end of file diff --git a/air_parser/ast/instructions/struct.Call.html b/air_parser/ast/instructions/struct.Call.html new file mode 100644 index 00000000..abac4492 --- /dev/null +++ b/air_parser/ast/instructions/struct.Call.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../air_parser/ast/struct.Call.html...

+ + + \ No newline at end of file diff --git a/air_parser/ast/instructions/struct.Canon.html b/air_parser/ast/instructions/struct.Canon.html new file mode 100644 index 00000000..2e8df60d --- /dev/null +++ b/air_parser/ast/instructions/struct.Canon.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../air_parser/ast/struct.Canon.html...

+ + + \ No newline at end of file diff --git a/air_parser/ast/instructions/struct.CanonMap.html b/air_parser/ast/instructions/struct.CanonMap.html new file mode 100644 index 00000000..02454d67 --- /dev/null +++ b/air_parser/ast/instructions/struct.CanonMap.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../air_parser/ast/struct.CanonMap.html...

+ + + \ No newline at end of file diff --git a/air_parser/ast/instructions/struct.CanonStreamMapScalar.html b/air_parser/ast/instructions/struct.CanonStreamMapScalar.html new file mode 100644 index 00000000..97de650d --- /dev/null +++ b/air_parser/ast/instructions/struct.CanonStreamMapScalar.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../air_parser/ast/struct.CanonStreamMapScalar.html...

+ + + \ No newline at end of file diff --git a/air_parser/ast/instructions/struct.FoldScalar.html b/air_parser/ast/instructions/struct.FoldScalar.html new file mode 100644 index 00000000..38186fb9 --- /dev/null +++ b/air_parser/ast/instructions/struct.FoldScalar.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../air_parser/ast/struct.FoldScalar.html...

+ + + \ No newline at end of file diff --git a/air_parser/ast/instructions/struct.FoldStream.html b/air_parser/ast/instructions/struct.FoldStream.html new file mode 100644 index 00000000..8c5b06ba --- /dev/null +++ b/air_parser/ast/instructions/struct.FoldStream.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../air_parser/ast/struct.FoldStream.html...

+ + + \ No newline at end of file diff --git a/air_parser/ast/instructions/struct.FoldStreamMap.html b/air_parser/ast/instructions/struct.FoldStreamMap.html new file mode 100644 index 00000000..5e7c9722 --- /dev/null +++ b/air_parser/ast/instructions/struct.FoldStreamMap.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../air_parser/ast/struct.FoldStreamMap.html...

+ + + \ No newline at end of file diff --git a/air_parser/ast/instructions/struct.Match.html b/air_parser/ast/instructions/struct.Match.html new file mode 100644 index 00000000..ab442d11 --- /dev/null +++ b/air_parser/ast/instructions/struct.Match.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../air_parser/ast/struct.Match.html...

+ + + \ No newline at end of file diff --git a/air_parser/ast/instructions/struct.MisMatch.html b/air_parser/ast/instructions/struct.MisMatch.html new file mode 100644 index 00000000..be73b63c --- /dev/null +++ b/air_parser/ast/instructions/struct.MisMatch.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../air_parser/ast/struct.MisMatch.html...

+ + + \ No newline at end of file diff --git a/air_parser/ast/instructions/struct.Never.html b/air_parser/ast/instructions/struct.Never.html new file mode 100644 index 00000000..cfc18dce --- /dev/null +++ b/air_parser/ast/instructions/struct.Never.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../air_parser/ast/struct.Never.html...

+ + + \ No newline at end of file diff --git a/air_parser/ast/instructions/struct.New.html b/air_parser/ast/instructions/struct.New.html new file mode 100644 index 00000000..8a733a5b --- /dev/null +++ b/air_parser/ast/instructions/struct.New.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../air_parser/ast/struct.New.html...

+ + + \ No newline at end of file diff --git a/air_parser/ast/instructions/struct.Next.html b/air_parser/ast/instructions/struct.Next.html new file mode 100644 index 00000000..7ee4d61c --- /dev/null +++ b/air_parser/ast/instructions/struct.Next.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../air_parser/ast/struct.Next.html...

+ + + \ No newline at end of file diff --git a/air_parser/ast/instructions/struct.Null.html b/air_parser/ast/instructions/struct.Null.html new file mode 100644 index 00000000..4682afe5 --- /dev/null +++ b/air_parser/ast/instructions/struct.Null.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../air_parser/ast/struct.Null.html...

+ + + \ No newline at end of file diff --git a/air_parser/ast/instructions/struct.Par.html b/air_parser/ast/instructions/struct.Par.html new file mode 100644 index 00000000..3fa6f3d9 --- /dev/null +++ b/air_parser/ast/instructions/struct.Par.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../air_parser/ast/struct.Par.html...

+ + + \ No newline at end of file diff --git a/air_parser/ast/instructions/struct.Seq.html b/air_parser/ast/instructions/struct.Seq.html new file mode 100644 index 00000000..74ae426f --- /dev/null +++ b/air_parser/ast/instructions/struct.Seq.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../air_parser/ast/struct.Seq.html...

+ + + \ No newline at end of file diff --git a/air_parser/ast/instructions/struct.Xor.html b/air_parser/ast/instructions/struct.Xor.html new file mode 100644 index 00000000..659afb43 --- /dev/null +++ b/air_parser/ast/instructions/struct.Xor.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../air_parser/ast/struct.Xor.html...

+ + + \ No newline at end of file diff --git a/air_parser/ast/instructions/trait.PeerIDErrorLogable.html b/air_parser/ast/instructions/trait.PeerIDErrorLogable.html new file mode 100644 index 00000000..f1fb08b2 --- /dev/null +++ b/air_parser/ast/instructions/trait.PeerIDErrorLogable.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../air_parser/ast/trait.PeerIDErrorLogable.html...

+ + + \ No newline at end of file diff --git a/air_parser/ast/sidebar-items.js b/air_parser/ast/sidebar-items.js new file mode 100644 index 00000000..5f6ccb4b --- /dev/null +++ b/air_parser/ast/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"enum":["ApArgument","ApResult","CallOutputValue","Fail","FoldScalarIterable","ImmutableValue","ImmutableVariable","ImmutableVariableWithLambda","Instruction","NewArgument","Number","ResolvableToPeerIdVariable","ResolvableToStringVariable","StreamMapKeyClause"],"struct":["Ap","ApMap","Call","Canon","CanonMap","CanonStream","CanonStreamMap","CanonStreamMapScalar","CanonStreamMapWithLambda","CanonStreamWithLambda","FoldScalar","FoldStream","FoldStreamMap","InstructionErrorAST","Match","MisMatch","Never","New","Next","Null","Par","Scalar","ScalarWithLambda","Seq","Span","Stream","StreamMap","Triplet","Xor"],"trait":["PeerIDErrorLogable"]}; \ No newline at end of file diff --git a/air_parser/ast/struct.Ap.html b/air_parser/ast/struct.Ap.html new file mode 100644 index 00000000..c2b9cc92 --- /dev/null +++ b/air_parser/ast/struct.Ap.html @@ -0,0 +1,24 @@ +Ap in air_parser::ast - Rust

Struct air_parser::ast::Ap

source ·
pub struct Ap<'i> {
+    pub argument: ApArgument<'i>,
+    pub result: ApResult<'i>,
+}
Expand description

(ap argument result)

+

Fields§

§argument: ApArgument<'i>§result: ApResult<'i>

Implementations§

source§

impl<'i> Ap<'i>

source

pub fn new(argument: ApArgument<'i>, result: ApResult<'i>) -> Self

Trait Implementations§

source§

impl<'i> Debug for Ap<'i>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Display for Ap<'_>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'i> PartialEq for Ap<'i>

source§

fn eq(&self, other: &Ap<'i>) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl PeerIDErrorLogable for Ap<'_>

source§

impl<'i> Serialize for Ap<'i>

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl<'i> StructuralPartialEq for Ap<'i>

Auto Trait Implementations§

§

impl<'i> Freeze for Ap<'i>

§

impl<'i> RefUnwindSafe for Ap<'i>

§

impl<'i> !Send for Ap<'i>

§

impl<'i> !Sync for Ap<'i>

§

impl<'i> Unpin for Ap<'i>

§

impl<'i> UnwindSafe for Ap<'i>

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_parser/ast/struct.ApMap.html b/air_parser/ast/struct.ApMap.html new file mode 100644 index 00000000..f3d3b085 --- /dev/null +++ b/air_parser/ast/struct.ApMap.html @@ -0,0 +1,29 @@ +ApMap in air_parser::ast - Rust

Struct air_parser::ast::ApMap

source ·
pub struct ApMap<'i> {
+    pub key: StreamMapKeyClause<'i>,
+    pub value: ApArgument<'i>,
+    pub map: StreamMap<'i>,
+}
Expand description

(ap key value %map)

+

Fields§

§key: StreamMapKeyClause<'i>§value: ApArgument<'i>§map: StreamMap<'i>

Implementations§

source§

impl<'i> ApMap<'i>

source

pub fn new( + key: StreamMapKeyClause<'i>, + value: ApArgument<'i>, + map: StreamMap<'i>, +) -> Self

Trait Implementations§

source§

impl<'i> Debug for ApMap<'i>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Display for ApMap<'_>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'i> PartialEq for ApMap<'i>

source§

fn eq(&self, other: &ApMap<'i>) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl PeerIDErrorLogable for ApMap<'_>

source§

impl<'i> Serialize for ApMap<'i>

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl<'i> StructuralPartialEq for ApMap<'i>

Auto Trait Implementations§

§

impl<'i> Freeze for ApMap<'i>

§

impl<'i> RefUnwindSafe for ApMap<'i>

§

impl<'i> !Send for ApMap<'i>

§

impl<'i> !Sync for ApMap<'i>

§

impl<'i> Unpin for ApMap<'i>

§

impl<'i> UnwindSafe for ApMap<'i>

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_parser/ast/struct.Call.html b/air_parser/ast/struct.Call.html new file mode 100644 index 00000000..2192a635 --- /dev/null +++ b/air_parser/ast/struct.Call.html @@ -0,0 +1,29 @@ +Call in air_parser::ast - Rust

Struct air_parser::ast::Call

source ·
pub struct Call<'i> {
+    pub triplet: Triplet<'i>,
+    pub args: Rc<Vec<ImmutableValue<'i>>>,
+    pub output: CallOutputValue<'i>,
+}
Expand description

(call (peer part of a triplet: PeerPart) (function part of a triplet: FunctionPart) [arguments] output)

+

Fields§

§triplet: Triplet<'i>§args: Rc<Vec<ImmutableValue<'i>>>§output: CallOutputValue<'i>

Implementations§

source§

impl<'i> Call<'i>

source

pub fn new( + triplet: Triplet<'i>, + args: Rc<Vec<ImmutableValue<'i>>>, + output: CallOutputValue<'i>, +) -> Self

Trait Implementations§

source§

impl<'i> Debug for Call<'i>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Display for Call<'_>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'i> PartialEq for Call<'i>

source§

fn eq(&self, other: &Call<'i>) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl PeerIDErrorLogable for Call<'_>

source§

impl<'i> Serialize for Call<'i>

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl<'i> StructuralPartialEq for Call<'i>

Auto Trait Implementations§

§

impl<'i> Freeze for Call<'i>

§

impl<'i> RefUnwindSafe for Call<'i>

§

impl<'i> !Send for Call<'i>

§

impl<'i> !Sync for Call<'i>

§

impl<'i> Unpin for Call<'i>

§

impl<'i> UnwindSafe for Call<'i>

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_parser/ast/struct.Canon.html b/air_parser/ast/struct.Canon.html new file mode 100644 index 00000000..4a5a0681 --- /dev/null +++ b/air_parser/ast/struct.Canon.html @@ -0,0 +1,29 @@ +Canon in air_parser::ast - Rust

Struct air_parser::ast::Canon

source ·
pub struct Canon<'i> {
+    pub peer_id: ResolvableToPeerIdVariable<'i>,
+    pub stream: Stream<'i>,
+    pub canon_stream: CanonStream<'i>,
+}
Expand description

(canon peer_id $stream #canon_stream)

+

Fields§

§peer_id: ResolvableToPeerIdVariable<'i>§stream: Stream<'i>§canon_stream: CanonStream<'i>

Implementations§

source§

impl<'i> Canon<'i>

source

pub fn new( + peer_id: ResolvableToPeerIdVariable<'i>, + stream: Stream<'i>, + canon_stream: CanonStream<'i>, +) -> Self

Trait Implementations§

source§

impl<'i> Debug for Canon<'i>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Display for Canon<'_>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'i> PartialEq for Canon<'i>

source§

fn eq(&self, other: &Canon<'i>) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl PeerIDErrorLogable for Canon<'_>

source§

impl<'i> Serialize for Canon<'i>

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl<'i> Eq for Canon<'i>

source§

impl<'i> StructuralPartialEq for Canon<'i>

Auto Trait Implementations§

§

impl<'i> Freeze for Canon<'i>

§

impl<'i> RefUnwindSafe for Canon<'i>

§

impl<'i> Send for Canon<'i>

§

impl<'i> Sync for Canon<'i>

§

impl<'i> Unpin for Canon<'i>

§

impl<'i> UnwindSafe for Canon<'i>

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_parser/ast/struct.CanonMap.html b/air_parser/ast/struct.CanonMap.html new file mode 100644 index 00000000..923a7c47 --- /dev/null +++ b/air_parser/ast/struct.CanonMap.html @@ -0,0 +1,29 @@ +CanonMap in air_parser::ast - Rust

Struct air_parser::ast::CanonMap

source ·
pub struct CanonMap<'i> {
+    pub peer_id: ResolvableToPeerIdVariable<'i>,
+    pub stream_map: StreamMap<'i>,
+    pub canon_stream_map: CanonStreamMap<'i>,
+}
Expand description

(canon peer_id %stream_map #%canon_stream_map)

+

Fields§

§peer_id: ResolvableToPeerIdVariable<'i>§stream_map: StreamMap<'i>§canon_stream_map: CanonStreamMap<'i>

Implementations§

source§

impl<'i> CanonMap<'i>

source

pub fn new( + peer_id: ResolvableToPeerIdVariable<'i>, + stream_map: StreamMap<'i>, + canon_stream_map: CanonStreamMap<'i>, +) -> Self

Trait Implementations§

source§

impl<'i> Debug for CanonMap<'i>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Display for CanonMap<'_>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'i> PartialEq for CanonMap<'i>

source§

fn eq(&self, other: &CanonMap<'i>) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl PeerIDErrorLogable for CanonMap<'_>

source§

impl<'i> Serialize for CanonMap<'i>

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl<'i> Eq for CanonMap<'i>

source§

impl<'i> StructuralPartialEq for CanonMap<'i>

Auto Trait Implementations§

§

impl<'i> Freeze for CanonMap<'i>

§

impl<'i> RefUnwindSafe for CanonMap<'i>

§

impl<'i> Send for CanonMap<'i>

§

impl<'i> Sync for CanonMap<'i>

§

impl<'i> Unpin for CanonMap<'i>

§

impl<'i> UnwindSafe for CanonMap<'i>

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_parser/ast/struct.CanonStream.html b/air_parser/ast/struct.CanonStream.html new file mode 100644 index 00000000..c6657c3c --- /dev/null +++ b/air_parser/ast/struct.CanonStream.html @@ -0,0 +1,28 @@ +CanonStream in air_parser::ast - Rust

Struct air_parser::ast::CanonStream

source ·
pub struct CanonStream<'i> {
+    pub name: &'i str,
+    pub position: AirPos,
+}
Expand description

A canonicalized stream without a lambda.

+

Fields§

§name: &'i str§position: AirPos

Implementations§

source§

impl<'i> CanonStream<'i>

source

pub fn new(name: &'i str, position: AirPos) -> Self

Trait Implementations§

source§

impl<'i> Clone for CanonStream<'i>

source§

fn clone(&self) -> CanonStream<'i>

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl<'i> Debug for CanonStream<'i>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'de: 'i, 'i> Deserialize<'de> for CanonStream<'i>

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl Display for CanonStream<'_>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'i> PartialEq for CanonStream<'i>

source§

fn eq(&self, other: &CanonStream<'i>) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl<'i> Serialize for CanonStream<'i>

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl<'i> Eq for CanonStream<'i>

source§

impl<'i> StructuralPartialEq for CanonStream<'i>

Auto Trait Implementations§

§

impl<'i> Freeze for CanonStream<'i>

§

impl<'i> RefUnwindSafe for CanonStream<'i>

§

impl<'i> Send for CanonStream<'i>

§

impl<'i> Sync for CanonStream<'i>

§

impl<'i> Unpin for CanonStream<'i>

§

impl<'i> UnwindSafe for CanonStream<'i>

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_parser/ast/struct.CanonStreamMap.html b/air_parser/ast/struct.CanonStreamMap.html new file mode 100644 index 00000000..39c75a94 --- /dev/null +++ b/air_parser/ast/struct.CanonStreamMap.html @@ -0,0 +1,28 @@ +CanonStreamMap in air_parser::ast - Rust

Struct air_parser::ast::CanonStreamMap

source ·
pub struct CanonStreamMap<'i> {
+    pub name: &'i str,
+    pub position: AirPos,
+}
Expand description

A canonicalized stream map without a lambda.

+

Fields§

§name: &'i str§position: AirPos

Implementations§

source§

impl<'i> CanonStreamMap<'i>

source

pub fn new(name: &'i str, position: AirPos) -> Self

Trait Implementations§

source§

impl<'i> Clone for CanonStreamMap<'i>

source§

fn clone(&self) -> CanonStreamMap<'i>

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl<'i> Debug for CanonStreamMap<'i>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'de: 'i, 'i> Deserialize<'de> for CanonStreamMap<'i>

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl Display for CanonStreamMap<'_>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'i> PartialEq for CanonStreamMap<'i>

source§

fn eq(&self, other: &CanonStreamMap<'i>) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl<'i> Serialize for CanonStreamMap<'i>

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl<'i> Eq for CanonStreamMap<'i>

source§

impl<'i> StructuralPartialEq for CanonStreamMap<'i>

Auto Trait Implementations§

§

impl<'i> Freeze for CanonStreamMap<'i>

§

impl<'i> RefUnwindSafe for CanonStreamMap<'i>

§

impl<'i> Send for CanonStreamMap<'i>

§

impl<'i> Sync for CanonStreamMap<'i>

§

impl<'i> Unpin for CanonStreamMap<'i>

§

impl<'i> UnwindSafe for CanonStreamMap<'i>

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_parser/ast/struct.CanonStreamMapScalar.html b/air_parser/ast/struct.CanonStreamMapScalar.html new file mode 100644 index 00000000..44937b5d --- /dev/null +++ b/air_parser/ast/struct.CanonStreamMapScalar.html @@ -0,0 +1,29 @@ +CanonStreamMapScalar in air_parser::ast - Rust

Struct air_parser::ast::CanonStreamMapScalar

source ·
pub struct CanonStreamMapScalar<'i> {
+    pub peer_id: ResolvableToPeerIdVariable<'i>,
+    pub stream_map: StreamMap<'i>,
+    pub scalar: Scalar<'i>,
+}
Expand description

(canon peer_id %stream_map scalar)

+

Fields§

§peer_id: ResolvableToPeerIdVariable<'i>§stream_map: StreamMap<'i>§scalar: Scalar<'i>

Implementations§

source§

impl<'i> CanonStreamMapScalar<'i>

source

pub fn new( + peer_id: ResolvableToPeerIdVariable<'i>, + stream_map: StreamMap<'i>, + scalar: Scalar<'i>, +) -> Self

Trait Implementations§

source§

impl<'i> Debug for CanonStreamMapScalar<'i>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Display for CanonStreamMapScalar<'_>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'i> PartialEq for CanonStreamMapScalar<'i>

source§

fn eq(&self, other: &CanonStreamMapScalar<'i>) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl PeerIDErrorLogable for CanonStreamMapScalar<'_>

source§

impl<'i> Serialize for CanonStreamMapScalar<'i>

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl<'i> Eq for CanonStreamMapScalar<'i>

source§

impl<'i> StructuralPartialEq for CanonStreamMapScalar<'i>

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_parser/ast/struct.CanonStreamMapWithLambda.html b/air_parser/ast/struct.CanonStreamMapWithLambda.html new file mode 100644 index 00000000..5ebd5d7a --- /dev/null +++ b/air_parser/ast/struct.CanonStreamMapWithLambda.html @@ -0,0 +1,29 @@ +CanonStreamMapWithLambda in air_parser::ast - Rust

Struct air_parser::ast::CanonStreamMapWithLambda

source ·
pub struct CanonStreamMapWithLambda<'i> {
+    pub name: &'i str,
+    pub lambda: LambdaAST<'i>,
+    pub position: AirPos,
+}
Expand description

A canonicalized stream map with a lambda.

+

Fields§

§name: &'i str§lambda: LambdaAST<'i>§position: AirPos

Implementations§

source§

impl<'i> CanonStreamMapWithLambda<'i>

source

pub fn new(name: &'i str, lambda: LambdaAST<'i>, position: AirPos) -> Self

Trait Implementations§

source§

impl<'i> Clone for CanonStreamMapWithLambda<'i>

source§

fn clone(&self) -> CanonStreamMapWithLambda<'i>

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl<'i> Debug for CanonStreamMapWithLambda<'i>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'de: 'i, 'i> Deserialize<'de> for CanonStreamMapWithLambda<'i>

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl Display for CanonStreamMapWithLambda<'_>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'i> PartialEq for CanonStreamMapWithLambda<'i>

source§

fn eq(&self, other: &CanonStreamMapWithLambda<'i>) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl<'i> Serialize for CanonStreamMapWithLambda<'i>

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl<'i> Eq for CanonStreamMapWithLambda<'i>

source§

impl<'i> StructuralPartialEq for CanonStreamMapWithLambda<'i>

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_parser/ast/struct.CanonStreamWithLambda.html b/air_parser/ast/struct.CanonStreamWithLambda.html new file mode 100644 index 00000000..1748e9aa --- /dev/null +++ b/air_parser/ast/struct.CanonStreamWithLambda.html @@ -0,0 +1,29 @@ +CanonStreamWithLambda in air_parser::ast - Rust

Struct air_parser::ast::CanonStreamWithLambda

source ·
pub struct CanonStreamWithLambda<'i> {
+    pub name: &'i str,
+    pub lambda: LambdaAST<'i>,
+    pub position: AirPos,
+}
Expand description

A canonicalized stream with a lambda.

+

Fields§

§name: &'i str§lambda: LambdaAST<'i>§position: AirPos

Implementations§

source§

impl<'i> CanonStreamWithLambda<'i>

source

pub fn new(name: &'i str, lambda: LambdaAST<'i>, position: AirPos) -> Self

Trait Implementations§

source§

impl<'i> Clone for CanonStreamWithLambda<'i>

source§

fn clone(&self) -> CanonStreamWithLambda<'i>

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl<'i> Debug for CanonStreamWithLambda<'i>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'de: 'i, 'i> Deserialize<'de> for CanonStreamWithLambda<'i>

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl Display for CanonStreamWithLambda<'_>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'i> PartialEq for CanonStreamWithLambda<'i>

source§

fn eq(&self, other: &CanonStreamWithLambda<'i>) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl<'i> Serialize for CanonStreamWithLambda<'i>

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl<'i> Eq for CanonStreamWithLambda<'i>

source§

impl<'i> StructuralPartialEq for CanonStreamWithLambda<'i>

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_parser/ast/struct.FoldScalar.html b/air_parser/ast/struct.FoldScalar.html new file mode 100644 index 00000000..dd01696a --- /dev/null +++ b/air_parser/ast/struct.FoldScalar.html @@ -0,0 +1,33 @@ +FoldScalar in air_parser::ast - Rust

Struct air_parser::ast::FoldScalar

source ·
pub struct FoldScalar<'i> {
+    pub iterable: FoldScalarIterable<'i>,
+    pub iterator: Scalar<'i>,
+    pub instruction: Rc<Instruction<'i>>,
+    pub last_instruction: Option<Rc<Instruction<'i>>>,
+    pub span: Span,
+}
Expand description

(fold scalar_iterable iterator instruction)

+

Fields§

§iterable: FoldScalarIterable<'i>§iterator: Scalar<'i>§instruction: Rc<Instruction<'i>>§last_instruction: Option<Rc<Instruction<'i>>>§span: Span

Implementations§

source§

impl<'i> FoldScalar<'i>

source

pub fn new( + iterable: FoldScalarIterable<'i>, + iterator: Scalar<'i>, + instruction: Instruction<'i>, + last_instruction: Option<Instruction<'i>>, + span: Span, +) -> Self

Trait Implementations§

source§

impl<'i> Debug for FoldScalar<'i>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Display for FoldScalar<'_>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'i> PartialEq for FoldScalar<'i>

source§

fn eq(&self, other: &FoldScalar<'i>) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl PeerIDErrorLogable for FoldScalar<'_>

source§

impl<'i> Serialize for FoldScalar<'i>

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl<'i> StructuralPartialEq for FoldScalar<'i>

Auto Trait Implementations§

§

impl<'i> Freeze for FoldScalar<'i>

§

impl<'i> RefUnwindSafe for FoldScalar<'i>

§

impl<'i> !Send for FoldScalar<'i>

§

impl<'i> !Sync for FoldScalar<'i>

§

impl<'i> Unpin for FoldScalar<'i>

§

impl<'i> UnwindSafe for FoldScalar<'i>

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_parser/ast/struct.FoldStream.html b/air_parser/ast/struct.FoldStream.html new file mode 100644 index 00000000..508fa289 --- /dev/null +++ b/air_parser/ast/struct.FoldStream.html @@ -0,0 +1,33 @@ +FoldStream in air_parser::ast - Rust

Struct air_parser::ast::FoldStream

source ·
pub struct FoldStream<'i> {
+    pub iterable: Stream<'i>,
+    pub iterator: Scalar<'i>,
+    pub instruction: Rc<Instruction<'i>>,
+    pub last_instruction: Option<Rc<Instruction<'i>>>,
+    pub span: Span,
+}
Expand description

(fold stream_iterable iterator instruction)

+

Fields§

§iterable: Stream<'i>§iterator: Scalar<'i>§instruction: Rc<Instruction<'i>>§last_instruction: Option<Rc<Instruction<'i>>>§span: Span

Implementations§

source§

impl<'i> FoldStream<'i>

source

pub fn new( + iterable: Stream<'i>, + iterator: Scalar<'i>, + instruction: Instruction<'i>, + last_instruction: Option<Instruction<'i>>, + span: Span, +) -> Self

Trait Implementations§

source§

impl<'i> Debug for FoldStream<'i>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Display for FoldStream<'_>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'i> PartialEq for FoldStream<'i>

source§

fn eq(&self, other: &FoldStream<'i>) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl PeerIDErrorLogable for FoldStream<'_>

source§

impl<'i> Serialize for FoldStream<'i>

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl<'i> StructuralPartialEq for FoldStream<'i>

Auto Trait Implementations§

§

impl<'i> Freeze for FoldStream<'i>

§

impl<'i> RefUnwindSafe for FoldStream<'i>

§

impl<'i> !Send for FoldStream<'i>

§

impl<'i> !Sync for FoldStream<'i>

§

impl<'i> Unpin for FoldStream<'i>

§

impl<'i> UnwindSafe for FoldStream<'i>

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_parser/ast/struct.FoldStreamMap.html b/air_parser/ast/struct.FoldStreamMap.html new file mode 100644 index 00000000..d1e0209e --- /dev/null +++ b/air_parser/ast/struct.FoldStreamMap.html @@ -0,0 +1,33 @@ +FoldStreamMap in air_parser::ast - Rust

Struct air_parser::ast::FoldStreamMap

source ·
pub struct FoldStreamMap<'i> {
+    pub iterable: StreamMap<'i>,
+    pub iterator: Scalar<'i>,
+    pub instruction: Rc<Instruction<'i>>,
+    pub last_instruction: Option<Rc<Instruction<'i>>>,
+    pub span: Span,
+}
Expand description

(fold stream_map_iterable iterator instruction)

+

Fields§

§iterable: StreamMap<'i>§iterator: Scalar<'i>§instruction: Rc<Instruction<'i>>§last_instruction: Option<Rc<Instruction<'i>>>§span: Span

Implementations§

source§

impl<'i> FoldStreamMap<'i>

source

pub fn new( + iterable: StreamMap<'i>, + iterator: Scalar<'i>, + instruction: Instruction<'i>, + last_instruction: Option<Instruction<'i>>, + span: Span, +) -> Self

Trait Implementations§

source§

impl<'i> Debug for FoldStreamMap<'i>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Display for FoldStreamMap<'_>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'i> PartialEq for FoldStreamMap<'i>

source§

fn eq(&self, other: &FoldStreamMap<'i>) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl PeerIDErrorLogable for FoldStreamMap<'_>

source§

impl<'i> Serialize for FoldStreamMap<'i>

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl<'i> StructuralPartialEq for FoldStreamMap<'i>

Auto Trait Implementations§

§

impl<'i> Freeze for FoldStreamMap<'i>

§

impl<'i> RefUnwindSafe for FoldStreamMap<'i>

§

impl<'i> !Send for FoldStreamMap<'i>

§

impl<'i> !Sync for FoldStreamMap<'i>

§

impl<'i> Unpin for FoldStreamMap<'i>

§

impl<'i> UnwindSafe for FoldStreamMap<'i>

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_parser/ast/struct.InstructionErrorAST.html b/air_parser/ast/struct.InstructionErrorAST.html new file mode 100644 index 00000000..572fa2d8 --- /dev/null +++ b/air_parser/ast/struct.InstructionErrorAST.html @@ -0,0 +1,26 @@ +InstructionErrorAST in air_parser::ast - Rust

Struct air_parser::ast::InstructionErrorAST

source ·
pub struct InstructionErrorAST<'lens> {
+    pub lens: Option<LambdaAST<'lens>>,
+}
Expand description

An error wrapper with an optional lens.

+

Fields§

§lens: Option<LambdaAST<'lens>>

Implementations§

source§

impl<'lens> InstructionErrorAST<'lens>

source

pub fn new(lens: Option<LambdaAST<'lens>>) -> Self

Trait Implementations§

source§

impl<'lens> Clone for InstructionErrorAST<'lens>

source§

fn clone(&self) -> InstructionErrorAST<'lens>

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl<'lens> Debug for InstructionErrorAST<'lens>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'de: 'lens, 'lens> Deserialize<'de> for InstructionErrorAST<'lens>

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl<'lens> PartialEq for InstructionErrorAST<'lens>

source§

fn eq(&self, other: &InstructionErrorAST<'lens>) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl<'lens> Serialize for InstructionErrorAST<'lens>

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl<'lens> Eq for InstructionErrorAST<'lens>

source§

impl<'lens> StructuralPartialEq for InstructionErrorAST<'lens>

Auto Trait Implementations§

§

impl<'lens> Freeze for InstructionErrorAST<'lens>

§

impl<'lens> RefUnwindSafe for InstructionErrorAST<'lens>

§

impl<'lens> Send for InstructionErrorAST<'lens>

§

impl<'lens> Sync for InstructionErrorAST<'lens>

§

impl<'lens> Unpin for InstructionErrorAST<'lens>

§

impl<'lens> UnwindSafe for InstructionErrorAST<'lens>

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_parser/ast/struct.Match.html b/air_parser/ast/struct.Match.html new file mode 100644 index 00000000..41389b68 --- /dev/null +++ b/air_parser/ast/struct.Match.html @@ -0,0 +1,29 @@ +Match in air_parser::ast - Rust

Struct air_parser::ast::Match

source ·
pub struct Match<'i> {
+    pub left_value: ImmutableValue<'i>,
+    pub right_value: ImmutableValue<'i>,
+    pub instruction: Instruction<'i>,
+}
Expand description

(match left_value right_value instruction)

+

Fields§

§left_value: ImmutableValue<'i>§right_value: ImmutableValue<'i>§instruction: Instruction<'i>

Implementations§

source§

impl<'i> Match<'i>

source

pub fn new( + left_value: ImmutableValue<'i>, + right_value: ImmutableValue<'i>, + instruction: Instruction<'i>, +) -> Self

Trait Implementations§

source§

impl<'i> Debug for Match<'i>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Display for Match<'_>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'i> PartialEq for Match<'i>

source§

fn eq(&self, other: &Match<'i>) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl PeerIDErrorLogable for Match<'_>

source§

impl<'i> Serialize for Match<'i>

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl<'i> StructuralPartialEq for Match<'i>

Auto Trait Implementations§

§

impl<'i> Freeze for Match<'i>

§

impl<'i> RefUnwindSafe for Match<'i>

§

impl<'i> !Send for Match<'i>

§

impl<'i> !Sync for Match<'i>

§

impl<'i> Unpin for Match<'i>

§

impl<'i> UnwindSafe for Match<'i>

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_parser/ast/struct.MisMatch.html b/air_parser/ast/struct.MisMatch.html new file mode 100644 index 00000000..b8e25c10 --- /dev/null +++ b/air_parser/ast/struct.MisMatch.html @@ -0,0 +1,29 @@ +MisMatch in air_parser::ast - Rust

Struct air_parser::ast::MisMatch

source ·
pub struct MisMatch<'i> {
+    pub left_value: ImmutableValue<'i>,
+    pub right_value: ImmutableValue<'i>,
+    pub instruction: Instruction<'i>,
+}
Expand description

(mismatch left_value right_value instruction)

+

Fields§

§left_value: ImmutableValue<'i>§right_value: ImmutableValue<'i>§instruction: Instruction<'i>

Implementations§

source§

impl<'i> MisMatch<'i>

source

pub fn new( + left_value: ImmutableValue<'i>, + right_value: ImmutableValue<'i>, + instruction: Instruction<'i>, +) -> Self

Trait Implementations§

source§

impl<'i> Debug for MisMatch<'i>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Display for MisMatch<'_>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'i> PartialEq for MisMatch<'i>

source§

fn eq(&self, other: &MisMatch<'i>) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl PeerIDErrorLogable for MisMatch<'_>

source§

impl<'i> Serialize for MisMatch<'i>

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl<'i> StructuralPartialEq for MisMatch<'i>

Auto Trait Implementations§

§

impl<'i> Freeze for MisMatch<'i>

§

impl<'i> RefUnwindSafe for MisMatch<'i>

§

impl<'i> !Send for MisMatch<'i>

§

impl<'i> !Sync for MisMatch<'i>

§

impl<'i> Unpin for MisMatch<'i>

§

impl<'i> UnwindSafe for MisMatch<'i>

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_parser/ast/struct.Never.html b/air_parser/ast/struct.Never.html new file mode 100644 index 00000000..0957e369 --- /dev/null +++ b/air_parser/ast/struct.Never.html @@ -0,0 +1,21 @@ +Never in air_parser::ast - Rust

Struct air_parser::ast::Never

source ·
pub struct Never;
Expand description

(never)

+

Trait Implementations§

source§

impl Debug for Never

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Display for Never

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl PartialEq for Never

source§

fn eq(&self, other: &Never) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl PeerIDErrorLogable for Never

source§

impl Serialize for Never

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Eq for Never

source§

impl StructuralPartialEq for Never

Auto Trait Implementations§

§

impl Freeze for Never

§

impl RefUnwindSafe for Never

§

impl Send for Never

§

impl Sync for Never

§

impl Unpin for Never

§

impl UnwindSafe for Never

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_parser/ast/struct.New.html b/air_parser/ast/struct.New.html new file mode 100644 index 00000000..0416d45b --- /dev/null +++ b/air_parser/ast/struct.New.html @@ -0,0 +1,29 @@ +New in air_parser::ast - Rust

Struct air_parser::ast::New

source ·
pub struct New<'i> {
+    pub argument: NewArgument<'i>,
+    pub instruction: Instruction<'i>,
+    pub span: Span,
+}
Expand description

(new variable instruction)

+

Fields§

§argument: NewArgument<'i>§instruction: Instruction<'i>§span: Span

Implementations§

source§

impl<'i> New<'i>

source

pub fn new( + argument: NewArgument<'i>, + instruction: Instruction<'i>, + span: Span, +) -> Self

Trait Implementations§

source§

impl<'i> Debug for New<'i>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Display for New<'_>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'i> PartialEq for New<'i>

source§

fn eq(&self, other: &New<'i>) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl PeerIDErrorLogable for New<'_>

source§

impl<'i> Serialize for New<'i>

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl<'i> StructuralPartialEq for New<'i>

Auto Trait Implementations§

§

impl<'i> Freeze for New<'i>

§

impl<'i> RefUnwindSafe for New<'i>

§

impl<'i> !Send for New<'i>

§

impl<'i> !Sync for New<'i>

§

impl<'i> Unpin for New<'i>

§

impl<'i> UnwindSafe for New<'i>

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_parser/ast/struct.Next.html b/air_parser/ast/struct.Next.html new file mode 100644 index 00000000..73e46b17 --- /dev/null +++ b/air_parser/ast/struct.Next.html @@ -0,0 +1,23 @@ +Next in air_parser::ast - Rust

Struct air_parser::ast::Next

source ·
pub struct Next<'i> {
+    pub iterator: Scalar<'i>,
+}
Expand description

(fold stream_iterable iterator instruction)

+

Fields§

§iterator: Scalar<'i>

Implementations§

source§

impl<'i> Next<'i>

source

pub fn new(iterator: Scalar<'i>) -> Self

Trait Implementations§

source§

impl<'i> Debug for Next<'i>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Display for Next<'_>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'i> PartialEq for Next<'i>

source§

fn eq(&self, other: &Next<'i>) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl PeerIDErrorLogable for Next<'_>

source§

impl<'i> Serialize for Next<'i>

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl<'i> Eq for Next<'i>

source§

impl<'i> StructuralPartialEq for Next<'i>

Auto Trait Implementations§

§

impl<'i> Freeze for Next<'i>

§

impl<'i> RefUnwindSafe for Next<'i>

§

impl<'i> Send for Next<'i>

§

impl<'i> Sync for Next<'i>

§

impl<'i> Unpin for Next<'i>

§

impl<'i> UnwindSafe for Next<'i>

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_parser/ast/struct.Null.html b/air_parser/ast/struct.Null.html new file mode 100644 index 00000000..e26d45b6 --- /dev/null +++ b/air_parser/ast/struct.Null.html @@ -0,0 +1,21 @@ +Null in air_parser::ast - Rust

Struct air_parser::ast::Null

source ·
pub struct Null;
Expand description

(null)

+

Trait Implementations§

source§

impl Debug for Null

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Display for Null

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl PartialEq for Null

source§

fn eq(&self, other: &Null) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl PeerIDErrorLogable for Null

source§

impl Serialize for Null

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Eq for Null

source§

impl StructuralPartialEq for Null

Auto Trait Implementations§

§

impl Freeze for Null

§

impl RefUnwindSafe for Null

§

impl Send for Null

§

impl Sync for Null

§

impl Unpin for Null

§

impl UnwindSafe for Null

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_parser/ast/struct.Par.html b/air_parser/ast/struct.Par.html new file mode 100644 index 00000000..51a331a1 --- /dev/null +++ b/air_parser/ast/struct.Par.html @@ -0,0 +1,24 @@ +Par in air_parser::ast - Rust

Struct air_parser::ast::Par

source ·
pub struct Par<'i>(pub Instruction<'i>, pub Instruction<'i>);
Expand description

(par instruction instruction)

+

Tuple Fields§

§0: Instruction<'i>§1: Instruction<'i>

Implementations§

source§

impl<'i> Par<'i>

source

pub fn new( + left_instruction: Instruction<'i>, + right_instruction: Instruction<'i>, +) -> Self

Trait Implementations§

source§

impl<'i> Debug for Par<'i>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Display for Par<'_>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'i> PartialEq for Par<'i>

source§

fn eq(&self, other: &Par<'i>) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl PeerIDErrorLogable for Par<'_>

source§

impl<'i> Serialize for Par<'i>

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl<'i> StructuralPartialEq for Par<'i>

Auto Trait Implementations§

§

impl<'i> Freeze for Par<'i>

§

impl<'i> RefUnwindSafe for Par<'i>

§

impl<'i> !Send for Par<'i>

§

impl<'i> !Sync for Par<'i>

§

impl<'i> Unpin for Par<'i>

§

impl<'i> UnwindSafe for Par<'i>

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_parser/ast/struct.Scalar.html b/air_parser/ast/struct.Scalar.html new file mode 100644 index 00000000..da5adf48 --- /dev/null +++ b/air_parser/ast/struct.Scalar.html @@ -0,0 +1,28 @@ +Scalar in air_parser::ast - Rust

Struct air_parser::ast::Scalar

source ·
pub struct Scalar<'i> {
+    pub name: &'i str,
+    pub position: AirPos,
+}
Expand description

A scalar value without a lambda.

+

Fields§

§name: &'i str§position: AirPos

Implementations§

source§

impl<'i> Scalar<'i>

source

pub fn new(name: &'i str, position: AirPos) -> Self

Trait Implementations§

source§

impl<'i> Clone for Scalar<'i>

source§

fn clone(&self) -> Scalar<'i>

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl<'i> Debug for Scalar<'i>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'de: 'i, 'i> Deserialize<'de> for Scalar<'i>

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl Display for Scalar<'_>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'i> PartialEq for Scalar<'i>

source§

fn eq(&self, other: &Scalar<'i>) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl<'i> Serialize for Scalar<'i>

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl<'i> Eq for Scalar<'i>

source§

impl<'i> StructuralPartialEq for Scalar<'i>

Auto Trait Implementations§

§

impl<'i> Freeze for Scalar<'i>

§

impl<'i> RefUnwindSafe for Scalar<'i>

§

impl<'i> Send for Scalar<'i>

§

impl<'i> Sync for Scalar<'i>

§

impl<'i> Unpin for Scalar<'i>

§

impl<'i> UnwindSafe for Scalar<'i>

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_parser/ast/struct.ScalarWithLambda.html b/air_parser/ast/struct.ScalarWithLambda.html new file mode 100644 index 00000000..77b1ab10 --- /dev/null +++ b/air_parser/ast/struct.ScalarWithLambda.html @@ -0,0 +1,29 @@ +ScalarWithLambda in air_parser::ast - Rust

Struct air_parser::ast::ScalarWithLambda

source ·
pub struct ScalarWithLambda<'i> {
+    pub name: &'i str,
+    pub lambda: LambdaAST<'i>,
+    pub position: AirPos,
+}
Expand description

A scalar value with a lambda expression.

+

Fields§

§name: &'i str§lambda: LambdaAST<'i>§position: AirPos

Implementations§

source§

impl<'i> ScalarWithLambda<'i>

source

pub fn new(name: &'i str, lambda: LambdaAST<'i>, position: AirPos) -> Self

Trait Implementations§

source§

impl<'i> Clone for ScalarWithLambda<'i>

source§

fn clone(&self) -> ScalarWithLambda<'i>

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl<'i> Debug for ScalarWithLambda<'i>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'de: 'i, 'i> Deserialize<'de> for ScalarWithLambda<'i>

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl Display for ScalarWithLambda<'_>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'i> PartialEq for ScalarWithLambda<'i>

source§

fn eq(&self, other: &ScalarWithLambda<'i>) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl<'i> Serialize for ScalarWithLambda<'i>

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl<'i> Eq for ScalarWithLambda<'i>

source§

impl<'i> StructuralPartialEq for ScalarWithLambda<'i>

Auto Trait Implementations§

§

impl<'i> Freeze for ScalarWithLambda<'i>

§

impl<'i> RefUnwindSafe for ScalarWithLambda<'i>

§

impl<'i> Send for ScalarWithLambda<'i>

§

impl<'i> Sync for ScalarWithLambda<'i>

§

impl<'i> Unpin for ScalarWithLambda<'i>

§

impl<'i> UnwindSafe for ScalarWithLambda<'i>

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_parser/ast/struct.Seq.html b/air_parser/ast/struct.Seq.html new file mode 100644 index 00000000..d85d4a73 --- /dev/null +++ b/air_parser/ast/struct.Seq.html @@ -0,0 +1,24 @@ +Seq in air_parser::ast - Rust

Struct air_parser::ast::Seq

source ·
pub struct Seq<'i>(pub Instruction<'i>, pub Instruction<'i>);
Expand description

(seq instruction instruction)

+

Tuple Fields§

§0: Instruction<'i>§1: Instruction<'i>

Implementations§

source§

impl<'i> Seq<'i>

source

pub fn new( + left_instruction: Instruction<'i>, + right_instruction: Instruction<'i>, +) -> Self

Trait Implementations§

source§

impl<'i> Debug for Seq<'i>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Display for Seq<'_>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'i> PartialEq for Seq<'i>

source§

fn eq(&self, other: &Seq<'i>) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl PeerIDErrorLogable for Seq<'_>

source§

impl<'i> Serialize for Seq<'i>

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl<'i> StructuralPartialEq for Seq<'i>

Auto Trait Implementations§

§

impl<'i> Freeze for Seq<'i>

§

impl<'i> RefUnwindSafe for Seq<'i>

§

impl<'i> !Send for Seq<'i>

§

impl<'i> !Sync for Seq<'i>

§

impl<'i> Unpin for Seq<'i>

§

impl<'i> UnwindSafe for Seq<'i>

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_parser/ast/struct.Span.html b/air_parser/ast/struct.Span.html new file mode 100644 index 00000000..e50fe411 --- /dev/null +++ b/air_parser/ast/struct.Span.html @@ -0,0 +1,34 @@ +Span in air_parser::ast - Rust

Struct air_parser::ast::Span

source ·
pub struct Span {
+    pub left: AirPos,
+    pub right: AirPos,
+}

Fields§

§left: AirPos§right: AirPos

Implementations§

source§

impl Span

source

pub fn new(left: AirPos, right: AirPos) -> Self

source

pub fn contains_position(&self, position: AirPos) -> bool

source

pub fn contains_span(&self, span: Self) -> bool

Trait Implementations§

source§

impl Clone for Span

source§

fn clone(&self) -> Span

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for Span

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'de> Deserialize<'de> for Span

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl From<Range<AirPos>> for Span

source§

fn from(range: Range<AirPos>) -> Self

Converts to this type from the input type.
source§

impl Hash for Span

source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
source§

impl Ord for Span

source§

fn cmp(&self, other: &Self) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · source§

fn max(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · source§

fn min(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · source§

fn clamp(self, min: Self, max: Self) -> Self
where + Self: Sized + PartialOrd,

Restrict a value to a certain interval. Read more
source§

impl PartialEq for Span

source§

fn eq(&self, other: &Span) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl PartialOrd for Span

source§

fn partial_cmp(&self, other: &Self) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · source§

fn lt(&self, other: &Rhs) -> bool

This method tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · source§

fn le(&self, other: &Rhs) -> bool

This method tests less than or equal to (for self and other) and is used by the <= +operator. Read more
1.0.0 · source§

fn gt(&self, other: &Rhs) -> bool

This method tests greater than (for self and other) and is used by the > operator. Read more
1.0.0 · source§

fn ge(&self, other: &Rhs) -> bool

This method tests greater than or equal to (for self and other) and is used by the >= +operator. Read more
source§

impl Serialize for Span

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Copy for Span

source§

impl Eq for Span

source§

impl StructuralPartialEq for Span

Auto Trait Implementations§

§

impl Freeze for Span

§

impl RefUnwindSafe for Span

§

impl Send for Span

§

impl Sync for Span

§

impl Unpin for Span

§

impl UnwindSafe for Span

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
source§

impl<T> CloneToUninit for T
where + T: Copy,

source§

unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_parser/ast/struct.Stream.html b/air_parser/ast/struct.Stream.html new file mode 100644 index 00000000..a0ba9be0 --- /dev/null +++ b/air_parser/ast/struct.Stream.html @@ -0,0 +1,28 @@ +Stream in air_parser::ast - Rust

Struct air_parser::ast::Stream

source ·
pub struct Stream<'i> {
+    pub name: &'i str,
+    pub position: AirPos,
+}
Expand description

A stream without a lambda.

+

Fields§

§name: &'i str§position: AirPos

Implementations§

source§

impl<'i> Stream<'i>

source

pub fn new(name: &'i str, position: AirPos) -> Self

Trait Implementations§

source§

impl<'i> Clone for Stream<'i>

source§

fn clone(&self) -> Stream<'i>

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl<'i> Debug for Stream<'i>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'de: 'i, 'i> Deserialize<'de> for Stream<'i>

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl Display for Stream<'_>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'i> PartialEq for Stream<'i>

source§

fn eq(&self, other: &Stream<'i>) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl<'i> Serialize for Stream<'i>

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl<'i> Eq for Stream<'i>

source§

impl<'i> StructuralPartialEq for Stream<'i>

Auto Trait Implementations§

§

impl<'i> Freeze for Stream<'i>

§

impl<'i> RefUnwindSafe for Stream<'i>

§

impl<'i> Send for Stream<'i>

§

impl<'i> Sync for Stream<'i>

§

impl<'i> Unpin for Stream<'i>

§

impl<'i> UnwindSafe for Stream<'i>

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_parser/ast/struct.StreamMap.html b/air_parser/ast/struct.StreamMap.html new file mode 100644 index 00000000..00c852d7 --- /dev/null +++ b/air_parser/ast/struct.StreamMap.html @@ -0,0 +1,28 @@ +StreamMap in air_parser::ast - Rust

Struct air_parser::ast::StreamMap

source ·
pub struct StreamMap<'i> {
+    pub name: &'i str,
+    pub position: AirPos,
+}
Expand description

A map based on top of a stream.

+

Fields§

§name: &'i str§position: AirPos

Implementations§

source§

impl<'i> StreamMap<'i>

source

pub fn new(name: &'i str, position: AirPos) -> Self

Trait Implementations§

source§

impl<'i> Clone for StreamMap<'i>

source§

fn clone(&self) -> StreamMap<'i>

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl<'i> Debug for StreamMap<'i>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'de: 'i, 'i> Deserialize<'de> for StreamMap<'i>

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl Display for StreamMap<'_>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'i> PartialEq for StreamMap<'i>

source§

fn eq(&self, other: &StreamMap<'i>) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl<'i> Serialize for StreamMap<'i>

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl<'i> Eq for StreamMap<'i>

source§

impl<'i> StructuralPartialEq for StreamMap<'i>

Auto Trait Implementations§

§

impl<'i> Freeze for StreamMap<'i>

§

impl<'i> RefUnwindSafe for StreamMap<'i>

§

impl<'i> Send for StreamMap<'i>

§

impl<'i> Sync for StreamMap<'i>

§

impl<'i> Unpin for StreamMap<'i>

§

impl<'i> UnwindSafe for StreamMap<'i>

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_parser/ast/struct.Triplet.html b/air_parser/ast/struct.Triplet.html new file mode 100644 index 00000000..bd7cd667 --- /dev/null +++ b/air_parser/ast/struct.Triplet.html @@ -0,0 +1,30 @@ +Triplet in air_parser::ast - Rust

Struct air_parser::ast::Triplet

source ·
pub struct Triplet<'i> {
+    pub peer_id: ResolvableToPeerIdVariable<'i>,
+    pub service_id: ResolvableToStringVariable<'i>,
+    pub function_name: ResolvableToStringVariable<'i>,
+}
Expand description

Triplet represents a location of the executable code in the network. +It is build from PeerPart and FunctionPart of a Call instruction.

+

Fields§

§peer_id: ResolvableToPeerIdVariable<'i>§service_id: ResolvableToStringVariable<'i>§function_name: ResolvableToStringVariable<'i>

Trait Implementations§

source§

impl<'i> Clone for Triplet<'i>

source§

fn clone(&self) -> Triplet<'i>

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl<'i> Debug for Triplet<'i>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'de: 'i, 'i> Deserialize<'de> for Triplet<'i>

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl Display for Triplet<'_>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'i> PartialEq for Triplet<'i>

source§

fn eq(&self, other: &Triplet<'i>) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl<'i> Serialize for Triplet<'i>

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl<'i> Eq for Triplet<'i>

source§

impl<'i> StructuralPartialEq for Triplet<'i>

Auto Trait Implementations§

§

impl<'i> Freeze for Triplet<'i>

§

impl<'i> RefUnwindSafe for Triplet<'i>

§

impl<'i> Send for Triplet<'i>

§

impl<'i> Sync for Triplet<'i>

§

impl<'i> Unpin for Triplet<'i>

§

impl<'i> UnwindSafe for Triplet<'i>

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_parser/ast/struct.Xor.html b/air_parser/ast/struct.Xor.html new file mode 100644 index 00000000..37e99a70 --- /dev/null +++ b/air_parser/ast/struct.Xor.html @@ -0,0 +1,24 @@ +Xor in air_parser::ast - Rust

Struct air_parser::ast::Xor

source ·
pub struct Xor<'i>(pub Instruction<'i>, pub Instruction<'i>);
Expand description

(xor instruction instruction)

+

Tuple Fields§

§0: Instruction<'i>§1: Instruction<'i>

Implementations§

source§

impl<'i> Xor<'i>

source

pub fn new( + left_instruction: Instruction<'i>, + right_instruction: Instruction<'i>, +) -> Self

Trait Implementations§

source§

impl<'i> Debug for Xor<'i>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Display for Xor<'_>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'i> PartialEq for Xor<'i>

source§

fn eq(&self, other: &Xor<'i>) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl PeerIDErrorLogable for Xor<'_>

source§

impl<'i> Serialize for Xor<'i>

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl<'i> StructuralPartialEq for Xor<'i>

Auto Trait Implementations§

§

impl<'i> Freeze for Xor<'i>

§

impl<'i> RefUnwindSafe for Xor<'i>

§

impl<'i> !Send for Xor<'i>

§

impl<'i> !Sync for Xor<'i>

§

impl<'i> Unpin for Xor<'i>

§

impl<'i> UnwindSafe for Xor<'i>

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_parser/ast/trait.PeerIDErrorLogable.html b/air_parser/ast/trait.PeerIDErrorLogable.html new file mode 100644 index 00000000..51e8ae1f --- /dev/null +++ b/air_parser/ast/trait.PeerIDErrorLogable.html @@ -0,0 +1,4 @@ +PeerIDErrorLogable in air_parser::ast - Rust
\ No newline at end of file diff --git a/air_parser/ast/values/enum.ImmutableVariable.html b/air_parser/ast/values/enum.ImmutableVariable.html new file mode 100644 index 00000000..07f652b4 --- /dev/null +++ b/air_parser/ast/values/enum.ImmutableVariable.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../air_parser/ast/enum.ImmutableVariable.html...

+ + + \ No newline at end of file diff --git a/air_parser/ast/values/enum.ImmutableVariableWithLambda.html b/air_parser/ast/values/enum.ImmutableVariableWithLambda.html new file mode 100644 index 00000000..ece139bc --- /dev/null +++ b/air_parser/ast/values/enum.ImmutableVariableWithLambda.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../air_parser/ast/enum.ImmutableVariableWithLambda.html...

+ + + \ No newline at end of file diff --git a/air_parser/ast/values/struct.CanonStream.html b/air_parser/ast/values/struct.CanonStream.html new file mode 100644 index 00000000..55ec370e --- /dev/null +++ b/air_parser/ast/values/struct.CanonStream.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../air_parser/ast/struct.CanonStream.html...

+ + + \ No newline at end of file diff --git a/air_parser/ast/values/struct.CanonStreamMap.html b/air_parser/ast/values/struct.CanonStreamMap.html new file mode 100644 index 00000000..b40178bc --- /dev/null +++ b/air_parser/ast/values/struct.CanonStreamMap.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../air_parser/ast/struct.CanonStreamMap.html...

+ + + \ No newline at end of file diff --git a/air_parser/ast/values/struct.CanonStreamMapWithLambda.html b/air_parser/ast/values/struct.CanonStreamMapWithLambda.html new file mode 100644 index 00000000..d3d5175c --- /dev/null +++ b/air_parser/ast/values/struct.CanonStreamMapWithLambda.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../air_parser/ast/struct.CanonStreamMapWithLambda.html...

+ + + \ No newline at end of file diff --git a/air_parser/ast/values/struct.CanonStreamWithLambda.html b/air_parser/ast/values/struct.CanonStreamWithLambda.html new file mode 100644 index 00000000..f4836c22 --- /dev/null +++ b/air_parser/ast/values/struct.CanonStreamWithLambda.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../air_parser/ast/struct.CanonStreamWithLambda.html...

+ + + \ No newline at end of file diff --git a/air_parser/ast/values/struct.InstructionErrorAST.html b/air_parser/ast/values/struct.InstructionErrorAST.html new file mode 100644 index 00000000..409c3179 --- /dev/null +++ b/air_parser/ast/values/struct.InstructionErrorAST.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../air_parser/ast/struct.InstructionErrorAST.html...

+ + + \ No newline at end of file diff --git a/air_parser/ast/values/struct.Scalar.html b/air_parser/ast/values/struct.Scalar.html new file mode 100644 index 00000000..19e3ff66 --- /dev/null +++ b/air_parser/ast/values/struct.Scalar.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../air_parser/ast/struct.Scalar.html...

+ + + \ No newline at end of file diff --git a/air_parser/ast/values/struct.ScalarWithLambda.html b/air_parser/ast/values/struct.ScalarWithLambda.html new file mode 100644 index 00000000..6100a514 --- /dev/null +++ b/air_parser/ast/values/struct.ScalarWithLambda.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../air_parser/ast/struct.ScalarWithLambda.html...

+ + + \ No newline at end of file diff --git a/air_parser/ast/values/struct.Stream.html b/air_parser/ast/values/struct.Stream.html new file mode 100644 index 00000000..955a0ff9 --- /dev/null +++ b/air_parser/ast/values/struct.Stream.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../air_parser/ast/struct.Stream.html...

+ + + \ No newline at end of file diff --git a/air_parser/ast/values/struct.StreamMap.html b/air_parser/ast/values/struct.StreamMap.html new file mode 100644 index 00000000..b75d49cf --- /dev/null +++ b/air_parser/ast/values/struct.StreamMap.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../air_parser/ast/struct.StreamMap.html...

+ + + \ No newline at end of file diff --git a/air_parser/fn.parse.html b/air_parser/fn.parse.html new file mode 100644 index 00000000..eabe77da --- /dev/null +++ b/air_parser/fn.parse.html @@ -0,0 +1,2 @@ +parse in air_parser - Rust

Function air_parser::parse

source ·
pub fn parse(air_script: &str) -> Result<Instruction<'_>, String>
Expand description

Parse AIR source_code to Box<Instruction>

+
\ No newline at end of file diff --git a/air_parser/index.html b/air_parser/index.html new file mode 100644 index 00000000..7db1f2ef --- /dev/null +++ b/air_parser/index.html @@ -0,0 +1 @@ +air_parser - Rust

Crate air_parser

source ·

Modules§

Macros§

Structs§

Functions§

  • Parse AIR source_code to Box<Instruction>
\ No newline at end of file diff --git a/air_parser/macro.make_user_error!.html b/air_parser/macro.make_user_error!.html new file mode 100644 index 00000000..f75227c4 --- /dev/null +++ b/air_parser/macro.make_user_error!.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to macro.make_user_error.html...

+ + + \ No newline at end of file diff --git a/air_parser/macro.make_user_error.html b/air_parser/macro.make_user_error.html new file mode 100644 index 00000000..e33f4cda --- /dev/null +++ b/air_parser/macro.make_user_error.html @@ -0,0 +1,3 @@ +make_user_error in air_parser - Rust

Macro air_parser::make_user_error

source ·
macro_rules! make_user_error {
+    ($error_type:ident, $start_pos: ident, $token:expr, $end_pos: ident) => { ... };
+}
\ No newline at end of file diff --git a/air_parser/parser/air/__parse__AIR/struct.AIRParser.html b/air_parser/parser/air/__parse__AIR/struct.AIRParser.html new file mode 100644 index 00000000..6f0bb59c --- /dev/null +++ b/air_parser/parser/air/__parse__AIR/struct.AIRParser.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../../air_parser/struct.AIRParser.html...

+ + + \ No newline at end of file diff --git a/air_parser/parser/air_parser/fn.parse.html b/air_parser/parser/air_parser/fn.parse.html new file mode 100644 index 00000000..fd68e393 --- /dev/null +++ b/air_parser/parser/air_parser/fn.parse.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../air_parser/fn.parse.html...

+ + + \ No newline at end of file diff --git a/air_parser/parser/lexer/air_lexer/struct.AIRLexer.html b/air_parser/parser/lexer/air_lexer/struct.AIRLexer.html new file mode 100644 index 00000000..9948ca9c --- /dev/null +++ b/air_parser/parser/lexer/air_lexer/struct.AIRLexer.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../../air_parser/struct.AIRLexer.html...

+ + + \ No newline at end of file diff --git a/air_parser/parser/lexer/text_pos/struct.AirPos.html b/air_parser/parser/lexer/text_pos/struct.AirPos.html new file mode 100644 index 00000000..21b22899 --- /dev/null +++ b/air_parser/parser/lexer/text_pos/struct.AirPos.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../../air_parser/struct.AirPos.html...

+ + + \ No newline at end of file diff --git a/air_parser/parser/span/struct.Span.html b/air_parser/parser/span/struct.Span.html new file mode 100644 index 00000000..8e4d39ee --- /dev/null +++ b/air_parser/parser/span/struct.Span.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../air_parser/ast/struct.Span.html...

+ + + \ No newline at end of file diff --git a/air_parser/parser/validator/struct.VariableValidator.html b/air_parser/parser/validator/struct.VariableValidator.html new file mode 100644 index 00000000..02139ad2 --- /dev/null +++ b/air_parser/parser/validator/struct.VariableValidator.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../air_parser/struct.VariableValidator.html...

+ + + \ No newline at end of file diff --git a/air_parser/sidebar-items.js b/air_parser/sidebar-items.js new file mode 100644 index 00000000..68a52a19 --- /dev/null +++ b/air_parser/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"fn":["parse"],"macro":["make_user_error"],"mod":["ast"],"struct":["AIRLexer","AIRParser","AirPos","VariableValidator"]}; \ No newline at end of file diff --git a/air_parser/struct.AIRLexer.html b/air_parser/struct.AIRLexer.html new file mode 100644 index 00000000..6a0cddbe --- /dev/null +++ b/air_parser/struct.AIRLexer.html @@ -0,0 +1,578 @@ +AIRLexer in air_parser - Rust

Struct air_parser::AIRLexer

source ·
pub struct AIRLexer<'input> { /* private fields */ }

Implementations§

source§

impl<'input> AIRLexer<'input>

source

pub fn new(input: &'input str) -> Self

source

pub fn next_token( + &mut self, +) -> Option<Result<(AirPos, Token<'input>, AirPos), LexerError>>

Trait Implementations§

source§

impl<'input> Iterator for AIRLexer<'input>

§

type Item = Result<(AirPos, Token<'input>, AirPos), LexerError>

The type of the elements being iterated over.
source§

fn next(&mut self) -> Option<Self::Item>

Advances the iterator and returns the next value. Read more
source§

fn next_chunk<const N: usize>( + &mut self, +) -> Result<[Self::Item; N], IntoIter<Self::Item, N>>
where + Self: Sized,

🔬This is a nightly-only experimental API. (iter_next_chunk)
Advances the iterator and returns an array containing the next N values. Read more
1.0.0 · source§

fn size_hint(&self) -> (usize, Option<usize>)

Returns the bounds on the remaining length of the iterator. Read more
1.0.0 · source§

fn count(self) -> usize
where + Self: Sized,

Consumes the iterator, counting the number of iterations and returning it. Read more
1.0.0 · source§

fn last(self) -> Option<Self::Item>
where + Self: Sized,

Consumes the iterator, returning the last element. Read more
source§

fn advance_by(&mut self, n: usize) -> Result<(), NonZero<usize>>

🔬This is a nightly-only experimental API. (iter_advance_by)
Advances the iterator by n elements. Read more
1.0.0 · source§

fn nth(&mut self, n: usize) -> Option<Self::Item>

Returns the nth element of the iterator. Read more
1.28.0 · source§

fn step_by(self, step: usize) -> StepBy<Self>
where + Self: Sized,

Creates an iterator starting at the same point, but stepping by +the given amount at each iteration. Read more
1.0.0 · source§

fn chain<U>(self, other: U) -> Chain<Self, <U as IntoIterator>::IntoIter>
where + Self: Sized, + U: IntoIterator<Item = Self::Item>,

Takes two iterators and creates a new iterator over both in sequence. Read more
1.0.0 · source§

fn zip<U>(self, other: U) -> Zip<Self, <U as IntoIterator>::IntoIter>
where + Self: Sized, + U: IntoIterator,

‘Zips up’ two iterators into a single iterator of pairs. Read more
source§

fn intersperse_with<G>(self, separator: G) -> IntersperseWith<Self, G>
where + Self: Sized, + G: FnMut() -> Self::Item,

🔬This is a nightly-only experimental API. (iter_intersperse)
Creates a new iterator which places an item generated by separator +between adjacent items of the original iterator. Read more
1.0.0 · source§

fn map<B, F>(self, f: F) -> Map<Self, F>
where + Self: Sized, + F: FnMut(Self::Item) -> B,

Takes a closure and creates an iterator which calls that closure on each +element. Read more
1.21.0 · source§

fn for_each<F>(self, f: F)
where + Self: Sized, + F: FnMut(Self::Item),

Calls a closure on each element of an iterator. Read more
1.0.0 · source§

fn filter<P>(self, predicate: P) -> Filter<Self, P>
where + Self: Sized, + P: FnMut(&Self::Item) -> bool,

Creates an iterator which uses a closure to determine if an element +should be yielded. Read more
1.0.0 · source§

fn filter_map<B, F>(self, f: F) -> FilterMap<Self, F>
where + Self: Sized, + F: FnMut(Self::Item) -> Option<B>,

Creates an iterator that both filters and maps. Read more
1.0.0 · source§

fn enumerate(self) -> Enumerate<Self>
where + Self: Sized,

Creates an iterator which gives the current iteration count as well as +the next value. Read more
1.0.0 · source§

fn peekable(self) -> Peekable<Self>
where + Self: Sized,

Creates an iterator which can use the peek and peek_mut methods +to look at the next element of the iterator without consuming it. See +their documentation for more information. Read more
1.0.0 · source§

fn skip_while<P>(self, predicate: P) -> SkipWhile<Self, P>
where + Self: Sized, + P: FnMut(&Self::Item) -> bool,

Creates an iterator that skips elements based on a predicate. Read more
1.0.0 · source§

fn take_while<P>(self, predicate: P) -> TakeWhile<Self, P>
where + Self: Sized, + P: FnMut(&Self::Item) -> bool,

Creates an iterator that yields elements based on a predicate. Read more
1.57.0 · source§

fn map_while<B, P>(self, predicate: P) -> MapWhile<Self, P>
where + Self: Sized, + P: FnMut(Self::Item) -> Option<B>,

Creates an iterator that both yields elements based on a predicate and maps. Read more
1.0.0 · source§

fn skip(self, n: usize) -> Skip<Self>
where + Self: Sized,

Creates an iterator that skips the first n elements. Read more
1.0.0 · source§

fn take(self, n: usize) -> Take<Self>
where + Self: Sized,

Creates an iterator that yields the first n elements, or fewer +if the underlying iterator ends sooner. Read more
1.0.0 · source§

fn scan<St, B, F>(self, initial_state: St, f: F) -> Scan<Self, St, F>
where + Self: Sized, + F: FnMut(&mut St, Self::Item) -> Option<B>,

An iterator adapter which, like fold, holds internal state, but +unlike fold, produces a new iterator. Read more
1.0.0 · source§

fn flat_map<U, F>(self, f: F) -> FlatMap<Self, U, F>
where + Self: Sized, + U: IntoIterator, + F: FnMut(Self::Item) -> U,

Creates an iterator that works like map, but flattens nested structure. Read more
source§

fn map_windows<F, R, const N: usize>(self, f: F) -> MapWindows<Self, F, N>
where + Self: Sized, + F: FnMut(&[Self::Item; N]) -> R,

🔬This is a nightly-only experimental API. (iter_map_windows)
Calls the given function f for each contiguous window of size N over +self and returns an iterator over the outputs of f. Like slice::windows(), +the windows during mapping overlap as well. Read more
1.0.0 · source§

fn fuse(self) -> Fuse<Self>
where + Self: Sized,

Creates an iterator which ends after the first None. Read more
1.0.0 · source§

fn inspect<F>(self, f: F) -> Inspect<Self, F>
where + Self: Sized, + F: FnMut(&Self::Item),

Does something with each element of an iterator, passing the value on. Read more
1.0.0 · source§

fn by_ref(&mut self) -> &mut Self
where + Self: Sized,

Borrows an iterator, rather than consuming it. Read more
1.0.0 · source§

fn collect<B>(self) -> B
where + B: FromIterator<Self::Item>, + Self: Sized,

Transforms an iterator into a collection. Read more
source§

fn collect_into<E>(self, collection: &mut E) -> &mut E
where + E: Extend<Self::Item>, + Self: Sized,

🔬This is a nightly-only experimental API. (iter_collect_into)
Collects all the items from an iterator into a collection. Read more
1.0.0 · source§

fn partition<B, F>(self, f: F) -> (B, B)
where + Self: Sized, + B: Default + Extend<Self::Item>, + F: FnMut(&Self::Item) -> bool,

Consumes an iterator, creating two collections from it. Read more
source§

fn is_partitioned<P>(self, predicate: P) -> bool
where + Self: Sized, + P: FnMut(Self::Item) -> bool,

🔬This is a nightly-only experimental API. (iter_is_partitioned)
Checks if the elements of this iterator are partitioned according to the given predicate, +such that all those that return true precede all those that return false. Read more
1.27.0 · source§

fn try_fold<B, F, R>(&mut self, init: B, f: F) -> R
where + Self: Sized, + F: FnMut(B, Self::Item) -> R, + R: Try<Output = B>,

An iterator method that applies a function as long as it returns +successfully, producing a single, final value. Read more
1.27.0 · source§

fn try_for_each<F, R>(&mut self, f: F) -> R
where + Self: Sized, + F: FnMut(Self::Item) -> R, + R: Try<Output = ()>,

An iterator method that applies a fallible function to each item in the +iterator, stopping at the first error and returning that error. Read more
1.0.0 · source§

fn fold<B, F>(self, init: B, f: F) -> B
where + Self: Sized, + F: FnMut(B, Self::Item) -> B,

Folds every element into an accumulator by applying an operation, +returning the final result. Read more
1.51.0 · source§

fn reduce<F>(self, f: F) -> Option<Self::Item>
where + Self: Sized, + F: FnMut(Self::Item, Self::Item) -> Self::Item,

Reduces the elements to a single one, by repeatedly applying a reducing +operation. Read more
source§

fn try_reduce<R>( + &mut self, + f: impl FnMut(Self::Item, Self::Item) -> R, +) -> <<R as Try>::Residual as Residual<Option<<R as Try>::Output>>>::TryType
where + Self: Sized, + R: Try<Output = Self::Item>, + <R as Try>::Residual: Residual<Option<Self::Item>>,

🔬This is a nightly-only experimental API. (iterator_try_reduce)
Reduces the elements to a single one by repeatedly applying a reducing operation. If the +closure returns a failure, the failure is propagated back to the caller immediately. Read more
1.0.0 · source§

fn all<F>(&mut self, f: F) -> bool
where + Self: Sized, + F: FnMut(Self::Item) -> bool,

Tests if every element of the iterator matches a predicate. Read more
1.0.0 · source§

fn any<F>(&mut self, f: F) -> bool
where + Self: Sized, + F: FnMut(Self::Item) -> bool,

Tests if any element of the iterator matches a predicate. Read more
1.0.0 · source§

fn find<P>(&mut self, predicate: P) -> Option<Self::Item>
where + Self: Sized, + P: FnMut(&Self::Item) -> bool,

Searches for an element of an iterator that satisfies a predicate. Read more
1.30.0 · source§

fn find_map<B, F>(&mut self, f: F) -> Option<B>
where + Self: Sized, + F: FnMut(Self::Item) -> Option<B>,

Applies function to the elements of iterator and returns +the first non-none result. Read more
source§

fn try_find<R>( + &mut self, + f: impl FnMut(&Self::Item) -> R, +) -> <<R as Try>::Residual as Residual<Option<Self::Item>>>::TryType
where + Self: Sized, + R: Try<Output = bool>, + <R as Try>::Residual: Residual<Option<Self::Item>>,

🔬This is a nightly-only experimental API. (try_find)
Applies function to the elements of iterator and returns +the first true result or the first error. Read more
1.0.0 · source§

fn position<P>(&mut self, predicate: P) -> Option<usize>
where + Self: Sized, + P: FnMut(Self::Item) -> bool,

Searches for an element in an iterator, returning its index. Read more
1.6.0 · source§

fn max_by_key<B, F>(self, f: F) -> Option<Self::Item>
where + B: Ord, + Self: Sized, + F: FnMut(&Self::Item) -> B,

Returns the element that gives the maximum value from the +specified function. Read more
1.15.0 · source§

fn max_by<F>(self, compare: F) -> Option<Self::Item>
where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> Ordering,

Returns the element that gives the maximum value with respect to the +specified comparison function. Read more
1.6.0 · source§

fn min_by_key<B, F>(self, f: F) -> Option<Self::Item>
where + B: Ord, + Self: Sized, + F: FnMut(&Self::Item) -> B,

Returns the element that gives the minimum value from the +specified function. Read more
1.15.0 · source§

fn min_by<F>(self, compare: F) -> Option<Self::Item>
where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> Ordering,

Returns the element that gives the minimum value with respect to the +specified comparison function. Read more
1.0.0 · source§

fn unzip<A, B, FromA, FromB>(self) -> (FromA, FromB)
where + FromA: Default + Extend<A>, + FromB: Default + Extend<B>, + Self: Sized + Iterator<Item = (A, B)>,

Converts an iterator of pairs into a pair of containers. Read more
1.36.0 · source§

fn copied<'a, T>(self) -> Copied<Self>
where + T: 'a + Copy, + Self: Sized + Iterator<Item = &'a T>,

Creates an iterator which copies all of its elements. Read more
1.0.0 · source§

fn cloned<'a, T>(self) -> Cloned<Self>
where + T: 'a + Clone, + Self: Sized + Iterator<Item = &'a T>,

Creates an iterator which clones all of its elements. Read more
source§

fn array_chunks<const N: usize>(self) -> ArrayChunks<Self, N>
where + Self: Sized,

🔬This is a nightly-only experimental API. (iter_array_chunks)
Returns an iterator over N elements of the iterator at a time. Read more
1.11.0 · source§

fn sum<S>(self) -> S
where + Self: Sized, + S: Sum<Self::Item>,

Sums the elements of an iterator. Read more
1.11.0 · source§

fn product<P>(self) -> P
where + Self: Sized, + P: Product<Self::Item>,

Iterates over the entire iterator, multiplying all the elements Read more
source§

fn cmp_by<I, F>(self, other: I, cmp: F) -> Ordering
where + Self: Sized, + I: IntoIterator, + F: FnMut(Self::Item, <I as IntoIterator>::Item) -> Ordering,

🔬This is a nightly-only experimental API. (iter_order_by)
Lexicographically compares the elements of this Iterator with those +of another with respect to the specified comparison function. Read more
1.5.0 · source§

fn partial_cmp<I>(self, other: I) -> Option<Ordering>
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Lexicographically compares the PartialOrd elements of +this Iterator with those of another. The comparison works like short-circuit +evaluation, returning a result without comparing the remaining elements. +As soon as an order can be determined, the evaluation stops and a result is returned. Read more
source§

fn partial_cmp_by<I, F>(self, other: I, partial_cmp: F) -> Option<Ordering>
where + Self: Sized, + I: IntoIterator, + F: FnMut(Self::Item, <I as IntoIterator>::Item) -> Option<Ordering>,

🔬This is a nightly-only experimental API. (iter_order_by)
Lexicographically compares the elements of this Iterator with those +of another with respect to the specified comparison function. Read more
1.5.0 · source§

fn eq<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialEq<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are equal to those of +another. Read more
source§

fn eq_by<I, F>(self, other: I, eq: F) -> bool
where + Self: Sized, + I: IntoIterator, + F: FnMut(Self::Item, <I as IntoIterator>::Item) -> bool,

🔬This is a nightly-only experimental API. (iter_order_by)
Determines if the elements of this Iterator are equal to those of +another with respect to the specified equality function. Read more
1.5.0 · source§

fn ne<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialEq<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are not equal to those of +another. Read more
1.5.0 · source§

fn lt<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are lexicographically +less than those of another. Read more
1.5.0 · source§

fn le<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are lexicographically +less or equal to those of another. Read more
1.5.0 · source§

fn gt<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are lexicographically +greater than those of another. Read more
1.5.0 · source§

fn ge<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are lexicographically +greater than or equal to those of another. Read more
source§

fn is_sorted_by<F>(self, compare: F) -> bool
where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> bool,

🔬This is a nightly-only experimental API. (is_sorted)
Checks if the elements of this iterator are sorted using the given comparator function. Read more
source§

fn is_sorted_by_key<F, K>(self, f: F) -> bool
where + Self: Sized, + F: FnMut(Self::Item) -> K, + K: PartialOrd,

🔬This is a nightly-only experimental API. (is_sorted)
Checks if the elements of this iterator are sorted using the given key extraction +function. Read more

Auto Trait Implementations§

§

impl<'input> Freeze for AIRLexer<'input>

§

impl<'input> RefUnwindSafe for AIRLexer<'input>

§

impl<'input> Send for AIRLexer<'input>

§

impl<'input> Sync for AIRLexer<'input>

§

impl<'input> Unpin for AIRLexer<'input>

§

impl<'input> UnwindSafe for AIRLexer<'input>

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<I> IntoIterator for I
where + I: Iterator,

§

type Item = <I as Iterator>::Item

The type of the elements being iterated over.
§

type IntoIter = I

Which kind of iterator are we turning this into?
source§

fn into_iter(self) -> I

Creates an iterator from a value. Read more
source§

impl<T> Itertools for T
where + T: Iterator + ?Sized,

source§

fn interleave<J>( + self, + other: J, +) -> Interleave<Self, <J as IntoIterator>::IntoIter>
where + J: IntoIterator<Item = Self::Item>, + Self: Sized,

Alternate elements from two iterators until both have run out. Read more
source§

fn interleave_shortest<J>( + self, + other: J, +) -> InterleaveShortest<Self, <J as IntoIterator>::IntoIter>
where + J: IntoIterator<Item = Self::Item>, + Self: Sized,

Alternate elements from two iterators until at least one of them has run +out. Read more
source§

fn intersperse( + self, + element: Self::Item, +) -> IntersperseWith<Self, IntersperseElementSimple<Self::Item>>
where + Self: Sized, + Self::Item: Clone,

An iterator adaptor to insert a particular value +between each element of the adapted iterator. Read more
source§

fn intersperse_with<F>(self, element: F) -> IntersperseWith<Self, F>
where + Self: Sized, + F: FnMut() -> Self::Item,

An iterator adaptor to insert a particular value created by a function +between each element of the adapted iterator. Read more
source§

fn zip_longest<J>( + self, + other: J, +) -> ZipLongest<Self, <J as IntoIterator>::IntoIter>
where + J: IntoIterator, + Self: Sized,

Create an iterator which iterates over both this and the specified +iterator simultaneously, yielding pairs of two optional elements. Read more
source§

fn zip_eq<J>(self, other: J) -> ZipEq<Self, <J as IntoIterator>::IntoIter>
where + J: IntoIterator, + Self: Sized,

Create an iterator which iterates over both this and the specified +iterator simultaneously, yielding pairs of elements. Read more
source§

fn batching<B, F>(self, f: F) -> Batching<Self, F>
where + F: FnMut(&mut Self) -> Option<B>, + Self: Sized,

A “meta iterator adaptor”. Its closure receives a reference to the +iterator and may pick off as many elements as it likes, to produce the +next iterator element. Read more
source§

fn group_by<K, F>(self, key: F) -> GroupBy<K, Self, F>
where + Self: Sized, + F: FnMut(&Self::Item) -> K, + K: PartialEq,

Return an iterable that can group iterator elements. +Consecutive elements that map to the same key (“runs”), are assigned +to the same group. Read more
source§

fn chunks(self, size: usize) -> IntoChunks<Self>
where + Self: Sized,

Return an iterable that can chunk the iterator. Read more
source§

fn tuple_windows<T>(self) -> TupleWindows<Self, T>
where + Self: Sized + Iterator<Item = <T as TupleCollect>::Item>, + T: HomogeneousTuple, + <T as TupleCollect>::Item: Clone,

Return an iterator over all contiguous windows producing tuples of +a specific size (up to 12). Read more
source§

fn circular_tuple_windows<T>(self) -> CircularTupleWindows<Self, T>
where + Self: Sized + Clone + Iterator<Item = <T as TupleCollect>::Item> + ExactSizeIterator, + T: TupleCollect + Clone, + <T as TupleCollect>::Item: Clone,

Return an iterator over all windows, wrapping back to the first +elements when the window would otherwise exceed the length of the +iterator, producing tuples of a specific size (up to 12). Read more
source§

fn tuples<T>(self) -> Tuples<Self, T>
where + Self: Sized + Iterator<Item = <T as TupleCollect>::Item>, + T: HomogeneousTuple,

Return an iterator that groups the items in tuples of a specific size +(up to 12). Read more
source§

fn tee(self) -> (Tee<Self>, Tee<Self>)
where + Self: Sized, + Self::Item: Clone,

Split into an iterator pair that both yield all elements from +the original iterator. Read more
source§

fn step(self, n: usize) -> Step<Self>
where + Self: Sized,

👎Deprecated since 0.8.0: Use std .step_by() instead
Return an iterator adaptor that steps n elements in the base iterator +for each iteration. Read more
source§

fn map_into<R>(self) -> MapSpecialCase<Self, MapSpecialCaseFnInto<R>>
where + Self: Sized, + Self::Item: Into<R>,

Convert each item of the iterator using the Into trait. Read more
source§

fn map_results<F, T, U, E>( + self, + f: F, +) -> MapSpecialCase<Self, MapSpecialCaseFnOk<F>>
where + Self: Sized + Iterator<Item = Result<T, E>>, + F: FnMut(T) -> U,

👎Deprecated since 0.10.0: Use .map_ok() instead
source§

fn map_ok<F, T, U, E>(self, f: F) -> MapSpecialCase<Self, MapSpecialCaseFnOk<F>>
where + Self: Sized + Iterator<Item = Result<T, E>>, + F: FnMut(T) -> U,

Return an iterator adaptor that applies the provided closure +to every Result::Ok value. Result::Err values are +unchanged. Read more
source§

fn filter_ok<F, T, E>(self, f: F) -> FilterOk<Self, F>
where + Self: Sized + Iterator<Item = Result<T, E>>, + F: FnMut(&T) -> bool,

Return an iterator adaptor that filters every Result::Ok +value with the provided closure. Result::Err values are +unchanged. Read more
source§

fn filter_map_ok<F, T, U, E>(self, f: F) -> FilterMapOk<Self, F>
where + Self: Sized + Iterator<Item = Result<T, E>>, + F: FnMut(T) -> Option<U>,

Return an iterator adaptor that filters and transforms every +Result::Ok value with the provided closure. Result::Err +values are unchanged. Read more
source§

fn flatten_ok<T, E>(self) -> FlattenOk<Self, T, E>
where + Self: Sized + Iterator<Item = Result<T, E>>, + T: IntoIterator,

Return an iterator adaptor that flattens every Result::Ok value into +a series of Result::Ok values. Result::Err values are unchanged. Read more
source§

fn merge<J>( + self, + other: J, +) -> MergeBy<Self, <J as IntoIterator>::IntoIter, MergeLte>
where + Self: Sized, + Self::Item: PartialOrd, + J: IntoIterator<Item = Self::Item>,

Return an iterator adaptor that merges the two base iterators in +ascending order. If both base iterators are sorted (ascending), the +result is sorted. Read more
source§

fn merge_by<J, F>( + self, + other: J, + is_first: F, +) -> MergeBy<Self, <J as IntoIterator>::IntoIter, F>
where + Self: Sized, + J: IntoIterator<Item = Self::Item>, + F: FnMut(&Self::Item, &Self::Item) -> bool,

Return an iterator adaptor that merges the two base iterators in order. +This is much like .merge() but allows for a custom ordering. Read more
source§

fn merge_join_by<J, F>( + self, + other: J, + cmp_fn: F, +) -> MergeJoinBy<Self, <J as IntoIterator>::IntoIter, F>
where + J: IntoIterator, + F: FnMut(&Self::Item, &<J as IntoIterator>::Item) -> Ordering, + Self: Sized,

Create an iterator that merges items from both this and the specified +iterator in ascending order. Read more
source§

fn kmerge(self) -> KMergeBy<<Self::Item as IntoIterator>::IntoIter, KMergeByLt>
where + Self: Sized, + Self::Item: IntoIterator, + <Self::Item as IntoIterator>::Item: PartialOrd,

Return an iterator adaptor that flattens an iterator of iterators by +merging them in ascending order. Read more
source§

fn kmerge_by<F>( + self, + first: F, +) -> KMergeBy<<Self::Item as IntoIterator>::IntoIter, F>
where + Self: Sized, + Self::Item: IntoIterator, + F: FnMut(&<Self::Item as IntoIterator>::Item, &<Self::Item as IntoIterator>::Item) -> bool,

Return an iterator adaptor that flattens an iterator of iterators by +merging them according to the given closure. Read more
source§

fn cartesian_product<J>( + self, + other: J, +) -> Product<Self, <J as IntoIterator>::IntoIter>
where + Self: Sized, + Self::Item: Clone, + J: IntoIterator, + <J as IntoIterator>::IntoIter: Clone,

Return an iterator adaptor that iterates over the cartesian product of +the element sets of two iterators self and J. Read more
source§

fn multi_cartesian_product( + self, +) -> MultiProduct<<Self::Item as IntoIterator>::IntoIter>
where + Self: Sized, + Self::Item: IntoIterator, + <Self::Item as IntoIterator>::IntoIter: Clone, + <Self::Item as IntoIterator>::Item: Clone,

Return an iterator adaptor that iterates over the cartesian product of +all subiterators returned by meta-iterator self. Read more
source§

fn coalesce<F>(self, f: F) -> CoalesceBy<Self, F, Self::Item>
where + Self: Sized, + F: FnMut(Self::Item, Self::Item) -> Result<Self::Item, (Self::Item, Self::Item)>,

Return an iterator adaptor that uses the passed-in closure to +optionally merge together consecutive elements. Read more
source§

fn dedup(self) -> CoalesceBy<Self, DedupPred2CoalescePred<DedupEq>, Self::Item>
where + Self: Sized, + Self::Item: PartialEq,

Remove duplicates from sections of consecutive identical elements. +If the iterator is sorted, all elements will be unique. Read more
source§

fn dedup_by<Cmp>( + self, + cmp: Cmp, +) -> CoalesceBy<Self, DedupPred2CoalescePred<Cmp>, Self::Item>
where + Self: Sized, + Cmp: FnMut(&Self::Item, &Self::Item) -> bool,

Remove duplicates from sections of consecutive identical elements, +determining equality using a comparison function. +If the iterator is sorted, all elements will be unique. Read more
source§

fn dedup_with_count( + self, +) -> CoalesceBy<Self, DedupPredWithCount2CoalescePred<DedupEq>, (usize, Self::Item)>
where + Self: Sized,

Remove duplicates from sections of consecutive identical elements, while keeping a count of +how many repeated elements were present. +If the iterator is sorted, all elements will be unique. Read more
source§

fn dedup_by_with_count<Cmp>( + self, + cmp: Cmp, +) -> CoalesceBy<Self, DedupPredWithCount2CoalescePred<Cmp>, (usize, Self::Item)>
where + Self: Sized, + Cmp: FnMut(&Self::Item, &Self::Item) -> bool,

Remove duplicates from sections of consecutive identical elements, while keeping a count of +how many repeated elements were present. +This will determine equality using a comparison function. +If the iterator is sorted, all elements will be unique. Read more
source§

fn duplicates(self) -> DuplicatesBy<Self, Self::Item, ById>
where + Self: Sized, + Self::Item: Eq + Hash,

Return an iterator adaptor that produces elements that appear more than once during the +iteration. Duplicates are detected using hash and equality. Read more
source§

fn duplicates_by<V, F>(self, f: F) -> DuplicatesBy<Self, V, ByFn<F>>
where + Self: Sized, + V: Eq + Hash, + F: FnMut(&Self::Item) -> V,

Return an iterator adaptor that produces elements that appear more than once during the +iteration. Duplicates are detected using hash and equality. Read more
source§

fn unique(self) -> Unique<Self>
where + Self: Sized, + Self::Item: Clone + Eq + Hash,

Return an iterator adaptor that filters out elements that have +already been produced once during the iteration. Duplicates +are detected using hash and equality. Read more
source§

fn unique_by<V, F>(self, f: F) -> UniqueBy<Self, V, F>
where + Self: Sized, + V: Eq + Hash, + F: FnMut(&Self::Item) -> V,

Return an iterator adaptor that filters out elements that have +already been produced once during the iteration. Read more
source§

fn peeking_take_while<F>(&mut self, accept: F) -> PeekingTakeWhile<'_, Self, F>
where + Self: Sized + PeekingNext, + F: FnMut(&Self::Item) -> bool,

Return an iterator adaptor that borrows from this iterator and +takes items while the closure accept returns true. Read more
source§

fn take_while_ref<F>(&mut self, accept: F) -> TakeWhileRef<'_, Self, F>
where + Self: Clone, + F: FnMut(&Self::Item) -> bool,

Return an iterator adaptor that borrows from a Clone-able iterator +to only pick off elements while the predicate accept returns true. Read more
source§

fn while_some<A>(self) -> WhileSome<Self>
where + Self: Sized + Iterator<Item = Option<A>>,

Return an iterator adaptor that filters Option<A> iterator elements +and produces A. Stops on the first None encountered. Read more
source§

fn tuple_combinations<T>(self) -> TupleCombinations<Self, T>
where + Self: Sized + Clone, + Self::Item: Clone, + T: HasCombination<Self>,

Return an iterator adaptor that iterates over the combinations of the +elements from an iterator. Read more
source§

fn combinations(self, k: usize) -> Combinations<Self>
where + Self: Sized, + Self::Item: Clone,

Return an iterator adaptor that iterates over the k-length combinations of +the elements from an iterator. Read more
source§

fn combinations_with_replacement( + self, + k: usize, +) -> CombinationsWithReplacement<Self>
where + Self: Sized, + Self::Item: Clone,

Return an iterator that iterates over the k-length combinations of +the elements from an iterator, with replacement. Read more
source§

fn permutations(self, k: usize) -> Permutations<Self>
where + Self: Sized, + Self::Item: Clone,

Return an iterator adaptor that iterates over all k-permutations of the +elements from an iterator. Read more
source§

fn powerset(self) -> Powerset<Self>
where + Self: Sized, + Self::Item: Clone,

Return an iterator that iterates through the powerset of the elements from an +iterator. Read more
source§

fn pad_using<F>(self, min: usize, f: F) -> PadUsing<Self, F>
where + Self: Sized, + F: FnMut(usize) -> Self::Item,

Return an iterator adaptor that pads the sequence to a minimum length of +min by filling missing elements using a closure f. Read more
source§

fn with_position(self) -> WithPosition<Self>
where + Self: Sized,

Return an iterator adaptor that wraps each element in a Position to +ease special-case handling of the first or last elements. Read more
source§

fn positions<P>(self, predicate: P) -> Positions<Self, P>
where + Self: Sized, + P: FnMut(Self::Item) -> bool,

Return an iterator adaptor that yields the indices of all elements +satisfying a predicate, counted from the start of the iterator. Read more
source§

fn update<F>(self, updater: F) -> Update<Self, F>
where + Self: Sized, + F: FnMut(&mut Self::Item),

Return an iterator adaptor that applies a mutating function +to each element before yielding it. Read more
source§

fn next_tuple<T>(&mut self) -> Option<T>
where + Self: Sized + Iterator<Item = <T as TupleCollect>::Item>, + T: HomogeneousTuple,

Advances the iterator and returns the next items grouped in a tuple of +a specific size (up to 12). Read more
source§

fn collect_tuple<T>(self) -> Option<T>
where + Self: Sized + Iterator<Item = <T as TupleCollect>::Item>, + T: HomogeneousTuple,

Collects all items from the iterator into a tuple of a specific size +(up to 12). Read more
source§

fn find_position<P>(&mut self, pred: P) -> Option<(usize, Self::Item)>
where + P: FnMut(&Self::Item) -> bool,

Find the position and value of the first element satisfying a predicate. Read more
source§

fn find_or_last<P>(self, predicate: P) -> Option<Self::Item>
where + Self: Sized, + P: FnMut(&Self::Item) -> bool,

Find the value of the first element satisfying a predicate or return the last element, if any. Read more
source§

fn find_or_first<P>(self, predicate: P) -> Option<Self::Item>
where + Self: Sized, + P: FnMut(&Self::Item) -> bool,

Find the value of the first element satisfying a predicate or return the first element, if any. Read more
source§

fn contains<Q>(&mut self, query: &Q) -> bool
where + Self: Sized, + Self::Item: Borrow<Q>, + Q: PartialEq,

Returns true if the given item is present in this iterator. Read more
source§

fn all_equal(&mut self) -> bool
where + Self: Sized, + Self::Item: PartialEq,

Check whether all elements compare equal. Read more
source§

fn all_unique(&mut self) -> bool
where + Self: Sized, + Self::Item: Eq + Hash,

Check whether all elements are unique (non equal). Read more
source§

fn dropping(self, n: usize) -> Self
where + Self: Sized,

Consume the first n elements from the iterator eagerly, +and return the same iterator again. Read more
source§

fn dropping_back(self, n: usize) -> Self
where + Self: Sized + DoubleEndedIterator,

Consume the last n elements from the iterator eagerly, +and return the same iterator again. Read more
source§

fn foreach<F>(self, f: F)
where + F: FnMut(Self::Item), + Self: Sized,

👎Deprecated since 0.8.0: Use .for_each() instead
Run the closure f eagerly on each element of the iterator. Read more
source§

fn concat(self) -> Self::Item
where + Self: Sized, + Self::Item: Extend<<Self::Item as IntoIterator>::Item> + IntoIterator + Default,

Combine all an iterator’s elements into one element by using Extend. Read more
source§

fn collect_vec(self) -> Vec<Self::Item>
where + Self: Sized,

.collect_vec() is simply a type specialization of Iterator::collect, +for convenience.
source§

fn try_collect<T, U, E>(self) -> Result<U, E>
where + Self: Sized + Iterator<Item = Result<T, E>>, + Result<U, E>: FromIterator<Result<T, E>>,

.try_collect() is more convenient way of writing +.collect::<Result<_, _>>() Read more
source§

fn set_from<'a, A, J>(&mut self, from: J) -> usize
where + A: 'a, + Self: Iterator<Item = &'a mut A>, + J: IntoIterator<Item = A>,

Assign to each reference in self from the from iterator, +stopping at the shortest of the two iterators. Read more
source§

fn join(&mut self, sep: &str) -> String
where + Self::Item: Display,

Combine all iterator elements into one String, separated by sep. Read more
source§

fn format(self, sep: &str) -> Format<'_, Self>
where + Self: Sized,

Format all iterator elements, separated by sep. Read more
source§

fn format_with<F>(self, sep: &str, format: F) -> FormatWith<'_, Self, F>
where + Self: Sized, + F: FnMut(Self::Item, &mut dyn FnMut(&dyn Display) -> Result<(), Error>) -> Result<(), Error>,

Format all iterator elements, separated by sep. Read more
source§

fn fold_results<A, E, B, F>(&mut self, start: B, f: F) -> Result<B, E>
where + Self: Iterator<Item = Result<A, E>>, + F: FnMut(B, A) -> B,

👎Deprecated since 0.10.0: Use .fold_ok() instead
source§

fn fold_ok<A, E, B, F>(&mut self, start: B, f: F) -> Result<B, E>
where + Self: Iterator<Item = Result<A, E>>, + F: FnMut(B, A) -> B,

Fold Result values from an iterator. Read more
source§

fn fold_options<A, B, F>(&mut self, start: B, f: F) -> Option<B>
where + Self: Iterator<Item = Option<A>>, + F: FnMut(B, A) -> B,

Fold Option values from an iterator. Read more
source§

fn fold1<F>(self, f: F) -> Option<Self::Item>
where + F: FnMut(Self::Item, Self::Item) -> Self::Item, + Self: Sized,

👎Deprecated since 0.10.2: Use Iterator::reduce instead
Accumulator of the elements in the iterator. Read more
source§

fn tree_fold1<F>(self, f: F) -> Option<Self::Item>
where + F: FnMut(Self::Item, Self::Item) -> Self::Item, + Self: Sized,

Accumulate the elements in the iterator in a tree-like manner. Read more
source§

fn fold_while<B, F>(&mut self, init: B, f: F) -> FoldWhile<B>
where + Self: Sized, + F: FnMut(B, Self::Item) -> FoldWhile<B>,

An iterator method that applies a function, producing a single, final value. Read more
source§

fn sum1<S>(self) -> Option<S>
where + Self: Sized, + S: Sum<Self::Item>,

Iterate over the entire iterator and add all the elements. Read more
source§

fn product1<P>(self) -> Option<P>
where + Self: Sized, + P: Product<Self::Item>,

Iterate over the entire iterator and multiply all the elements. Read more
source§

fn sorted_unstable(self) -> IntoIter<Self::Item>
where + Self: Sized, + Self::Item: Ord,

Sort all iterator elements into a new iterator in ascending order. Read more
source§

fn sorted_unstable_by<F>(self, cmp: F) -> IntoIter<Self::Item>
where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> Ordering,

Sort all iterator elements into a new iterator in ascending order. Read more
source§

fn sorted_unstable_by_key<K, F>(self, f: F) -> IntoIter<Self::Item>
where + Self: Sized, + K: Ord, + F: FnMut(&Self::Item) -> K,

Sort all iterator elements into a new iterator in ascending order. Read more
source§

fn sorted(self) -> IntoIter<Self::Item>
where + Self: Sized, + Self::Item: Ord,

Sort all iterator elements into a new iterator in ascending order. Read more
source§

fn sorted_by<F>(self, cmp: F) -> IntoIter<Self::Item>
where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> Ordering,

Sort all iterator elements into a new iterator in ascending order. Read more
source§

fn sorted_by_key<K, F>(self, f: F) -> IntoIter<Self::Item>
where + Self: Sized, + K: Ord, + F: FnMut(&Self::Item) -> K,

Sort all iterator elements into a new iterator in ascending order. Read more
source§

fn sorted_by_cached_key<K, F>(self, f: F) -> IntoIter<Self::Item>
where + Self: Sized, + K: Ord, + F: FnMut(&Self::Item) -> K,

Sort all iterator elements into a new iterator in ascending order. The key function is +called exactly once per key. Read more
source§

fn k_smallest(self, k: usize) -> IntoIter<Self::Item>
where + Self: Sized, + Self::Item: Ord,

Sort the k smallest elements into a new iterator, in ascending order. Read more
source§

fn partition_map<A, B, F, L, R>(self, predicate: F) -> (A, B)
where + Self: Sized, + F: FnMut(Self::Item) -> Either<L, R>, + A: Default + Extend<L>, + B: Default + Extend<R>,

Collect all iterator elements into one of two +partitions. Unlike Iterator::partition, each partition may +have a distinct type. Read more
source§

fn partition_result<A, B, T, E>(self) -> (A, B)
where + Self: Sized + Iterator<Item = Result<T, E>>, + A: Default + Extend<T>, + B: Default + Extend<E>,

Partition a sequence of Results into one list of all the Ok elements +and another list of all the Err elements. Read more
source§

fn into_group_map<K, V>(self) -> HashMap<K, Vec<V>>
where + Self: Sized + Iterator<Item = (K, V)>, + K: Hash + Eq,

Return a HashMap of keys mapped to Vecs of values. Keys and values +are taken from (Key, Value) tuple pairs yielded by the input iterator. Read more
source§

fn into_group_map_by<K, V, F>(self, f: F) -> HashMap<K, Vec<V>>
where + Self: Sized + Iterator<Item = V>, + K: Hash + Eq, + F: Fn(&V) -> K,

Return an Iterator on a HashMap. Keys mapped to Vecs of values. The key is specified +in the closure. Read more
source§

fn into_grouping_map<K, V>(self) -> GroupingMap<Self>
where + Self: Sized + Iterator<Item = (K, V)>, + K: Hash + Eq,

Constructs a GroupingMap to be used later with one of the efficient +group-and-fold operations it allows to perform. Read more
source§

fn into_grouping_map_by<K, V, F>( + self, + key_mapper: F, +) -> GroupingMap<MapForGrouping<Self, F>>
where + Self: Sized + Iterator<Item = V>, + K: Hash + Eq, + F: FnMut(&V) -> K,

Constructs a GroupingMap to be used later with one of the efficient +group-and-fold operations it allows to perform. Read more
source§

fn min_set(self) -> Vec<Self::Item>
where + Self: Sized, + Self::Item: Ord,

Return all minimum elements of an iterator. Read more
source§

fn min_set_by<F>(self, compare: F) -> Vec<Self::Item>
where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> Ordering,

Return all minimum elements of an iterator, as determined by +the specified function. Read more
source§

fn min_set_by_key<K, F>(self, key: F) -> Vec<Self::Item>
where + Self: Sized, + K: Ord, + F: FnMut(&Self::Item) -> K,

Return all minimum elements of an iterator, as determined by +the specified function. Read more
source§

fn max_set(self) -> Vec<Self::Item>
where + Self: Sized, + Self::Item: Ord,

Return all maximum elements of an iterator. Read more
source§

fn max_set_by<F>(self, compare: F) -> Vec<Self::Item>
where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> Ordering,

Return all maximum elements of an iterator, as determined by +the specified function. Read more
source§

fn max_set_by_key<K, F>(self, key: F) -> Vec<Self::Item>
where + Self: Sized, + K: Ord, + F: FnMut(&Self::Item) -> K,

Return all minimum elements of an iterator, as determined by +the specified function. Read more
source§

fn minmax(self) -> MinMaxResult<Self::Item>
where + Self: Sized, + Self::Item: PartialOrd,

Return the minimum and maximum elements in the iterator. Read more
source§

fn minmax_by_key<K, F>(self, key: F) -> MinMaxResult<Self::Item>
where + Self: Sized, + K: PartialOrd, + F: FnMut(&Self::Item) -> K,

Return the minimum and maximum element of an iterator, as determined by +the specified function. Read more
source§

fn minmax_by<F>(self, compare: F) -> MinMaxResult<Self::Item>
where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> Ordering,

Return the minimum and maximum element of an iterator, as determined by +the specified comparison function. Read more
source§

fn position_max(self) -> Option<usize>
where + Self: Sized, + Self::Item: Ord,

Return the position of the maximum element in the iterator. Read more
source§

fn position_max_by_key<K, F>(self, key: F) -> Option<usize>
where + Self: Sized, + K: Ord, + F: FnMut(&Self::Item) -> K,

Return the position of the maximum element in the iterator, as +determined by the specified function. Read more
source§

fn position_max_by<F>(self, compare: F) -> Option<usize>
where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> Ordering,

Return the position of the maximum element in the iterator, as +determined by the specified comparison function. Read more
source§

fn position_min(self) -> Option<usize>
where + Self: Sized, + Self::Item: Ord,

Return the position of the minimum element in the iterator. Read more
source§

fn position_min_by_key<K, F>(self, key: F) -> Option<usize>
where + Self: Sized, + K: Ord, + F: FnMut(&Self::Item) -> K,

Return the position of the minimum element in the iterator, as +determined by the specified function. Read more
source§

fn position_min_by<F>(self, compare: F) -> Option<usize>
where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> Ordering,

Return the position of the minimum element in the iterator, as +determined by the specified comparison function. Read more
source§

fn position_minmax(self) -> MinMaxResult<usize>
where + Self: Sized, + Self::Item: PartialOrd,

Return the positions of the minimum and maximum elements in +the iterator. Read more
source§

fn position_minmax_by_key<K, F>(self, key: F) -> MinMaxResult<usize>
where + Self: Sized, + K: PartialOrd, + F: FnMut(&Self::Item) -> K,

Return the postions of the minimum and maximum elements of an +iterator, as determined by the specified function. Read more
source§

fn position_minmax_by<F>(self, compare: F) -> MinMaxResult<usize>
where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> Ordering,

Return the postions of the minimum and maximum elements of an +iterator, as determined by the specified comparison function. Read more
source§

fn exactly_one(self) -> Result<Self::Item, ExactlyOneError<Self>>
where + Self: Sized,

If the iterator yields exactly one element, that element will be returned, otherwise +an error will be returned containing an iterator that has the same output as the input +iterator. Read more
source§

fn at_most_one(self) -> Result<Option<Self::Item>, ExactlyOneError<Self>>
where + Self: Sized,

If the iterator yields no elements, Ok(None) will be returned. If the iterator yields +exactly one element, that element will be returned, otherwise an error will be returned +containing an iterator that has the same output as the input iterator. Read more
source§

fn multipeek(self) -> MultiPeek<Self>
where + Self: Sized,

An iterator adaptor that allows the user to peek at multiple .next() +values without advancing the base iterator. Read more
source§

fn counts(self) -> HashMap<Self::Item, usize>
where + Self: Sized, + Self::Item: Eq + Hash,

Collect the items in this iterator and return a HashMap which +contains each item that appears in the iterator and the number +of times it appears. Read more
source§

fn counts_by<K, F>(self, f: F) -> HashMap<K, usize>
where + Self: Sized, + K: Eq + Hash, + F: FnMut(Self::Item) -> K,

Collect the items in this iterator and return a HashMap which +contains each item that appears in the iterator and the number +of times it appears, +determining identity using a keying function. Read more
source§

fn multiunzip<FromI>(self) -> FromI
where + Self: Sized + MultiUnzip<FromI>,

Converts an iterator of tuples into a tuple of containers. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_parser/struct.AIRParser.html b/air_parser/struct.AIRParser.html new file mode 100644 index 00000000..3bd65ec7 --- /dev/null +++ b/air_parser/struct.AIRParser.html @@ -0,0 +1,22 @@ +AIRParser in air_parser - Rust

Struct air_parser::AIRParser

source ·
pub struct AIRParser { /* private fields */ }

Implementations§

source§

impl AIRParser

source

pub fn new() -> AIRParser

source

pub fn parse<'err, 'input, 'v, __TOKEN: __ToTriple<'err, 'input, 'v>, __TOKENS: IntoIterator<Item = __TOKEN>>( + &self, + input: &'input str, + errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>, + validator: &'v mut VariableValidator<'input>, + __tokens0: __TOKENS, +) -> Result<Instruction<'input>, ParseError<AirPos, Token<'input>, ParserError>>

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_parser/struct.AirPos.html b/air_parser/struct.AirPos.html new file mode 100644 index 00000000..8fdb460b --- /dev/null +++ b/air_parser/struct.AirPos.html @@ -0,0 +1,35 @@ +AirPos in air_parser - Rust

Struct air_parser::AirPos

source ·
pub struct AirPos(/* private fields */);
Expand description

Character position in the AIR script text.

+

Trait Implementations§

source§

impl Add<usize> for AirPos

§

type Output = AirPos

The resulting type after applying the + operator.
source§

fn add(self, rhs: usize) -> Self::Output

Performs the + operation. Read more
source§

impl Clone for AirPos

source§

fn clone(&self) -> AirPos

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for AirPos

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Default for AirPos

source§

fn default() -> AirPos

Returns the “default value” for a type. Read more
source§

impl<'de> Deserialize<'de> for AirPos

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl Display for AirPos

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl From<AirPos> for usize

source§

fn from(p: AirPos) -> Self

Converts to this type from the input type.
source§

impl From<usize> for AirPos

source§

fn from(value: usize) -> Self

Converts to this type from the input type.
source§

impl Hash for AirPos

source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
source§

impl Ord for AirPos

source§

fn cmp(&self, other: &AirPos) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · source§

fn max(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · source§

fn min(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · source§

fn clamp(self, min: Self, max: Self) -> Self
where + Self: Sized + PartialOrd,

Restrict a value to a certain interval. Read more
source§

impl PartialEq<usize> for AirPos

source§

fn eq(&self, other: &usize) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl PartialEq for AirPos

source§

fn eq(&self, other: &AirPos) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl PartialOrd for AirPos

source§

fn partial_cmp(&self, other: &AirPos) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · source§

fn lt(&self, other: &Rhs) -> bool

This method tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · source§

fn le(&self, other: &Rhs) -> bool

This method tests less than or equal to (for self and other) and is used by the <= +operator. Read more
1.0.0 · source§

fn gt(&self, other: &Rhs) -> bool

This method tests greater than (for self and other) and is used by the > operator. Read more
1.0.0 · source§

fn ge(&self, other: &Rhs) -> bool

This method tests greater than or equal to (for self and other) and is used by the >= +operator. Read more
source§

impl Serialize for AirPos

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Sub<usize> for AirPos

§

type Output = AirPos

The resulting type after applying the - operator.
source§

fn sub(self, rhs: usize) -> Self::Output

Performs the - operation. Read more
source§

impl Sub for AirPos

§

type Output = usize

The resulting type after applying the - operator.
source§

fn sub(self, rhs: AirPos) -> Self::Output

Performs the - operation. Read more
source§

impl Copy for AirPos

source§

impl Eq for AirPos

source§

impl StructuralPartialEq for AirPos

Auto Trait Implementations§

§

impl Freeze for AirPos

§

impl RefUnwindSafe for AirPos

§

impl Send for AirPos

§

impl Sync for AirPos

§

impl Unpin for AirPos

§

impl UnwindSafe for AirPos

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
source§

impl<T> CloneToUninit for T
where + T: Copy,

source§

unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_parser/struct.VariableValidator.html b/air_parser/struct.VariableValidator.html new file mode 100644 index 00000000..6a7cb895 --- /dev/null +++ b/air_parser/struct.VariableValidator.html @@ -0,0 +1,23 @@ +VariableValidator in air_parser - Rust

Struct air_parser::VariableValidator

source ·
pub struct VariableValidator<'i> { /* private fields */ }
Expand description

Intermediate implementation of variable validator.

+

It is intended to track variables (i.e., those that were defined as +a result of the call instruction) and iterables (i.e., those X’s defined +in a fold array X call).

+

Validator will catch any undefined variables or iterables and raise an error.

+

Implementations§

source§

impl<'i> VariableValidator<'i>

source

pub fn new() -> Self

Trait Implementations§

source§

impl<'i> Clone for VariableValidator<'i>

source§

fn clone(&self) -> VariableValidator<'i>

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl<'i> Debug for VariableValidator<'i>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'i> Default for VariableValidator<'i>

source§

fn default() -> VariableValidator<'i>

Returns the “default value” for a type. Read more

Auto Trait Implementations§

§

impl<'i> Freeze for VariableValidator<'i>

§

impl<'i> RefUnwindSafe for VariableValidator<'i>

§

impl<'i> Send for VariableValidator<'i>

§

impl<'i> Sync for VariableValidator<'i>

§

impl<'i> Unpin for VariableValidator<'i>

§

impl<'i> UnwindSafe for VariableValidator<'i>

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_test_framework/all.html b/air_test_framework/all.html new file mode 100644 index 00000000..e4071c3d --- /dev/null +++ b/air_test_framework/all.html @@ -0,0 +1 @@ +List of all items in this crate
\ No newline at end of file diff --git a/air_test_framework/asserts/enum.ServiceDefinition.html b/air_test_framework/asserts/enum.ServiceDefinition.html new file mode 100644 index 00000000..7e3c7ea6 --- /dev/null +++ b/air_test_framework/asserts/enum.ServiceDefinition.html @@ -0,0 +1,65 @@ +ServiceDefinition in air_test_framework::asserts - Rust

Enum air_test_framework::asserts::ServiceDefinition

source ·
pub enum ServiceDefinition {
+    Ok(JValue),
+    Error(CallServiceResult),
+    SeqOk {
+        call_number_seq: Cell<usize>,
+        call_map: HashMap<String, JValue>,
+    },
+    SeqError {
+        call_number_seq: Cell<usize>,
+        call_map: HashMap<String, CallServiceResult>,
+    },
+    Behaviour(Behavior),
+    DbgBehaviour(Behavior),
+    Map(HashMap<String, JValue>),
+}
Expand description

Service definition in the testing framework comment DSL.

+

Variants§

§

Ok(JValue)

Simple service that returns same value

+
§

Error(CallServiceResult)

Simple service that returns same call result (i.e. may return a error)

+
§

SeqOk

Service that may return a new value on subsequent call. Its keys are either +call number string starting from “0”, or “default”.

+

Fields

§call_number_seq: Cell<usize>
§call_map: HashMap<String, JValue>
§

SeqError

Fields

§call_number_seq: Cell<usize>
§

Behaviour(Behavior)

Some known service by name: “echo”, “unit” (more to follow).

+
§

DbgBehaviour(Behavior)

Same services as defined by the enum element above with dbg! applied to the arguments.

+
§

Map(HashMap<String, JValue>)

Maps first argument to a value

+

Implementations§

source§

impl ServiceDefinition

source

pub fn ok(value: JValue) -> Self

source

pub fn error(value: CallServiceResult) -> Self

source

pub fn seq_ok(call_map: HashMap<String, JValue>) -> Self

source

pub fn seq_error(call_map: HashMap<String, CallServiceResult>) -> Self

source

pub fn behaviour(name: Behavior) -> Self

source

pub fn map(map: HashMap<String, JValue>) -> Self

source

pub async fn call(&self, params: CallRequestParams) -> CallServiceResult

Trait Implementations§

source§

impl Clone for ServiceDefinition

source§

fn clone(&self) -> ServiceDefinition

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for ServiceDefinition

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'_enum> From<&'_enum ServiceDefinition> for ServiceTagName

source§

fn from(val: &'_enum ServiceDefinition) -> ServiceTagName

Converts to this type from the input type.
source§

impl From<ServiceDefinition> for ServiceTagName

source§

fn from(val: ServiceDefinition) -> ServiceTagName

Converts to this type from the input type.
source§

impl FromStr for ServiceDefinition

§

type Err = String

The associated error which can be returned from parsing.
source§

fn from_str(s: &str) -> Result<Self, Self::Err>

Parses a string s to return a value of this type. Read more
source§

impl PartialEq for ServiceDefinition

source§

fn eq(&self, other: &ServiceDefinition) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl Eq for ServiceDefinition

source§

impl StructuralPartialEq for ServiceDefinition

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_test_framework/asserts/enum.ServiceTagName.html b/air_test_framework/asserts/enum.ServiceTagName.html new file mode 100644 index 00000000..798bd8ab --- /dev/null +++ b/air_test_framework/asserts/enum.ServiceTagName.html @@ -0,0 +1,62 @@ +ServiceTagName in air_test_framework::asserts - Rust

Enum air_test_framework::asserts::ServiceTagName

source ·
pub enum ServiceTagName {
+    Ok,
+    Error,
+    SeqOk,
+    SeqError,
+    Behaviour,
+    DbgBehaviour,
+    Map,
+}
Expand description

Auto-generated discriminant enum variants

+

Variants§

§

Ok

Simple service that returns same value

+
§

Error

Simple service that returns same call result (i.e. may return a error)

+
§

SeqOk

Service that may return a new value on subsequent call. Its keys are either +call number string starting from “0”, or “default”.

+
§

SeqError

§

Behaviour

Some known service by name: “echo”, “unit” (more to follow).

+
§

DbgBehaviour

Same services as defined by the enum element above with dbg! applied to the arguments.

+
§

Map

Maps first argument to a value

+

Trait Implementations§

source§

impl AsRef<str> for ServiceTagName

source§

fn as_ref(&self) -> &str

Converts this type into a shared reference of the (usually inferred) input type.
source§

impl Clone for ServiceTagName

source§

fn clone(&self) -> ServiceTagName

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for ServiceTagName

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'_enum> From<&'_enum ServiceDefinition> for ServiceTagName

source§

fn from(val: &'_enum ServiceDefinition) -> ServiceTagName

Converts to this type from the input type.
source§

impl From<ServiceDefinition> for ServiceTagName

source§

fn from(val: ServiceDefinition) -> ServiceTagName

Converts to this type from the input type.
source§

impl FromStr for ServiceTagName

§

type Err = ParseError

The associated error which can be returned from parsing.
source§

fn from_str(s: &str) -> Result<ServiceTagName, <Self as FromStr>::Err>

Parses a string s to return a value of this type. Read more
source§

impl PartialEq for ServiceTagName

source§

fn eq(&self, other: &ServiceTagName) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl TryFrom<&str> for ServiceTagName

§

type Error = ParseError

The type returned in the event of a conversion error.
source§

fn try_from(s: &str) -> Result<ServiceTagName, <Self as TryFrom<&str>>::Error>

Performs the conversion.
source§

impl Copy for ServiceTagName

source§

impl Eq for ServiceTagName

source§

impl StructuralPartialEq for ServiceTagName

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
§

impl<S> AsComponentExternName for S
where + S: AsRef<str>,

§

fn as_component_extern_name(&self) -> ComponentExternName<'_>

Converts this receiver into a ComponentExternName.
§

impl<S> AsComponentExternName for S
where + S: AsRef<str>,

§

fn as_component_extern_name(&self) -> ComponentExternName<'_>

Converts this receiver into a ComponentExternName.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
source§

impl<T> CloneToUninit for T
where + T: Copy,

source§

unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_test_framework/asserts/index.html b/air_test_framework/asserts/index.html new file mode 100644 index 00000000..67945cae --- /dev/null +++ b/air_test_framework/asserts/index.html @@ -0,0 +1 @@ +air_test_framework::asserts - Rust

Module air_test_framework::asserts

source ·

Enums§

\ No newline at end of file diff --git a/air_test_framework/asserts/sidebar-items.js b/air_test_framework/asserts/sidebar-items.js new file mode 100644 index 00000000..0b3605f8 --- /dev/null +++ b/air_test_framework/asserts/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"enum":["ServiceDefinition","ServiceTagName"]}; \ No newline at end of file diff --git a/air_test_framework/ephemeral/index.html b/air_test_framework/ephemeral/index.html new file mode 100644 index 00000000..3907a863 --- /dev/null +++ b/air_test_framework/ephemeral/index.html @@ -0,0 +1 @@ +air_test_framework::ephemeral - Rust

Module air_test_framework::ephemeral

source ·

Modules§

Structs§

Type Aliases§

\ No newline at end of file diff --git a/air_test_framework/ephemeral/neighborhood/enum.AlterState.html b/air_test_framework/ephemeral/neighborhood/enum.AlterState.html new file mode 100644 index 00000000..6d0e792b --- /dev/null +++ b/air_test_framework/ephemeral/neighborhood/enum.AlterState.html @@ -0,0 +1,47 @@ +AlterState in air_test_framework::ephemeral::neighborhood - Rust
pub enum AlterState {
+    Added,
+    Removed,
+}

Variants§

§

Added

§

Removed

Trait Implementations§

source§

impl Clone for AlterState

source§

fn clone(&self) -> AlterState

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for AlterState

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl PartialEq for AlterState

source§

fn eq(&self, other: &AlterState) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl Copy for AlterState

source§

impl Eq for AlterState

source§

impl StructuralPartialEq for AlterState

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
source§

impl<T> CloneToUninit for T
where + T: Copy,

source§

unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_test_framework/ephemeral/neighborhood/index.html b/air_test_framework/ephemeral/neighborhood/index.html new file mode 100644 index 00000000..f04831f0 --- /dev/null +++ b/air_test_framework/ephemeral/neighborhood/index.html @@ -0,0 +1,2 @@ +air_test_framework::ephemeral::neighborhood - Rust

Module air_test_framework::ephemeral::neighborhood

source ·

Structs§

  • Neighbors of particular node, including set of nodes unreachable from this one (but they might be +reachable from others).

Enums§

\ No newline at end of file diff --git a/air_test_framework/ephemeral/neighborhood/sidebar-items.js b/air_test_framework/ephemeral/neighborhood/sidebar-items.js new file mode 100644 index 00000000..416c5947 --- /dev/null +++ b/air_test_framework/ephemeral/neighborhood/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"enum":["AlterState"],"struct":["Neighborhood","PeerEnv"]}; \ No newline at end of file diff --git a/air_test_framework/ephemeral/neighborhood/struct.Neighborhood.html b/air_test_framework/ephemeral/neighborhood/struct.Neighborhood.html new file mode 100644 index 00000000..09cb9d59 --- /dev/null +++ b/air_test_framework/ephemeral/neighborhood/struct.Neighborhood.html @@ -0,0 +1,39 @@ +Neighborhood in air_test_framework::ephemeral::neighborhood - Rust
pub struct Neighborhood<R = DefaultAirRunner> { /* private fields */ }
Expand description

Neighbors of particular node, including set of nodes unreachable from this one (but they might be +reachable from others).

+

Implementations§

source§

impl<R: AirRunner> Neighborhood<R>

source

pub fn new(network: &Rc<Network<R>>) -> Self

source

pub fn iter(&self) -> impl Iterator<Item = PeerId>

source

pub fn alter(&mut self, other_peer_id: impl Into<PeerId>, state: AlterState)

source

pub fn unalter<Id>(&mut self, other_peer_id: &Id)
where + PeerId: Borrow<Id>, + Id: Eq + Hash + ?Sized,

source

pub fn get_alter_state<Id>(&self, other_peer_id: &Id) -> Option<AlterState>
where + PeerId: Borrow<Id>, + Id: Eq + Hash + ?Sized,

source

pub fn set_target_unreachable(&mut self, target: impl Into<PeerId>)

source

pub fn unset_target_unreachable<Id>(&mut self, target: &Id)
where + PeerId: Borrow<Id>, + Id: Eq + Hash + ?Sized,

source

pub fn is_reachable(&self, target: impl Into<PeerId>) -> bool

Trait Implementations§

source§

impl<R: AirRunner> IntoIterator for &Neighborhood<R>

§

type Item = PeerId

The type of the elements being iterated over.
§

type IntoIter = IntoIter<PeerId>

Which kind of iterator are we turning this into?
source§

fn into_iter(self) -> Self::IntoIter

Creates an iterator from a value. Read more

Auto Trait Implementations§

§

impl<R> Freeze for Neighborhood<R>

§

impl<R = WasmAirRunner> !RefUnwindSafe for Neighborhood<R>

§

impl<R = WasmAirRunner> !Send for Neighborhood<R>

§

impl<R = WasmAirRunner> !Sync for Neighborhood<R>

§

impl<R> Unpin for Neighborhood<R>

§

impl<R = WasmAirRunner> !UnwindSafe for Neighborhood<R>

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_test_framework/ephemeral/neighborhood/struct.PeerEnv.html b/air_test_framework/ephemeral/neighborhood/struct.PeerEnv.html new file mode 100644 index 00000000..bc51e80e --- /dev/null +++ b/air_test_framework/ephemeral/neighborhood/struct.PeerEnv.html @@ -0,0 +1,39 @@ +PeerEnv in air_test_framework::ephemeral::neighborhood - Rust

Struct air_test_framework::ephemeral::neighborhood::PeerEnv

source ·
pub struct PeerEnv<R> { /* private fields */ }

Implementations§

source§

impl<R: AirRunner> PeerEnv<R>

source

pub fn new(peer: Peer<R>, network: &Rc<Network<R>>) -> Self

source

pub fn is_failed(&self) -> bool

source

pub fn set_failed(&mut self, failed: bool)

source

pub fn is_reachable(&self, target: impl Into<PeerId>) -> bool

source

pub fn extend_neighborhood( + &mut self, + peers: impl Iterator<Item = impl Into<PeerId>>, +)

source

pub fn remove_from_neighborhood( + &mut self, + peers: impl Iterator<Item = impl Into<PeerId>>, +)

source

pub fn get_neighborhood(&self) -> &Neighborhood<R>

source

pub fn get_neighborhood_mut(&mut self) -> &mut Neighborhood<R>

source

pub fn iter(&self) -> impl Iterator<Item = PeerId>

source

pub fn get_peer(&self) -> &Peer<R>

Trait Implementations§

source§

impl<'a, R: AirRunner> IntoIterator for &'a PeerEnv<R>

§

type Item = <&'a Neighborhood<R> as IntoIterator>::Item

The type of the elements being iterated over.
§

type IntoIter = <&'a Neighborhood<R> as IntoIterator>::IntoIter

Which kind of iterator are we turning this into?
source§

fn into_iter(self) -> Self::IntoIter

Creates an iterator from a value. Read more

Auto Trait Implementations§

§

impl<R> Freeze for PeerEnv<R>
where + R: Freeze,

§

impl<R> !RefUnwindSafe for PeerEnv<R>

§

impl<R> !Send for PeerEnv<R>

§

impl<R> !Sync for PeerEnv<R>

§

impl<R> Unpin for PeerEnv<R>
where + R: Unpin,

§

impl<R> !UnwindSafe for PeerEnv<R>

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_test_framework/ephemeral/sidebar-items.js b/air_test_framework/ephemeral/sidebar-items.js new file mode 100644 index 00000000..08d4a8b3 --- /dev/null +++ b/air_test_framework/ephemeral/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"mod":["neighborhood"],"struct":["Network","Peer","PeerId"],"type":["Data"]}; \ No newline at end of file diff --git a/air_test_framework/ephemeral/struct.Network.html b/air_test_framework/ephemeral/struct.Network.html new file mode 100644 index 00000000..0a38a412 --- /dev/null +++ b/air_test_framework/ephemeral/struct.Network.html @@ -0,0 +1,72 @@ +Network in air_test_framework::ephemeral - Rust

Struct air_test_framework::ephemeral::Network

source ·
pub struct Network<R = DefaultAirRunner> { /* private fields */ }

Implementations§

source§

impl Network<DefaultAirRunner>

source

pub async fn empty() -> Rc<Self>

source§

impl<R: AirRunner> Network<R>

source

pub async fn new( + named_peers: impl Iterator<Item = impl Into<PeerId>>, + common_services: Vec<MarineServiceHandle>, + test_init_params: TestInitParameters, +) -> Rc<Self>

source

pub async fn from_peers( + nodes: Vec<Peer<R>>, + test_init_params: TestInitParameters, +) -> Rc<Self>

source

pub fn add_peer_env( + self: &Rc<Self>, + peer: Peer<R>, + neighborhood: impl IntoIterator<Item = impl Into<PeerId>>, +)

source

pub async fn ensure_named_peer( + self: &Rc<Self>, + name: impl Into<PeerId>, + test_init_params: TestInitParameters, +) -> PeerId

source

pub fn add_peer(self: &Rc<Self>, peer: Peer<R>)

Add a peer with default neighborhood.

+
source

pub fn set_peer_failed<Id>(&mut self, name: &Id, failed: bool)
where + PeerId: Borrow<Id> + for<'a> From<&'a Id>, + Id: Hash + Eq + ?Sized,

source

pub fn fail_peer_for<Id1, Id2>( + &mut self, + source_peer_name: &Id1, + target_peer_name: &Id2, +)
where + PeerId: Borrow<Id1> + for<'a> From<&'a Id1> + Borrow<Id2> + for<'a> From<&'a Id2>, + Id1: Hash + Eq + ?Sized, + Id2: Hash + Eq + ?Sized,

source

pub fn unfail_peer_for<Id1, Id2>( + &mut self, + source_peer_name: &Id1, + target_peer_name: &Id2, +)
where + PeerId: Borrow<Id1> + for<'a> From<&'a Id1> + Borrow<Id2> + for<'a> From<&'a Id2>, + Id1: Hash + Eq + ?Sized, + Id2: Hash + Eq + ?Sized,

source

pub fn get_peer_env<Id>(&self, peer_id: &Id) -> Option<Rc<RefCell<PeerEnv<R>>>>
where + PeerId: Borrow<Id> + for<'a> From<&'a Id>, + Id: Hash + Eq + ?Sized,

source

pub fn get_named_peer_env<Id>( + &self, + peer_name: &Id, +) -> Option<Rc<RefCell<PeerEnv<R>>>>
where + PeerId: Borrow<Id> + for<'a> From<&'a Id>, + Id: Hash + Eq + ?Sized,

source

pub fn get_peers(&self) -> impl Iterator<Item = PeerId>

source

pub fn resolve_peer<Id>(&self, name: &Id) -> PeerId
where + PeerId: Borrow<Id> + for<'a> From<&'a Id>, + Id: Hash + Eq + ?Sized,

Auto Trait Implementations§

§

impl<R = WasmAirRunner> !Freeze for Network<R>

§

impl<R = WasmAirRunner> !RefUnwindSafe for Network<R>

§

impl<R = WasmAirRunner> !Send for Network<R>

§

impl<R = WasmAirRunner> !Sync for Network<R>

§

impl<R> Unpin for Network<R>

§

impl<R = WasmAirRunner> !UnwindSafe for Network<R>

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_test_framework/ephemeral/struct.Peer.html b/air_test_framework/ephemeral/struct.Peer.html new file mode 100644 index 00000000..95dfd6be --- /dev/null +++ b/air_test_framework/ephemeral/struct.Peer.html @@ -0,0 +1,37 @@ +Peer in air_test_framework::ephemeral - Rust

Struct air_test_framework::ephemeral::Peer

source ·
pub struct Peer<R> { /* private fields */ }

Implementations§

source§

impl<R: AirRunner> Peer<R>

source

pub async fn new( + keypair: impl Into<KeyPair>, + services: Rc<[MarineServiceHandle]>, + test_init_parameters: TestInitParameters, +) -> Self

source

pub fn get_peer_id(&self) -> &PeerId

source

pub fn get_keypair(&self) -> &KeyPair

Trait Implementations§

source§

impl<R: AirRunner> Debug for Peer<R>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

§

impl<R> Freeze for Peer<R>
where + R: Freeze,

§

impl<R> !RefUnwindSafe for Peer<R>

§

impl<R> !Send for Peer<R>

§

impl<R> !Sync for Peer<R>

§

impl<R> Unpin for Peer<R>
where + R: Unpin,

§

impl<R> !UnwindSafe for Peer<R>

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_test_framework/ephemeral/struct.PeerId.html b/air_test_framework/ephemeral/struct.PeerId.html new file mode 100644 index 00000000..0a7f0f2b --- /dev/null +++ b/air_test_framework/ephemeral/struct.PeerId.html @@ -0,0 +1,1268 @@ +PeerId in air_test_framework::ephemeral - Rust

Struct air_test_framework::ephemeral::PeerId

source ·
pub struct PeerId(/* private fields */);

Implementations§

source§

impl PeerId

source

pub fn new<'any>(peer_id: impl Into<&'any str>) -> Self

source

pub fn from_keypair(keypair: &KeyPair) -> Self

Methods from Deref<Target = str>§

1.0.0 · source

pub fn len(&self) -> usize

Returns the length of self.

+

This length is in bytes, not chars or graphemes. In other words, +it might not be what a human considers the length of the string.

+
§Examples
+
let len = "foo".len();
+assert_eq!(3, len);
+
+assert_eq!("ƒoo".len(), 4); // fancy f!
+assert_eq!("ƒoo".chars().count(), 3);
+
1.0.0 · source

pub fn is_empty(&self) -> bool

Returns true if self has a length of zero bytes.

+
§Examples
+
let s = "";
+assert!(s.is_empty());
+
+let s = "not empty";
+assert!(!s.is_empty());
+
1.9.0 · source

pub fn is_char_boundary(&self, index: usize) -> bool

Checks that index-th byte is the first byte in a UTF-8 code point +sequence or the end of the string.

+

The start and end of the string (when index == self.len()) are +considered to be boundaries.

+

Returns false if index is greater than self.len().

+
§Examples
+
let s = "Löwe 老虎 Léopard";
+assert!(s.is_char_boundary(0));
+// start of `老`
+assert!(s.is_char_boundary(6));
+assert!(s.is_char_boundary(s.len()));
+
+// second byte of `ö`
+assert!(!s.is_char_boundary(2));
+
+// third byte of `老`
+assert!(!s.is_char_boundary(8));
+
source

pub fn floor_char_boundary(&self, index: usize) -> usize

🔬This is a nightly-only experimental API. (round_char_boundary)

Finds the closest x not exceeding index where is_char_boundary(x) is true.

+

This method can help you truncate a string so that it’s still valid UTF-8, but doesn’t +exceed a given number of bytes. Note that this is done purely at the character level +and can still visually split graphemes, even though the underlying characters aren’t +split. For example, the emoji 🧑‍🔬 (scientist) could be split so that the string only +includes 🧑 (person) instead.

+
§Examples
+
#![feature(round_char_boundary)]
+let s = "❤️🧡💛💚💙💜";
+assert_eq!(s.len(), 26);
+assert!(!s.is_char_boundary(13));
+
+let closest = s.floor_char_boundary(13);
+assert_eq!(closest, 10);
+assert_eq!(&s[..closest], "❤️🧡");
+
source

pub fn ceil_char_boundary(&self, index: usize) -> usize

🔬This is a nightly-only experimental API. (round_char_boundary)

Finds the closest x not below index where is_char_boundary(x) is true.

+

If index is greater than the length of the string, this returns the length of the string.

+

This method is the natural complement to floor_char_boundary. See that method +for more details.

+
§Examples
+
#![feature(round_char_boundary)]
+let s = "❤️🧡💛💚💙💜";
+assert_eq!(s.len(), 26);
+assert!(!s.is_char_boundary(13));
+
+let closest = s.ceil_char_boundary(13);
+assert_eq!(closest, 14);
+assert_eq!(&s[..closest], "❤️🧡💛");
+
1.0.0 · source

pub fn as_bytes(&self) -> &[u8]

Converts a string slice to a byte slice. To convert the byte slice back +into a string slice, use the from_utf8 function.

+
§Examples
+
let bytes = "bors".as_bytes();
+assert_eq!(b"bors", bytes);
+
1.0.0 · source

pub fn as_ptr(&self) -> *const u8

Converts a string slice to a raw pointer.

+

As string slices are a slice of bytes, the raw pointer points to a +u8. This pointer will be pointing to the first byte of the string +slice.

+

The caller must ensure that the returned pointer is never written to. +If you need to mutate the contents of the string slice, use as_mut_ptr.

+
§Examples
+
let s = "Hello";
+let ptr = s.as_ptr();
+
1.20.0 · source

pub fn get<I>(&self, i: I) -> Option<&<I as SliceIndex<str>>::Output>
where + I: SliceIndex<str>,

Returns a subslice of str.

+

This is the non-panicking alternative to indexing the str. Returns +None whenever equivalent indexing operation would panic.

+
§Examples
+
let v = String::from("🗻∈🌏");
+
+assert_eq!(Some("🗻"), v.get(0..4));
+
+// indices not on UTF-8 sequence boundaries
+assert!(v.get(1..).is_none());
+assert!(v.get(..8).is_none());
+
+// out of bounds
+assert!(v.get(..42).is_none());
+
1.20.0 · source

pub unsafe fn get_unchecked<I>(&self, i: I) -> &<I as SliceIndex<str>>::Output
where + I: SliceIndex<str>,

Returns an unchecked subslice of str.

+

This is the unchecked alternative to indexing the str.

+
§Safety
+

Callers of this function are responsible that these preconditions are +satisfied:

+
    +
  • The starting index must not exceed the ending index;
  • +
  • Indexes must be within bounds of the original slice;
  • +
  • Indexes must lie on UTF-8 sequence boundaries.
  • +
+

Failing that, the returned string slice may reference invalid memory or +violate the invariants communicated by the str type.

+
§Examples
+
let v = "🗻∈🌏";
+unsafe {
+    assert_eq!("🗻", v.get_unchecked(0..4));
+    assert_eq!("∈", v.get_unchecked(4..7));
+    assert_eq!("🌏", v.get_unchecked(7..11));
+}
+
1.0.0 · source

pub unsafe fn slice_unchecked(&self, begin: usize, end: usize) -> &str

👎Deprecated since 1.29.0: use get_unchecked(begin..end) instead

Creates a string slice from another string slice, bypassing safety +checks.

+

This is generally not recommended, use with caution! For a safe +alternative see str and Index.

+

This new slice goes from begin to end, including begin but +excluding end.

+

To get a mutable string slice instead, see the +slice_mut_unchecked method.

+
§Safety
+

Callers of this function are responsible that three preconditions are +satisfied:

+
    +
  • begin must not exceed end.
  • +
  • begin and end must be byte positions within the string slice.
  • +
  • begin and end must lie on UTF-8 sequence boundaries.
  • +
+
§Examples
+
let s = "Löwe 老虎 Léopard";
+
+unsafe {
+    assert_eq!("Löwe 老虎 Léopard", s.slice_unchecked(0, 21));
+}
+
+let s = "Hello, world!";
+
+unsafe {
+    assert_eq!("world", s.slice_unchecked(7, 12));
+}
+
1.4.0 · source

pub fn split_at(&self, mid: usize) -> (&str, &str)

Divide one string slice into two at an index.

+

The argument, mid, should be a byte offset from the start of the +string. It must also be on the boundary of a UTF-8 code point.

+

The two slices returned go from the start of the string slice to mid, +and from mid to the end of the string slice.

+

To get mutable string slices instead, see the split_at_mut +method.

+
§Panics
+

Panics if mid is not on a UTF-8 code point boundary, or if it is past +the end of the last code point of the string slice. For a non-panicking +alternative see split_at_checked.

+
§Examples
+
let s = "Per Martin-Löf";
+
+let (first, last) = s.split_at(3);
+
+assert_eq!("Per", first);
+assert_eq!(" Martin-Löf", last);
+
1.80.0 · source

pub fn split_at_checked(&self, mid: usize) -> Option<(&str, &str)>

Divide one string slice into two at an index.

+

The argument, mid, should be a valid byte offset from the start of the +string. It must also be on the boundary of a UTF-8 code point. The +method returns None if that’s not the case.

+

The two slices returned go from the start of the string slice to mid, +and from mid to the end of the string slice.

+

To get mutable string slices instead, see the split_at_mut_checked +method.

+
§Examples
+
let s = "Per Martin-Löf";
+
+let (first, last) = s.split_at_checked(3).unwrap();
+assert_eq!("Per", first);
+assert_eq!(" Martin-Löf", last);
+
+assert_eq!(None, s.split_at_checked(13));  // Inside “ö”
+assert_eq!(None, s.split_at_checked(16));  // Beyond the string length
+
1.0.0 · source

pub fn chars(&self) -> Chars<'_>

Returns an iterator over the chars of a string slice.

+

As a string slice consists of valid UTF-8, we can iterate through a +string slice by char. This method returns such an iterator.

+

It’s important to remember that char represents a Unicode Scalar +Value, and might not match your idea of what a ‘character’ is. Iteration +over grapheme clusters may be what you actually want. This functionality +is not provided by Rust’s standard library, check crates.io instead.

+
§Examples
+

Basic usage:

+ +
let word = "goodbye";
+
+let count = word.chars().count();
+assert_eq!(7, count);
+
+let mut chars = word.chars();
+
+assert_eq!(Some('g'), chars.next());
+assert_eq!(Some('o'), chars.next());
+assert_eq!(Some('o'), chars.next());
+assert_eq!(Some('d'), chars.next());
+assert_eq!(Some('b'), chars.next());
+assert_eq!(Some('y'), chars.next());
+assert_eq!(Some('e'), chars.next());
+
+assert_eq!(None, chars.next());
+

Remember, chars might not match your intuition about characters:

+ +
let y = "y̆";
+
+let mut chars = y.chars();
+
+assert_eq!(Some('y'), chars.next()); // not 'y̆'
+assert_eq!(Some('\u{0306}'), chars.next());
+
+assert_eq!(None, chars.next());
+
1.0.0 · source

pub fn char_indices(&self) -> CharIndices<'_>

Returns an iterator over the chars of a string slice, and their +positions.

+

As a string slice consists of valid UTF-8, we can iterate through a +string slice by char. This method returns an iterator of both +these chars, as well as their byte positions.

+

The iterator yields tuples. The position is first, the char is +second.

+
§Examples
+

Basic usage:

+ +
let word = "goodbye";
+
+let count = word.char_indices().count();
+assert_eq!(7, count);
+
+let mut char_indices = word.char_indices();
+
+assert_eq!(Some((0, 'g')), char_indices.next());
+assert_eq!(Some((1, 'o')), char_indices.next());
+assert_eq!(Some((2, 'o')), char_indices.next());
+assert_eq!(Some((3, 'd')), char_indices.next());
+assert_eq!(Some((4, 'b')), char_indices.next());
+assert_eq!(Some((5, 'y')), char_indices.next());
+assert_eq!(Some((6, 'e')), char_indices.next());
+
+assert_eq!(None, char_indices.next());
+

Remember, chars might not match your intuition about characters:

+ +
let yes = "y̆es";
+
+let mut char_indices = yes.char_indices();
+
+assert_eq!(Some((0, 'y')), char_indices.next()); // not (0, 'y̆')
+assert_eq!(Some((1, '\u{0306}')), char_indices.next());
+
+// note the 3 here - the previous character took up two bytes
+assert_eq!(Some((3, 'e')), char_indices.next());
+assert_eq!(Some((4, 's')), char_indices.next());
+
+assert_eq!(None, char_indices.next());
+
1.0.0 · source

pub fn bytes(&self) -> Bytes<'_>

An iterator over the bytes of a string slice.

+

As a string slice consists of a sequence of bytes, we can iterate +through a string slice by byte. This method returns such an iterator.

+
§Examples
+
let mut bytes = "bors".bytes();
+
+assert_eq!(Some(b'b'), bytes.next());
+assert_eq!(Some(b'o'), bytes.next());
+assert_eq!(Some(b'r'), bytes.next());
+assert_eq!(Some(b's'), bytes.next());
+
+assert_eq!(None, bytes.next());
+
1.1.0 · source

pub fn split_whitespace(&self) -> SplitWhitespace<'_>

Splits a string slice by whitespace.

+

The iterator returned will return string slices that are sub-slices of +the original string slice, separated by any amount of whitespace.

+

‘Whitespace’ is defined according to the terms of the Unicode Derived +Core Property White_Space. If you only want to split on ASCII whitespace +instead, use split_ascii_whitespace.

+
§Examples
+

Basic usage:

+ +
let mut iter = "A few words".split_whitespace();
+
+assert_eq!(Some("A"), iter.next());
+assert_eq!(Some("few"), iter.next());
+assert_eq!(Some("words"), iter.next());
+
+assert_eq!(None, iter.next());
+

All kinds of whitespace are considered:

+ +
let mut iter = " Mary   had\ta\u{2009}little  \n\t lamb".split_whitespace();
+assert_eq!(Some("Mary"), iter.next());
+assert_eq!(Some("had"), iter.next());
+assert_eq!(Some("a"), iter.next());
+assert_eq!(Some("little"), iter.next());
+assert_eq!(Some("lamb"), iter.next());
+
+assert_eq!(None, iter.next());
+

If the string is empty or all whitespace, the iterator yields no string slices:

+ +
assert_eq!("".split_whitespace().next(), None);
+assert_eq!("   ".split_whitespace().next(), None);
+
1.34.0 · source

pub fn split_ascii_whitespace(&self) -> SplitAsciiWhitespace<'_>

Splits a string slice by ASCII whitespace.

+

The iterator returned will return string slices that are sub-slices of +the original string slice, separated by any amount of ASCII whitespace.

+

To split by Unicode Whitespace instead, use split_whitespace.

+
§Examples
+

Basic usage:

+ +
let mut iter = "A few words".split_ascii_whitespace();
+
+assert_eq!(Some("A"), iter.next());
+assert_eq!(Some("few"), iter.next());
+assert_eq!(Some("words"), iter.next());
+
+assert_eq!(None, iter.next());
+

All kinds of ASCII whitespace are considered:

+ +
let mut iter = " Mary   had\ta little  \n\t lamb".split_ascii_whitespace();
+assert_eq!(Some("Mary"), iter.next());
+assert_eq!(Some("had"), iter.next());
+assert_eq!(Some("a"), iter.next());
+assert_eq!(Some("little"), iter.next());
+assert_eq!(Some("lamb"), iter.next());
+
+assert_eq!(None, iter.next());
+

If the string is empty or all ASCII whitespace, the iterator yields no string slices:

+ +
assert_eq!("".split_ascii_whitespace().next(), None);
+assert_eq!("   ".split_ascii_whitespace().next(), None);
+
1.0.0 · source

pub fn lines(&self) -> Lines<'_>

An iterator over the lines of a string, as string slices.

+

Lines are split at line endings that are either newlines (\n) or +sequences of a carriage return followed by a line feed (\r\n).

+

Line terminators are not included in the lines returned by the iterator.

+

Note that any carriage return (\r) not immediately followed by a +line feed (\n) does not split a line. These carriage returns are +thereby included in the produced lines.

+

The final line ending is optional. A string that ends with a final line +ending will return the same lines as an otherwise identical string +without a final line ending.

+
§Examples
+

Basic usage:

+ +
let text = "foo\r\nbar\n\nbaz\r";
+let mut lines = text.lines();
+
+assert_eq!(Some("foo"), lines.next());
+assert_eq!(Some("bar"), lines.next());
+assert_eq!(Some(""), lines.next());
+// Trailing carriage return is included in the last line
+assert_eq!(Some("baz\r"), lines.next());
+
+assert_eq!(None, lines.next());
+

The final line does not require any ending:

+ +
let text = "foo\nbar\n\r\nbaz";
+let mut lines = text.lines();
+
+assert_eq!(Some("foo"), lines.next());
+assert_eq!(Some("bar"), lines.next());
+assert_eq!(Some(""), lines.next());
+assert_eq!(Some("baz"), lines.next());
+
+assert_eq!(None, lines.next());
+
1.0.0 · source

pub fn lines_any(&self) -> LinesAny<'_>

👎Deprecated since 1.4.0: use lines() instead now

An iterator over the lines of a string.

+
1.8.0 · source

pub fn encode_utf16(&self) -> EncodeUtf16<'_>

Returns an iterator of u16 over the string encoded as UTF-16.

+
§Examples
+
let text = "Zażółć gęślą jaźń";
+
+let utf8_len = text.len();
+let utf16_len = text.encode_utf16().count();
+
+assert!(utf16_len <= utf8_len);
+
1.0.0 · source

pub fn contains<'a, P>(&'a self, pat: P) -> bool
where + P: Pattern<'a>,

Returns true if the given pattern matches a sub-slice of +this string slice.

+

Returns false if it does not.

+

The pattern can be a &str, char, a slice of chars, or a +function or closure that determines if a character matches.

+
§Examples
+
let bananas = "bananas";
+
+assert!(bananas.contains("nana"));
+assert!(!bananas.contains("apples"));
+
1.0.0 · source

pub fn starts_with<'a, P>(&'a self, pat: P) -> bool
where + P: Pattern<'a>,

Returns true if the given pattern matches a prefix of this +string slice.

+

Returns false if it does not.

+

The pattern can be a &str, in which case this function will return true if +the &str is a prefix of this string slice.

+

The pattern can also be a char, a slice of chars, or a +function or closure that determines if a character matches. +These will only be checked against the first character of this string slice. +Look at the second example below regarding behavior for slices of chars.

+
§Examples
+
let bananas = "bananas";
+
+assert!(bananas.starts_with("bana"));
+assert!(!bananas.starts_with("nana"));
+ +
let bananas = "bananas";
+
+// Note that both of these assert successfully.
+assert!(bananas.starts_with(&['b', 'a', 'n', 'a']));
+assert!(bananas.starts_with(&['a', 'b', 'c', 'd']));
+
1.0.0 · source

pub fn ends_with<'a, P>(&'a self, pat: P) -> bool
where + P: Pattern<'a>, + <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>,

Returns true if the given pattern matches a suffix of this +string slice.

+

Returns false if it does not.

+

The pattern can be a &str, char, a slice of chars, or a +function or closure that determines if a character matches.

+
§Examples
+
let bananas = "bananas";
+
+assert!(bananas.ends_with("anas"));
+assert!(!bananas.ends_with("nana"));
+
1.0.0 · source

pub fn find<'a, P>(&'a self, pat: P) -> Option<usize>
where + P: Pattern<'a>,

Returns the byte index of the first character of this string slice that +matches the pattern.

+

Returns None if the pattern doesn’t match.

+

The pattern can be a &str, char, a slice of chars, or a +function or closure that determines if a character matches.

+
§Examples
+

Simple patterns:

+ +
let s = "Löwe 老虎 Léopard Gepardi";
+
+assert_eq!(s.find('L'), Some(0));
+assert_eq!(s.find('é'), Some(14));
+assert_eq!(s.find("pard"), Some(17));
+

More complex patterns using point-free style and closures:

+ +
let s = "Löwe 老虎 Léopard";
+
+assert_eq!(s.find(char::is_whitespace), Some(5));
+assert_eq!(s.find(char::is_lowercase), Some(1));
+assert_eq!(s.find(|c: char| c.is_whitespace() || c.is_lowercase()), Some(1));
+assert_eq!(s.find(|c: char| (c < 'o') && (c > 'a')), Some(4));
+

Not finding the pattern:

+ +
let s = "Löwe 老虎 Léopard";
+let x: &[_] = &['1', '2'];
+
+assert_eq!(s.find(x), None);
+
1.0.0 · source

pub fn rfind<'a, P>(&'a self, pat: P) -> Option<usize>
where + P: Pattern<'a>, + <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>,

Returns the byte index for the first character of the last match of the pattern in +this string slice.

+

Returns None if the pattern doesn’t match.

+

The pattern can be a &str, char, a slice of chars, or a +function or closure that determines if a character matches.

+
§Examples
+

Simple patterns:

+ +
let s = "Löwe 老虎 Léopard Gepardi";
+
+assert_eq!(s.rfind('L'), Some(13));
+assert_eq!(s.rfind('é'), Some(14));
+assert_eq!(s.rfind("pard"), Some(24));
+

More complex patterns with closures:

+ +
let s = "Löwe 老虎 Léopard";
+
+assert_eq!(s.rfind(char::is_whitespace), Some(12));
+assert_eq!(s.rfind(char::is_lowercase), Some(20));
+

Not finding the pattern:

+ +
let s = "Löwe 老虎 Léopard";
+let x: &[_] = &['1', '2'];
+
+assert_eq!(s.rfind(x), None);
+
1.0.0 · source

pub fn split<'a, P>(&'a self, pat: P) -> Split<'a, P>
where + P: Pattern<'a>,

An iterator over substrings of this string slice, separated by +characters matched by a pattern.

+

The pattern can be a &str, char, a slice of chars, or a +function or closure that determines if a character matches.

+
§Iterator behavior
+

The returned iterator will be a DoubleEndedIterator if the pattern +allows a reverse search and forward/reverse search yields the same +elements. This is true for, e.g., char, but not for &str.

+

If the pattern allows a reverse search but its results might differ +from a forward search, the rsplit method can be used.

+
§Examples
+

Simple patterns:

+ +
let v: Vec<&str> = "Mary had a little lamb".split(' ').collect();
+assert_eq!(v, ["Mary", "had", "a", "little", "lamb"]);
+
+let v: Vec<&str> = "".split('X').collect();
+assert_eq!(v, [""]);
+
+let v: Vec<&str> = "lionXXtigerXleopard".split('X').collect();
+assert_eq!(v, ["lion", "", "tiger", "leopard"]);
+
+let v: Vec<&str> = "lion::tiger::leopard".split("::").collect();
+assert_eq!(v, ["lion", "tiger", "leopard"]);
+
+let v: Vec<&str> = "abc1def2ghi".split(char::is_numeric).collect();
+assert_eq!(v, ["abc", "def", "ghi"]);
+
+let v: Vec<&str> = "lionXtigerXleopard".split(char::is_uppercase).collect();
+assert_eq!(v, ["lion", "tiger", "leopard"]);
+

If the pattern is a slice of chars, split on each occurrence of any of the characters:

+ +
let v: Vec<&str> = "2020-11-03 23:59".split(&['-', ' ', ':', '@'][..]).collect();
+assert_eq!(v, ["2020", "11", "03", "23", "59"]);
+

A more complex pattern, using a closure:

+ +
let v: Vec<&str> = "abc1defXghi".split(|c| c == '1' || c == 'X').collect();
+assert_eq!(v, ["abc", "def", "ghi"]);
+

If a string contains multiple contiguous separators, you will end up +with empty strings in the output:

+ +
let x = "||||a||b|c".to_string();
+let d: Vec<_> = x.split('|').collect();
+
+assert_eq!(d, &["", "", "", "", "a", "", "b", "c"]);
+

Contiguous separators are separated by the empty string.

+ +
let x = "(///)".to_string();
+let d: Vec<_> = x.split('/').collect();
+
+assert_eq!(d, &["(", "", "", ")"]);
+

Separators at the start or end of a string are neighbored +by empty strings.

+ +
let d: Vec<_> = "010".split("0").collect();
+assert_eq!(d, &["", "1", ""]);
+

When the empty string is used as a separator, it separates +every character in the string, along with the beginning +and end of the string.

+ +
let f: Vec<_> = "rust".split("").collect();
+assert_eq!(f, &["", "r", "u", "s", "t", ""]);
+

Contiguous separators can lead to possibly surprising behavior +when whitespace is used as the separator. This code is correct:

+ +
let x = "    a  b c".to_string();
+let d: Vec<_> = x.split(' ').collect();
+
+assert_eq!(d, &["", "", "", "", "a", "", "b", "c"]);
+

It does not give you:

+ +
assert_eq!(d, &["a", "b", "c"]);
+

Use split_whitespace for this behavior.

+
1.51.0 · source

pub fn split_inclusive<'a, P>(&'a self, pat: P) -> SplitInclusive<'a, P>
where + P: Pattern<'a>,

An iterator over substrings of this string slice, separated by +characters matched by a pattern. Differs from the iterator produced by +split in that split_inclusive leaves the matched part as the +terminator of the substring.

+

The pattern can be a &str, char, a slice of chars, or a +function or closure that determines if a character matches.

+
§Examples
+
let v: Vec<&str> = "Mary had a little lamb\nlittle lamb\nlittle lamb."
+    .split_inclusive('\n').collect();
+assert_eq!(v, ["Mary had a little lamb\n", "little lamb\n", "little lamb."]);
+

If the last element of the string is matched, +that element will be considered the terminator of the preceding substring. +That substring will be the last item returned by the iterator.

+ +
let v: Vec<&str> = "Mary had a little lamb\nlittle lamb\nlittle lamb.\n"
+    .split_inclusive('\n').collect();
+assert_eq!(v, ["Mary had a little lamb\n", "little lamb\n", "little lamb.\n"]);
+
1.0.0 · source

pub fn rsplit<'a, P>(&'a self, pat: P) -> RSplit<'a, P>
where + P: Pattern<'a>, + <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>,

An iterator over substrings of the given string slice, separated by +characters matched by a pattern and yielded in reverse order.

+

The pattern can be a &str, char, a slice of chars, or a +function or closure that determines if a character matches.

+
§Iterator behavior
+

The returned iterator requires that the pattern supports a reverse +search, and it will be a DoubleEndedIterator if a forward/reverse +search yields the same elements.

+

For iterating from the front, the split method can be used.

+
§Examples
+

Simple patterns:

+ +
let v: Vec<&str> = "Mary had a little lamb".rsplit(' ').collect();
+assert_eq!(v, ["lamb", "little", "a", "had", "Mary"]);
+
+let v: Vec<&str> = "".rsplit('X').collect();
+assert_eq!(v, [""]);
+
+let v: Vec<&str> = "lionXXtigerXleopard".rsplit('X').collect();
+assert_eq!(v, ["leopard", "tiger", "", "lion"]);
+
+let v: Vec<&str> = "lion::tiger::leopard".rsplit("::").collect();
+assert_eq!(v, ["leopard", "tiger", "lion"]);
+

A more complex pattern, using a closure:

+ +
let v: Vec<&str> = "abc1defXghi".rsplit(|c| c == '1' || c == 'X').collect();
+assert_eq!(v, ["ghi", "def", "abc"]);
+
1.0.0 · source

pub fn split_terminator<'a, P>(&'a self, pat: P) -> SplitTerminator<'a, P>
where + P: Pattern<'a>,

An iterator over substrings of the given string slice, separated by +characters matched by a pattern.

+

The pattern can be a &str, char, a slice of chars, or a +function or closure that determines if a character matches.

+

Equivalent to split, except that the trailing substring +is skipped if empty.

+

This method can be used for string data that is terminated, +rather than separated by a pattern.

+
§Iterator behavior
+

The returned iterator will be a DoubleEndedIterator if the pattern +allows a reverse search and forward/reverse search yields the same +elements. This is true for, e.g., char, but not for &str.

+

If the pattern allows a reverse search but its results might differ +from a forward search, the rsplit_terminator method can be used.

+
§Examples
+
let v: Vec<&str> = "A.B.".split_terminator('.').collect();
+assert_eq!(v, ["A", "B"]);
+
+let v: Vec<&str> = "A..B..".split_terminator(".").collect();
+assert_eq!(v, ["A", "", "B", ""]);
+
+let v: Vec<&str> = "A.B:C.D".split_terminator(&['.', ':'][..]).collect();
+assert_eq!(v, ["A", "B", "C", "D"]);
+
1.0.0 · source

pub fn rsplit_terminator<'a, P>(&'a self, pat: P) -> RSplitTerminator<'a, P>
where + P: Pattern<'a>, + <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>,

An iterator over substrings of self, separated by characters +matched by a pattern and yielded in reverse order.

+

The pattern can be a &str, char, a slice of chars, or a +function or closure that determines if a character matches.

+

Equivalent to split, except that the trailing substring is +skipped if empty.

+

This method can be used for string data that is terminated, +rather than separated by a pattern.

+
§Iterator behavior
+

The returned iterator requires that the pattern supports a +reverse search, and it will be double ended if a forward/reverse +search yields the same elements.

+

For iterating from the front, the split_terminator method can be +used.

+
§Examples
+
let v: Vec<&str> = "A.B.".rsplit_terminator('.').collect();
+assert_eq!(v, ["B", "A"]);
+
+let v: Vec<&str> = "A..B..".rsplit_terminator(".").collect();
+assert_eq!(v, ["", "B", "", "A"]);
+
+let v: Vec<&str> = "A.B:C.D".rsplit_terminator(&['.', ':'][..]).collect();
+assert_eq!(v, ["D", "C", "B", "A"]);
+
1.0.0 · source

pub fn splitn<'a, P>(&'a self, n: usize, pat: P) -> SplitN<'a, P>
where + P: Pattern<'a>,

An iterator over substrings of the given string slice, separated by a +pattern, restricted to returning at most n items.

+

If n substrings are returned, the last substring (the nth substring) +will contain the remainder of the string.

+

The pattern can be a &str, char, a slice of chars, or a +function or closure that determines if a character matches.

+
§Iterator behavior
+

The returned iterator will not be double ended, because it is +not efficient to support.

+

If the pattern allows a reverse search, the rsplitn method can be +used.

+
§Examples
+

Simple patterns:

+ +
let v: Vec<&str> = "Mary had a little lambda".splitn(3, ' ').collect();
+assert_eq!(v, ["Mary", "had", "a little lambda"]);
+
+let v: Vec<&str> = "lionXXtigerXleopard".splitn(3, "X").collect();
+assert_eq!(v, ["lion", "", "tigerXleopard"]);
+
+let v: Vec<&str> = "abcXdef".splitn(1, 'X').collect();
+assert_eq!(v, ["abcXdef"]);
+
+let v: Vec<&str> = "".splitn(1, 'X').collect();
+assert_eq!(v, [""]);
+

A more complex pattern, using a closure:

+ +
let v: Vec<&str> = "abc1defXghi".splitn(2, |c| c == '1' || c == 'X').collect();
+assert_eq!(v, ["abc", "defXghi"]);
+
1.0.0 · source

pub fn rsplitn<'a, P>(&'a self, n: usize, pat: P) -> RSplitN<'a, P>
where + P: Pattern<'a>, + <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>,

An iterator over substrings of this string slice, separated by a +pattern, starting from the end of the string, restricted to returning +at most n items.

+

If n substrings are returned, the last substring (the nth substring) +will contain the remainder of the string.

+

The pattern can be a &str, char, a slice of chars, or a +function or closure that determines if a character matches.

+
§Iterator behavior
+

The returned iterator will not be double ended, because it is not +efficient to support.

+

For splitting from the front, the splitn method can be used.

+
§Examples
+

Simple patterns:

+ +
let v: Vec<&str> = "Mary had a little lamb".rsplitn(3, ' ').collect();
+assert_eq!(v, ["lamb", "little", "Mary had a"]);
+
+let v: Vec<&str> = "lionXXtigerXleopard".rsplitn(3, 'X').collect();
+assert_eq!(v, ["leopard", "tiger", "lionX"]);
+
+let v: Vec<&str> = "lion::tiger::leopard".rsplitn(2, "::").collect();
+assert_eq!(v, ["leopard", "lion::tiger"]);
+

A more complex pattern, using a closure:

+ +
let v: Vec<&str> = "abc1defXghi".rsplitn(2, |c| c == '1' || c == 'X').collect();
+assert_eq!(v, ["ghi", "abc1def"]);
+
1.52.0 · source

pub fn split_once<'a, P>(&'a self, delimiter: P) -> Option<(&'a str, &'a str)>
where + P: Pattern<'a>,

Splits the string on the first occurrence of the specified delimiter and +returns prefix before delimiter and suffix after delimiter.

+
§Examples
+
assert_eq!("cfg".split_once('='), None);
+assert_eq!("cfg=".split_once('='), Some(("cfg", "")));
+assert_eq!("cfg=foo".split_once('='), Some(("cfg", "foo")));
+assert_eq!("cfg=foo=bar".split_once('='), Some(("cfg", "foo=bar")));
+
1.52.0 · source

pub fn rsplit_once<'a, P>(&'a self, delimiter: P) -> Option<(&'a str, &'a str)>
where + P: Pattern<'a>, + <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>,

Splits the string on the last occurrence of the specified delimiter and +returns prefix before delimiter and suffix after delimiter.

+
§Examples
+
assert_eq!("cfg".rsplit_once('='), None);
+assert_eq!("cfg=foo".rsplit_once('='), Some(("cfg", "foo")));
+assert_eq!("cfg=foo=bar".rsplit_once('='), Some(("cfg=foo", "bar")));
+
1.2.0 · source

pub fn matches<'a, P>(&'a self, pat: P) -> Matches<'a, P>
where + P: Pattern<'a>,

An iterator over the disjoint matches of a pattern within the given string +slice.

+

The pattern can be a &str, char, a slice of chars, or a +function or closure that determines if a character matches.

+
§Iterator behavior
+

The returned iterator will be a DoubleEndedIterator if the pattern +allows a reverse search and forward/reverse search yields the same +elements. This is true for, e.g., char, but not for &str.

+

If the pattern allows a reverse search but its results might differ +from a forward search, the rmatches method can be used.

+
§Examples
+
let v: Vec<&str> = "abcXXXabcYYYabc".matches("abc").collect();
+assert_eq!(v, ["abc", "abc", "abc"]);
+
+let v: Vec<&str> = "1abc2abc3".matches(char::is_numeric).collect();
+assert_eq!(v, ["1", "2", "3"]);
+
1.2.0 · source

pub fn rmatches<'a, P>(&'a self, pat: P) -> RMatches<'a, P>
where + P: Pattern<'a>, + <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>,

An iterator over the disjoint matches of a pattern within this string slice, +yielded in reverse order.

+

The pattern can be a &str, char, a slice of chars, or a +function or closure that determines if a character matches.

+
§Iterator behavior
+

The returned iterator requires that the pattern supports a reverse +search, and it will be a DoubleEndedIterator if a forward/reverse +search yields the same elements.

+

For iterating from the front, the matches method can be used.

+
§Examples
+
let v: Vec<&str> = "abcXXXabcYYYabc".rmatches("abc").collect();
+assert_eq!(v, ["abc", "abc", "abc"]);
+
+let v: Vec<&str> = "1abc2abc3".rmatches(char::is_numeric).collect();
+assert_eq!(v, ["3", "2", "1"]);
+
1.5.0 · source

pub fn match_indices<'a, P>(&'a self, pat: P) -> MatchIndices<'a, P>
where + P: Pattern<'a>,

An iterator over the disjoint matches of a pattern within this string +slice as well as the index that the match starts at.

+

For matches of pat within self that overlap, only the indices +corresponding to the first match are returned.

+

The pattern can be a &str, char, a slice of chars, or a +function or closure that determines if a character matches.

+
§Iterator behavior
+

The returned iterator will be a DoubleEndedIterator if the pattern +allows a reverse search and forward/reverse search yields the same +elements. This is true for, e.g., char, but not for &str.

+

If the pattern allows a reverse search but its results might differ +from a forward search, the rmatch_indices method can be used.

+
§Examples
+
let v: Vec<_> = "abcXXXabcYYYabc".match_indices("abc").collect();
+assert_eq!(v, [(0, "abc"), (6, "abc"), (12, "abc")]);
+
+let v: Vec<_> = "1abcabc2".match_indices("abc").collect();
+assert_eq!(v, [(1, "abc"), (4, "abc")]);
+
+let v: Vec<_> = "ababa".match_indices("aba").collect();
+assert_eq!(v, [(0, "aba")]); // only the first `aba`
+
1.5.0 · source

pub fn rmatch_indices<'a, P>(&'a self, pat: P) -> RMatchIndices<'a, P>
where + P: Pattern<'a>, + <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>,

An iterator over the disjoint matches of a pattern within self, +yielded in reverse order along with the index of the match.

+

For matches of pat within self that overlap, only the indices +corresponding to the last match are returned.

+

The pattern can be a &str, char, a slice of chars, or a +function or closure that determines if a character matches.

+
§Iterator behavior
+

The returned iterator requires that the pattern supports a reverse +search, and it will be a DoubleEndedIterator if a forward/reverse +search yields the same elements.

+

For iterating from the front, the match_indices method can be used.

+
§Examples
+
let v: Vec<_> = "abcXXXabcYYYabc".rmatch_indices("abc").collect();
+assert_eq!(v, [(12, "abc"), (6, "abc"), (0, "abc")]);
+
+let v: Vec<_> = "1abcabc2".rmatch_indices("abc").collect();
+assert_eq!(v, [(4, "abc"), (1, "abc")]);
+
+let v: Vec<_> = "ababa".rmatch_indices("aba").collect();
+assert_eq!(v, [(2, "aba")]); // only the last `aba`
+
1.0.0 · source

pub fn trim(&self) -> &str

Returns a string slice with leading and trailing whitespace removed.

+

‘Whitespace’ is defined according to the terms of the Unicode Derived +Core Property White_Space, which includes newlines.

+
§Examples
+
let s = "\n Hello\tworld\t\n";
+
+assert_eq!("Hello\tworld", s.trim());
+
1.30.0 · source

pub fn trim_start(&self) -> &str

Returns a string slice with leading whitespace removed.

+

‘Whitespace’ is defined according to the terms of the Unicode Derived +Core Property White_Space, which includes newlines.

+
§Text directionality
+

A string is a sequence of bytes. start in this context means the first +position of that byte string; for a left-to-right language like English or +Russian, this will be left side, and for right-to-left languages like +Arabic or Hebrew, this will be the right side.

+
§Examples
+

Basic usage:

+ +
let s = "\n Hello\tworld\t\n";
+assert_eq!("Hello\tworld\t\n", s.trim_start());
+

Directionality:

+ +
let s = "  English  ";
+assert!(Some('E') == s.trim_start().chars().next());
+
+let s = "  עברית  ";
+assert!(Some('ע') == s.trim_start().chars().next());
+
1.30.0 · source

pub fn trim_end(&self) -> &str

Returns a string slice with trailing whitespace removed.

+

‘Whitespace’ is defined according to the terms of the Unicode Derived +Core Property White_Space, which includes newlines.

+
§Text directionality
+

A string is a sequence of bytes. end in this context means the last +position of that byte string; for a left-to-right language like English or +Russian, this will be right side, and for right-to-left languages like +Arabic or Hebrew, this will be the left side.

+
§Examples
+

Basic usage:

+ +
let s = "\n Hello\tworld\t\n";
+assert_eq!("\n Hello\tworld", s.trim_end());
+

Directionality:

+ +
let s = "  English  ";
+assert!(Some('h') == s.trim_end().chars().rev().next());
+
+let s = "  עברית  ";
+assert!(Some('ת') == s.trim_end().chars().rev().next());
+
1.0.0 · source

pub fn trim_left(&self) -> &str

👎Deprecated since 1.33.0: superseded by trim_start

Returns a string slice with leading whitespace removed.

+

‘Whitespace’ is defined according to the terms of the Unicode Derived +Core Property White_Space.

+
§Text directionality
+

A string is a sequence of bytes. ‘Left’ in this context means the first +position of that byte string; for a language like Arabic or Hebrew +which are ‘right to left’ rather than ‘left to right’, this will be +the right side, not the left.

+
§Examples
+

Basic usage:

+ +
let s = " Hello\tworld\t";
+
+assert_eq!("Hello\tworld\t", s.trim_left());
+

Directionality:

+ +
let s = "  English";
+assert!(Some('E') == s.trim_left().chars().next());
+
+let s = "  עברית";
+assert!(Some('ע') == s.trim_left().chars().next());
+
1.0.0 · source

pub fn trim_right(&self) -> &str

👎Deprecated since 1.33.0: superseded by trim_end

Returns a string slice with trailing whitespace removed.

+

‘Whitespace’ is defined according to the terms of the Unicode Derived +Core Property White_Space.

+
§Text directionality
+

A string is a sequence of bytes. ‘Right’ in this context means the last +position of that byte string; for a language like Arabic or Hebrew +which are ‘right to left’ rather than ‘left to right’, this will be +the left side, not the right.

+
§Examples
+

Basic usage:

+ +
let s = " Hello\tworld\t";
+
+assert_eq!(" Hello\tworld", s.trim_right());
+

Directionality:

+ +
let s = "English  ";
+assert!(Some('h') == s.trim_right().chars().rev().next());
+
+let s = "עברית  ";
+assert!(Some('ת') == s.trim_right().chars().rev().next());
+
1.0.0 · source

pub fn trim_matches<'a, P>(&'a self, pat: P) -> &'a str
where + P: Pattern<'a>, + <P as Pattern<'a>>::Searcher: DoubleEndedSearcher<'a>,

Returns a string slice with all prefixes and suffixes that match a +pattern repeatedly removed.

+

The pattern can be a char, a slice of chars, or a function +or closure that determines if a character matches.

+
§Examples
+

Simple patterns:

+ +
assert_eq!("11foo1bar11".trim_matches('1'), "foo1bar");
+assert_eq!("123foo1bar123".trim_matches(char::is_numeric), "foo1bar");
+
+let x: &[_] = &['1', '2'];
+assert_eq!("12foo1bar12".trim_matches(x), "foo1bar");
+

A more complex pattern, using a closure:

+ +
assert_eq!("1foo1barXX".trim_matches(|c| c == '1' || c == 'X'), "foo1bar");
+
1.30.0 · source

pub fn trim_start_matches<'a, P>(&'a self, pat: P) -> &'a str
where + P: Pattern<'a>,

Returns a string slice with all prefixes that match a pattern +repeatedly removed.

+

The pattern can be a &str, char, a slice of chars, or a +function or closure that determines if a character matches.

+
§Text directionality
+

A string is a sequence of bytes. start in this context means the first +position of that byte string; for a left-to-right language like English or +Russian, this will be left side, and for right-to-left languages like +Arabic or Hebrew, this will be the right side.

+
§Examples
+
assert_eq!("11foo1bar11".trim_start_matches('1'), "foo1bar11");
+assert_eq!("123foo1bar123".trim_start_matches(char::is_numeric), "foo1bar123");
+
+let x: &[_] = &['1', '2'];
+assert_eq!("12foo1bar12".trim_start_matches(x), "foo1bar12");
+
1.45.0 · source

pub fn strip_prefix<'a, P>(&'a self, prefix: P) -> Option<&'a str>
where + P: Pattern<'a>,

Returns a string slice with the prefix removed.

+

If the string starts with the pattern prefix, returns the substring after the prefix, +wrapped in Some. Unlike trim_start_matches, this method removes the prefix exactly once.

+

If the string does not start with prefix, returns None.

+

The pattern can be a &str, char, a slice of chars, or a +function or closure that determines if a character matches.

+
§Examples
+
assert_eq!("foo:bar".strip_prefix("foo:"), Some("bar"));
+assert_eq!("foo:bar".strip_prefix("bar"), None);
+assert_eq!("foofoo".strip_prefix("foo"), Some("foo"));
+
1.45.0 · source

pub fn strip_suffix<'a, P>(&'a self, suffix: P) -> Option<&'a str>
where + P: Pattern<'a>, + <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>,

Returns a string slice with the suffix removed.

+

If the string ends with the pattern suffix, returns the substring before the suffix, +wrapped in Some. Unlike trim_end_matches, this method removes the suffix exactly once.

+

If the string does not end with suffix, returns None.

+

The pattern can be a &str, char, a slice of chars, or a +function or closure that determines if a character matches.

+
§Examples
+
assert_eq!("bar:foo".strip_suffix(":foo"), Some("bar"));
+assert_eq!("bar:foo".strip_suffix("bar"), None);
+assert_eq!("foofoo".strip_suffix("foo"), Some("foo"));
+
1.30.0 · source

pub fn trim_end_matches<'a, P>(&'a self, pat: P) -> &'a str
where + P: Pattern<'a>, + <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>,

Returns a string slice with all suffixes that match a pattern +repeatedly removed.

+

The pattern can be a &str, char, a slice of chars, or a +function or closure that determines if a character matches.

+
§Text directionality
+

A string is a sequence of bytes. end in this context means the last +position of that byte string; for a left-to-right language like English or +Russian, this will be right side, and for right-to-left languages like +Arabic or Hebrew, this will be the left side.

+
§Examples
+

Simple patterns:

+ +
assert_eq!("11foo1bar11".trim_end_matches('1'), "11foo1bar");
+assert_eq!("123foo1bar123".trim_end_matches(char::is_numeric), "123foo1bar");
+
+let x: &[_] = &['1', '2'];
+assert_eq!("12foo1bar12".trim_end_matches(x), "12foo1bar");
+

A more complex pattern, using a closure:

+ +
assert_eq!("1fooX".trim_end_matches(|c| c == '1' || c == 'X'), "1foo");
+
1.0.0 · source

pub fn trim_left_matches<'a, P>(&'a self, pat: P) -> &'a str
where + P: Pattern<'a>,

👎Deprecated since 1.33.0: superseded by trim_start_matches

Returns a string slice with all prefixes that match a pattern +repeatedly removed.

+

The pattern can be a &str, char, a slice of chars, or a +function or closure that determines if a character matches.

+
§Text directionality
+

A string is a sequence of bytes. ‘Left’ in this context means the first +position of that byte string; for a language like Arabic or Hebrew +which are ‘right to left’ rather than ‘left to right’, this will be +the right side, not the left.

+
§Examples
+
assert_eq!("11foo1bar11".trim_left_matches('1'), "foo1bar11");
+assert_eq!("123foo1bar123".trim_left_matches(char::is_numeric), "foo1bar123");
+
+let x: &[_] = &['1', '2'];
+assert_eq!("12foo1bar12".trim_left_matches(x), "foo1bar12");
+
1.0.0 · source

pub fn trim_right_matches<'a, P>(&'a self, pat: P) -> &'a str
where + P: Pattern<'a>, + <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>,

👎Deprecated since 1.33.0: superseded by trim_end_matches

Returns a string slice with all suffixes that match a pattern +repeatedly removed.

+

The pattern can be a &str, char, a slice of chars, or a +function or closure that determines if a character matches.

+
§Text directionality
+

A string is a sequence of bytes. ‘Right’ in this context means the last +position of that byte string; for a language like Arabic or Hebrew +which are ‘right to left’ rather than ‘left to right’, this will be +the left side, not the right.

+
§Examples
+

Simple patterns:

+ +
assert_eq!("11foo1bar11".trim_right_matches('1'), "11foo1bar");
+assert_eq!("123foo1bar123".trim_right_matches(char::is_numeric), "123foo1bar");
+
+let x: &[_] = &['1', '2'];
+assert_eq!("12foo1bar12".trim_right_matches(x), "12foo1bar");
+

A more complex pattern, using a closure:

+ +
assert_eq!("1fooX".trim_right_matches(|c| c == '1' || c == 'X'), "1foo");
+
1.0.0 · source

pub fn parse<F>(&self) -> Result<F, <F as FromStr>::Err>
where + F: FromStr,

Parses this string slice into another type.

+

Because parse is so general, it can cause problems with type +inference. As such, parse is one of the few times you’ll see +the syntax affectionately known as the ‘turbofish’: ::<>. This +helps the inference algorithm understand specifically which type +you’re trying to parse into.

+

parse can parse into any type that implements the FromStr trait.

+
§Errors
+

Will return Err if it’s not possible to parse this string slice into +the desired type.

+
§Examples
+

Basic usage

+ +
let four: u32 = "4".parse().unwrap();
+
+assert_eq!(4, four);
+

Using the ‘turbofish’ instead of annotating four:

+ +
let four = "4".parse::<u32>();
+
+assert_eq!(Ok(4), four);
+

Failing to parse:

+ +
let nope = "j".parse::<u32>();
+
+assert!(nope.is_err());
+
1.23.0 · source

pub fn is_ascii(&self) -> bool

Checks if all characters in this string are within the ASCII range.

+
§Examples
+
let ascii = "hello!\n";
+let non_ascii = "Grüße, Jürgen ❤";
+
+assert!(ascii.is_ascii());
+assert!(!non_ascii.is_ascii());
+
source

pub fn as_ascii(&self) -> Option<&[AsciiChar]>

🔬This is a nightly-only experimental API. (ascii_char)

If this string slice is_ascii, returns it as a slice +of ASCII characters, otherwise returns None.

+
1.23.0 · source

pub fn eq_ignore_ascii_case(&self, other: &str) -> bool

Checks that two strings are an ASCII case-insensitive match.

+

Same as to_ascii_lowercase(a) == to_ascii_lowercase(b), +but without allocating and copying temporaries.

+
§Examples
+
assert!("Ferris".eq_ignore_ascii_case("FERRIS"));
+assert!("Ferrös".eq_ignore_ascii_case("FERRöS"));
+assert!(!"Ferrös".eq_ignore_ascii_case("FERRÖS"));
+
1.80.0 · source

pub fn trim_ascii_start(&self) -> &str

Returns a string slice with leading ASCII whitespace removed.

+

‘Whitespace’ refers to the definition used by +u8::is_ascii_whitespace.

+
§Examples
+
assert_eq!(" \t \u{3000}hello world\n".trim_ascii_start(), "\u{3000}hello world\n");
+assert_eq!("  ".trim_ascii_start(), "");
+assert_eq!("".trim_ascii_start(), "");
+
1.80.0 · source

pub fn trim_ascii_end(&self) -> &str

Returns a string slice with trailing ASCII whitespace removed.

+

‘Whitespace’ refers to the definition used by +u8::is_ascii_whitespace.

+
§Examples
+
assert_eq!("\r hello world\u{3000}\n ".trim_ascii_end(), "\r hello world\u{3000}");
+assert_eq!("  ".trim_ascii_end(), "");
+assert_eq!("".trim_ascii_end(), "");
+
1.80.0 · source

pub fn trim_ascii(&self) -> &str

Returns a string slice with leading and trailing ASCII whitespace +removed.

+

‘Whitespace’ refers to the definition used by +u8::is_ascii_whitespace.

+
§Examples
+
assert_eq!("\r hello world\n ".trim_ascii(), "hello world");
+assert_eq!("  ".trim_ascii(), "");
+assert_eq!("".trim_ascii(), "");
+
1.34.0 · source

pub fn escape_debug(&self) -> EscapeDebug<'_>

Return an iterator that escapes each char in self with char::escape_debug.

+

Note: only extended grapheme codepoints that begin the string will be +escaped.

+
§Examples
+

As an iterator:

+ +
for c in "❤\n!".escape_debug() {
+    print!("{c}");
+}
+println!();
+

Using println! directly:

+ +
println!("{}", "❤\n!".escape_debug());
+

Both are equivalent to:

+ +
println!("❤\\n!");
+

Using to_string:

+ +
assert_eq!("❤\n!".escape_debug().to_string(), "❤\\n!");
+
1.34.0 · source

pub fn escape_default(&self) -> EscapeDefault<'_>

Return an iterator that escapes each char in self with char::escape_default.

+
§Examples
+

As an iterator:

+ +
for c in "❤\n!".escape_default() {
+    print!("{c}");
+}
+println!();
+

Using println! directly:

+ +
println!("{}", "❤\n!".escape_default());
+

Both are equivalent to:

+ +
println!("\\u{{2764}}\\n!");
+

Using to_string:

+ +
assert_eq!("❤\n!".escape_default().to_string(), "\\u{2764}\\n!");
+
1.34.0 · source

pub fn escape_unicode(&self) -> EscapeUnicode<'_>

Return an iterator that escapes each char in self with char::escape_unicode.

+
§Examples
+

As an iterator:

+ +
for c in "❤\n!".escape_unicode() {
+    print!("{c}");
+}
+println!();
+

Using println! directly:

+ +
println!("{}", "❤\n!".escape_unicode());
+

Both are equivalent to:

+ +
println!("\\u{{2764}}\\u{{a}}\\u{{21}}");
+

Using to_string:

+ +
assert_eq!("❤\n!".escape_unicode().to_string(), "\\u{2764}\\u{a}\\u{21}");
+
1.0.0 · source

pub fn replace<'a, P>(&'a self, from: P, to: &str) -> String
where + P: Pattern<'a>,

Replaces all matches of a pattern with another string.

+

replace creates a new String, and copies the data from this string slice into it. +While doing so, it attempts to find matches of a pattern. If it finds any, it +replaces them with the replacement string slice.

+
§Examples
+

Basic usage:

+ +
let s = "this is old";
+
+assert_eq!("this is new", s.replace("old", "new"));
+assert_eq!("than an old", s.replace("is", "an"));
+

When the pattern doesn’t match, it returns this string slice as String:

+ +
let s = "this is old";
+assert_eq!(s, s.replace("cookie monster", "little lamb"));
+
1.16.0 · source

pub fn replacen<'a, P>(&'a self, pat: P, to: &str, count: usize) -> String
where + P: Pattern<'a>,

Replaces first N matches of a pattern with another string.

+

replacen creates a new String, and copies the data from this string slice into it. +While doing so, it attempts to find matches of a pattern. If it finds any, it +replaces them with the replacement string slice at most count times.

+
§Examples
+

Basic usage:

+ +
let s = "foo foo 123 foo";
+assert_eq!("new new 123 foo", s.replacen("foo", "new", 2));
+assert_eq!("faa fao 123 foo", s.replacen('o', "a", 3));
+assert_eq!("foo foo new23 foo", s.replacen(char::is_numeric, "new", 1));
+

When the pattern doesn’t match, it returns this string slice as String:

+ +
let s = "this is old";
+assert_eq!(s, s.replacen("cookie monster", "little lamb", 10));
+
1.2.0 · source

pub fn to_lowercase(&self) -> String

Returns the lowercase equivalent of this string slice, as a new String.

+

‘Lowercase’ is defined according to the terms of the Unicode Derived Core Property +Lowercase.

+

Since some characters can expand into multiple characters when changing +the case, this function returns a String instead of modifying the +parameter in-place.

+
§Examples
+

Basic usage:

+ +
let s = "HELLO";
+
+assert_eq!("hello", s.to_lowercase());
+

A tricky example, with sigma:

+ +
let sigma = "Σ";
+
+assert_eq!("σ", sigma.to_lowercase());
+
+// but at the end of a word, it's ς, not σ:
+let odysseus = "ὈΔΥΣΣΕΎΣ";
+
+assert_eq!("ὀδυσσεύς", odysseus.to_lowercase());
+

Languages without case are not changed:

+ +
let new_year = "农历新年";
+
+assert_eq!(new_year, new_year.to_lowercase());
+
1.2.0 · source

pub fn to_uppercase(&self) -> String

Returns the uppercase equivalent of this string slice, as a new String.

+

‘Uppercase’ is defined according to the terms of the Unicode Derived Core Property +Uppercase.

+

Since some characters can expand into multiple characters when changing +the case, this function returns a String instead of modifying the +parameter in-place.

+
§Examples
+

Basic usage:

+ +
let s = "hello";
+
+assert_eq!("HELLO", s.to_uppercase());
+

Scripts without case are not changed:

+ +
let new_year = "农历新年";
+
+assert_eq!(new_year, new_year.to_uppercase());
+

One character can become multiple:

+ +
let s = "tschüß";
+
+assert_eq!("TSCHÜSS", s.to_uppercase());
+
1.16.0 · source

pub fn repeat(&self, n: usize) -> String

Creates a new String by repeating a string n times.

+
§Panics
+

This function will panic if the capacity would overflow.

+
§Examples
+

Basic usage:

+ +
assert_eq!("abc".repeat(4), String::from("abcabcabcabc"));
+

A panic upon overflow:

+ +
// this will panic at runtime
+let huge = "0123456789abcdef".repeat(usize::MAX);
+
1.23.0 · source

pub fn to_ascii_uppercase(&self) -> String

Returns a copy of this string where each character is mapped to its +ASCII upper case equivalent.

+

ASCII letters ‘a’ to ‘z’ are mapped to ‘A’ to ‘Z’, +but non-ASCII letters are unchanged.

+

To uppercase the value in-place, use make_ascii_uppercase.

+

To uppercase ASCII characters in addition to non-ASCII characters, use +to_uppercase.

+
§Examples
+
let s = "Grüße, Jürgen ❤";
+
+assert_eq!("GRüßE, JüRGEN ❤", s.to_ascii_uppercase());
+
1.23.0 · source

pub fn to_ascii_lowercase(&self) -> String

Returns a copy of this string where each character is mapped to its +ASCII lower case equivalent.

+

ASCII letters ‘A’ to ‘Z’ are mapped to ‘a’ to ‘z’, +but non-ASCII letters are unchanged.

+

To lowercase the value in-place, use make_ascii_lowercase.

+

To lowercase ASCII characters in addition to non-ASCII characters, use +to_lowercase.

+
§Examples
+
let s = "Grüße, Jürgen ❤";
+
+assert_eq!("grüße, jürgen ❤", s.to_ascii_lowercase());
+

Trait Implementations§

source§

impl Borrow<str> for PeerId

source§

fn borrow(&self) -> &str

Immutably borrows from an owned value. Read more
source§

impl Clone for PeerId

source§

fn clone(&self) -> PeerId

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for PeerId

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Deref for PeerId

§

type Target = str

The resulting type after dereferencing.
source§

fn deref(&self) -> &Self::Target

Dereferences the value.
source§

impl From<&PeerId> for PeerId

source§

fn from(value: &PeerId) -> Self

Converts to this type from the input type.
source§

impl From<&str> for PeerId

source§

fn from(source: &str) -> Self

Converts to this type from the input type.
source§

impl From<String> for PeerId

source§

fn from(source: String) -> Self

Converts to this type from the input type.
source§

impl Hash for PeerId

source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
source§

impl PartialEq for PeerId

source§

fn eq(&self, other: &PeerId) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl Eq for PeerId

source§

impl StructuralPartialEq for PeerId

Auto Trait Implementations§

§

impl Freeze for PeerId

§

impl RefUnwindSafe for PeerId

§

impl !Send for PeerId

§

impl !Sync for PeerId

§

impl Unpin for PeerId

§

impl UnwindSafe for PeerId

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CallHasher for T
where + T: Hash + ?Sized,

§

default fn get_hash<H, B>(value: &H, build_hasher: &B) -> u64
where + H: Hash + ?Sized, + B: BuildHasher,

source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_test_framework/ephemeral/type.Data.html b/air_test_framework/ephemeral/type.Data.html new file mode 100644 index 00000000..0e33bba0 --- /dev/null +++ b/air_test_framework/ephemeral/type.Data.html @@ -0,0 +1 @@ +Data in air_test_framework::ephemeral - Rust

Type Alias air_test_framework::ephemeral::Data

source ·
pub type Data = Vec<u8>;

Aliased Type§

struct Data { /* private fields */ }
\ No newline at end of file diff --git a/air_test_framework/execution/index.html b/air_test_framework/execution/index.html new file mode 100644 index 00000000..1c30adf7 --- /dev/null +++ b/air_test_framework/execution/index.html @@ -0,0 +1,2 @@ +air_test_framework::execution - Rust

Module air_test_framework::execution

source ·

Structs§

  • A executor for an AIR script. Several executors may share same TransformedAirScript +and its state.
\ No newline at end of file diff --git a/air_test_framework/execution/sidebar-items.js b/air_test_framework/execution/sidebar-items.js new file mode 100644 index 00000000..6c66cc69 --- /dev/null +++ b/air_test_framework/execution/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"struct":["AirScriptExecutor"]}; \ No newline at end of file diff --git a/air_test_framework/execution/struct.AirScriptExecutor.html b/air_test_framework/execution/struct.AirScriptExecutor.html new file mode 100644 index 00000000..dd30033b --- /dev/null +++ b/air_test_framework/execution/struct.AirScriptExecutor.html @@ -0,0 +1,74 @@ +AirScriptExecutor in air_test_framework::execution - Rust

Struct air_test_framework::execution::AirScriptExecutor

source ·
pub struct AirScriptExecutor<R = DefaultAirRunner> { /* private fields */ }
Expand description

A executor for an AIR script. Several executors may share same TransformedAirScript +and its state.

+

Implementations§

source§

impl AirScriptExecutor<DefaultAirRunner>

source

pub async fn from_annotated( + test_parameters: TestRunParameters, + annotated_air_script: &str, +) -> Result<Self, String>

Simple constructor where everything is generated from the annotated_air_script.

+
source§

impl<R: AirRunner> AirScriptExecutor<R>

source

pub async fn from_transformed_air_script( + test_parameters: TestRunParameters, + test_init_parameters: TestInitParameters, + transformed_air_script: TransformedAirScript<R>, +) -> Result<Self, String>

source

pub async fn new( + test_parameters: TestRunParameters, + common_services: Vec<MarineServiceHandle>, + extra_peers: impl IntoIterator<Item = PeerId>, + annotated_air_script: &str, +) -> Result<Self, String>

Create execution from the annotated air script.

+

extra_peers allows you to define peers that are not mentioned in the annotated script +explicitly, but are used, e.g. if their names are returned from a call.

+
source

pub async fn from_network( + test_parameters: TestRunParameters, + test_init_parameters: TestInitParameters, + network: Rc<Network<R>>, + annotated_air_script: &str, +) -> Result<Self, String>

source

pub async fn new_with_init_parameters( + test_parameters: TestRunParameters, + test_init_parameters: TestInitParameters, + common_services: Vec<MarineServiceHandle>, + extra_peers: impl IntoIterator<Item = PeerId>, + annotated_air_script: &str, +) -> Result<Self, String>

source

pub fn execution_iter<'s, Id>( + &'s self, + peer_id: &Id, +) -> Option<impl Stream<Item = RawAVMOutcome> + 's>
where + PeerId: Borrow<Id> + for<'a> From<&'a Id>, + Id: Eq + Hash + ?Sized,

Return Iterator for handling all the queued datas +for particular peer_id.

+
source

pub async fn execute_all<Id>(&self, peer_id: &Id) -> Option<Vec<RawAVMOutcome>>
where + PeerId: Borrow<Id> + for<'a> From<&'a Id>, + Id: Eq + Hash + ?Sized,

Process all queued datas, panicing on error.

+
source

pub async fn execute_one<Id>(&self, peer_id: &Id) -> Option<RawAVMOutcome>
where + PeerId: Borrow<Id> + for<'a> From<&'a Id>, + Id: Eq + Hash + ?Sized,

Process one queued data, panicing if it is unavalable or on error.

+
source

pub fn enqueue(&self, peer_id: impl Into<PeerId>, data: Data)

Push data into peer’s queue.

+
source

pub fn get_prev_data(&self, peer_id: impl Into<PeerId>) -> Data

source

pub fn resolve_name(&self, name: &str) -> PeerId

source

pub fn get_network(&self) -> Rc<Network<R>>

source

pub fn get_transformed_air_script(&self) -> &TransformedAirScript<R>

Auto Trait Implementations§

§

impl<R> Freeze for AirScriptExecutor<R>

§

impl<R = WasmAirRunner> !RefUnwindSafe for AirScriptExecutor<R>

§

impl<R = WasmAirRunner> !Send for AirScriptExecutor<R>

§

impl<R = WasmAirRunner> !Sync for AirScriptExecutor<R>

§

impl<R> Unpin for AirScriptExecutor<R>

§

impl<R = WasmAirRunner> !UnwindSafe for AirScriptExecutor<R>

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_test_framework/index.html b/air_test_framework/index.html new file mode 100644 index 00000000..44463058 --- /dev/null +++ b/air_test_framework/index.html @@ -0,0 +1 @@ +air_test_framework - Rust

Crate air_test_framework

source ·

Re-exports§

Modules§

\ No newline at end of file diff --git a/air_test_framework/services/enum.FunctionOutcome.html b/air_test_framework/services/enum.FunctionOutcome.html new file mode 100644 index 00000000..ec73e100 --- /dev/null +++ b/air_test_framework/services/enum.FunctionOutcome.html @@ -0,0 +1,37 @@ +FunctionOutcome in air_test_framework::services - Rust

Enum air_test_framework::services::FunctionOutcome

source ·
pub enum FunctionOutcome {
+    ServiceResult(CallServiceResult, Duration),
+    NotDefined,
+    Empty,
+}
Expand description

Somewhat modified type from fluence. The Duration defines when the caller receives it, imitating +real execution time.

+

Variants§

§

ServiceResult(CallServiceResult, Duration)

§

NotDefined

§

Empty

Implementations§

source§

impl FunctionOutcome

source

pub fn from_service_result(service_result: CallServiceResult) -> Self

source

pub fn from_value(value: JValue) -> Self

Trait Implementations§

source§

impl Debug for FunctionOutcome

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_test_framework/services/index.html b/air_test_framework/services/index.html new file mode 100644 index 00000000..0cdea2b9 --- /dev/null +++ b/air_test_framework/services/index.html @@ -0,0 +1,2 @@ +air_test_framework::services - Rust

Module air_test_framework::services

source ·

Structs§

Enums§

  • Somewhat modified type from fluence. The Duration defines when the caller receives it, imitating +real execution time.

Traits§

Type Aliases§

\ No newline at end of file diff --git a/air_test_framework/services/sidebar-items.js b/air_test_framework/services/sidebar-items.js new file mode 100644 index 00000000..0b5113b6 --- /dev/null +++ b/air_test_framework/services/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"enum":["FunctionOutcome"],"struct":["MarineServiceHandle"],"trait":["MarineService"],"type":["JValue"]}; \ No newline at end of file diff --git a/air_test_framework/services/struct.MarineServiceHandle.html b/air_test_framework/services/struct.MarineServiceHandle.html new file mode 100644 index 00000000..5d5e1e4f --- /dev/null +++ b/air_test_framework/services/struct.MarineServiceHandle.html @@ -0,0 +1,37 @@ +MarineServiceHandle in air_test_framework::services - Rust

Struct air_test_framework::services::MarineServiceHandle

source ·
pub struct MarineServiceHandle(/* private fields */);

Trait Implementations§

source§

impl Clone for MarineServiceHandle

source§

fn clone(&self) -> MarineServiceHandle

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl MarineService for MarineServiceHandle

source§

fn call<'this>( + &'this self, + params: CallRequestParams, +) -> LocalBoxFuture<'this, FunctionOutcome>

source§

fn to_handle(self) -> MarineServiceHandle
where + Self: Sized + 'static,

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_test_framework/services/trait.MarineService.html b/air_test_framework/services/trait.MarineService.html new file mode 100644 index 00000000..e0731db8 --- /dev/null +++ b/air_test_framework/services/trait.MarineService.html @@ -0,0 +1,16 @@ +MarineService in air_test_framework::services - Rust

Trait air_test_framework::services::MarineService

source ·
pub trait MarineService {
+    // Required method
+    fn call<'this>(
+        &'this self,
+        params: CallRequestParams,
+    ) -> LocalBoxFuture<'this, FunctionOutcome>;
+
+    // Provided method
+    fn to_handle(self) -> MarineServiceHandle
+       where Self: Sized + 'static { ... }
+}
Expand description

A mocked Marine service.

+

Required Methods§

source

fn call<'this>( + &'this self, + params: CallRequestParams, +) -> LocalBoxFuture<'this, FunctionOutcome>

Provided Methods§

source

fn to_handle(self) -> MarineServiceHandle
where + Self: Sized + 'static,

Implementors§

\ No newline at end of file diff --git a/air_test_framework/services/type.JValue.html b/air_test_framework/services/type.JValue.html new file mode 100644 index 00000000..d019d317 --- /dev/null +++ b/air_test_framework/services/type.JValue.html @@ -0,0 +1,31 @@ +JValue in air_test_framework::services - Rust

Type Alias air_test_framework::services::JValue

source ·
pub type JValue = Value;

Aliased Type§

enum JValue {
+    Null,
+    Bool(bool),
+    Number(Number),
+    String(String),
+    Array(Vec<Value>),
+    Object(Map<String, Value>),
+}

Variants§

§

Null

Represents a JSON null value.

+ +
let v = json!(null);
+
§

Bool(bool)

Represents a JSON boolean.

+ +
let v = json!(true);
+
§

Number(Number)

Represents a JSON number, whether integer or floating point.

+ +
let v = json!(12.5);
+
§

String(String)

Represents a JSON string.

+ +
let v = json!("a string");
+
§

Array(Vec<Value>)

Represents a JSON array.

+ +
let v = json!(["an", "array"]);
+
§

Object(Map<String, Value>)

Represents a JSON object.

+

By default the map is backed by a BTreeMap. Enable the preserve_order +feature of serde_json to use IndexMap instead, which preserves +entries in the order they are inserted into the map. In particular, this +allows JSON data to be deserialized into a Value and serialized to a +string while retaining the order of map keys in the input.

+ +
let v = json!({ "an": "object" });
+
\ No newline at end of file diff --git a/air_test_framework/sidebar-items.js b/air_test_framework/sidebar-items.js new file mode 100644 index 00000000..e2dd356d --- /dev/null +++ b/air_test_framework/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"mod":["asserts","ephemeral","execution","services","transform"]}; \ No newline at end of file diff --git a/air_test_framework/transform/index.html b/air_test_framework/transform/index.html new file mode 100644 index 00000000..d6200e7e --- /dev/null +++ b/air_test_framework/transform/index.html @@ -0,0 +1 @@ +air_test_framework::transform - Rust

Module air_test_framework::transform

source ·

Modules§

\ No newline at end of file diff --git a/air_test_framework/transform/sidebar-items.js b/air_test_framework/transform/sidebar-items.js new file mode 100644 index 00000000..5d4d0f00 --- /dev/null +++ b/air_test_framework/transform/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"mod":["walker"]}; \ No newline at end of file diff --git a/air_test_framework/transform/walker/index.html b/air_test_framework/transform/walker/index.html new file mode 100644 index 00000000..5bd427e8 --- /dev/null +++ b/air_test_framework/transform/walker/index.html @@ -0,0 +1,3 @@ +air_test_framework::transform::walker - Rust

Module air_test_framework::transform::walker

source ·

Structs§

  • Transformed script represents transformed script’s services’ state within the network. +Executions that use the same transformed script share same generated services’ state. +This struct is cheap to clone, and cloned copies share same internal state.
\ No newline at end of file diff --git a/air_test_framework/transform/walker/sidebar-items.js b/air_test_framework/transform/walker/sidebar-items.js new file mode 100644 index 00000000..b5f8c4d7 --- /dev/null +++ b/air_test_framework/transform/walker/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"struct":["TransformedAirScript"]}; \ No newline at end of file diff --git a/air_test_framework/transform/walker/struct.TransformedAirScript.html b/air_test_framework/transform/walker/struct.TransformedAirScript.html new file mode 100644 index 00000000..e45d408d --- /dev/null +++ b/air_test_framework/transform/walker/struct.TransformedAirScript.html @@ -0,0 +1,1260 @@ +TransformedAirScript in air_test_framework::transform::walker - Rust
pub struct TransformedAirScript<R = DefaultAirRunner> { /* private fields */ }
Expand description

Transformed script represents transformed script’s services’ state within the network. +Executions that use the same transformed script share same generated services’ state. +This struct is cheap to clone, and cloned copies share same internal state.

+

Implementations§

source§

impl<R: AirRunner> TransformedAirScript<R>

source

pub async fn new( + annotated_air_script: &str, + network: Rc<Network<R>>, + test_init_parameters: TestInitParameters, +) -> Result<Self, String>

source

pub fn get_network(&self) -> Rc<Network<R>>

Methods from Deref<Target = str>§

1.0.0 · source

pub fn len(&self) -> usize

Returns the length of self.

+

This length is in bytes, not chars or graphemes. In other words, +it might not be what a human considers the length of the string.

+
§Examples
+
let len = "foo".len();
+assert_eq!(3, len);
+
+assert_eq!("ƒoo".len(), 4); // fancy f!
+assert_eq!("ƒoo".chars().count(), 3);
+
1.0.0 · source

pub fn is_empty(&self) -> bool

Returns true if self has a length of zero bytes.

+
§Examples
+
let s = "";
+assert!(s.is_empty());
+
+let s = "not empty";
+assert!(!s.is_empty());
+
1.9.0 · source

pub fn is_char_boundary(&self, index: usize) -> bool

Checks that index-th byte is the first byte in a UTF-8 code point +sequence or the end of the string.

+

The start and end of the string (when index == self.len()) are +considered to be boundaries.

+

Returns false if index is greater than self.len().

+
§Examples
+
let s = "Löwe 老虎 Léopard";
+assert!(s.is_char_boundary(0));
+// start of `老`
+assert!(s.is_char_boundary(6));
+assert!(s.is_char_boundary(s.len()));
+
+// second byte of `ö`
+assert!(!s.is_char_boundary(2));
+
+// third byte of `老`
+assert!(!s.is_char_boundary(8));
+
source

pub fn floor_char_boundary(&self, index: usize) -> usize

🔬This is a nightly-only experimental API. (round_char_boundary)

Finds the closest x not exceeding index where is_char_boundary(x) is true.

+

This method can help you truncate a string so that it’s still valid UTF-8, but doesn’t +exceed a given number of bytes. Note that this is done purely at the character level +and can still visually split graphemes, even though the underlying characters aren’t +split. For example, the emoji 🧑‍🔬 (scientist) could be split so that the string only +includes 🧑 (person) instead.

+
§Examples
+
#![feature(round_char_boundary)]
+let s = "❤️🧡💛💚💙💜";
+assert_eq!(s.len(), 26);
+assert!(!s.is_char_boundary(13));
+
+let closest = s.floor_char_boundary(13);
+assert_eq!(closest, 10);
+assert_eq!(&s[..closest], "❤️🧡");
+
source

pub fn ceil_char_boundary(&self, index: usize) -> usize

🔬This is a nightly-only experimental API. (round_char_boundary)

Finds the closest x not below index where is_char_boundary(x) is true.

+

If index is greater than the length of the string, this returns the length of the string.

+

This method is the natural complement to floor_char_boundary. See that method +for more details.

+
§Examples
+
#![feature(round_char_boundary)]
+let s = "❤️🧡💛💚💙💜";
+assert_eq!(s.len(), 26);
+assert!(!s.is_char_boundary(13));
+
+let closest = s.ceil_char_boundary(13);
+assert_eq!(closest, 14);
+assert_eq!(&s[..closest], "❤️🧡💛");
+
1.0.0 · source

pub fn as_bytes(&self) -> &[u8]

Converts a string slice to a byte slice. To convert the byte slice back +into a string slice, use the from_utf8 function.

+
§Examples
+
let bytes = "bors".as_bytes();
+assert_eq!(b"bors", bytes);
+
1.0.0 · source

pub fn as_ptr(&self) -> *const u8

Converts a string slice to a raw pointer.

+

As string slices are a slice of bytes, the raw pointer points to a +u8. This pointer will be pointing to the first byte of the string +slice.

+

The caller must ensure that the returned pointer is never written to. +If you need to mutate the contents of the string slice, use as_mut_ptr.

+
§Examples
+
let s = "Hello";
+let ptr = s.as_ptr();
+
1.20.0 · source

pub fn get<I>(&self, i: I) -> Option<&<I as SliceIndex<str>>::Output>
where + I: SliceIndex<str>,

Returns a subslice of str.

+

This is the non-panicking alternative to indexing the str. Returns +None whenever equivalent indexing operation would panic.

+
§Examples
+
let v = String::from("🗻∈🌏");
+
+assert_eq!(Some("🗻"), v.get(0..4));
+
+// indices not on UTF-8 sequence boundaries
+assert!(v.get(1..).is_none());
+assert!(v.get(..8).is_none());
+
+// out of bounds
+assert!(v.get(..42).is_none());
+
1.20.0 · source

pub unsafe fn get_unchecked<I>(&self, i: I) -> &<I as SliceIndex<str>>::Output
where + I: SliceIndex<str>,

Returns an unchecked subslice of str.

+

This is the unchecked alternative to indexing the str.

+
§Safety
+

Callers of this function are responsible that these preconditions are +satisfied:

+
    +
  • The starting index must not exceed the ending index;
  • +
  • Indexes must be within bounds of the original slice;
  • +
  • Indexes must lie on UTF-8 sequence boundaries.
  • +
+

Failing that, the returned string slice may reference invalid memory or +violate the invariants communicated by the str type.

+
§Examples
+
let v = "🗻∈🌏";
+unsafe {
+    assert_eq!("🗻", v.get_unchecked(0..4));
+    assert_eq!("∈", v.get_unchecked(4..7));
+    assert_eq!("🌏", v.get_unchecked(7..11));
+}
+
1.0.0 · source

pub unsafe fn slice_unchecked(&self, begin: usize, end: usize) -> &str

👎Deprecated since 1.29.0: use get_unchecked(begin..end) instead

Creates a string slice from another string slice, bypassing safety +checks.

+

This is generally not recommended, use with caution! For a safe +alternative see str and Index.

+

This new slice goes from begin to end, including begin but +excluding end.

+

To get a mutable string slice instead, see the +slice_mut_unchecked method.

+
§Safety
+

Callers of this function are responsible that three preconditions are +satisfied:

+
    +
  • begin must not exceed end.
  • +
  • begin and end must be byte positions within the string slice.
  • +
  • begin and end must lie on UTF-8 sequence boundaries.
  • +
+
§Examples
+
let s = "Löwe 老虎 Léopard";
+
+unsafe {
+    assert_eq!("Löwe 老虎 Léopard", s.slice_unchecked(0, 21));
+}
+
+let s = "Hello, world!";
+
+unsafe {
+    assert_eq!("world", s.slice_unchecked(7, 12));
+}
+
1.4.0 · source

pub fn split_at(&self, mid: usize) -> (&str, &str)

Divide one string slice into two at an index.

+

The argument, mid, should be a byte offset from the start of the +string. It must also be on the boundary of a UTF-8 code point.

+

The two slices returned go from the start of the string slice to mid, +and from mid to the end of the string slice.

+

To get mutable string slices instead, see the split_at_mut +method.

+
§Panics
+

Panics if mid is not on a UTF-8 code point boundary, or if it is past +the end of the last code point of the string slice. For a non-panicking +alternative see split_at_checked.

+
§Examples
+
let s = "Per Martin-Löf";
+
+let (first, last) = s.split_at(3);
+
+assert_eq!("Per", first);
+assert_eq!(" Martin-Löf", last);
+
1.80.0 · source

pub fn split_at_checked(&self, mid: usize) -> Option<(&str, &str)>

Divide one string slice into two at an index.

+

The argument, mid, should be a valid byte offset from the start of the +string. It must also be on the boundary of a UTF-8 code point. The +method returns None if that’s not the case.

+

The two slices returned go from the start of the string slice to mid, +and from mid to the end of the string slice.

+

To get mutable string slices instead, see the split_at_mut_checked +method.

+
§Examples
+
let s = "Per Martin-Löf";
+
+let (first, last) = s.split_at_checked(3).unwrap();
+assert_eq!("Per", first);
+assert_eq!(" Martin-Löf", last);
+
+assert_eq!(None, s.split_at_checked(13));  // Inside “ö”
+assert_eq!(None, s.split_at_checked(16));  // Beyond the string length
+
1.0.0 · source

pub fn chars(&self) -> Chars<'_>

Returns an iterator over the chars of a string slice.

+

As a string slice consists of valid UTF-8, we can iterate through a +string slice by char. This method returns such an iterator.

+

It’s important to remember that char represents a Unicode Scalar +Value, and might not match your idea of what a ‘character’ is. Iteration +over grapheme clusters may be what you actually want. This functionality +is not provided by Rust’s standard library, check crates.io instead.

+
§Examples
+

Basic usage:

+ +
let word = "goodbye";
+
+let count = word.chars().count();
+assert_eq!(7, count);
+
+let mut chars = word.chars();
+
+assert_eq!(Some('g'), chars.next());
+assert_eq!(Some('o'), chars.next());
+assert_eq!(Some('o'), chars.next());
+assert_eq!(Some('d'), chars.next());
+assert_eq!(Some('b'), chars.next());
+assert_eq!(Some('y'), chars.next());
+assert_eq!(Some('e'), chars.next());
+
+assert_eq!(None, chars.next());
+

Remember, chars might not match your intuition about characters:

+ +
let y = "y̆";
+
+let mut chars = y.chars();
+
+assert_eq!(Some('y'), chars.next()); // not 'y̆'
+assert_eq!(Some('\u{0306}'), chars.next());
+
+assert_eq!(None, chars.next());
+
1.0.0 · source

pub fn char_indices(&self) -> CharIndices<'_>

Returns an iterator over the chars of a string slice, and their +positions.

+

As a string slice consists of valid UTF-8, we can iterate through a +string slice by char. This method returns an iterator of both +these chars, as well as their byte positions.

+

The iterator yields tuples. The position is first, the char is +second.

+
§Examples
+

Basic usage:

+ +
let word = "goodbye";
+
+let count = word.char_indices().count();
+assert_eq!(7, count);
+
+let mut char_indices = word.char_indices();
+
+assert_eq!(Some((0, 'g')), char_indices.next());
+assert_eq!(Some((1, 'o')), char_indices.next());
+assert_eq!(Some((2, 'o')), char_indices.next());
+assert_eq!(Some((3, 'd')), char_indices.next());
+assert_eq!(Some((4, 'b')), char_indices.next());
+assert_eq!(Some((5, 'y')), char_indices.next());
+assert_eq!(Some((6, 'e')), char_indices.next());
+
+assert_eq!(None, char_indices.next());
+

Remember, chars might not match your intuition about characters:

+ +
let yes = "y̆es";
+
+let mut char_indices = yes.char_indices();
+
+assert_eq!(Some((0, 'y')), char_indices.next()); // not (0, 'y̆')
+assert_eq!(Some((1, '\u{0306}')), char_indices.next());
+
+// note the 3 here - the previous character took up two bytes
+assert_eq!(Some((3, 'e')), char_indices.next());
+assert_eq!(Some((4, 's')), char_indices.next());
+
+assert_eq!(None, char_indices.next());
+
1.0.0 · source

pub fn bytes(&self) -> Bytes<'_>

An iterator over the bytes of a string slice.

+

As a string slice consists of a sequence of bytes, we can iterate +through a string slice by byte. This method returns such an iterator.

+
§Examples
+
let mut bytes = "bors".bytes();
+
+assert_eq!(Some(b'b'), bytes.next());
+assert_eq!(Some(b'o'), bytes.next());
+assert_eq!(Some(b'r'), bytes.next());
+assert_eq!(Some(b's'), bytes.next());
+
+assert_eq!(None, bytes.next());
+
1.1.0 · source

pub fn split_whitespace(&self) -> SplitWhitespace<'_>

Splits a string slice by whitespace.

+

The iterator returned will return string slices that are sub-slices of +the original string slice, separated by any amount of whitespace.

+

‘Whitespace’ is defined according to the terms of the Unicode Derived +Core Property White_Space. If you only want to split on ASCII whitespace +instead, use split_ascii_whitespace.

+
§Examples
+

Basic usage:

+ +
let mut iter = "A few words".split_whitespace();
+
+assert_eq!(Some("A"), iter.next());
+assert_eq!(Some("few"), iter.next());
+assert_eq!(Some("words"), iter.next());
+
+assert_eq!(None, iter.next());
+

All kinds of whitespace are considered:

+ +
let mut iter = " Mary   had\ta\u{2009}little  \n\t lamb".split_whitespace();
+assert_eq!(Some("Mary"), iter.next());
+assert_eq!(Some("had"), iter.next());
+assert_eq!(Some("a"), iter.next());
+assert_eq!(Some("little"), iter.next());
+assert_eq!(Some("lamb"), iter.next());
+
+assert_eq!(None, iter.next());
+

If the string is empty or all whitespace, the iterator yields no string slices:

+ +
assert_eq!("".split_whitespace().next(), None);
+assert_eq!("   ".split_whitespace().next(), None);
+
1.34.0 · source

pub fn split_ascii_whitespace(&self) -> SplitAsciiWhitespace<'_>

Splits a string slice by ASCII whitespace.

+

The iterator returned will return string slices that are sub-slices of +the original string slice, separated by any amount of ASCII whitespace.

+

To split by Unicode Whitespace instead, use split_whitespace.

+
§Examples
+

Basic usage:

+ +
let mut iter = "A few words".split_ascii_whitespace();
+
+assert_eq!(Some("A"), iter.next());
+assert_eq!(Some("few"), iter.next());
+assert_eq!(Some("words"), iter.next());
+
+assert_eq!(None, iter.next());
+

All kinds of ASCII whitespace are considered:

+ +
let mut iter = " Mary   had\ta little  \n\t lamb".split_ascii_whitespace();
+assert_eq!(Some("Mary"), iter.next());
+assert_eq!(Some("had"), iter.next());
+assert_eq!(Some("a"), iter.next());
+assert_eq!(Some("little"), iter.next());
+assert_eq!(Some("lamb"), iter.next());
+
+assert_eq!(None, iter.next());
+

If the string is empty or all ASCII whitespace, the iterator yields no string slices:

+ +
assert_eq!("".split_ascii_whitespace().next(), None);
+assert_eq!("   ".split_ascii_whitespace().next(), None);
+
1.0.0 · source

pub fn lines(&self) -> Lines<'_>

An iterator over the lines of a string, as string slices.

+

Lines are split at line endings that are either newlines (\n) or +sequences of a carriage return followed by a line feed (\r\n).

+

Line terminators are not included in the lines returned by the iterator.

+

Note that any carriage return (\r) not immediately followed by a +line feed (\n) does not split a line. These carriage returns are +thereby included in the produced lines.

+

The final line ending is optional. A string that ends with a final line +ending will return the same lines as an otherwise identical string +without a final line ending.

+
§Examples
+

Basic usage:

+ +
let text = "foo\r\nbar\n\nbaz\r";
+let mut lines = text.lines();
+
+assert_eq!(Some("foo"), lines.next());
+assert_eq!(Some("bar"), lines.next());
+assert_eq!(Some(""), lines.next());
+// Trailing carriage return is included in the last line
+assert_eq!(Some("baz\r"), lines.next());
+
+assert_eq!(None, lines.next());
+

The final line does not require any ending:

+ +
let text = "foo\nbar\n\r\nbaz";
+let mut lines = text.lines();
+
+assert_eq!(Some("foo"), lines.next());
+assert_eq!(Some("bar"), lines.next());
+assert_eq!(Some(""), lines.next());
+assert_eq!(Some("baz"), lines.next());
+
+assert_eq!(None, lines.next());
+
1.0.0 · source

pub fn lines_any(&self) -> LinesAny<'_>

👎Deprecated since 1.4.0: use lines() instead now

An iterator over the lines of a string.

+
1.8.0 · source

pub fn encode_utf16(&self) -> EncodeUtf16<'_>

Returns an iterator of u16 over the string encoded as UTF-16.

+
§Examples
+
let text = "Zażółć gęślą jaźń";
+
+let utf8_len = text.len();
+let utf16_len = text.encode_utf16().count();
+
+assert!(utf16_len <= utf8_len);
+
1.0.0 · source

pub fn contains<'a, P>(&'a self, pat: P) -> bool
where + P: Pattern<'a>,

Returns true if the given pattern matches a sub-slice of +this string slice.

+

Returns false if it does not.

+

The pattern can be a &str, char, a slice of chars, or a +function or closure that determines if a character matches.

+
§Examples
+
let bananas = "bananas";
+
+assert!(bananas.contains("nana"));
+assert!(!bananas.contains("apples"));
+
1.0.0 · source

pub fn starts_with<'a, P>(&'a self, pat: P) -> bool
where + P: Pattern<'a>,

Returns true if the given pattern matches a prefix of this +string slice.

+

Returns false if it does not.

+

The pattern can be a &str, in which case this function will return true if +the &str is a prefix of this string slice.

+

The pattern can also be a char, a slice of chars, or a +function or closure that determines if a character matches. +These will only be checked against the first character of this string slice. +Look at the second example below regarding behavior for slices of chars.

+
§Examples
+
let bananas = "bananas";
+
+assert!(bananas.starts_with("bana"));
+assert!(!bananas.starts_with("nana"));
+ +
let bananas = "bananas";
+
+// Note that both of these assert successfully.
+assert!(bananas.starts_with(&['b', 'a', 'n', 'a']));
+assert!(bananas.starts_with(&['a', 'b', 'c', 'd']));
+
1.0.0 · source

pub fn ends_with<'a, P>(&'a self, pat: P) -> bool
where + P: Pattern<'a>, + <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>,

Returns true if the given pattern matches a suffix of this +string slice.

+

Returns false if it does not.

+

The pattern can be a &str, char, a slice of chars, or a +function or closure that determines if a character matches.

+
§Examples
+
let bananas = "bananas";
+
+assert!(bananas.ends_with("anas"));
+assert!(!bananas.ends_with("nana"));
+
1.0.0 · source

pub fn find<'a, P>(&'a self, pat: P) -> Option<usize>
where + P: Pattern<'a>,

Returns the byte index of the first character of this string slice that +matches the pattern.

+

Returns None if the pattern doesn’t match.

+

The pattern can be a &str, char, a slice of chars, or a +function or closure that determines if a character matches.

+
§Examples
+

Simple patterns:

+ +
let s = "Löwe 老虎 Léopard Gepardi";
+
+assert_eq!(s.find('L'), Some(0));
+assert_eq!(s.find('é'), Some(14));
+assert_eq!(s.find("pard"), Some(17));
+

More complex patterns using point-free style and closures:

+ +
let s = "Löwe 老虎 Léopard";
+
+assert_eq!(s.find(char::is_whitespace), Some(5));
+assert_eq!(s.find(char::is_lowercase), Some(1));
+assert_eq!(s.find(|c: char| c.is_whitespace() || c.is_lowercase()), Some(1));
+assert_eq!(s.find(|c: char| (c < 'o') && (c > 'a')), Some(4));
+

Not finding the pattern:

+ +
let s = "Löwe 老虎 Léopard";
+let x: &[_] = &['1', '2'];
+
+assert_eq!(s.find(x), None);
+
1.0.0 · source

pub fn rfind<'a, P>(&'a self, pat: P) -> Option<usize>
where + P: Pattern<'a>, + <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>,

Returns the byte index for the first character of the last match of the pattern in +this string slice.

+

Returns None if the pattern doesn’t match.

+

The pattern can be a &str, char, a slice of chars, or a +function or closure that determines if a character matches.

+
§Examples
+

Simple patterns:

+ +
let s = "Löwe 老虎 Léopard Gepardi";
+
+assert_eq!(s.rfind('L'), Some(13));
+assert_eq!(s.rfind('é'), Some(14));
+assert_eq!(s.rfind("pard"), Some(24));
+

More complex patterns with closures:

+ +
let s = "Löwe 老虎 Léopard";
+
+assert_eq!(s.rfind(char::is_whitespace), Some(12));
+assert_eq!(s.rfind(char::is_lowercase), Some(20));
+

Not finding the pattern:

+ +
let s = "Löwe 老虎 Léopard";
+let x: &[_] = &['1', '2'];
+
+assert_eq!(s.rfind(x), None);
+
1.0.0 · source

pub fn split<'a, P>(&'a self, pat: P) -> Split<'a, P>
where + P: Pattern<'a>,

An iterator over substrings of this string slice, separated by +characters matched by a pattern.

+

The pattern can be a &str, char, a slice of chars, or a +function or closure that determines if a character matches.

+
§Iterator behavior
+

The returned iterator will be a DoubleEndedIterator if the pattern +allows a reverse search and forward/reverse search yields the same +elements. This is true for, e.g., char, but not for &str.

+

If the pattern allows a reverse search but its results might differ +from a forward search, the rsplit method can be used.

+
§Examples
+

Simple patterns:

+ +
let v: Vec<&str> = "Mary had a little lamb".split(' ').collect();
+assert_eq!(v, ["Mary", "had", "a", "little", "lamb"]);
+
+let v: Vec<&str> = "".split('X').collect();
+assert_eq!(v, [""]);
+
+let v: Vec<&str> = "lionXXtigerXleopard".split('X').collect();
+assert_eq!(v, ["lion", "", "tiger", "leopard"]);
+
+let v: Vec<&str> = "lion::tiger::leopard".split("::").collect();
+assert_eq!(v, ["lion", "tiger", "leopard"]);
+
+let v: Vec<&str> = "abc1def2ghi".split(char::is_numeric).collect();
+assert_eq!(v, ["abc", "def", "ghi"]);
+
+let v: Vec<&str> = "lionXtigerXleopard".split(char::is_uppercase).collect();
+assert_eq!(v, ["lion", "tiger", "leopard"]);
+

If the pattern is a slice of chars, split on each occurrence of any of the characters:

+ +
let v: Vec<&str> = "2020-11-03 23:59".split(&['-', ' ', ':', '@'][..]).collect();
+assert_eq!(v, ["2020", "11", "03", "23", "59"]);
+

A more complex pattern, using a closure:

+ +
let v: Vec<&str> = "abc1defXghi".split(|c| c == '1' || c == 'X').collect();
+assert_eq!(v, ["abc", "def", "ghi"]);
+

If a string contains multiple contiguous separators, you will end up +with empty strings in the output:

+ +
let x = "||||a||b|c".to_string();
+let d: Vec<_> = x.split('|').collect();
+
+assert_eq!(d, &["", "", "", "", "a", "", "b", "c"]);
+

Contiguous separators are separated by the empty string.

+ +
let x = "(///)".to_string();
+let d: Vec<_> = x.split('/').collect();
+
+assert_eq!(d, &["(", "", "", ")"]);
+

Separators at the start or end of a string are neighbored +by empty strings.

+ +
let d: Vec<_> = "010".split("0").collect();
+assert_eq!(d, &["", "1", ""]);
+

When the empty string is used as a separator, it separates +every character in the string, along with the beginning +and end of the string.

+ +
let f: Vec<_> = "rust".split("").collect();
+assert_eq!(f, &["", "r", "u", "s", "t", ""]);
+

Contiguous separators can lead to possibly surprising behavior +when whitespace is used as the separator. This code is correct:

+ +
let x = "    a  b c".to_string();
+let d: Vec<_> = x.split(' ').collect();
+
+assert_eq!(d, &["", "", "", "", "a", "", "b", "c"]);
+

It does not give you:

+ +
assert_eq!(d, &["a", "b", "c"]);
+

Use split_whitespace for this behavior.

+
1.51.0 · source

pub fn split_inclusive<'a, P>(&'a self, pat: P) -> SplitInclusive<'a, P>
where + P: Pattern<'a>,

An iterator over substrings of this string slice, separated by +characters matched by a pattern. Differs from the iterator produced by +split in that split_inclusive leaves the matched part as the +terminator of the substring.

+

The pattern can be a &str, char, a slice of chars, or a +function or closure that determines if a character matches.

+
§Examples
+
let v: Vec<&str> = "Mary had a little lamb\nlittle lamb\nlittle lamb."
+    .split_inclusive('\n').collect();
+assert_eq!(v, ["Mary had a little lamb\n", "little lamb\n", "little lamb."]);
+

If the last element of the string is matched, +that element will be considered the terminator of the preceding substring. +That substring will be the last item returned by the iterator.

+ +
let v: Vec<&str> = "Mary had a little lamb\nlittle lamb\nlittle lamb.\n"
+    .split_inclusive('\n').collect();
+assert_eq!(v, ["Mary had a little lamb\n", "little lamb\n", "little lamb.\n"]);
+
1.0.0 · source

pub fn rsplit<'a, P>(&'a self, pat: P) -> RSplit<'a, P>
where + P: Pattern<'a>, + <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>,

An iterator over substrings of the given string slice, separated by +characters matched by a pattern and yielded in reverse order.

+

The pattern can be a &str, char, a slice of chars, or a +function or closure that determines if a character matches.

+
§Iterator behavior
+

The returned iterator requires that the pattern supports a reverse +search, and it will be a DoubleEndedIterator if a forward/reverse +search yields the same elements.

+

For iterating from the front, the split method can be used.

+
§Examples
+

Simple patterns:

+ +
let v: Vec<&str> = "Mary had a little lamb".rsplit(' ').collect();
+assert_eq!(v, ["lamb", "little", "a", "had", "Mary"]);
+
+let v: Vec<&str> = "".rsplit('X').collect();
+assert_eq!(v, [""]);
+
+let v: Vec<&str> = "lionXXtigerXleopard".rsplit('X').collect();
+assert_eq!(v, ["leopard", "tiger", "", "lion"]);
+
+let v: Vec<&str> = "lion::tiger::leopard".rsplit("::").collect();
+assert_eq!(v, ["leopard", "tiger", "lion"]);
+

A more complex pattern, using a closure:

+ +
let v: Vec<&str> = "abc1defXghi".rsplit(|c| c == '1' || c == 'X').collect();
+assert_eq!(v, ["ghi", "def", "abc"]);
+
1.0.0 · source

pub fn split_terminator<'a, P>(&'a self, pat: P) -> SplitTerminator<'a, P>
where + P: Pattern<'a>,

An iterator over substrings of the given string slice, separated by +characters matched by a pattern.

+

The pattern can be a &str, char, a slice of chars, or a +function or closure that determines if a character matches.

+

Equivalent to split, except that the trailing substring +is skipped if empty.

+

This method can be used for string data that is terminated, +rather than separated by a pattern.

+
§Iterator behavior
+

The returned iterator will be a DoubleEndedIterator if the pattern +allows a reverse search and forward/reverse search yields the same +elements. This is true for, e.g., char, but not for &str.

+

If the pattern allows a reverse search but its results might differ +from a forward search, the rsplit_terminator method can be used.

+
§Examples
+
let v: Vec<&str> = "A.B.".split_terminator('.').collect();
+assert_eq!(v, ["A", "B"]);
+
+let v: Vec<&str> = "A..B..".split_terminator(".").collect();
+assert_eq!(v, ["A", "", "B", ""]);
+
+let v: Vec<&str> = "A.B:C.D".split_terminator(&['.', ':'][..]).collect();
+assert_eq!(v, ["A", "B", "C", "D"]);
+
1.0.0 · source

pub fn rsplit_terminator<'a, P>(&'a self, pat: P) -> RSplitTerminator<'a, P>
where + P: Pattern<'a>, + <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>,

An iterator over substrings of self, separated by characters +matched by a pattern and yielded in reverse order.

+

The pattern can be a &str, char, a slice of chars, or a +function or closure that determines if a character matches.

+

Equivalent to split, except that the trailing substring is +skipped if empty.

+

This method can be used for string data that is terminated, +rather than separated by a pattern.

+
§Iterator behavior
+

The returned iterator requires that the pattern supports a +reverse search, and it will be double ended if a forward/reverse +search yields the same elements.

+

For iterating from the front, the split_terminator method can be +used.

+
§Examples
+
let v: Vec<&str> = "A.B.".rsplit_terminator('.').collect();
+assert_eq!(v, ["B", "A"]);
+
+let v: Vec<&str> = "A..B..".rsplit_terminator(".").collect();
+assert_eq!(v, ["", "B", "", "A"]);
+
+let v: Vec<&str> = "A.B:C.D".rsplit_terminator(&['.', ':'][..]).collect();
+assert_eq!(v, ["D", "C", "B", "A"]);
+
1.0.0 · source

pub fn splitn<'a, P>(&'a self, n: usize, pat: P) -> SplitN<'a, P>
where + P: Pattern<'a>,

An iterator over substrings of the given string slice, separated by a +pattern, restricted to returning at most n items.

+

If n substrings are returned, the last substring (the nth substring) +will contain the remainder of the string.

+

The pattern can be a &str, char, a slice of chars, or a +function or closure that determines if a character matches.

+
§Iterator behavior
+

The returned iterator will not be double ended, because it is +not efficient to support.

+

If the pattern allows a reverse search, the rsplitn method can be +used.

+
§Examples
+

Simple patterns:

+ +
let v: Vec<&str> = "Mary had a little lambda".splitn(3, ' ').collect();
+assert_eq!(v, ["Mary", "had", "a little lambda"]);
+
+let v: Vec<&str> = "lionXXtigerXleopard".splitn(3, "X").collect();
+assert_eq!(v, ["lion", "", "tigerXleopard"]);
+
+let v: Vec<&str> = "abcXdef".splitn(1, 'X').collect();
+assert_eq!(v, ["abcXdef"]);
+
+let v: Vec<&str> = "".splitn(1, 'X').collect();
+assert_eq!(v, [""]);
+

A more complex pattern, using a closure:

+ +
let v: Vec<&str> = "abc1defXghi".splitn(2, |c| c == '1' || c == 'X').collect();
+assert_eq!(v, ["abc", "defXghi"]);
+
1.0.0 · source

pub fn rsplitn<'a, P>(&'a self, n: usize, pat: P) -> RSplitN<'a, P>
where + P: Pattern<'a>, + <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>,

An iterator over substrings of this string slice, separated by a +pattern, starting from the end of the string, restricted to returning +at most n items.

+

If n substrings are returned, the last substring (the nth substring) +will contain the remainder of the string.

+

The pattern can be a &str, char, a slice of chars, or a +function or closure that determines if a character matches.

+
§Iterator behavior
+

The returned iterator will not be double ended, because it is not +efficient to support.

+

For splitting from the front, the splitn method can be used.

+
§Examples
+

Simple patterns:

+ +
let v: Vec<&str> = "Mary had a little lamb".rsplitn(3, ' ').collect();
+assert_eq!(v, ["lamb", "little", "Mary had a"]);
+
+let v: Vec<&str> = "lionXXtigerXleopard".rsplitn(3, 'X').collect();
+assert_eq!(v, ["leopard", "tiger", "lionX"]);
+
+let v: Vec<&str> = "lion::tiger::leopard".rsplitn(2, "::").collect();
+assert_eq!(v, ["leopard", "lion::tiger"]);
+

A more complex pattern, using a closure:

+ +
let v: Vec<&str> = "abc1defXghi".rsplitn(2, |c| c == '1' || c == 'X').collect();
+assert_eq!(v, ["ghi", "abc1def"]);
+
1.52.0 · source

pub fn split_once<'a, P>(&'a self, delimiter: P) -> Option<(&'a str, &'a str)>
where + P: Pattern<'a>,

Splits the string on the first occurrence of the specified delimiter and +returns prefix before delimiter and suffix after delimiter.

+
§Examples
+
assert_eq!("cfg".split_once('='), None);
+assert_eq!("cfg=".split_once('='), Some(("cfg", "")));
+assert_eq!("cfg=foo".split_once('='), Some(("cfg", "foo")));
+assert_eq!("cfg=foo=bar".split_once('='), Some(("cfg", "foo=bar")));
+
1.52.0 · source

pub fn rsplit_once<'a, P>(&'a self, delimiter: P) -> Option<(&'a str, &'a str)>
where + P: Pattern<'a>, + <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>,

Splits the string on the last occurrence of the specified delimiter and +returns prefix before delimiter and suffix after delimiter.

+
§Examples
+
assert_eq!("cfg".rsplit_once('='), None);
+assert_eq!("cfg=foo".rsplit_once('='), Some(("cfg", "foo")));
+assert_eq!("cfg=foo=bar".rsplit_once('='), Some(("cfg=foo", "bar")));
+
1.2.0 · source

pub fn matches<'a, P>(&'a self, pat: P) -> Matches<'a, P>
where + P: Pattern<'a>,

An iterator over the disjoint matches of a pattern within the given string +slice.

+

The pattern can be a &str, char, a slice of chars, or a +function or closure that determines if a character matches.

+
§Iterator behavior
+

The returned iterator will be a DoubleEndedIterator if the pattern +allows a reverse search and forward/reverse search yields the same +elements. This is true for, e.g., char, but not for &str.

+

If the pattern allows a reverse search but its results might differ +from a forward search, the rmatches method can be used.

+
§Examples
+
let v: Vec<&str> = "abcXXXabcYYYabc".matches("abc").collect();
+assert_eq!(v, ["abc", "abc", "abc"]);
+
+let v: Vec<&str> = "1abc2abc3".matches(char::is_numeric).collect();
+assert_eq!(v, ["1", "2", "3"]);
+
1.2.0 · source

pub fn rmatches<'a, P>(&'a self, pat: P) -> RMatches<'a, P>
where + P: Pattern<'a>, + <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>,

An iterator over the disjoint matches of a pattern within this string slice, +yielded in reverse order.

+

The pattern can be a &str, char, a slice of chars, or a +function or closure that determines if a character matches.

+
§Iterator behavior
+

The returned iterator requires that the pattern supports a reverse +search, and it will be a DoubleEndedIterator if a forward/reverse +search yields the same elements.

+

For iterating from the front, the matches method can be used.

+
§Examples
+
let v: Vec<&str> = "abcXXXabcYYYabc".rmatches("abc").collect();
+assert_eq!(v, ["abc", "abc", "abc"]);
+
+let v: Vec<&str> = "1abc2abc3".rmatches(char::is_numeric).collect();
+assert_eq!(v, ["3", "2", "1"]);
+
1.5.0 · source

pub fn match_indices<'a, P>(&'a self, pat: P) -> MatchIndices<'a, P>
where + P: Pattern<'a>,

An iterator over the disjoint matches of a pattern within this string +slice as well as the index that the match starts at.

+

For matches of pat within self that overlap, only the indices +corresponding to the first match are returned.

+

The pattern can be a &str, char, a slice of chars, or a +function or closure that determines if a character matches.

+
§Iterator behavior
+

The returned iterator will be a DoubleEndedIterator if the pattern +allows a reverse search and forward/reverse search yields the same +elements. This is true for, e.g., char, but not for &str.

+

If the pattern allows a reverse search but its results might differ +from a forward search, the rmatch_indices method can be used.

+
§Examples
+
let v: Vec<_> = "abcXXXabcYYYabc".match_indices("abc").collect();
+assert_eq!(v, [(0, "abc"), (6, "abc"), (12, "abc")]);
+
+let v: Vec<_> = "1abcabc2".match_indices("abc").collect();
+assert_eq!(v, [(1, "abc"), (4, "abc")]);
+
+let v: Vec<_> = "ababa".match_indices("aba").collect();
+assert_eq!(v, [(0, "aba")]); // only the first `aba`
+
1.5.0 · source

pub fn rmatch_indices<'a, P>(&'a self, pat: P) -> RMatchIndices<'a, P>
where + P: Pattern<'a>, + <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>,

An iterator over the disjoint matches of a pattern within self, +yielded in reverse order along with the index of the match.

+

For matches of pat within self that overlap, only the indices +corresponding to the last match are returned.

+

The pattern can be a &str, char, a slice of chars, or a +function or closure that determines if a character matches.

+
§Iterator behavior
+

The returned iterator requires that the pattern supports a reverse +search, and it will be a DoubleEndedIterator if a forward/reverse +search yields the same elements.

+

For iterating from the front, the match_indices method can be used.

+
§Examples
+
let v: Vec<_> = "abcXXXabcYYYabc".rmatch_indices("abc").collect();
+assert_eq!(v, [(12, "abc"), (6, "abc"), (0, "abc")]);
+
+let v: Vec<_> = "1abcabc2".rmatch_indices("abc").collect();
+assert_eq!(v, [(4, "abc"), (1, "abc")]);
+
+let v: Vec<_> = "ababa".rmatch_indices("aba").collect();
+assert_eq!(v, [(2, "aba")]); // only the last `aba`
+
1.0.0 · source

pub fn trim(&self) -> &str

Returns a string slice with leading and trailing whitespace removed.

+

‘Whitespace’ is defined according to the terms of the Unicode Derived +Core Property White_Space, which includes newlines.

+
§Examples
+
let s = "\n Hello\tworld\t\n";
+
+assert_eq!("Hello\tworld", s.trim());
+
1.30.0 · source

pub fn trim_start(&self) -> &str

Returns a string slice with leading whitespace removed.

+

‘Whitespace’ is defined according to the terms of the Unicode Derived +Core Property White_Space, which includes newlines.

+
§Text directionality
+

A string is a sequence of bytes. start in this context means the first +position of that byte string; for a left-to-right language like English or +Russian, this will be left side, and for right-to-left languages like +Arabic or Hebrew, this will be the right side.

+
§Examples
+

Basic usage:

+ +
let s = "\n Hello\tworld\t\n";
+assert_eq!("Hello\tworld\t\n", s.trim_start());
+

Directionality:

+ +
let s = "  English  ";
+assert!(Some('E') == s.trim_start().chars().next());
+
+let s = "  עברית  ";
+assert!(Some('ע') == s.trim_start().chars().next());
+
1.30.0 · source

pub fn trim_end(&self) -> &str

Returns a string slice with trailing whitespace removed.

+

‘Whitespace’ is defined according to the terms of the Unicode Derived +Core Property White_Space, which includes newlines.

+
§Text directionality
+

A string is a sequence of bytes. end in this context means the last +position of that byte string; for a left-to-right language like English or +Russian, this will be right side, and for right-to-left languages like +Arabic or Hebrew, this will be the left side.

+
§Examples
+

Basic usage:

+ +
let s = "\n Hello\tworld\t\n";
+assert_eq!("\n Hello\tworld", s.trim_end());
+

Directionality:

+ +
let s = "  English  ";
+assert!(Some('h') == s.trim_end().chars().rev().next());
+
+let s = "  עברית  ";
+assert!(Some('ת') == s.trim_end().chars().rev().next());
+
1.0.0 · source

pub fn trim_left(&self) -> &str

👎Deprecated since 1.33.0: superseded by trim_start

Returns a string slice with leading whitespace removed.

+

‘Whitespace’ is defined according to the terms of the Unicode Derived +Core Property White_Space.

+
§Text directionality
+

A string is a sequence of bytes. ‘Left’ in this context means the first +position of that byte string; for a language like Arabic or Hebrew +which are ‘right to left’ rather than ‘left to right’, this will be +the right side, not the left.

+
§Examples
+

Basic usage:

+ +
let s = " Hello\tworld\t";
+
+assert_eq!("Hello\tworld\t", s.trim_left());
+

Directionality:

+ +
let s = "  English";
+assert!(Some('E') == s.trim_left().chars().next());
+
+let s = "  עברית";
+assert!(Some('ע') == s.trim_left().chars().next());
+
1.0.0 · source

pub fn trim_right(&self) -> &str

👎Deprecated since 1.33.0: superseded by trim_end

Returns a string slice with trailing whitespace removed.

+

‘Whitespace’ is defined according to the terms of the Unicode Derived +Core Property White_Space.

+
§Text directionality
+

A string is a sequence of bytes. ‘Right’ in this context means the last +position of that byte string; for a language like Arabic or Hebrew +which are ‘right to left’ rather than ‘left to right’, this will be +the left side, not the right.

+
§Examples
+

Basic usage:

+ +
let s = " Hello\tworld\t";
+
+assert_eq!(" Hello\tworld", s.trim_right());
+

Directionality:

+ +
let s = "English  ";
+assert!(Some('h') == s.trim_right().chars().rev().next());
+
+let s = "עברית  ";
+assert!(Some('ת') == s.trim_right().chars().rev().next());
+
1.0.0 · source

pub fn trim_matches<'a, P>(&'a self, pat: P) -> &'a str
where + P: Pattern<'a>, + <P as Pattern<'a>>::Searcher: DoubleEndedSearcher<'a>,

Returns a string slice with all prefixes and suffixes that match a +pattern repeatedly removed.

+

The pattern can be a char, a slice of chars, or a function +or closure that determines if a character matches.

+
§Examples
+

Simple patterns:

+ +
assert_eq!("11foo1bar11".trim_matches('1'), "foo1bar");
+assert_eq!("123foo1bar123".trim_matches(char::is_numeric), "foo1bar");
+
+let x: &[_] = &['1', '2'];
+assert_eq!("12foo1bar12".trim_matches(x), "foo1bar");
+

A more complex pattern, using a closure:

+ +
assert_eq!("1foo1barXX".trim_matches(|c| c == '1' || c == 'X'), "foo1bar");
+
1.30.0 · source

pub fn trim_start_matches<'a, P>(&'a self, pat: P) -> &'a str
where + P: Pattern<'a>,

Returns a string slice with all prefixes that match a pattern +repeatedly removed.

+

The pattern can be a &str, char, a slice of chars, or a +function or closure that determines if a character matches.

+
§Text directionality
+

A string is a sequence of bytes. start in this context means the first +position of that byte string; for a left-to-right language like English or +Russian, this will be left side, and for right-to-left languages like +Arabic or Hebrew, this will be the right side.

+
§Examples
+
assert_eq!("11foo1bar11".trim_start_matches('1'), "foo1bar11");
+assert_eq!("123foo1bar123".trim_start_matches(char::is_numeric), "foo1bar123");
+
+let x: &[_] = &['1', '2'];
+assert_eq!("12foo1bar12".trim_start_matches(x), "foo1bar12");
+
1.45.0 · source

pub fn strip_prefix<'a, P>(&'a self, prefix: P) -> Option<&'a str>
where + P: Pattern<'a>,

Returns a string slice with the prefix removed.

+

If the string starts with the pattern prefix, returns the substring after the prefix, +wrapped in Some. Unlike trim_start_matches, this method removes the prefix exactly once.

+

If the string does not start with prefix, returns None.

+

The pattern can be a &str, char, a slice of chars, or a +function or closure that determines if a character matches.

+
§Examples
+
assert_eq!("foo:bar".strip_prefix("foo:"), Some("bar"));
+assert_eq!("foo:bar".strip_prefix("bar"), None);
+assert_eq!("foofoo".strip_prefix("foo"), Some("foo"));
+
1.45.0 · source

pub fn strip_suffix<'a, P>(&'a self, suffix: P) -> Option<&'a str>
where + P: Pattern<'a>, + <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>,

Returns a string slice with the suffix removed.

+

If the string ends with the pattern suffix, returns the substring before the suffix, +wrapped in Some. Unlike trim_end_matches, this method removes the suffix exactly once.

+

If the string does not end with suffix, returns None.

+

The pattern can be a &str, char, a slice of chars, or a +function or closure that determines if a character matches.

+
§Examples
+
assert_eq!("bar:foo".strip_suffix(":foo"), Some("bar"));
+assert_eq!("bar:foo".strip_suffix("bar"), None);
+assert_eq!("foofoo".strip_suffix("foo"), Some("foo"));
+
1.30.0 · source

pub fn trim_end_matches<'a, P>(&'a self, pat: P) -> &'a str
where + P: Pattern<'a>, + <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>,

Returns a string slice with all suffixes that match a pattern +repeatedly removed.

+

The pattern can be a &str, char, a slice of chars, or a +function or closure that determines if a character matches.

+
§Text directionality
+

A string is a sequence of bytes. end in this context means the last +position of that byte string; for a left-to-right language like English or +Russian, this will be right side, and for right-to-left languages like +Arabic or Hebrew, this will be the left side.

+
§Examples
+

Simple patterns:

+ +
assert_eq!("11foo1bar11".trim_end_matches('1'), "11foo1bar");
+assert_eq!("123foo1bar123".trim_end_matches(char::is_numeric), "123foo1bar");
+
+let x: &[_] = &['1', '2'];
+assert_eq!("12foo1bar12".trim_end_matches(x), "12foo1bar");
+

A more complex pattern, using a closure:

+ +
assert_eq!("1fooX".trim_end_matches(|c| c == '1' || c == 'X'), "1foo");
+
1.0.0 · source

pub fn trim_left_matches<'a, P>(&'a self, pat: P) -> &'a str
where + P: Pattern<'a>,

👎Deprecated since 1.33.0: superseded by trim_start_matches

Returns a string slice with all prefixes that match a pattern +repeatedly removed.

+

The pattern can be a &str, char, a slice of chars, or a +function or closure that determines if a character matches.

+
§Text directionality
+

A string is a sequence of bytes. ‘Left’ in this context means the first +position of that byte string; for a language like Arabic or Hebrew +which are ‘right to left’ rather than ‘left to right’, this will be +the right side, not the left.

+
§Examples
+
assert_eq!("11foo1bar11".trim_left_matches('1'), "foo1bar11");
+assert_eq!("123foo1bar123".trim_left_matches(char::is_numeric), "foo1bar123");
+
+let x: &[_] = &['1', '2'];
+assert_eq!("12foo1bar12".trim_left_matches(x), "foo1bar12");
+
1.0.0 · source

pub fn trim_right_matches<'a, P>(&'a self, pat: P) -> &'a str
where + P: Pattern<'a>, + <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>,

👎Deprecated since 1.33.0: superseded by trim_end_matches

Returns a string slice with all suffixes that match a pattern +repeatedly removed.

+

The pattern can be a &str, char, a slice of chars, or a +function or closure that determines if a character matches.

+
§Text directionality
+

A string is a sequence of bytes. ‘Right’ in this context means the last +position of that byte string; for a language like Arabic or Hebrew +which are ‘right to left’ rather than ‘left to right’, this will be +the left side, not the right.

+
§Examples
+

Simple patterns:

+ +
assert_eq!("11foo1bar11".trim_right_matches('1'), "11foo1bar");
+assert_eq!("123foo1bar123".trim_right_matches(char::is_numeric), "123foo1bar");
+
+let x: &[_] = &['1', '2'];
+assert_eq!("12foo1bar12".trim_right_matches(x), "12foo1bar");
+

A more complex pattern, using a closure:

+ +
assert_eq!("1fooX".trim_right_matches(|c| c == '1' || c == 'X'), "1foo");
+
1.0.0 · source

pub fn parse<F>(&self) -> Result<F, <F as FromStr>::Err>
where + F: FromStr,

Parses this string slice into another type.

+

Because parse is so general, it can cause problems with type +inference. As such, parse is one of the few times you’ll see +the syntax affectionately known as the ‘turbofish’: ::<>. This +helps the inference algorithm understand specifically which type +you’re trying to parse into.

+

parse can parse into any type that implements the FromStr trait.

+
§Errors
+

Will return Err if it’s not possible to parse this string slice into +the desired type.

+
§Examples
+

Basic usage

+ +
let four: u32 = "4".parse().unwrap();
+
+assert_eq!(4, four);
+

Using the ‘turbofish’ instead of annotating four:

+ +
let four = "4".parse::<u32>();
+
+assert_eq!(Ok(4), four);
+

Failing to parse:

+ +
let nope = "j".parse::<u32>();
+
+assert!(nope.is_err());
+
1.23.0 · source

pub fn is_ascii(&self) -> bool

Checks if all characters in this string are within the ASCII range.

+
§Examples
+
let ascii = "hello!\n";
+let non_ascii = "Grüße, Jürgen ❤";
+
+assert!(ascii.is_ascii());
+assert!(!non_ascii.is_ascii());
+
source

pub fn as_ascii(&self) -> Option<&[AsciiChar]>

🔬This is a nightly-only experimental API. (ascii_char)

If this string slice is_ascii, returns it as a slice +of ASCII characters, otherwise returns None.

+
1.23.0 · source

pub fn eq_ignore_ascii_case(&self, other: &str) -> bool

Checks that two strings are an ASCII case-insensitive match.

+

Same as to_ascii_lowercase(a) == to_ascii_lowercase(b), +but without allocating and copying temporaries.

+
§Examples
+
assert!("Ferris".eq_ignore_ascii_case("FERRIS"));
+assert!("Ferrös".eq_ignore_ascii_case("FERRöS"));
+assert!(!"Ferrös".eq_ignore_ascii_case("FERRÖS"));
+
1.80.0 · source

pub fn trim_ascii_start(&self) -> &str

Returns a string slice with leading ASCII whitespace removed.

+

‘Whitespace’ refers to the definition used by +u8::is_ascii_whitespace.

+
§Examples
+
assert_eq!(" \t \u{3000}hello world\n".trim_ascii_start(), "\u{3000}hello world\n");
+assert_eq!("  ".trim_ascii_start(), "");
+assert_eq!("".trim_ascii_start(), "");
+
1.80.0 · source

pub fn trim_ascii_end(&self) -> &str

Returns a string slice with trailing ASCII whitespace removed.

+

‘Whitespace’ refers to the definition used by +u8::is_ascii_whitespace.

+
§Examples
+
assert_eq!("\r hello world\u{3000}\n ".trim_ascii_end(), "\r hello world\u{3000}");
+assert_eq!("  ".trim_ascii_end(), "");
+assert_eq!("".trim_ascii_end(), "");
+
1.80.0 · source

pub fn trim_ascii(&self) -> &str

Returns a string slice with leading and trailing ASCII whitespace +removed.

+

‘Whitespace’ refers to the definition used by +u8::is_ascii_whitespace.

+
§Examples
+
assert_eq!("\r hello world\n ".trim_ascii(), "hello world");
+assert_eq!("  ".trim_ascii(), "");
+assert_eq!("".trim_ascii(), "");
+
1.34.0 · source

pub fn escape_debug(&self) -> EscapeDebug<'_>

Return an iterator that escapes each char in self with char::escape_debug.

+

Note: only extended grapheme codepoints that begin the string will be +escaped.

+
§Examples
+

As an iterator:

+ +
for c in "❤\n!".escape_debug() {
+    print!("{c}");
+}
+println!();
+

Using println! directly:

+ +
println!("{}", "❤\n!".escape_debug());
+

Both are equivalent to:

+ +
println!("❤\\n!");
+

Using to_string:

+ +
assert_eq!("❤\n!".escape_debug().to_string(), "❤\\n!");
+
1.34.0 · source

pub fn escape_default(&self) -> EscapeDefault<'_>

Return an iterator that escapes each char in self with char::escape_default.

+
§Examples
+

As an iterator:

+ +
for c in "❤\n!".escape_default() {
+    print!("{c}");
+}
+println!();
+

Using println! directly:

+ +
println!("{}", "❤\n!".escape_default());
+

Both are equivalent to:

+ +
println!("\\u{{2764}}\\n!");
+

Using to_string:

+ +
assert_eq!("❤\n!".escape_default().to_string(), "\\u{2764}\\n!");
+
1.34.0 · source

pub fn escape_unicode(&self) -> EscapeUnicode<'_>

Return an iterator that escapes each char in self with char::escape_unicode.

+
§Examples
+

As an iterator:

+ +
for c in "❤\n!".escape_unicode() {
+    print!("{c}");
+}
+println!();
+

Using println! directly:

+ +
println!("{}", "❤\n!".escape_unicode());
+

Both are equivalent to:

+ +
println!("\\u{{2764}}\\u{{a}}\\u{{21}}");
+

Using to_string:

+ +
assert_eq!("❤\n!".escape_unicode().to_string(), "\\u{2764}\\u{a}\\u{21}");
+
1.0.0 · source

pub fn replace<'a, P>(&'a self, from: P, to: &str) -> String
where + P: Pattern<'a>,

Replaces all matches of a pattern with another string.

+

replace creates a new String, and copies the data from this string slice into it. +While doing so, it attempts to find matches of a pattern. If it finds any, it +replaces them with the replacement string slice.

+
§Examples
+

Basic usage:

+ +
let s = "this is old";
+
+assert_eq!("this is new", s.replace("old", "new"));
+assert_eq!("than an old", s.replace("is", "an"));
+

When the pattern doesn’t match, it returns this string slice as String:

+ +
let s = "this is old";
+assert_eq!(s, s.replace("cookie monster", "little lamb"));
+
1.16.0 · source

pub fn replacen<'a, P>(&'a self, pat: P, to: &str, count: usize) -> String
where + P: Pattern<'a>,

Replaces first N matches of a pattern with another string.

+

replacen creates a new String, and copies the data from this string slice into it. +While doing so, it attempts to find matches of a pattern. If it finds any, it +replaces them with the replacement string slice at most count times.

+
§Examples
+

Basic usage:

+ +
let s = "foo foo 123 foo";
+assert_eq!("new new 123 foo", s.replacen("foo", "new", 2));
+assert_eq!("faa fao 123 foo", s.replacen('o', "a", 3));
+assert_eq!("foo foo new23 foo", s.replacen(char::is_numeric, "new", 1));
+

When the pattern doesn’t match, it returns this string slice as String:

+ +
let s = "this is old";
+assert_eq!(s, s.replacen("cookie monster", "little lamb", 10));
+
1.2.0 · source

pub fn to_lowercase(&self) -> String

Returns the lowercase equivalent of this string slice, as a new String.

+

‘Lowercase’ is defined according to the terms of the Unicode Derived Core Property +Lowercase.

+

Since some characters can expand into multiple characters when changing +the case, this function returns a String instead of modifying the +parameter in-place.

+
§Examples
+

Basic usage:

+ +
let s = "HELLO";
+
+assert_eq!("hello", s.to_lowercase());
+

A tricky example, with sigma:

+ +
let sigma = "Σ";
+
+assert_eq!("σ", sigma.to_lowercase());
+
+// but at the end of a word, it's ς, not σ:
+let odysseus = "ὈΔΥΣΣΕΎΣ";
+
+assert_eq!("ὀδυσσεύς", odysseus.to_lowercase());
+

Languages without case are not changed:

+ +
let new_year = "农历新年";
+
+assert_eq!(new_year, new_year.to_lowercase());
+
1.2.0 · source

pub fn to_uppercase(&self) -> String

Returns the uppercase equivalent of this string slice, as a new String.

+

‘Uppercase’ is defined according to the terms of the Unicode Derived Core Property +Uppercase.

+

Since some characters can expand into multiple characters when changing +the case, this function returns a String instead of modifying the +parameter in-place.

+
§Examples
+

Basic usage:

+ +
let s = "hello";
+
+assert_eq!("HELLO", s.to_uppercase());
+

Scripts without case are not changed:

+ +
let new_year = "农历新年";
+
+assert_eq!(new_year, new_year.to_uppercase());
+

One character can become multiple:

+ +
let s = "tschüß";
+
+assert_eq!("TSCHÜSS", s.to_uppercase());
+
1.16.0 · source

pub fn repeat(&self, n: usize) -> String

Creates a new String by repeating a string n times.

+
§Panics
+

This function will panic if the capacity would overflow.

+
§Examples
+

Basic usage:

+ +
assert_eq!("abc".repeat(4), String::from("abcabcabcabc"));
+

A panic upon overflow:

+ +
// this will panic at runtime
+let huge = "0123456789abcdef".repeat(usize::MAX);
+
1.23.0 · source

pub fn to_ascii_uppercase(&self) -> String

Returns a copy of this string where each character is mapped to its +ASCII upper case equivalent.

+

ASCII letters ‘a’ to ‘z’ are mapped to ‘A’ to ‘Z’, +but non-ASCII letters are unchanged.

+

To uppercase the value in-place, use make_ascii_uppercase.

+

To uppercase ASCII characters in addition to non-ASCII characters, use +to_uppercase.

+
§Examples
+
let s = "Grüße, Jürgen ❤";
+
+assert_eq!("GRüßE, JüRGEN ❤", s.to_ascii_uppercase());
+
1.23.0 · source

pub fn to_ascii_lowercase(&self) -> String

Returns a copy of this string where each character is mapped to its +ASCII lower case equivalent.

+

ASCII letters ‘A’ to ‘Z’ are mapped to ‘a’ to ‘z’, +but non-ASCII letters are unchanged.

+

To lowercase the value in-place, use make_ascii_lowercase.

+

To lowercase ASCII characters in addition to non-ASCII characters, use +to_lowercase.

+
§Examples
+
let s = "Grüße, Jürgen ❤";
+
+assert_eq!("grüße, jürgen ❤", s.to_ascii_lowercase());
+

Trait Implementations§

source§

impl<R: Clone> Clone for TransformedAirScript<R>

source§

fn clone(&self) -> TransformedAirScript<R>

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl<R> Deref for TransformedAirScript<R>

§

type Target = str

The resulting type after dereferencing.
source§

fn deref(&self) -> &Self::Target

Dereferences the value.

Auto Trait Implementations§

§

impl<R> Freeze for TransformedAirScript<R>

§

impl<R = WasmAirRunner> !RefUnwindSafe for TransformedAirScript<R>

§

impl<R = WasmAirRunner> !Send for TransformedAirScript<R>

§

impl<R = WasmAirRunner> !Sync for TransformedAirScript<R>

§

impl<R> Unpin for TransformedAirScript<R>

§

impl<R = WasmAirRunner> !UnwindSafe for TransformedAirScript<R>

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_test_utils/all.html b/air_test_utils/all.html new file mode 100644 index 00000000..59d911f3 --- /dev/null +++ b/air_test_utils/all.html @@ -0,0 +1 @@ +List of all items in this crate

List of all items

Structs

Enums

Traits

Macros

Functions

Type Aliases

Constants

\ No newline at end of file diff --git a/air_test_utils/avm_runner/index.html b/air_test_utils/avm_runner/index.html new file mode 100644 index 00000000..0616b519 --- /dev/null +++ b/air_test_utils/avm_runner/index.html @@ -0,0 +1 @@ +air_test_utils::avm_runner - Rust

Module air_test_utils::avm_runner

source ·

Structs§

  • This struct is very similar to AVMOutcome, but keeps error_code and error_msg for test purposes.
\ No newline at end of file diff --git a/air_test_utils/avm_runner/sidebar-items.js b/air_test_utils/avm_runner/sidebar-items.js new file mode 100644 index 00000000..2ab44d88 --- /dev/null +++ b/air_test_utils/avm_runner/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"struct":["AVMRunner","RawAVMOutcome"]}; \ No newline at end of file diff --git a/air_test_utils/avm_runner/struct.AVMRunner.html b/air_test_utils/avm_runner/struct.AVMRunner.html new file mode 100644 index 00000000..1646e019 --- /dev/null +++ b/air_test_utils/avm_runner/struct.AVMRunner.html @@ -0,0 +1,73 @@ +AVMRunner in air_test_utils::avm_runner - Rust

Struct air_test_utils::avm_runner::AVMRunner

source ·
pub struct AVMRunner<WB>
where + WB: WasmBackend,
{ /* private fields */ }

Implementations§

source§

impl<WB> AVMRunner<WB>
where + WB: WasmBackend,

source

pub async fn new( + air_wasm_path: PathBuf, + total_memory_limit: Option<u64>, + avm_runtime_limits: AVMRuntimeLimits, + logging_mask: i32, + wasm_backend: WB, +) -> Result<AVMRunner<WB>, RunnerError>

Create AVM with the provided config.

+
source

pub async fn call( + &mut self, + air: impl Into<String>, + prev_data: impl Into<Vec<u8>>, + data: impl Into<Vec<u8>>, + init_peer_id: impl Into<String>, + timestamp: u64, + ttl: u32, + current_peer_id: impl Into<String>, + call_results: HashMap<u32, CallServiceResult>, + keypair: &KeyPair, + particle_id: String, +) -> Result<RawAVMOutcome, RunnerError>

source

pub async fn call_tracing( + &mut self, + air: impl Into<String>, + prev_data: impl Into<Vec<u8>>, + data: impl Into<Vec<u8>>, + init_peer_id: impl Into<String>, + timestamp: u64, + ttl: u32, + current_peer_id: impl Into<String>, + call_results: HashMap<u32, CallServiceResult>, + tracing_params: String, + tracing_output_mode: u8, + key_format: u8, + secret_key_bytes: Vec<u8>, + particle_id: String, +) -> Result<RawAVMOutcome, RunnerError>

source

pub async fn to_human_readable_data<'this>( + &'this mut self, + data: Vec<u8>, +) -> Result<String, RunnerError>

source

pub fn memory_stats(&self) -> AVMMemoryStats

Auto Trait Implementations§

§

impl<WB> !Freeze for AVMRunner<WB>

§

impl<WB> !RefUnwindSafe for AVMRunner<WB>

§

impl<WB> Send for AVMRunner<WB>
where + <WB as WasmBackend>::Instance: Send,

§

impl<WB> !Sync for AVMRunner<WB>

§

impl<WB> Unpin for AVMRunner<WB>
where + WB: Unpin, + <WB as WasmBackend>::Store: Unpin,

§

impl<WB> !UnwindSafe for AVMRunner<WB>

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_test_utils/avm_runner/struct.RawAVMOutcome.html b/air_test_utils/avm_runner/struct.RawAVMOutcome.html new file mode 100644 index 00000000..797cb4e9 --- /dev/null +++ b/air_test_utils/avm_runner/struct.RawAVMOutcome.html @@ -0,0 +1,61 @@ +RawAVMOutcome in air_test_utils::avm_runner - Rust

Struct air_test_utils::avm_runner::RawAVMOutcome

source ·
pub struct RawAVMOutcome {
+    pub ret_code: i64,
+    pub error_message: String,
+    pub data: Vec<u8>,
+    pub call_requests: HashMap<u32, CallRequestParams>,
+    pub next_peer_pks: Vec<String>,
+    pub soft_limits_triggering: SoftLimitsTriggering,
+}
Expand description

This struct is very similar to AVMOutcome, but keeps error_code and error_msg for test purposes.

+

Fields§

§ret_code: i64§error_message: String§data: Vec<u8>§call_requests: HashMap<u32, CallRequestParams>§next_peer_pks: Vec<String>§soft_limits_triggering: SoftLimitsTriggering

Implementations§

Trait Implementations§

source§

impl Clone for RawAVMOutcome

source§

fn clone(&self) -> RawAVMOutcome

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for RawAVMOutcome

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
source§

impl<'de> Deserialize<'de> for RawAVMOutcome

source§

fn deserialize<__D>( + __deserializer: __D, +) -> Result<RawAVMOutcome, <__D as Deserializer<'de>>::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl PartialEq for RawAVMOutcome

source§

fn eq(&self, other: &RawAVMOutcome) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl Serialize for RawAVMOutcome

source§

fn serialize<__S>( + &self, + __serializer: __S, +) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Eq for RawAVMOutcome

source§

impl StructuralPartialEq for RawAVMOutcome

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_test_utils/call_services/enum.VariableOptionSource.html b/air_test_utils/call_services/enum.VariableOptionSource.html new file mode 100644 index 00000000..323c3ae8 --- /dev/null +++ b/air_test_utils/call_services/enum.VariableOptionSource.html @@ -0,0 +1,36 @@ +VariableOptionSource in air_test_utils::call_services - Rust
pub enum VariableOptionSource {
+    Argument(usize),
+    FunctionName,
+    ServiceName,
+}
Expand description

Manages which source will be used to choose a variable.

+

Variants§

§

Argument(usize)

§

FunctionName

§

ServiceName

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_test_utils/call_services/fn.echo_call_service.html b/air_test_utils/call_services/fn.echo_call_service.html new file mode 100644 index 00000000..e27f9e89 --- /dev/null +++ b/air_test_utils/call_services/fn.echo_call_service.html @@ -0,0 +1 @@ +echo_call_service in air_test_utils::call_services - Rust

Function air_test_utils::call_services::echo_call_service

source ·
pub fn echo_call_service() -> CallServiceClosure<'static>
\ No newline at end of file diff --git a/air_test_utils/call_services/fn.fallible_call_service.html b/air_test_utils/call_services/fn.fallible_call_service.html new file mode 100644 index 00000000..652f2aae --- /dev/null +++ b/air_test_utils/call_services/fn.fallible_call_service.html @@ -0,0 +1,3 @@ +fallible_call_service in air_test_utils::call_services - Rust

Function air_test_utils::call_services::fallible_call_service

source ·
pub fn fallible_call_service(
+    fallible_service_id: impl Into<String>,
+) -> CallServiceClosure<'static>
\ No newline at end of file diff --git a/air_test_utils/call_services/fn.fallible_call_service_by_arg.html b/air_test_utils/call_services/fn.fallible_call_service_by_arg.html new file mode 100644 index 00000000..5f4db3b5 --- /dev/null +++ b/air_test_utils/call_services/fn.fallible_call_service_by_arg.html @@ -0,0 +1,3 @@ +fallible_call_service_by_arg in air_test_utils::call_services - Rust
pub fn fallible_call_service_by_arg(
+    arg: impl Into<Value>,
+) -> CallServiceClosure<'static>
\ No newline at end of file diff --git a/air_test_utils/call_services/fn.return_string_call_service.html b/air_test_utils/call_services/fn.return_string_call_service.html new file mode 100644 index 00000000..0247efe6 --- /dev/null +++ b/air_test_utils/call_services/fn.return_string_call_service.html @@ -0,0 +1,3 @@ +return_string_call_service in air_test_utils::call_services - Rust
pub fn return_string_call_service(
+    ret_str: impl Into<String>,
+) -> CallServiceClosure<'static>
\ No newline at end of file diff --git a/air_test_utils/call_services/fn.set_variable_call_service.html b/air_test_utils/call_services/fn.set_variable_call_service.html new file mode 100644 index 00000000..968a7e30 --- /dev/null +++ b/air_test_utils/call_services/fn.set_variable_call_service.html @@ -0,0 +1 @@ +set_variable_call_service in air_test_utils::call_services - Rust
pub fn set_variable_call_service(json: Value) -> CallServiceClosure<'static>
\ No newline at end of file diff --git a/air_test_utils/call_services/fn.set_variables_call_service.html b/air_test_utils/call_services/fn.set_variables_call_service.html new file mode 100644 index 00000000..649a5a30 --- /dev/null +++ b/air_test_utils/call_services/fn.set_variables_call_service.html @@ -0,0 +1,4 @@ +set_variables_call_service in air_test_utils::call_services - Rust
pub fn set_variables_call_service(
+    variables_mapping: HashMap<String, Value>,
+    variable_source: VariableOptionSource,
+) -> CallServiceClosure<'static>
\ No newline at end of file diff --git a/air_test_utils/call_services/fn.tetraplet_host_function.html b/air_test_utils/call_services/fn.tetraplet_host_function.html new file mode 100644 index 00000000..39ccabda --- /dev/null +++ b/air_test_utils/call_services/fn.tetraplet_host_function.html @@ -0,0 +1,3 @@ +tetraplet_host_function in air_test_utils::call_services - Rust
pub fn tetraplet_host_function(
+    closure: CallServiceClosure<'static>,
+) -> (CallServiceClosure<'static>, Rc<RefCell<ArgTetraplets>>)
\ No newline at end of file diff --git a/air_test_utils/call_services/fn.unit_call_service.html b/air_test_utils/call_services/fn.unit_call_service.html new file mode 100644 index 00000000..399166d6 --- /dev/null +++ b/air_test_utils/call_services/fn.unit_call_service.html @@ -0,0 +1 @@ +unit_call_service in air_test_utils::call_services - Rust

Function air_test_utils::call_services::unit_call_service

source ·
pub fn unit_call_service() -> CallServiceClosure<'static>
\ No newline at end of file diff --git a/air_test_utils/call_services/index.html b/air_test_utils/call_services/index.html new file mode 100644 index 00000000..2685a84a --- /dev/null +++ b/air_test_utils/call_services/index.html @@ -0,0 +1 @@ +air_test_utils::call_services - Rust
\ No newline at end of file diff --git a/air_test_utils/call_services/sidebar-items.js b/air_test_utils/call_services/sidebar-items.js new file mode 100644 index 00000000..d7b3c4e9 --- /dev/null +++ b/air_test_utils/call_services/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"enum":["VariableOptionSource"],"fn":["echo_call_service","fallible_call_service","fallible_call_service_by_arg","return_string_call_service","set_variable_call_service","set_variables_call_service","tetraplet_host_function","unit_call_service"],"type":["ArgTetraplets"]}; \ No newline at end of file diff --git a/air_test_utils/call_services/type.ArgTetraplets.html b/air_test_utils/call_services/type.ArgTetraplets.html new file mode 100644 index 00000000..4518cebb --- /dev/null +++ b/air_test_utils/call_services/type.ArgTetraplets.html @@ -0,0 +1 @@ +ArgTetraplets in air_test_utils::call_services - Rust

Type Alias air_test_utils::call_services::ArgTetraplets

source ·
pub type ArgTetraplets = Vec<Vec<SecurityTetraplet>>;

Aliased Type§

struct ArgTetraplets { /* private fields */ }
\ No newline at end of file diff --git a/air_test_utils/constant.CALL_SERVICE_SUCCESS.html b/air_test_utils/constant.CALL_SERVICE_SUCCESS.html new file mode 100644 index 00000000..08a5122e --- /dev/null +++ b/air_test_utils/constant.CALL_SERVICE_SUCCESS.html @@ -0,0 +1 @@ +CALL_SERVICE_SUCCESS in air_test_utils - Rust

Constant air_test_utils::CALL_SERVICE_SUCCESS

source ·
pub const CALL_SERVICE_SUCCESS: i32 = 0;
\ No newline at end of file diff --git a/air_test_utils/enum.AVMError.html b/air_test_utils/enum.AVMError.html new file mode 100644 index 00000000..84c6f690 --- /dev/null +++ b/air_test_utils/enum.AVMError.html @@ -0,0 +1,62 @@ +AVMError in air_test_utils - Rust

Enum air_test_utils::AVMError

source ·
pub enum AVMError<E> {
+    InterpreterFailed(ErrorAVMOutcome),
+    RunnerError(RunnerError),
+    DataStoreError(E),
+    AnomalyDataSeError(Error),
+}

Variants§

§

InterpreterFailed(ErrorAVMOutcome)

This error contains interpreter outcome in case when execution failed on the interpreter +side. A host should match on this error type explicitly to save provided data.

+
§

RunnerError(RunnerError)

This errors are encountered from an AVM runner.

+
§

DataStoreError(E)

This errors are encountered from a data store object.

+
§

AnomalyDataSeError(Error)

This errors are encountered from serialization of data tracked during an anomaly.

+

Trait Implementations§

source§

impl<E> Debug for AVMError<E>
where + E: Debug,

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
source§

impl<E> Display for AVMError<E>
where + E: Display,

source§

fn fmt(&self, __formatter: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
source§

impl<E> Error for AVMError<E>
where + E: Error, + AVMError<E>: Debug + Display,

source§

fn source(&self) -> Option<&(dyn Error + 'static)>

The lower-level source of this error, if any. Read more
1.0.0 · source§

fn description(&self) -> &str

👎Deprecated since 1.42.0: use the Display impl or to_string()
1.0.0 · source§

fn cause(&self) -> Option<&dyn Error>

👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
source§

fn provide<'a>(&'a self, request: &mut Request<'a>)

🔬This is a nightly-only experimental API. (error_generic_member_access)
Provides type based access to context intended for error reports. Read more
source§

impl<E> From<E> for AVMError<E>

source§

fn from(source: E) -> AVMError<E>

Converts to this type from the input type.

Auto Trait Implementations§

§

impl<E> Freeze for AVMError<E>
where + E: Freeze,

§

impl<E> !RefUnwindSafe for AVMError<E>

§

impl<E> Send for AVMError<E>
where + E: Send,

§

impl<E> Sync for AVMError<E>
where + E: Sync,

§

impl<E> Unpin for AVMError<E>
where + E: Unpin,

§

impl<E> !UnwindSafe for AVMError<E>

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
§

impl<T> Error for T
where + T: Error + 'static,

§

fn as_error(&self) -> &(dyn Error + 'static)

Gets this error as an std::error::Error.
source§

impl<T> From<!> for T

source§

fn from(t: !) -> T

Converts to this type from the input type.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> FromFd for T
where + T: From<OwnedFd>,

§

fn from_fd(owned_fd: OwnedFd) -> T

👎Deprecated since 1.0.0: FromFd::from_fd is replaced by From<OwnedFd>::from
Constructs a new instance of Self from the given file descriptor. Read more
§

fn from_into_fd<Owned>(into_owned: Owned) -> Self
where + Owned: Into<OwnedFd>, + Self: Sized + From<OwnedFd>,

Constructs a new instance of Self from the given file descriptor +converted from into_owned. Read more
§

impl<T> FromFilelike for T
where + T: From<OwnedFd>,

§

fn from_filelike(owned: OwnedFd) -> T

Constructs a new instance of Self from the given filelike object. Read more
§

fn from_into_filelike<Owned>(owned: Owned) -> T
where + Owned: IntoFilelike,

Constructs a new instance of Self from the given filelike object +converted from into_owned. Read more
§

impl<T> FromGrip for T
where + T: From<OwnedFd>,

§

fn from_grip(owned_grip: OwnedFd) -> T

Consume an OwnedGrip and convert into a Self.
§

impl<T> FromSocketlike for T
where + T: From<OwnedFd>,

§

fn from_socketlike(owned: OwnedFd) -> T

Constructs a new instance of Self from the given socketlike object.
§

fn from_into_socketlike<Owned>(owned: Owned) -> T
where + Owned: IntoSocketlike,

Constructs a new instance of Self from the given socketlike object +converted from into_owned.
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_test_utils/enum.ArchivedCallResult.html b/air_test_utils/enum.ArchivedCallResult.html new file mode 100644 index 00000000..dea94c2b --- /dev/null +++ b/air_test_utils/enum.ArchivedCallResult.html @@ -0,0 +1,56 @@ +ArchivedCallResult in air_test_utils - Rust

Enum air_test_utils::ArchivedCallResult

source ·
#[repr(u8)]
pub enum ArchivedCallResult
where + Sender: Archive, + ValueRef: Archive, + CID<ServiceResultCidAggregate>: Archive,
{ + RequestSentBy(<Sender as Archive>::Archived), + Executed(<ValueRef as Archive>::Archived), + Failed(<CID<ServiceResultCidAggregate> as Archive>::Archived), +}
Expand description

An archived CallResult

+

Variants§

§

RequestSentBy(<Sender as Archive>::Archived)

The archived counterpart of CallResult::RequestSentBy

+

Tuple Fields

§0: <Sender as Archive>::Archived

The archived counterpart of CallResult::RequestSentBy::0

+
§

Executed(<ValueRef as Archive>::Archived)

The archived counterpart of CallResult::Executed

+

Tuple Fields

§0: <ValueRef as Archive>::Archived

The archived counterpart of CallResult::Executed::0

+
§

Failed(<CID<ServiceResultCidAggregate> as Archive>::Archived)

The archived counterpart of CallResult::Failed

+

Tuple Fields

§0: <CID<ServiceResultCidAggregate> as Archive>::Archived

The archived counterpart of CallResult::Failed::0

+

Trait Implementations§

source§

impl<__C> CheckBytes<__C> for ArchivedCallResult
where + Sender: Archive, + ValueRef: Archive, + CID<ServiceResultCidAggregate>: Archive, + <Sender as Archive>::Archived: CheckBytes<__C>, + <ValueRef as Archive>::Archived: CheckBytes<__C>, + <CID<ServiceResultCidAggregate> as Archive>::Archived: CheckBytes<__C>, + __C: ?Sized,

§

type Error = EnumCheckError<u8>

The error that may result from checking the type.
source§

unsafe fn check_bytes<'__bytecheck>( + value: *const ArchivedCallResult, + context: &mut __C, +) -> Result<&'__bytecheck ArchivedCallResult, EnumCheckError<u8>>

Checks whether the given pointer points to a valid value within the +given context. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_test_utils/enum.ArchivedCanonResult.html b/air_test_utils/enum.ArchivedCanonResult.html new file mode 100644 index 00000000..ee66e59d --- /dev/null +++ b/air_test_utils/enum.ArchivedCanonResult.html @@ -0,0 +1,50 @@ +ArchivedCanonResult in air_test_utils - Rust

Enum air_test_utils::ArchivedCanonResult

source ·
#[repr(u8)]
pub enum ArchivedCanonResult
where + Rc<String>: Archive, + CID<CanonResultCidAggregate>: Archive,
{ + RequestSentBy(<Rc<String> as Archive>::Archived), + Executed(<CID<CanonResultCidAggregate> as Archive>::Archived), +}
Expand description

An archived CanonResult

+

Variants§

§

RequestSentBy(<Rc<String> as Archive>::Archived)

The archived counterpart of CanonResult::RequestSentBy

+

Tuple Fields

§0: <Rc<String> as Archive>::Archived

The archived counterpart of CanonResult::RequestSentBy::0

+
§

Executed(<CID<CanonResultCidAggregate> as Archive>::Archived)

The archived counterpart of CanonResult::Executed

+

Tuple Fields

§0: <CID<CanonResultCidAggregate> as Archive>::Archived

The archived counterpart of CanonResult::Executed::0

+

Trait Implementations§

source§

impl<__C> CheckBytes<__C> for ArchivedCanonResult
where + Rc<String>: Archive, + CID<CanonResultCidAggregate>: Archive, + <Rc<String> as Archive>::Archived: CheckBytes<__C>, + <CID<CanonResultCidAggregate> as Archive>::Archived: CheckBytes<__C>, + __C: ?Sized,

§

type Error = EnumCheckError<u8>

The error that may result from checking the type.
source§

unsafe fn check_bytes<'__bytecheck>( + value: *const ArchivedCanonResult, + context: &mut __C, +) -> Result<&'__bytecheck ArchivedCanonResult, EnumCheckError<u8>>

Checks whether the given pointer points to a valid value within the +given context. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_test_utils/enum.ArchivedExecutedState.html b/air_test_utils/enum.ArchivedExecutedState.html new file mode 100644 index 00000000..65cf5e4d --- /dev/null +++ b/air_test_utils/enum.ArchivedExecutedState.html @@ -0,0 +1,68 @@ +ArchivedExecutedState in air_test_utils - Rust

Enum air_test_utils::ArchivedExecutedState

source ·
#[repr(u8)]
pub enum ArchivedExecutedState
where + ParResult: Archive, + CallResult: Archive, + FoldResult: Archive, + ApResult: Archive, + CanonResult: Archive,
{ + Par(<ParResult as Archive>::Archived), + Call(<CallResult as Archive>::Archived), + Fold(<FoldResult as Archive>::Archived), + Ap(<ApResult as Archive>::Archived), + Canon(<CanonResult as Archive>::Archived), +}
Expand description

An archived ExecutedState

+

Variants§

§

Par(<ParResult as Archive>::Archived)

The archived counterpart of ExecutedState::Par

+

Tuple Fields

§0: <ParResult as Archive>::Archived

The archived counterpart of ExecutedState::Par::0

+
§

Call(<CallResult as Archive>::Archived)

The archived counterpart of ExecutedState::Call

+

Tuple Fields

§0: <CallResult as Archive>::Archived

The archived counterpart of ExecutedState::Call::0

+
§

Fold(<FoldResult as Archive>::Archived)

The archived counterpart of ExecutedState::Fold

+

Tuple Fields

§0: <FoldResult as Archive>::Archived

The archived counterpart of ExecutedState::Fold::0

+
§

Ap(<ApResult as Archive>::Archived)

The archived counterpart of ExecutedState::Ap

+

Tuple Fields

§0: <ApResult as Archive>::Archived

The archived counterpart of ExecutedState::Ap::0

+
§

Canon(<CanonResult as Archive>::Archived)

The archived counterpart of ExecutedState::Canon

+

Tuple Fields

§0: <CanonResult as Archive>::Archived

The archived counterpart of ExecutedState::Canon::0

+

Trait Implementations§

source§

impl<__C> CheckBytes<__C> for ArchivedExecutedState
where + ParResult: Archive, + CallResult: Archive, + FoldResult: Archive, + ApResult: Archive, + CanonResult: Archive, + <ParResult as Archive>::Archived: CheckBytes<__C>, + <CallResult as Archive>::Archived: CheckBytes<__C>, + <FoldResult as Archive>::Archived: CheckBytes<__C>, + <ApResult as Archive>::Archived: CheckBytes<__C>, + <CanonResult as Archive>::Archived: CheckBytes<__C>, + __C: ?Sized,

§

type Error = EnumCheckError<u8>

The error that may result from checking the type.
source§

unsafe fn check_bytes<'__bytecheck>( + value: *const ArchivedExecutedState, + context: &mut __C, +) -> Result<&'__bytecheck ArchivedExecutedState, EnumCheckError<u8>>

Checks whether the given pointer points to a valid value within the +given context. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_test_utils/enum.ArchivedProvenance.html b/air_test_utils/enum.ArchivedProvenance.html new file mode 100644 index 00000000..52216e13 --- /dev/null +++ b/air_test_utils/enum.ArchivedProvenance.html @@ -0,0 +1,56 @@ +ArchivedProvenance in air_test_utils - Rust

Enum air_test_utils::ArchivedProvenance

source ·
#[repr(u8)]
pub enum ArchivedProvenance{ + Literal, + ServiceResult { + cid: <CID<ServiceResultCidAggregate> as Archive>::Archived, + }, + Canon { + cid: <CID<CanonResultCidAggregate> as Archive>::Archived, + }, +}
Expand description

An archived Provenance

+

Variants§

§

Literal

The archived counterpart of Provenance::Literal

+
§

ServiceResult

The archived counterpart of Provenance::ServiceResult

+

Fields

§cid: <CID<ServiceResultCidAggregate> as Archive>::Archived

The archived counterpart of Provenance::ServiceResult::cid

+
§

Canon

The archived counterpart of Provenance::Canon

+

Fields

§cid: <CID<CanonResultCidAggregate> as Archive>::Archived

The archived counterpart of Provenance::Canon::cid

+

Trait Implementations§

source§

impl<__C> CheckBytes<__C> for ArchivedProvenance
where + CID<ServiceResultCidAggregate>: Archive, + CID<CanonResultCidAggregate>: Archive, + <CID<ServiceResultCidAggregate> as Archive>::Archived: CheckBytes<__C>, + <CID<CanonResultCidAggregate> as Archive>::Archived: CheckBytes<__C>, + __C: ?Sized,

§

type Error = EnumCheckError<u8>

The error that may result from checking the type.
source§

unsafe fn check_bytes<'__bytecheck>( + value: *const ArchivedProvenance, + context: &mut __C, +) -> Result<&'__bytecheck ArchivedProvenance, EnumCheckError<u8>>

Checks whether the given pointer points to a valid value within the +given context. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_test_utils/enum.ArchivedSender.html b/air_test_utils/enum.ArchivedSender.html new file mode 100644 index 00000000..df931320 --- /dev/null +++ b/air_test_utils/enum.ArchivedSender.html @@ -0,0 +1,54 @@ +ArchivedSender in air_test_utils - Rust

Enum air_test_utils::ArchivedSender

source ·
#[repr(u8)]
pub enum ArchivedSender
where + Rc<String>: Archive, + u32: Archive,
{ + PeerId(<Rc<String> as Archive>::Archived), + PeerIdWithCallId { + peer_id: <Rc<String> as Archive>::Archived, + call_id: <u32 as Archive>::Archived, + }, +}
Expand description

An archived Sender

+

Variants§

§

PeerId(<Rc<String> as Archive>::Archived)

The archived counterpart of Sender::PeerId

+

Tuple Fields

§0: <Rc<String> as Archive>::Archived

The archived counterpart of Sender::PeerId::0

+
§

PeerIdWithCallId

The archived counterpart of Sender::PeerIdWithCallId

+

Fields

§peer_id: <Rc<String> as Archive>::Archived

The archived counterpart of Sender::PeerIdWithCallId::peer_id

+
§call_id: <u32 as Archive>::Archived

The archived counterpart of Sender::PeerIdWithCallId::call_id

+

Trait Implementations§

source§

impl<__C> CheckBytes<__C> for ArchivedSender
where + Rc<String>: Archive, + u32: Archive, + <Rc<String> as Archive>::Archived: CheckBytes<__C>, + <u32 as Archive>::Archived: CheckBytes<__C>, + __C: ?Sized,

§

type Error = EnumCheckError<u8>

The error that may result from checking the type.
source§

unsafe fn check_bytes<'__bytecheck>( + value: *const ArchivedSender, + context: &mut __C, +) -> Result<&'__bytecheck ArchivedSender, EnumCheckError<u8>>

Checks whether the given pointer points to a valid value within the +given context. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_test_utils/enum.ArchivedValueRef.html b/air_test_utils/enum.ArchivedValueRef.html new file mode 100644 index 00000000..49c84ff8 --- /dev/null +++ b/air_test_utils/enum.ArchivedValueRef.html @@ -0,0 +1,60 @@ +ArchivedValueRef in air_test_utils - Rust

Enum air_test_utils::ArchivedValueRef

source ·
#[repr(u8)]
pub enum ArchivedValueRef
where + CID<ServiceResultCidAggregate>: Archive, + GenerationIdx: Archive, + CID<JValue>: Archive,
{ + Scalar(<CID<ServiceResultCidAggregate> as Archive>::Archived), + Stream { + cid: <CID<ServiceResultCidAggregate> as Archive>::Archived, + generation: <GenerationIdx as Archive>::Archived, + }, + Unused(<CID<JValue> as Archive>::Archived), +}
Expand description

An archived ValueRef

+

Variants§

§

Scalar(<CID<ServiceResultCidAggregate> as Archive>::Archived)

The archived counterpart of ValueRef::Scalar

+

Tuple Fields

§0: <CID<ServiceResultCidAggregate> as Archive>::Archived

The archived counterpart of ValueRef::Scalar::0

+
§

Stream

The archived counterpart of ValueRef::Stream

+

Fields

§cid: <CID<ServiceResultCidAggregate> as Archive>::Archived

The archived counterpart of ValueRef::Stream::cid

+
§generation: <GenerationIdx as Archive>::Archived

The archived counterpart of ValueRef::Stream::generation

+
§

Unused(<CID<JValue> as Archive>::Archived)

The archived counterpart of ValueRef::Unused

+

Tuple Fields

§0: <CID<JValue> as Archive>::Archived

The archived counterpart of ValueRef::Unused::0

+

Trait Implementations§

source§

impl<__C> CheckBytes<__C> for ArchivedValueRef
where + CID<ServiceResultCidAggregate>: Archive, + GenerationIdx: Archive, + CID<JValue>: Archive, + <CID<ServiceResultCidAggregate> as Archive>::Archived: CheckBytes<__C>, + <GenerationIdx as Archive>::Archived: CheckBytes<__C>, + <CID<JValue> as Archive>::Archived: CheckBytes<__C>, + __C: ?Sized,

§

type Error = EnumCheckError<u8>

The error that may result from checking the type.
source§

unsafe fn check_bytes<'__bytecheck>( + value: *const ArchivedValueRef, + context: &mut __C, +) -> Result<&'__bytecheck ArchivedValueRef, EnumCheckError<u8>>

Checks whether the given pointer points to a valid value within the +given context. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_test_utils/enum.CallResult.html b/air_test_utils/enum.CallResult.html new file mode 100644 index 00000000..7303ad92 --- /dev/null +++ b/air_test_utils/enum.CallResult.html @@ -0,0 +1,113 @@ +CallResult in air_test_utils - Rust

Enum air_test_utils::CallResult

source ·
pub enum CallResult {
+    RequestSentBy(Sender),
+    Executed(ValueRef),
+    Failed(CID<ServiceResultCidAggregate>),
+}

Variants§

§

RequestSentBy(Sender)

Request was sent to a target node by node with such public key and it shouldn’t be called again.

+
§

Executed(ValueRef)

A corresponding call’s been already executed with such value as a result.

+
§

Failed(CID<ServiceResultCidAggregate>)

The call returned a service error.

+

The JValue has to be a two element array [i32, String].

+

Implementations§

Trait Implementations§

source§

impl Archive for CallResult
where + Sender: Archive, + ValueRef: Archive, + CID<ServiceResultCidAggregate>: Archive,

§

type Archived = ArchivedCallResult

The archived representation of this type. Read more
§

type Resolver = CallResultResolver

The resolver for this type. It must contain all the additional information from serializing +needed to make the archived type from the normal type.
source§

unsafe fn resolve( + &self, + pos: usize, + resolver: <CallResult as Archive>::Resolver, + out: *mut <CallResult as Archive>::Archived, +)

Creates the archived version of this value at the given position and writes it to the given +output. Read more
source§

impl Clone for CallResult

source§

fn clone(&self) -> CallResult

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for CallResult

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
source§

impl<'de> Deserialize<'de> for CallResult

source§

fn deserialize<__D>( + __deserializer: __D, +) -> Result<CallResult, <__D as Deserializer<'de>>::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl<__D> Deserialize<CallResult, __D> for <CallResult as Archive>::Archived
where + __D: Fallible + ?Sized, + Sender: Archive, + <Sender as Archive>::Archived: Deserialize<Sender, __D>, + ValueRef: Archive, + <ValueRef as Archive>::Archived: Deserialize<ValueRef, __D>, + CID<ServiceResultCidAggregate>: Archive, + <CID<ServiceResultCidAggregate> as Archive>::Archived: Deserialize<CID<ServiceResultCidAggregate>, __D>,

source§

fn deserialize( + &self, + deserializer: &mut __D, +) -> Result<CallResult, <__D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl PartialEq for CallResult

source§

fn eq(&self, other: &CallResult) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl<__S> Serialize<__S> for CallResult
where + __S: Fallible + ?Sized, + Sender: Serialize<__S>, + ValueRef: Serialize<__S>, + CID<ServiceResultCidAggregate>: Serialize<__S>,

source§

fn serialize( + &self, + serializer: &mut __S, +) -> Result<<CallResult as Archive>::Resolver, <__S as Fallible>::Error>

Writes the dependencies for the object and returns a resolver that can create the archived +type.
source§

impl Serialize for CallResult

source§

fn serialize<__S>( + &self, + __serializer: __S, +) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Eq for CallResult

source§

impl StructuralPartialEq for CallResult

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
§

impl<T> ArchiveUnsized for T
where + T: Archive,

§

type Archived = <T as Archive>::Archived

The archived counterpart of this type. Unlike Archive, it may be unsized. Read more
§

type MetadataResolver = ()

The resolver for the metadata of this type. Read more
§

unsafe fn resolve_metadata( + &self, + _: usize, + _: <T as ArchiveUnsized>::MetadataResolver, + _: *mut <<T as ArchiveUnsized>::Archived as ArchivePointee>::ArchivedMetadata, +)

Creates the archived version of the metadata for this value at the given position and writes +it to the given output. Read more
§

unsafe fn resolve_unsized( + &self, + from: usize, + to: usize, + resolver: Self::MetadataResolver, + out: *mut RelPtr<Self::Archived, <isize as Archive>::Archived>, +)

Resolves a relative pointer to this value with the given from and to and writes it to +the given output. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
§

impl<T, S> SerializeUnsized<S> for T
where + T: Serialize<S>, + S: Serializer + ?Sized,

§

fn serialize_unsized( + &self, + serializer: &mut S, +) -> Result<usize, <S as Fallible>::Error>

Writes the object and returns the position of the archived type.
§

fn serialize_metadata(&self, _: &mut S) -> Result<(), <S as Fallible>::Error>

Serializes the metadata for the given type.
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_test_utils/enum.CallResultResolver.html b/air_test_utils/enum.CallResultResolver.html new file mode 100644 index 00000000..b6037722 --- /dev/null +++ b/air_test_utils/enum.CallResultResolver.html @@ -0,0 +1,45 @@ +CallResultResolver in air_test_utils - Rust

Enum air_test_utils::CallResultResolver

source ·
pub enum CallResultResolver
where + Sender: Archive, + ValueRef: Archive, + CID<ServiceResultCidAggregate>: Archive,
{ + RequestSentBy(<Sender as Archive>::Resolver), + Executed(<ValueRef as Archive>::Resolver), + Failed(<CID<ServiceResultCidAggregate> as Archive>::Resolver), +}
Expand description

The resolver for an archived CallResult

+

Variants§

§

RequestSentBy(<Sender as Archive>::Resolver)

The resolver for CallResult::RequestSentBy

+

Tuple Fields

§0: <Sender as Archive>::Resolver

The resolver for CallResult::RequestSentBy::0

+
§

Executed(<ValueRef as Archive>::Resolver)

The resolver for CallResult::Executed

+

Tuple Fields

§0: <ValueRef as Archive>::Resolver

The resolver for CallResult::Executed::0

+
§

Failed(<CID<ServiceResultCidAggregate> as Archive>::Resolver)

The resolver for CallResult::Failed

+

Tuple Fields

§0: <CID<ServiceResultCidAggregate> as Archive>::Resolver

The resolver for CallResult::Failed::0

+

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_test_utils/enum.CallSeDeErrors.html b/air_test_utils/enum.CallSeDeErrors.html new file mode 100644 index 00000000..d6ab245f --- /dev/null +++ b/air_test_utils/enum.CallSeDeErrors.html @@ -0,0 +1,58 @@ +CallSeDeErrors in air_test_utils - Rust

Enum air_test_utils::CallSeDeErrors

source ·
pub enum CallSeDeErrors {
+    CallResultsSeFailed {
+        call_results: HashMap<String, CallServiceResult>,
+        se_error: <CallResultsRepr as Representation>::SerializeError,
+    },
+    CallRequestsDeError {
+        raw_call_request: SerializedCallRequests,
+        error: <CallRequestsRepr as Representation>::DeserializeError,
+    },
+    CallParamsArgsDeFailed {
+        call_params: CallRequestParams,
+        de_error: <CallArgumentsRepr as Representation>::DeserializeError,
+    },
+    CallParamsTetrapletsDeFailed {
+        call_params: CallRequestParams,
+        de_error: <TetrapletsRepr as Representation>::DeserializeError,
+    },
+}

Variants§

§

CallResultsSeFailed

Errors encountered while trying to serialize call results.

+
§

CallRequestsDeError

This error is encountered when deserialization pof call requests failed for some reason.

+
§

CallParamsArgsDeFailed

Errors encountered while trying to deserialize arguments from call parameters returned +by the interpreter. In the corresponding struct such arguments are Vec serialized +to a string.

+
§

CallParamsTetrapletsDeFailed

Errors encountered while trying to deserialize tetraplets from call parameters returned +by the interpreter. In the corresponding struct such tetraplets are +Vec<Vec> serialized to a string.

+

Trait Implementations§

source§

impl Debug for CallSeDeErrors

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
source§

impl Display for CallSeDeErrors

source§

fn fmt(&self, __formatter: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
source§

impl Error for CallSeDeErrors

1.30.0 · source§

fn source(&self) -> Option<&(dyn Error + 'static)>

The lower-level source of this error, if any. Read more
1.0.0 · source§

fn description(&self) -> &str

👎Deprecated since 1.42.0: use the Display impl or to_string()
1.0.0 · source§

fn cause(&self) -> Option<&dyn Error>

👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
source§

fn provide<'a>(&'a self, request: &mut Request<'a>)

🔬This is a nightly-only experimental API. (error_generic_member_access)
Provides type based access to context intended for error reports. Read more
source§

impl From<CallSeDeErrors> for RunnerError

source§

fn from(source: CallSeDeErrors) -> RunnerError

Converts to this type from the input type.

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
§

impl<T> Error for T
where + T: Error + 'static,

§

fn as_error(&self) -> &(dyn Error + 'static)

Gets this error as an std::error::Error.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_test_utils/enum.CanonResult.html b/air_test_utils/enum.CanonResult.html new file mode 100644 index 00000000..000b55f3 --- /dev/null +++ b/air_test_utils/enum.CanonResult.html @@ -0,0 +1,99 @@ +CanonResult in air_test_utils - Rust

Enum air_test_utils::CanonResult

source ·
pub enum CanonResult {
+    RequestSentBy(Rc<String>),
+    Executed(CID<CanonResultCidAggregate>),
+}
Expand description

Contains ids of element that were on a stream at the moment of an appropriate canon call.

+

Variants§

§

RequestSentBy(Rc<String>)

Request was sent to a target node by node with such public key and it shouldn’t be called again.

+
§

Executed(CID<CanonResultCidAggregate>)

Implementations§

Trait Implementations§

source§

impl Archive for CanonResult
where + Rc<String>: Archive, + CID<CanonResultCidAggregate>: Archive,

§

type Archived = ArchivedCanonResult

The archived representation of this type. Read more
§

type Resolver = CanonResultResolver

The resolver for this type. It must contain all the additional information from serializing +needed to make the archived type from the normal type.
source§

unsafe fn resolve( + &self, + pos: usize, + resolver: <CanonResult as Archive>::Resolver, + out: *mut <CanonResult as Archive>::Archived, +)

Creates the archived version of this value at the given position and writes it to the given +output. Read more
source§

impl Clone for CanonResult

source§

fn clone(&self) -> CanonResult

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for CanonResult

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
source§

impl<'de> Deserialize<'de> for CanonResult

source§

fn deserialize<__D>( + __deserializer: __D, +) -> Result<CanonResult, <__D as Deserializer<'de>>::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl<__D> Deserialize<CanonResult, __D> for <CanonResult as Archive>::Archived
where + __D: Fallible + ?Sized, + Rc<String>: Archive, + <Rc<String> as Archive>::Archived: Deserialize<Rc<String>, __D>, + CID<CanonResultCidAggregate>: Archive, + <CID<CanonResultCidAggregate> as Archive>::Archived: Deserialize<CID<CanonResultCidAggregate>, __D>,

source§

fn deserialize( + &self, + deserializer: &mut __D, +) -> Result<CanonResult, <__D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl PartialEq for CanonResult

source§

fn eq(&self, other: &CanonResult) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl<__S> Serialize<__S> for CanonResult
where + __S: Fallible + ?Sized, + Rc<String>: Serialize<__S>, + CID<CanonResultCidAggregate>: Serialize<__S>,

source§

fn serialize( + &self, + serializer: &mut __S, +) -> Result<<CanonResult as Archive>::Resolver, <__S as Fallible>::Error>

Writes the dependencies for the object and returns a resolver that can create the archived +type.
source§

impl Serialize for CanonResult

source§

fn serialize<__S>( + &self, + __serializer: __S, +) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Eq for CanonResult

source§

impl StructuralPartialEq for CanonResult

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
§

impl<T> ArchiveUnsized for T
where + T: Archive,

§

type Archived = <T as Archive>::Archived

The archived counterpart of this type. Unlike Archive, it may be unsized. Read more
§

type MetadataResolver = ()

The resolver for the metadata of this type. Read more
§

unsafe fn resolve_metadata( + &self, + _: usize, + _: <T as ArchiveUnsized>::MetadataResolver, + _: *mut <<T as ArchiveUnsized>::Archived as ArchivePointee>::ArchivedMetadata, +)

Creates the archived version of the metadata for this value at the given position and writes +it to the given output. Read more
§

unsafe fn resolve_unsized( + &self, + from: usize, + to: usize, + resolver: Self::MetadataResolver, + out: *mut RelPtr<Self::Archived, <isize as Archive>::Archived>, +)

Resolves a relative pointer to this value with the given from and to and writes it to +the given output. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
§

impl<T, S> SerializeUnsized<S> for T
where + T: Serialize<S>, + S: Serializer + ?Sized,

§

fn serialize_unsized( + &self, + serializer: &mut S, +) -> Result<usize, <S as Fallible>::Error>

Writes the object and returns the position of the archived type.
§

fn serialize_metadata(&self, _: &mut S) -> Result<(), <S as Fallible>::Error>

Serializes the metadata for the given type.
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_test_utils/enum.CanonResultResolver.html b/air_test_utils/enum.CanonResultResolver.html new file mode 100644 index 00000000..fc66c445 --- /dev/null +++ b/air_test_utils/enum.CanonResultResolver.html @@ -0,0 +1,41 @@ +CanonResultResolver in air_test_utils - Rust

Enum air_test_utils::CanonResultResolver

source ·
pub enum CanonResultResolver
where + Rc<String>: Archive, + CID<CanonResultCidAggregate>: Archive,
{ + RequestSentBy(<Rc<String> as Archive>::Resolver), + Executed(<CID<CanonResultCidAggregate> as Archive>::Resolver), +}
Expand description

The resolver for an archived CanonResult

+

Variants§

§

RequestSentBy(<Rc<String> as Archive>::Resolver)

The resolver for CanonResult::RequestSentBy

+

Tuple Fields

§0: <Rc<String> as Archive>::Resolver
§

Executed(<CID<CanonResultCidAggregate> as Archive>::Resolver)

The resolver for CanonResult::Executed

+

Tuple Fields

§0: <CID<CanonResultCidAggregate> as Archive>::Resolver

The resolver for CanonResult::Executed::0

+

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_test_utils/enum.CidStoreVerificationError.html b/air_test_utils/enum.CidStoreVerificationError.html new file mode 100644 index 00000000..f5501dad --- /dev/null +++ b/air_test_utils/enum.CidStoreVerificationError.html @@ -0,0 +1,40 @@ +CidStoreVerificationError in air_test_utils - Rust

Enum air_test_utils::CidStoreVerificationError

source ·
pub enum CidStoreVerificationError {
+    CidVerificationError(CidVerificationError),
+    MissingReference {
+        source_type_name: &'static str,
+        target_type_name: &'static str,
+        target_cid_repr: Rc<str>,
+    },
+}

Variants§

§

CidVerificationError(CidVerificationError)

§

MissingReference

Fields

§source_type_name: &'static str
§target_type_name: &'static str
§target_cid_repr: Rc<str>

Trait Implementations§

source§

impl Debug for CidStoreVerificationError

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
source§

impl Display for CidStoreVerificationError

source§

fn fmt(&self, __formatter: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
source§

impl Error for CidStoreVerificationError

source§

fn source(&self) -> Option<&(dyn Error + 'static)>

The lower-level source of this error, if any. Read more
1.0.0 · source§

fn description(&self) -> &str

👎Deprecated since 1.42.0: use the Display impl or to_string()
1.0.0 · source§

fn cause(&self) -> Option<&dyn Error>

👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
source§

fn provide<'a>(&'a self, request: &mut Request<'a>)

🔬This is a nightly-only experimental API. (error_generic_member_access)
Provides type based access to context intended for error reports. Read more
source§

impl From<CidVerificationError> for CidStoreVerificationError

source§

fn from(source: CidVerificationError) -> CidStoreVerificationError

Converts to this type from the input type.

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
§

impl<T> Error for T
where + T: Error + 'static,

§

fn as_error(&self) -> &(dyn Error + 'static)

Gets this error as an std::error::Error.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_test_utils/enum.DataDeserializationError.html b/air_test_utils/enum.DataDeserializationError.html new file mode 100644 index 00000000..3946915a --- /dev/null +++ b/air_test_utils/enum.DataDeserializationError.html @@ -0,0 +1,36 @@ +DataDeserializationError in air_test_utils - Rust

Enum air_test_utils::DataDeserializationError

source ·
pub enum DataDeserializationError {
+    Envelope(Error),
+    Data(RkyvDeserializeError),
+}

Variants§

§

Envelope(Error)

§

Data(RkyvDeserializeError)

Trait Implementations§

source§

impl Debug for DataDeserializationError

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
source§

impl Display for DataDeserializationError

source§

fn fmt(&self, __formatter: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
source§

impl Error for DataDeserializationError

1.30.0 · source§

fn source(&self) -> Option<&(dyn Error + 'static)>

The lower-level source of this error, if any. Read more
1.0.0 · source§

fn description(&self) -> &str

👎Deprecated since 1.42.0: use the Display impl or to_string()
1.0.0 · source§

fn cause(&self) -> Option<&dyn Error>

👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
source§

fn provide<'a>(&'a self, request: &mut Request<'a>)

🔬This is a nightly-only experimental API. (error_generic_member_access)
Provides type based access to context intended for error reports. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
§

impl<T> Error for T
where + T: Error + 'static,

§

fn as_error(&self) -> &(dyn Error + 'static)

Gets this error as an std::error::Error.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_test_utils/enum.ExecutedState.html b/air_test_utils/enum.ExecutedState.html new file mode 100644 index 00000000..34ae778e --- /dev/null +++ b/air_test_utils/enum.ExecutedState.html @@ -0,0 +1,116 @@ +ExecutedState in air_test_utils - Rust

Enum air_test_utils::ExecutedState

source ·
pub enum ExecutedState {
+    Par(ParResult),
+    Call(CallResult),
+    Fold(FoldResult),
+    Ap(ApResult),
+    Canon(CanonResult),
+}

Variants§

Implementations§

source§

impl ExecutedState

source

pub fn par( + left_subgraph_size: usize, + right_subgraph_size: usize, +) -> ExecutedState

Trait Implementations§

source§

impl Archive for ExecutedState
where + ParResult: Archive, + CallResult: Archive, + FoldResult: Archive, + ApResult: Archive, + CanonResult: Archive,

§

type Archived = ArchivedExecutedState

The archived representation of this type. Read more
§

type Resolver = ExecutedStateResolver

The resolver for this type. It must contain all the additional information from serializing +needed to make the archived type from the normal type.
source§

unsafe fn resolve( + &self, + pos: usize, + resolver: <ExecutedState as Archive>::Resolver, + out: *mut <ExecutedState as Archive>::Archived, +)

Creates the archived version of this value at the given position and writes it to the given +output. Read more
source§

impl Clone for ExecutedState

source§

fn clone(&self) -> ExecutedState

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for ExecutedState

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
source§

impl<'de> Deserialize<'de> for ExecutedState

source§

fn deserialize<__D>( + __deserializer: __D, +) -> Result<ExecutedState, <__D as Deserializer<'de>>::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl<__D> Deserialize<ExecutedState, __D> for <ExecutedState as Archive>::Archived
where + __D: Fallible + ?Sized, + ParResult: Archive, + <ParResult as Archive>::Archived: Deserialize<ParResult, __D>, + CallResult: Archive, + <CallResult as Archive>::Archived: Deserialize<CallResult, __D>, + FoldResult: Archive, + <FoldResult as Archive>::Archived: Deserialize<FoldResult, __D>, + ApResult: Archive, + <ApResult as Archive>::Archived: Deserialize<ApResult, __D>, + CanonResult: Archive, + <CanonResult as Archive>::Archived: Deserialize<CanonResult, __D>,

source§

fn deserialize( + &self, + deserializer: &mut __D, +) -> Result<ExecutedState, <__D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl Display for ExecutedState

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
source§

impl PartialEq for ExecutedState

source§

fn eq(&self, other: &ExecutedState) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl<__S> Serialize<__S> for ExecutedState
where + __S: Fallible + ?Sized, + ParResult: Serialize<__S>, + CallResult: Serialize<__S>, + FoldResult: Serialize<__S>, + ApResult: Serialize<__S>, + CanonResult: Serialize<__S>,

source§

fn serialize( + &self, + serializer: &mut __S, +) -> Result<<ExecutedState as Archive>::Resolver, <__S as Fallible>::Error>

Writes the dependencies for the object and returns a resolver that can create the archived +type.
source§

impl Serialize for ExecutedState

source§

fn serialize<__S>( + &self, + __serializer: __S, +) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Eq for ExecutedState

source§

impl StructuralPartialEq for ExecutedState

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
§

impl<T> ArchiveUnsized for T
where + T: Archive,

§

type Archived = <T as Archive>::Archived

The archived counterpart of this type. Unlike Archive, it may be unsized. Read more
§

type MetadataResolver = ()

The resolver for the metadata of this type. Read more
§

unsafe fn resolve_metadata( + &self, + _: usize, + _: <T as ArchiveUnsized>::MetadataResolver, + _: *mut <<T as ArchiveUnsized>::Archived as ArchivePointee>::ArchivedMetadata, +)

Creates the archived version of the metadata for this value at the given position and writes +it to the given output. Read more
§

unsafe fn resolve_unsized( + &self, + from: usize, + to: usize, + resolver: Self::MetadataResolver, + out: *mut RelPtr<Self::Archived, <isize as Archive>::Archived>, +)

Resolves a relative pointer to this value with the given from and to and writes it to +the given output. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
§

impl<T, S> SerializeUnsized<S> for T
where + T: Serialize<S>, + S: Serializer + ?Sized,

§

fn serialize_unsized( + &self, + serializer: &mut S, +) -> Result<usize, <S as Fallible>::Error>

Writes the object and returns the position of the archived type.
§

fn serialize_metadata(&self, _: &mut S) -> Result<(), <S as Fallible>::Error>

Serializes the metadata for the given type.
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_test_utils/enum.ExecutedStateResolver.html b/air_test_utils/enum.ExecutedStateResolver.html new file mode 100644 index 00000000..aaeea98b --- /dev/null +++ b/air_test_utils/enum.ExecutedStateResolver.html @@ -0,0 +1,53 @@ +ExecutedStateResolver in air_test_utils - Rust

Enum air_test_utils::ExecutedStateResolver

source ·
pub enum ExecutedStateResolver
where + ParResult: Archive, + CallResult: Archive, + FoldResult: Archive, + ApResult: Archive, + CanonResult: Archive,
{ + Par(<ParResult as Archive>::Resolver), + Call(<CallResult as Archive>::Resolver), + Fold(<FoldResult as Archive>::Resolver), + Ap(<ApResult as Archive>::Resolver), + Canon(<CanonResult as Archive>::Resolver), +}
Expand description

The resolver for an archived ExecutedState

+

Variants§

§

Par(<ParResult as Archive>::Resolver)

The resolver for ExecutedState::Par

+

Tuple Fields

§0: <ParResult as Archive>::Resolver

The resolver for ExecutedState::Par::0

+
§

Call(<CallResult as Archive>::Resolver)

The resolver for ExecutedState::Call

+

Tuple Fields

§0: <CallResult as Archive>::Resolver

The resolver for ExecutedState::Call::0

+
§

Fold(<FoldResult as Archive>::Resolver)

The resolver for ExecutedState::Fold

+

Tuple Fields

§0: <FoldResult as Archive>::Resolver

The resolver for ExecutedState::Fold::0

+
§

Ap(<ApResult as Archive>::Resolver)

The resolver for ExecutedState::Ap

+

Tuple Fields

§0: <ApResult as Archive>::Resolver

The resolver for ExecutedState::Ap::0

+
§

Canon(<CanonResult as Archive>::Resolver)

The resolver for ExecutedState::Canon

+

Tuple Fields

§0: <CanonResult as Archive>::Resolver

The resolver for ExecutedState::Canon::0

+

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_test_utils/enum.HostImportError.html b/air_test_utils/enum.HostImportError.html new file mode 100644 index 00000000..c8630204 --- /dev/null +++ b/air_test_utils/enum.HostImportError.html @@ -0,0 +1,44 @@ +HostImportError in air_test_utils - Rust

Enum air_test_utils::HostImportError

pub enum HostImportError {
+    MismatchWValues(WType, WValue),
+    MismatchWValuesCount,
+    LifterError(LiError),
+    LowererError(LoError),
+    RecordNotFound(RecordResolvableError),
+    InvalidUTF8String(FromUtf8Error),
+}

Variants§

§

MismatchWValues(WType, WValue)

An error occurred when host functions tries to lift IValues from WValues +and the latter has different type.

+
§

MismatchWValuesCount

An error occurred when a host functions tries to lift IValues from WValues +and the latter is not enough for that.

+
§

LifterError(LiError)

§

LowererError(LoError)

§

RecordNotFound(RecordResolvableError)

§

InvalidUTF8String(FromUtf8Error)

Trait Implementations§

§

impl Debug for HostImportError

§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
§

impl Display for HostImportError

§

fn fmt(&self, __formatter: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
§

impl Error for HostImportError

§

fn source(&self) -> Option<&(dyn Error + 'static)>

The lower-level source of this error, if any. Read more
1.0.0 · source§

fn description(&self) -> &str

👎Deprecated since 1.42.0: use the Display impl or to_string()
1.0.0 · source§

fn cause(&self) -> Option<&dyn Error>

👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
source§

fn provide<'a>(&'a self, request: &mut Request<'a>)

🔬This is a nightly-only experimental API. (error_generic_member_access)
Provides type based access to context intended for error reports. Read more
§

impl From<FromUtf8Error> for HostImportError

§

fn from(source: FromUtf8Error) -> HostImportError

Converts to this type from the input type.
§

impl From<LiError> for HostImportError

§

fn from(source: LiError) -> HostImportError

Converts to this type from the input type.
§

impl From<LoError> for HostImportError

§

fn from(source: LoError) -> HostImportError

Converts to this type from the input type.
§

impl From<RecordResolvableError> for HostImportError

§

fn from(source: RecordResolvableError) -> HostImportError

Converts to this type from the input type.

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
§

impl<T> Error for T
where + T: Error + 'static,

§

fn as_error(&self) -> &(dyn Error + 'static)

Gets this error as an std::error::Error.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_test_utils/enum.IType.html b/air_test_utils/enum.IType.html new file mode 100644 index 00000000..80ba1aed --- /dev/null +++ b/air_test_utils/enum.IType.html @@ -0,0 +1,97 @@ +IType in air_test_utils - Rust

Enum air_test_utils::IType

pub enum IType {
+
Show 17 variants Boolean, + S8, + S16, + S32, + S64, + U8, + U16, + U32, + U64, + F32, + F64, + String, + ByteArray, + Array(Box<IType>), + I32, + I64, + Record(u64), +
}
Expand description

Represents the types supported by WIT.

+

Variants§

§

Boolean

Boolean.

+
§

S8

A 8-bits signed integer.

+
§

S16

A 16-bits signed integer.

+
§

S32

A 32-bits signed integer.

+
§

S64

A 64-bits signed integer.

+
§

U8

A 8-bits unsigned integer.

+
§

U16

A 16-bits unsigned integer.

+
§

U32

A 32-bits unsigned integer.

+
§

U64

A 64-bits unsigned integer.

+
§

F32

A 32-bits float.

+
§

F64

A 64-bits float.

+
§

String

A string.

+
§

ByteArray

Specialization of arrays for byte vector.

+
§

Array(Box<IType>)

An array of values of the same type.

+
§

I32

A 32-bits integer (as defined in WebAssembly core).

+
§

I64

A 64-bits integer (as defined in WebAssembly core).

+
§

Record(u64)

A record contains record index from interfaces AST.

+

Implementations§

§

impl IType

pub const VARIANT_COUNT: usize = 17usize

Trait Implementations§

§

impl Clone for IType

§

fn clone(&self) -> IType

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
§

impl Debug for IType

§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
§

impl<'de> Deserialize<'de> for IType

§

fn deserialize<__D>( + __deserializer: __D, +) -> Result<IType, <__D as Deserializer<'de>>::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
§

impl Hash for IType

§

fn hash<__H>(&self, state: &mut __H)
where + __H: Hasher,

Feeds this value into the given Hasher. Read more
1.3.0 · source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
§

impl Parse<'_> for IType

§

fn parse(parser: Parser<'_>) -> Result<IType, Error>

Attempts to parse Self from parser, returning an error if it could +not be parsed. Read more
§

impl PartialEq for IType

§

fn eq(&self, other: &IType) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
§

impl Serialize for IType

§

fn serialize<__S>( + &self, + __serializer: __S, +) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
§

impl<W> ToBytes<W> for IType
where + W: Write,

Encode an IType into bytes.

+
§

fn to_bytes(&self, writer: &mut W) -> Result<(), Error>

Converts the given value into &[u8] in the given writer.
§

impl ToString for &IType

Encode an IType into a string.

+
§

fn to_string(&self) -> String

Converts the given value to a String. Read more
§

impl Eq for IType

§

impl StructuralPartialEq for IType

Auto Trait Implementations§

§

impl Freeze for IType

§

impl RefUnwindSafe for IType

§

impl Send for IType

§

impl Sync for IType

§

impl Unpin for IType

§

impl UnwindSafe for IType

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CallHasher for T
where + T: Hash + ?Sized,

§

default fn get_hash<H, B>(value: &H, build_hasher: &B) -> u64
where + H: Hash + ?Sized, + B: BuildHasher,

source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_test_utils/enum.IValue.html b/air_test_utils/enum.IValue.html new file mode 100644 index 00000000..4f38e6fb --- /dev/null +++ b/air_test_utils/enum.IValue.html @@ -0,0 +1,71 @@ +IValue in air_test_utils - Rust

Enum air_test_utils::IValue

pub enum IValue {
+
Show 17 variants Boolean(bool), + S8(i8), + S16(i16), + S32(i32), + S64(i64), + U8(u8), + U16(u16), + U32(u32), + U64(u64), + F32(f32), + F64(f64), + String(String), + ByteArray(Vec<u8>), + Array(Vec<IValue>), + I32(i32), + I64(i64), + Record(NEVec<IValue>), +
}
Expand description

A WIT value.

+

Variants§

§

Boolean(bool)

Boolean value.

+
§

S8(i8)

A 8-bits signed integer.

+
§

S16(i16)

A 16-bits signed integer.

+
§

S32(i32)

A 32-bits signed integer.

+
§

S64(i64)

A 64-bits signed integer.

+
§

U8(u8)

A 8-bits unsigned integer.

+
§

U16(u16)

A 16-bits unsigned integer.

+
§

U32(u32)

A 32-bits unsigned integer.

+
§

U64(u64)

A 64-bits unsigned integer.

+
§

F32(f32)

A 32-bits float.

+
§

F64(f64)

A 64-bits float.

+
§

String(String)

A string.

+
§

ByteArray(Vec<u8>)

Specialization of array type for byte vector.

+
§

Array(Vec<IValue>)

A byte array.

+
§

I32(i32)

A 32-bits integer (as defined in WebAssembly core).

+
§

I64(i64)

A 64-bits integer (as defined in WebAssembly core).

+
§

Record(NEVec<IValue>)

A record.

+

Implementations§

§

impl IValue

pub const VARIANT_COUNT: usize = 17usize

Trait Implementations§

§

impl Clone for IValue

§

fn clone(&self) -> IValue

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
§

impl Debug for IValue

§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
§

impl Default for IValue

§

fn default() -> IValue

Returns the “default value” for a type. Read more
§

impl From<String> for IValue

§

fn from(n: String) -> IValue

Converts to this type from the input type.
§

impl From<Vec<u8>> for IValue

§

fn from(n: Vec<u8>) -> IValue

Converts to this type from the input type.
§

impl From<f32> for IValue

§

fn from(n: f32) -> IValue

Converts to this type from the input type.
§

impl From<f64> for IValue

§

fn from(n: f64) -> IValue

Converts to this type from the input type.
§

impl From<i16> for IValue

§

fn from(n: i16) -> IValue

Converts to this type from the input type.
§

impl From<i32> for IValue

§

fn from(n: i32) -> IValue

Converts to this type from the input type.
§

impl From<i64> for IValue

§

fn from(n: i64) -> IValue

Converts to this type from the input type.
§

impl From<i8> for IValue

§

fn from(n: i8) -> IValue

Converts to this type from the input type.
§

impl From<u16> for IValue

§

fn from(n: u16) -> IValue

Converts to this type from the input type.
§

impl From<u32> for IValue

§

fn from(n: u32) -> IValue

Converts to this type from the input type.
§

impl From<u64> for IValue

§

fn from(n: u64) -> IValue

Converts to this type from the input type.
§

impl From<u8> for IValue

§

fn from(n: u8) -> IValue

Converts to this type from the input type.
§

impl PartialEq for IValue

§

fn eq(&self, other: &IValue) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
§

impl TryFrom<IValue> for Vec<u8>

§

type Error = WasmValueNativeCastError

The type returned in the event of a conversion error.
§

fn try_from(w: IValue) -> Result<Vec<u8>, <Vec<u8> as TryFrom<IValue>>::Error>

Performs the conversion.
§

impl StructuralPartialEq for IValue

Auto Trait Implementations§

§

impl Freeze for IValue

§

impl RefUnwindSafe for IValue

§

impl Send for IValue

§

impl Sync for IValue

§

impl Unpin for IValue

§

impl UnwindSafe for IValue

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_test_utils/enum.Provenance.html b/air_test_utils/enum.Provenance.html new file mode 100644 index 00000000..eeb9836f --- /dev/null +++ b/air_test_utils/enum.Provenance.html @@ -0,0 +1,102 @@ +Provenance in air_test_utils - Rust

Enum air_test_utils::Provenance

source ·
pub enum Provenance {
+    Literal,
+    ServiceResult {
+        cid: CID<ServiceResultCidAggregate>,
+    },
+    Canon {
+        cid: CID<CanonResultCidAggregate>,
+    },
+}

Variants§

§

Literal

§

ServiceResult

§

Canon

Implementations§

Trait Implementations§

source§

impl Archive for Provenance

§

type Archived = ArchivedProvenance

The archived representation of this type. Read more
§

type Resolver = ProvenanceResolver

The resolver for this type. It must contain all the additional information from serializing +needed to make the archived type from the normal type.
source§

unsafe fn resolve( + &self, + pos: usize, + resolver: <Provenance as Archive>::Resolver, + out: *mut <Provenance as Archive>::Archived, +)

Creates the archived version of this value at the given position and writes it to the given +output. Read more
source§

impl Clone for Provenance

source§

fn clone(&self) -> Provenance

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for Provenance

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
source§

impl<'de> Deserialize<'de> for Provenance

source§

fn deserialize<__D>( + __deserializer: __D, +) -> Result<Provenance, <__D as Deserializer<'de>>::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl<__D> Deserialize<Provenance, __D> for <Provenance as Archive>::Archived
where + __D: Fallible + ?Sized, + CID<ServiceResultCidAggregate>: Archive, + <CID<ServiceResultCidAggregate> as Archive>::Archived: Deserialize<CID<ServiceResultCidAggregate>, __D>, + CID<CanonResultCidAggregate>: Archive, + <CID<CanonResultCidAggregate> as Archive>::Archived: Deserialize<CID<CanonResultCidAggregate>, __D>,

source§

fn deserialize( + &self, + deserializer: &mut __D, +) -> Result<Provenance, <__D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl PartialEq for Provenance

source§

fn eq(&self, other: &Provenance) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl<__S> Serialize<__S> for Provenance
where + __S: Fallible + ?Sized, + CID<ServiceResultCidAggregate>: Serialize<__S>, + CID<CanonResultCidAggregate>: Serialize<__S>,

source§

fn serialize( + &self, + serializer: &mut __S, +) -> Result<<Provenance as Archive>::Resolver, <__S as Fallible>::Error>

Writes the dependencies for the object and returns a resolver that can create the archived +type.
source§

impl Serialize for Provenance

source§

fn serialize<__S>( + &self, + __serializer: __S, +) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Eq for Provenance

source§

impl StructuralPartialEq for Provenance

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
§

impl<T> ArchiveUnsized for T
where + T: Archive,

§

type Archived = <T as Archive>::Archived

The archived counterpart of this type. Unlike Archive, it may be unsized. Read more
§

type MetadataResolver = ()

The resolver for the metadata of this type. Read more
§

unsafe fn resolve_metadata( + &self, + _: usize, + _: <T as ArchiveUnsized>::MetadataResolver, + _: *mut <<T as ArchiveUnsized>::Archived as ArchivePointee>::ArchivedMetadata, +)

Creates the archived version of the metadata for this value at the given position and writes +it to the given output. Read more
§

unsafe fn resolve_unsized( + &self, + from: usize, + to: usize, + resolver: Self::MetadataResolver, + out: *mut RelPtr<Self::Archived, <isize as Archive>::Archived>, +)

Resolves a relative pointer to this value with the given from and to and writes it to +the given output. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
§

impl<T, S> SerializeUnsized<S> for T
where + T: Serialize<S>, + S: Serializer + ?Sized,

§

fn serialize_unsized( + &self, + serializer: &mut S, +) -> Result<usize, <S as Fallible>::Error>

Writes the object and returns the position of the archived type.
§

fn serialize_metadata(&self, _: &mut S) -> Result<(), <S as Fallible>::Error>

Serializes the metadata for the given type.
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_test_utils/enum.ProvenanceResolver.html b/air_test_utils/enum.ProvenanceResolver.html new file mode 100644 index 00000000..6c1cd151 --- /dev/null +++ b/air_test_utils/enum.ProvenanceResolver.html @@ -0,0 +1,47 @@ +ProvenanceResolver in air_test_utils - Rust

Enum air_test_utils::ProvenanceResolver

source ·
pub enum ProvenanceResolver{
+    Literal,
+    ServiceResult {
+        cid: <CID<ServiceResultCidAggregate> as Archive>::Resolver,
+    },
+    Canon {
+        cid: <CID<CanonResultCidAggregate> as Archive>::Resolver,
+    },
+}
Expand description

The resolver for an archived Provenance

+

Variants§

§

Literal

The resolver for Provenance::Literal

+
§

ServiceResult

The resolver for Provenance::ServiceResult

+

Fields

§cid: <CID<ServiceResultCidAggregate> as Archive>::Resolver
§

Canon

The resolver for Provenance::Canon

+

Fields

§cid: <CID<CanonResultCidAggregate> as Archive>::Resolver

The resolver for Provenance::Canon::cid

+

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_test_utils/enum.RunnerError.html b/air_test_utils/enum.RunnerError.html new file mode 100644 index 00000000..338fb7c7 --- /dev/null +++ b/air_test_utils/enum.RunnerError.html @@ -0,0 +1,54 @@ +RunnerError in air_test_utils - Rust

Enum air_test_utils::RunnerError

source ·
pub enum RunnerError {
+    MarineError(MarineError),
+    InvalidAIRPath {
+        invalid_path: PathBuf,
+        io_error: Option<Error>,
+        reason: &'static str,
+    },
+    InterpreterResultDeError(String),
+    IncorrectInterpreterResult(Vec<IValue>),
+    CallSeDeErrors(CallSeDeErrors),
+    KeyError(Report),
+    Aux(String),
+}

Variants§

§

MarineError(MarineError)

This errors are encountered from FaaS.

+
§

InvalidAIRPath

Specified path to AIR interpreter .wasm file was invalid

+

Fields

§invalid_path: PathBuf
§io_error: Option<Error>
§reason: &'static str
§

InterpreterResultDeError(String)

AIR interpreter result deserialization errors.

+
§

IncorrectInterpreterResult(Vec<IValue>)

Marine call returns Vec to support multi-value in a future, +but actually now it could return empty vec or a vec with one value. +This error is encountered when it returns vec with not a one value.

+
§

CallSeDeErrors(CallSeDeErrors)

This errors are encountered from an call results/params se/de.

+
§

KeyError(Report)

Invalid secret key.

+
§

Aux(String)

Errors from auxiliary calls.

+

Trait Implementations§

source§

impl Debug for RunnerError

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
source§

impl Display for RunnerError

source§

fn fmt(&self, __formatter: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
source§

impl Error for RunnerError

source§

fn source(&self) -> Option<&(dyn Error + 'static)>

The lower-level source of this error, if any. Read more
1.0.0 · source§

fn description(&self) -> &str

👎Deprecated since 1.42.0: use the Display impl or to_string()
1.0.0 · source§

fn cause(&self) -> Option<&dyn Error>

👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
source§

fn provide<'a>(&'a self, request: &mut Request<'a>)

🔬This is a nightly-only experimental API. (error_generic_member_access)
Provides type based access to context intended for error reports. Read more
source§

impl From<CallSeDeErrors> for RunnerError

source§

fn from(source: CallSeDeErrors) -> RunnerError

Converts to this type from the input type.
source§

impl From<MarineError> for RunnerError

source§

fn from(source: MarineError) -> RunnerError

Converts to this type from the input type.

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
§

impl<T> Error for T
where + T: Error + 'static,

§

fn as_error(&self) -> &(dyn Error + 'static)

Gets this error as an std::error::Error.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_test_utils/enum.Sender.html b/air_test_utils/enum.Sender.html new file mode 100644 index 00000000..5eb401db --- /dev/null +++ b/air_test_utils/enum.Sender.html @@ -0,0 +1,101 @@ +Sender in air_test_utils - Rust

Enum air_test_utils::Sender

source ·
pub enum Sender {
+    PeerId(Rc<String>),
+    PeerIdWithCallId {
+        peer_id: Rc<String>,
+        call_id: u32,
+    },
+}

Variants§

§

PeerId(Rc<String>)

§

PeerIdWithCallId

Fields

§peer_id: Rc<String>
§call_id: u32

Trait Implementations§

source§

impl Archive for Sender
where + Rc<String>: Archive, + u32: Archive,

§

type Archived = ArchivedSender

The archived representation of this type. Read more
§

type Resolver = SenderResolver

The resolver for this type. It must contain all the additional information from serializing +needed to make the archived type from the normal type.
source§

unsafe fn resolve( + &self, + pos: usize, + resolver: <Sender as Archive>::Resolver, + out: *mut <Sender as Archive>::Archived, +)

Creates the archived version of this value at the given position and writes it to the given +output. Read more
source§

impl Clone for Sender

source§

fn clone(&self) -> Sender

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for Sender

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
source§

impl<'de> Deserialize<'de> for Sender

source§

fn deserialize<__D>( + __deserializer: __D, +) -> Result<Sender, <__D as Deserializer<'de>>::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl<__D> Deserialize<Sender, __D> for <Sender as Archive>::Archived
where + __D: Fallible + ?Sized, + Rc<String>: Archive, + <Rc<String> as Archive>::Archived: Deserialize<Rc<String>, __D>, + u32: Archive, + <u32 as Archive>::Archived: Deserialize<u32, __D>,

source§

fn deserialize( + &self, + deserializer: &mut __D, +) -> Result<Sender, <__D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl Display for Sender

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
source§

impl PartialEq for Sender

source§

fn eq(&self, other: &Sender) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl<__S> Serialize<__S> for Sender
where + __S: Fallible + ?Sized, + Rc<String>: Serialize<__S>, + u32: Serialize<__S>,

source§

fn serialize( + &self, + serializer: &mut __S, +) -> Result<<Sender as Archive>::Resolver, <__S as Fallible>::Error>

Writes the dependencies for the object and returns a resolver that can create the archived +type.
source§

impl Serialize for Sender

source§

fn serialize<__S>( + &self, + __serializer: __S, +) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Eq for Sender

source§

impl StructuralPartialEq for Sender

Auto Trait Implementations§

§

impl Freeze for Sender

§

impl RefUnwindSafe for Sender

§

impl !Send for Sender

§

impl !Sync for Sender

§

impl Unpin for Sender

§

impl UnwindSafe for Sender

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
§

impl<T> ArchiveUnsized for T
where + T: Archive,

§

type Archived = <T as Archive>::Archived

The archived counterpart of this type. Unlike Archive, it may be unsized. Read more
§

type MetadataResolver = ()

The resolver for the metadata of this type. Read more
§

unsafe fn resolve_metadata( + &self, + _: usize, + _: <T as ArchiveUnsized>::MetadataResolver, + _: *mut <<T as ArchiveUnsized>::Archived as ArchivePointee>::ArchivedMetadata, +)

Creates the archived version of the metadata for this value at the given position and writes +it to the given output. Read more
§

unsafe fn resolve_unsized( + &self, + from: usize, + to: usize, + resolver: Self::MetadataResolver, + out: *mut RelPtr<Self::Archived, <isize as Archive>::Archived>, +)

Resolves a relative pointer to this value with the given from and to and writes it to +the given output. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
§

impl<T, S> SerializeUnsized<S> for T
where + T: Serialize<S>, + S: Serializer + ?Sized,

§

fn serialize_unsized( + &self, + serializer: &mut S, +) -> Result<usize, <S as Fallible>::Error>

Writes the object and returns the position of the archived type.
§

fn serialize_metadata(&self, _: &mut S) -> Result<(), <S as Fallible>::Error>

Serializes the metadata for the given type.
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_test_utils/enum.SenderResolver.html b/air_test_utils/enum.SenderResolver.html new file mode 100644 index 00000000..6b5e4d20 --- /dev/null +++ b/air_test_utils/enum.SenderResolver.html @@ -0,0 +1,45 @@ +SenderResolver in air_test_utils - Rust

Enum air_test_utils::SenderResolver

source ·
pub enum SenderResolver
where + Rc<String>: Archive, + u32: Archive,
{ + PeerId(<Rc<String> as Archive>::Resolver), + PeerIdWithCallId { + peer_id: <Rc<String> as Archive>::Resolver, + call_id: <u32 as Archive>::Resolver, + }, +}
Expand description

The resolver for an archived Sender

+

Variants§

§

PeerId(<Rc<String> as Archive>::Resolver)

The resolver for Sender::PeerId

+

Tuple Fields

§0: <Rc<String> as Archive>::Resolver

The resolver for Sender::PeerId::0

+
§

PeerIdWithCallId

The resolver for Sender::PeerIdWithCallId

+

Fields

§peer_id: <Rc<String> as Archive>::Resolver
§call_id: <u32 as Archive>::Resolver

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_test_utils/enum.ValueRef.html b/air_test_utils/enum.ValueRef.html new file mode 100644 index 00000000..886723d3 --- /dev/null +++ b/air_test_utils/enum.ValueRef.html @@ -0,0 +1,109 @@ +ValueRef in air_test_utils - Rust

Enum air_test_utils::ValueRef

source ·
pub enum ValueRef {
+    Scalar(CID<ServiceResultCidAggregate>),
+    Stream {
+        cid: CID<ServiceResultCidAggregate>,
+        generation: GenerationIdx,
+    },
+    Unused(CID<JValue>),
+}

Variants§

§

Scalar(CID<ServiceResultCidAggregate>)

The call value is stored to a scalar variable.

+
§

Stream

The call value is stored to a stream variable.

+
§

Unused(CID<JValue>)

The call value is not stored.

+

Trait Implementations§

source§

impl Archive for ValueRef
where + CID<ServiceResultCidAggregate>: Archive, + GenerationIdx: Archive, + CID<JValue>: Archive,

§

type Archived = ArchivedValueRef

The archived representation of this type. Read more
§

type Resolver = ValueRefResolver

The resolver for this type. It must contain all the additional information from serializing +needed to make the archived type from the normal type.
source§

unsafe fn resolve( + &self, + pos: usize, + resolver: <ValueRef as Archive>::Resolver, + out: *mut <ValueRef as Archive>::Archived, +)

Creates the archived version of this value at the given position and writes it to the given +output. Read more
source§

impl Clone for ValueRef

source§

fn clone(&self) -> ValueRef

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for ValueRef

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
source§

impl<'de> Deserialize<'de> for ValueRef

source§

fn deserialize<__D>( + __deserializer: __D, +) -> Result<ValueRef, <__D as Deserializer<'de>>::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl<__D> Deserialize<ValueRef, __D> for <ValueRef as Archive>::Archived
where + __D: Fallible + ?Sized, + CID<ServiceResultCidAggregate>: Archive, + <CID<ServiceResultCidAggregate> as Archive>::Archived: Deserialize<CID<ServiceResultCidAggregate>, __D>, + GenerationIdx: Archive, + <GenerationIdx as Archive>::Archived: Deserialize<GenerationIdx, __D>, + CID<JValue>: Archive, + <CID<JValue> as Archive>::Archived: Deserialize<CID<JValue>, __D>,

source§

fn deserialize( + &self, + deserializer: &mut __D, +) -> Result<ValueRef, <__D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl Display for ValueRef

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
source§

impl PartialEq for ValueRef

source§

fn eq(&self, other: &ValueRef) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl<__S> Serialize<__S> for ValueRef
where + __S: Fallible + ?Sized, + CID<ServiceResultCidAggregate>: Serialize<__S>, + GenerationIdx: Serialize<__S>, + CID<JValue>: Serialize<__S>,

source§

fn serialize( + &self, + serializer: &mut __S, +) -> Result<<ValueRef as Archive>::Resolver, <__S as Fallible>::Error>

Writes the dependencies for the object and returns a resolver that can create the archived +type.
source§

impl Serialize for ValueRef

source§

fn serialize<__S>( + &self, + __serializer: __S, +) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Eq for ValueRef

source§

impl StructuralPartialEq for ValueRef

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
§

impl<T> ArchiveUnsized for T
where + T: Archive,

§

type Archived = <T as Archive>::Archived

The archived counterpart of this type. Unlike Archive, it may be unsized. Read more
§

type MetadataResolver = ()

The resolver for the metadata of this type. Read more
§

unsafe fn resolve_metadata( + &self, + _: usize, + _: <T as ArchiveUnsized>::MetadataResolver, + _: *mut <<T as ArchiveUnsized>::Archived as ArchivePointee>::ArchivedMetadata, +)

Creates the archived version of the metadata for this value at the given position and writes +it to the given output. Read more
§

unsafe fn resolve_unsized( + &self, + from: usize, + to: usize, + resolver: Self::MetadataResolver, + out: *mut RelPtr<Self::Archived, <isize as Archive>::Archived>, +)

Resolves a relative pointer to this value with the given from and to and writes it to +the given output. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
§

impl<T, S> SerializeUnsized<S> for T
where + T: Serialize<S>, + S: Serializer + ?Sized,

§

fn serialize_unsized( + &self, + serializer: &mut S, +) -> Result<usize, <S as Fallible>::Error>

Writes the object and returns the position of the archived type.
§

fn serialize_metadata(&self, _: &mut S) -> Result<(), <S as Fallible>::Error>

Serializes the metadata for the given type.
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_test_utils/enum.ValueRefResolver.html b/air_test_utils/enum.ValueRefResolver.html new file mode 100644 index 00000000..e13a837b --- /dev/null +++ b/air_test_utils/enum.ValueRefResolver.html @@ -0,0 +1,49 @@ +ValueRefResolver in air_test_utils - Rust

Enum air_test_utils::ValueRefResolver

source ·
pub enum ValueRefResolver
where + CID<ServiceResultCidAggregate>: Archive, + GenerationIdx: Archive, + CID<JValue>: Archive,
{ + Scalar(<CID<ServiceResultCidAggregate> as Archive>::Resolver), + Stream { + cid: <CID<ServiceResultCidAggregate> as Archive>::Resolver, + generation: <GenerationIdx as Archive>::Resolver, + }, + Unused(<CID<JValue> as Archive>::Resolver), +}
Expand description

The resolver for an archived ValueRef

+

Variants§

§

Scalar(<CID<ServiceResultCidAggregate> as Archive>::Resolver)

The resolver for ValueRef::Scalar

+

Tuple Fields

§0: <CID<ServiceResultCidAggregate> as Archive>::Resolver

The resolver for ValueRef::Scalar::0

+
§

Stream

The resolver for ValueRef::Stream

+

Fields

§cid: <CID<ServiceResultCidAggregate> as Archive>::Resolver

The resolver for ValueRef::Stream::cid

+
§generation: <GenerationIdx as Archive>::Resolver

The resolver for ValueRef::Stream::generation

+
§

Unused(<CID<JValue> as Archive>::Resolver)

The resolver for ValueRef::Unused

+

Tuple Fields

§0: <CID<JValue> as Archive>::Resolver

The resolver for ValueRef::Unused::0

+

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_test_utils/executed_state/fn._failure_to_value.html b/air_test_utils/executed_state/fn._failure_to_value.html new file mode 100644 index 00000000..edcfae62 --- /dev/null +++ b/air_test_utils/executed_state/fn._failure_to_value.html @@ -0,0 +1 @@ +_failure_to_value in air_test_utils::executed_state - Rust

Function air_test_utils::executed_state::_failure_to_value

source ·
pub fn _failure_to_value(ret_code: i32, error_message: &str) -> JValue
\ No newline at end of file diff --git a/air_test_utils/executed_state/fn.ap.html b/air_test_utils/executed_state/fn.ap.html new file mode 100644 index 00000000..eef13efd --- /dev/null +++ b/air_test_utils/executed_state/fn.ap.html @@ -0,0 +1 @@ +ap in air_test_utils::executed_state - Rust

Function air_test_utils::executed_state::ap

source ·
pub fn ap(generation: impl Into<GenerationIdx>) -> ExecutedState
\ No newline at end of file diff --git a/air_test_utils/executed_state/fn.canon.html b/air_test_utils/executed_state/fn.canon.html new file mode 100644 index 00000000..d711ba56 --- /dev/null +++ b/air_test_utils/executed_state/fn.canon.html @@ -0,0 +1,3 @@ +canon in air_test_utils::executed_state - Rust

Function air_test_utils::executed_state::canon

source ·
pub fn canon(canonicalized_element: Value) -> ExecutedState
Expand description

This function takes a JSON DSL-like struct for compatibility and test writer +convenience.

+
\ No newline at end of file diff --git a/air_test_utils/executed_state/fn.canon_request.html b/air_test_utils/executed_state/fn.canon_request.html new file mode 100644 index 00000000..b117c82b --- /dev/null +++ b/air_test_utils/executed_state/fn.canon_request.html @@ -0,0 +1 @@ +canon_request in air_test_utils::executed_state - Rust

Function air_test_utils::executed_state::canon_request

source ·
pub fn canon_request(peer_id: impl Into<String>) -> ExecutedState
\ No newline at end of file diff --git a/air_test_utils/executed_state/fn.canon_tracked.html b/air_test_utils/executed_state/fn.canon_tracked.html new file mode 100644 index 00000000..d00ef539 --- /dev/null +++ b/air_test_utils/executed_state/fn.canon_tracked.html @@ -0,0 +1,4 @@ +canon_tracked in air_test_utils::executed_state - Rust

Function air_test_utils::executed_state::canon_tracked

source ·
pub fn canon_tracked(
+    canonicalized_element: Value,
+    cid_state: &mut ExecutionCidState,
+) -> ExecutedState
\ No newline at end of file diff --git a/air_test_utils/executed_state/fn.extract_canon_result_cid.html b/air_test_utils/executed_state/fn.extract_canon_result_cid.html new file mode 100644 index 00000000..f1a86517 --- /dev/null +++ b/air_test_utils/executed_state/fn.extract_canon_result_cid.html @@ -0,0 +1,3 @@ +extract_canon_result_cid in air_test_utils::executed_state - Rust
pub fn extract_canon_result_cid(
+    canon_state: &ExecutedState,
+) -> CID<CanonResultCidAggregate>
\ No newline at end of file diff --git a/air_test_utils/executed_state/fn.extract_service_result_cid.html b/air_test_utils/executed_state/fn.extract_service_result_cid.html new file mode 100644 index 00000000..be7b322c --- /dev/null +++ b/air_test_utils/executed_state/fn.extract_service_result_cid.html @@ -0,0 +1,3 @@ +extract_service_result_cid in air_test_utils::executed_state - Rust
pub fn extract_service_result_cid(
+    stream_exec_state: &ExecutedState,
+) -> CID<ServiceResultCidAggregate>
\ No newline at end of file diff --git a/air_test_utils/executed_state/fn.fold.html b/air_test_utils/executed_state/fn.fold.html new file mode 100644 index 00000000..c90c49cd --- /dev/null +++ b/air_test_utils/executed_state/fn.fold.html @@ -0,0 +1 @@ +fold in air_test_utils::executed_state - Rust

Function air_test_utils::executed_state::fold

source ·
pub fn fold(lore: FoldLore) -> ExecutedState
\ No newline at end of file diff --git a/air_test_utils/executed_state/fn.par.html b/air_test_utils/executed_state/fn.par.html new file mode 100644 index 00000000..042643ca --- /dev/null +++ b/air_test_utils/executed_state/fn.par.html @@ -0,0 +1 @@ +par in air_test_utils::executed_state - Rust

Function air_test_utils::executed_state::par

source ·
pub fn par(left: u32, right: u32) -> ExecutedState
\ No newline at end of file diff --git a/air_test_utils/executed_state/fn.request_sent_by.html b/air_test_utils/executed_state/fn.request_sent_by.html new file mode 100644 index 00000000..e8efeb2a --- /dev/null +++ b/air_test_utils/executed_state/fn.request_sent_by.html @@ -0,0 +1 @@ +request_sent_by in air_test_utils::executed_state - Rust

Function air_test_utils::executed_state::request_sent_by

source ·
pub fn request_sent_by(sender: impl Into<String>) -> ExecutedState
\ No newline at end of file diff --git a/air_test_utils/executed_state/fn.simple_value_aggregate_cid.html b/air_test_utils/executed_state/fn.simple_value_aggregate_cid.html new file mode 100644 index 00000000..b9bec789 --- /dev/null +++ b/air_test_utils/executed_state/fn.simple_value_aggregate_cid.html @@ -0,0 +1,4 @@ +simple_value_aggregate_cid in air_test_utils::executed_state - Rust
pub fn simple_value_aggregate_cid(
+    result: impl Into<JValue>,
+    cid_state: &mut ExecutionCidState,
+) -> CID<ServiceResultCidAggregate>
\ No newline at end of file diff --git a/air_test_utils/executed_state/fn.subtrace_desc.html b/air_test_utils/executed_state/fn.subtrace_desc.html new file mode 100644 index 00000000..f991bb27 --- /dev/null +++ b/air_test_utils/executed_state/fn.subtrace_desc.html @@ -0,0 +1,4 @@ +subtrace_desc in air_test_utils::executed_state - Rust

Function air_test_utils::executed_state::subtrace_desc

source ·
pub fn subtrace_desc(
+    begin_pos: impl Into<TracePos>,
+    subtrace_len: u32,
+) -> SubTraceDesc
\ No newline at end of file diff --git a/air_test_utils/executed_state/fn.subtrace_lore.html b/air_test_utils/executed_state/fn.subtrace_lore.html new file mode 100644 index 00000000..6a3d5f8d --- /dev/null +++ b/air_test_utils/executed_state/fn.subtrace_lore.html @@ -0,0 +1,5 @@ +subtrace_lore in air_test_utils::executed_state - Rust

Function air_test_utils::executed_state::subtrace_lore

source ·
pub fn subtrace_lore(
+    value_pos: impl Into<TracePos>,
+    before: SubTraceDesc,
+    after: SubTraceDesc,
+) -> FoldSubTraceLore
\ No newline at end of file diff --git a/air_test_utils/executed_state/fn.value_aggregate_cid.html b/air_test_utils/executed_state/fn.value_aggregate_cid.html new file mode 100644 index 00000000..6b06b772 --- /dev/null +++ b/air_test_utils/executed_state/fn.value_aggregate_cid.html @@ -0,0 +1,6 @@ +value_aggregate_cid in air_test_utils::executed_state - Rust

Function air_test_utils::executed_state::value_aggregate_cid

source ·
pub fn value_aggregate_cid(
+    result: impl Into<JValue>,
+    tetraplet: SecurityTetraplet,
+    args: Vec<JValue>,
+    cid_state: &mut ExecutionCidState,
+) -> CID<ServiceResultCidAggregate>
\ No newline at end of file diff --git a/air_test_utils/executed_state/index.html b/air_test_utils/executed_state/index.html new file mode 100644 index 00000000..41a9fcbe --- /dev/null +++ b/air_test_utils/executed_state/index.html @@ -0,0 +1,2 @@ +air_test_utils::executed_state - Rust
\ No newline at end of file diff --git a/air_test_utils/executed_state/sidebar-items.js b/air_test_utils/executed_state/sidebar-items.js new file mode 100644 index 00000000..fa9d7e90 --- /dev/null +++ b/air_test_utils/executed_state/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"fn":["_failure_to_value","ap","canon","canon_request","canon_tracked","extract_canon_result_cid","extract_service_result_cid","fold","par","request_sent_by","simple_value_aggregate_cid","subtrace_desc","subtrace_lore","value_aggregate_cid"],"struct":["CanonResultAlike","ExecutedCallBuilder","ValueAggregateAlike"]}; \ No newline at end of file diff --git a/air_test_utils/executed_state/struct.CanonResultAlike.html b/air_test_utils/executed_state/struct.CanonResultAlike.html new file mode 100644 index 00000000..ba21e44c --- /dev/null +++ b/air_test_utils/executed_state/struct.CanonResultAlike.html @@ -0,0 +1,37 @@ +CanonResultAlike in air_test_utils::executed_state - Rust

Struct air_test_utils::executed_state::CanonResultAlike

source ·
pub struct CanonResultAlike {
+    pub tetraplet: Rc<SecurityTetraplet>,
+    pub values: Vec<ValueAggregateAlike>,
+}

Fields§

§tetraplet: Rc<SecurityTetraplet>§values: Vec<ValueAggregateAlike>

Trait Implementations§

source§

impl Debug for CanonResultAlike

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'de> Deserialize<'de> for CanonResultAlike

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl Serialize for CanonResultAlike

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_test_utils/executed_state/struct.ExecutedCallBuilder.html b/air_test_utils/executed_state/struct.ExecutedCallBuilder.html new file mode 100644 index 00000000..3b8cc736 --- /dev/null +++ b/air_test_utils/executed_state/struct.ExecutedCallBuilder.html @@ -0,0 +1,35 @@ +ExecutedCallBuilder in air_test_utils::executed_state - Rust
pub struct ExecutedCallBuilder { /* private fields */ }

Implementations§

source§

impl ExecutedCallBuilder

source

pub fn new(result: impl Into<JValue>) -> Self

source

pub fn peer(self, peer_pk: impl Into<String>) -> Self

source

pub fn peer_name(self, peer_name: impl AsRef<str>) -> Self

source

pub fn service(self, service_id: impl Into<String>) -> Self

source

pub fn function(self, function_name: impl Into<String>) -> Self

source

pub fn lens(self, lens: impl Into<String>) -> Self

source

pub fn args(self, args: impl IntoIterator<Item = impl Into<JValue>>) -> Self

source

pub fn scalar(self) -> ExecutedState

source

pub fn unused(self) -> ExecutedState

source

pub fn scalar_tracked(self, cid_state: &mut ExecutionCidState) -> ExecutedState

source

pub fn failed(self) -> ExecutedState

source

pub fn failed_tracked(self, cid_state: &mut ExecutionCidState) -> ExecutedState

source

pub fn stream(self, generation: u32) -> ExecutedState

source

pub fn stream_tracked( + self, + generation: u32, + cid_state: &mut ExecutionCidState, +) -> ExecutedState

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_test_utils/executed_state/struct.ValueAggregateAlike.html b/air_test_utils/executed_state/struct.ValueAggregateAlike.html new file mode 100644 index 00000000..e03cbe7e --- /dev/null +++ b/air_test_utils/executed_state/struct.ValueAggregateAlike.html @@ -0,0 +1,38 @@ +ValueAggregateAlike in air_test_utils::executed_state - Rust
pub struct ValueAggregateAlike {
+    pub result: JValue,
+    pub tetraplet: Rc<SecurityTetraplet>,
+    pub provenance: Option<Provenance>,
+}

Fields§

§result: JValue§tetraplet: Rc<SecurityTetraplet>§provenance: Option<Provenance>

Trait Implementations§

source§

impl Debug for ValueAggregateAlike

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'de> Deserialize<'de> for ValueAggregateAlike

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl Serialize for ValueAggregateAlike

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_test_utils/fn.check_error.html b/air_test_utils/fn.check_error.html new file mode 100644 index 00000000..f84de9fe --- /dev/null +++ b/air_test_utils/fn.check_error.html @@ -0,0 +1,4 @@ +check_error in air_test_utils - Rust

Function air_test_utils::check_error

source ·
pub fn check_error(
+    result: &RawAVMOutcome,
+    error: impl ToErrorCode + ToString,
+) -> bool
\ No newline at end of file diff --git a/air_test_utils/fn.data_from_result.html b/air_test_utils/fn.data_from_result.html new file mode 100644 index 00000000..6c075d4e --- /dev/null +++ b/air_test_utils/fn.data_from_result.html @@ -0,0 +1 @@ +data_from_result in air_test_utils - Rust

Function air_test_utils::data_from_result

source ·
pub fn data_from_result(result: &RawAVMOutcome) -> InterpreterData
\ No newline at end of file diff --git a/air_test_utils/fn.data_version.html b/air_test_utils/fn.data_version.html new file mode 100644 index 00000000..c86823c8 --- /dev/null +++ b/air_test_utils/fn.data_version.html @@ -0,0 +1 @@ +data_version in air_test_utils - Rust

Function air_test_utils::data_version

source ·
pub fn data_version() -> &'static Version
\ No newline at end of file diff --git a/air_test_utils/fn.env_from_result.html b/air_test_utils/fn.env_from_result.html new file mode 100644 index 00000000..d3ba8db1 --- /dev/null +++ b/air_test_utils/fn.env_from_result.html @@ -0,0 +1 @@ +env_from_result in air_test_utils - Rust

Function air_test_utils::env_from_result

source ·
pub fn env_from_result(result: &RawAVMOutcome) -> InterpreterDataEnvelope<'_>
\ No newline at end of file diff --git a/air_test_utils/fn.into_raw_result.html b/air_test_utils/fn.into_raw_result.html new file mode 100644 index 00000000..41fb16c8 --- /dev/null +++ b/air_test_utils/fn.into_raw_result.html @@ -0,0 +1,3 @@ +into_raw_result in air_test_utils - Rust

Function air_test_utils::into_raw_result

source ·
pub fn into_raw_result(
+    call_results: HashMap<u32, CallServiceResult>,
+) -> HashMap<String, CallServiceResult>
\ No newline at end of file diff --git a/air_test_utils/fn.is_interpreter_succeded.html b/air_test_utils/fn.is_interpreter_succeded.html new file mode 100644 index 00000000..833c7930 --- /dev/null +++ b/air_test_utils/fn.is_interpreter_succeded.html @@ -0,0 +1 @@ +is_interpreter_succeded in air_test_utils - Rust

Function air_test_utils::is_interpreter_succeded

source ·
pub fn is_interpreter_succeded(result: &RawAVMOutcome) -> bool
\ No newline at end of file diff --git a/air_test_utils/fn.print_trace.html b/air_test_utils/fn.print_trace.html new file mode 100644 index 00000000..1c9d4768 --- /dev/null +++ b/air_test_utils/fn.print_trace.html @@ -0,0 +1 @@ +print_trace in air_test_utils - Rust

Function air_test_utils::print_trace

source ·
pub fn print_trace(result: &RawAVMOutcome, trace_name: &str)
\ No newline at end of file diff --git a/air_test_utils/fn.raw_data_from_trace.html b/air_test_utils/fn.raw_data_from_trace.html new file mode 100644 index 00000000..e69a2730 --- /dev/null +++ b/air_test_utils/fn.raw_data_from_trace.html @@ -0,0 +1,4 @@ +raw_data_from_trace in air_test_utils - Rust

Function air_test_utils::raw_data_from_trace

source ·
pub fn raw_data_from_trace(
+    trace: impl Into<ExecutionTrace>,
+    cid_state: ExecutionCidState,
+) -> Vec<u8> 
\ No newline at end of file diff --git a/air_test_utils/fn.raw_data_from_trace_with_canon.html b/air_test_utils/fn.raw_data_from_trace_with_canon.html new file mode 100644 index 00000000..1c035482 --- /dev/null +++ b/air_test_utils/fn.raw_data_from_trace_with_canon.html @@ -0,0 +1,4 @@ +raw_data_from_trace_with_canon in air_test_utils - Rust

Function air_test_utils::raw_data_from_trace_with_canon

source ·
pub fn raw_data_from_trace_with_canon(
+    trace: impl Into<ExecutionTrace>,
+    cid_state: ExecutionCidState,
+) -> Vec<u8> 
\ No newline at end of file diff --git a/air_test_utils/fn.trace_from_result.html b/air_test_utils/fn.trace_from_result.html new file mode 100644 index 00000000..8f591bb8 --- /dev/null +++ b/air_test_utils/fn.trace_from_result.html @@ -0,0 +1 @@ +trace_from_result in air_test_utils - Rust

Function air_test_utils::trace_from_result

source ·
pub fn trace_from_result(result: &RawAVMOutcome) -> ExecutionTrace
\ No newline at end of file diff --git a/air_test_utils/index.html b/air_test_utils/index.html new file mode 100644 index 00000000..0d746b20 --- /dev/null +++ b/air_test_utils/index.html @@ -0,0 +1,18 @@ +air_test_utils - Rust

Crate air_test_utils

source ·

Modules§

Macros§

Structs§

Enums§

Constants§

Traits§

Functions§

Type Aliases§

\ No newline at end of file diff --git a/air_test_utils/key_utils/fn.at.html b/air_test_utils/key_utils/fn.at.html new file mode 100644 index 00000000..6bc9d52e --- /dev/null +++ b/air_test_utils/key_utils/fn.at.html @@ -0,0 +1 @@ +at in air_test_utils::key_utils - Rust

Function air_test_utils::key_utils::at

source ·
pub fn at(peer_name: &str) -> String
\ No newline at end of file diff --git a/air_test_utils/key_utils/fn.derive_dummy_keypair.html b/air_test_utils/key_utils/fn.derive_dummy_keypair.html new file mode 100644 index 00000000..a59fd8c8 --- /dev/null +++ b/air_test_utils/key_utils/fn.derive_dummy_keypair.html @@ -0,0 +1,5 @@ +derive_dummy_keypair in air_test_utils::key_utils - Rust

Function air_test_utils::key_utils::derive_dummy_keypair

source ·
pub fn derive_dummy_keypair(seed: &str) -> (KeyPair, String)
Expand description

Derive fake keypair for testing proposes.

+

This function should be used in production, but it is yet. +It returns a keypair determinisitically derived from seed, and a corresponding peer ID +that might be useful in tests.

+
\ No newline at end of file diff --git a/air_test_utils/key_utils/index.html b/air_test_utils/key_utils/index.html new file mode 100644 index 00000000..217ddb33 --- /dev/null +++ b/air_test_utils/key_utils/index.html @@ -0,0 +1 @@ +air_test_utils::key_utils - Rust

Module air_test_utils::key_utils

source ·

Functions§

\ No newline at end of file diff --git a/air_test_utils/key_utils/sidebar-items.js b/air_test_utils/key_utils/sidebar-items.js new file mode 100644 index 00000000..b6388386 --- /dev/null +++ b/air_test_utils/key_utils/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"fn":["at","derive_dummy_keypair"]}; \ No newline at end of file diff --git a/air_test_utils/macro._trace_value_body!.html b/air_test_utils/macro._trace_value_body!.html new file mode 100644 index 00000000..d98168a3 --- /dev/null +++ b/air_test_utils/macro._trace_value_body!.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to macro._trace_value_body.html...

+ + + \ No newline at end of file diff --git a/air_test_utils/macro._trace_value_body.html b/air_test_utils/macro._trace_value_body.html new file mode 100644 index 00000000..282c3d40 --- /dev/null +++ b/air_test_utils/macro._trace_value_body.html @@ -0,0 +1,4 @@ +_trace_value_body in air_test_utils - Rust

Macro air_test_utils::_trace_value_body

source ·
macro_rules! _trace_value_body {
+    ($value:expr) => { ... };
+    ($value:expr, $func1:ident = $v1:expr $(, $func:ident = $v:expr)*) => { ... };
+}
\ No newline at end of file diff --git a/air_test_utils/macro.assert_error_eq!.html b/air_test_utils/macro.assert_error_eq!.html new file mode 100644 index 00000000..c0cf9113 --- /dev/null +++ b/air_test_utils/macro.assert_error_eq!.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to macro.assert_error_eq.html...

+ + + \ No newline at end of file diff --git a/air_test_utils/macro.assert_error_eq.html b/air_test_utils/macro.assert_error_eq.html new file mode 100644 index 00000000..6107e89d --- /dev/null +++ b/air_test_utils/macro.assert_error_eq.html @@ -0,0 +1,4 @@ +assert_error_eq in air_test_utils - Rust

Macro air_test_utils::assert_error_eq

source ·
macro_rules! assert_error_eq {
+    ($result:expr, $error:expr $(,)?) => { ... };
+    ($result:expr, $error:expr, $($arg:tt)+) => { ... };
+}
\ No newline at end of file diff --git a/air_test_utils/macro.assert_next_pks!.html b/air_test_utils/macro.assert_next_pks!.html new file mode 100644 index 00000000..bec1ec33 --- /dev/null +++ b/air_test_utils/macro.assert_next_pks!.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to macro.assert_next_pks.html...

+ + + \ No newline at end of file diff --git a/air_test_utils/macro.assert_next_pks.html b/air_test_utils/macro.assert_next_pks.html new file mode 100644 index 00000000..f4a1ebe9 --- /dev/null +++ b/air_test_utils/macro.assert_next_pks.html @@ -0,0 +1,3 @@ +assert_next_pks in air_test_utils - Rust

Macro air_test_utils::assert_next_pks

source ·
macro_rules! assert_next_pks {
+    ($expected:expr, $actual:expr) => { ... };
+}
\ No newline at end of file diff --git a/air_test_utils/macro.call_vm!.html b/air_test_utils/macro.call_vm!.html new file mode 100644 index 00000000..d3c6d95f --- /dev/null +++ b/air_test_utils/macro.call_vm!.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to macro.call_vm.html...

+ + + \ No newline at end of file diff --git a/air_test_utils/macro.call_vm.html b/air_test_utils/macro.call_vm.html new file mode 100644 index 00000000..a0201c59 --- /dev/null +++ b/air_test_utils/macro.call_vm.html @@ -0,0 +1,3 @@ +call_vm in air_test_utils - Rust

Macro air_test_utils::call_vm

source ·
macro_rules! call_vm {
+    ($vm:expr, $test_run_parameters:expr, $script:expr, $prev_data:expr, $data:expr) => { ... };
+}
\ No newline at end of file diff --git a/air_test_utils/macro.checked_call_vm!.html b/air_test_utils/macro.checked_call_vm!.html new file mode 100644 index 00000000..e0fbcc19 --- /dev/null +++ b/air_test_utils/macro.checked_call_vm!.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to macro.checked_call_vm.html...

+ + + \ No newline at end of file diff --git a/air_test_utils/macro.checked_call_vm.html b/air_test_utils/macro.checked_call_vm.html new file mode 100644 index 00000000..4870c856 --- /dev/null +++ b/air_test_utils/macro.checked_call_vm.html @@ -0,0 +1,3 @@ +checked_call_vm in air_test_utils - Rust

Macro air_test_utils::checked_call_vm

source ·
macro_rules! checked_call_vm {
+    ($vm:expr, $test_run_parameters:expr, $script:expr, $prev_data:expr, $data:expr) => { ... };
+}
\ No newline at end of file diff --git a/air_test_utils/macro.failed!.html b/air_test_utils/macro.failed!.html new file mode 100644 index 00000000..cd16ab92 --- /dev/null +++ b/air_test_utils/macro.failed!.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to macro.failed.html...

+ + + \ No newline at end of file diff --git a/air_test_utils/macro.failed.html b/air_test_utils/macro.failed.html new file mode 100644 index 00000000..ad515bf6 --- /dev/null +++ b/air_test_utils/macro.failed.html @@ -0,0 +1,4 @@ +failed in air_test_utils - Rust

Macro air_test_utils::failed

source ·
macro_rules! failed {
+    ($ret_code:expr, $error_message:expr) => { ... };
+    ($ret_code:expr, $error_message:expr, $func1:ident = $v1:expr $(, $func:ident = $v:expr)*) => { ... };
+}
\ No newline at end of file diff --git a/air_test_utils/macro.rc!.html b/air_test_utils/macro.rc!.html new file mode 100644 index 00000000..a2c22bcd --- /dev/null +++ b/air_test_utils/macro.rc!.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to macro.rc.html...

+ + + \ No newline at end of file diff --git a/air_test_utils/macro.rc.html b/air_test_utils/macro.rc.html new file mode 100644 index 00000000..f9070b49 --- /dev/null +++ b/air_test_utils/macro.rc.html @@ -0,0 +1,3 @@ +rc in air_test_utils - Rust

Macro air_test_utils::rc

source ·
macro_rules! rc {
+    ($expr:expr) => { ... };
+}
\ No newline at end of file diff --git a/air_test_utils/macro.scalar!.html b/air_test_utils/macro.scalar!.html new file mode 100644 index 00000000..8b460c97 --- /dev/null +++ b/air_test_utils/macro.scalar!.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to macro.scalar.html...

+ + + \ No newline at end of file diff --git a/air_test_utils/macro.scalar.html b/air_test_utils/macro.scalar.html new file mode 100644 index 00000000..3fd123cb --- /dev/null +++ b/air_test_utils/macro.scalar.html @@ -0,0 +1,4 @@ +scalar in air_test_utils - Rust

Macro air_test_utils::scalar

source ·
macro_rules! scalar {
+    ($value:expr) => { ... };
+    ($value:expr, $func1:ident = $v1:expr $(, $func:ident = $v:expr)*) => { ... };
+}
\ No newline at end of file diff --git a/air_test_utils/macro.scalar_tracked!.html b/air_test_utils/macro.scalar_tracked!.html new file mode 100644 index 00000000..d94e728f --- /dev/null +++ b/air_test_utils/macro.scalar_tracked!.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to macro.scalar_tracked.html...

+ + + \ No newline at end of file diff --git a/air_test_utils/macro.scalar_tracked.html b/air_test_utils/macro.scalar_tracked.html new file mode 100644 index 00000000..1b8b53ab --- /dev/null +++ b/air_test_utils/macro.scalar_tracked.html @@ -0,0 +1,4 @@ +scalar_tracked in air_test_utils - Rust

Macro air_test_utils::scalar_tracked

source ·
macro_rules! scalar_tracked {
+    ($value:expr, $state:expr) => { ... };
+    ($value:expr, $state:expr, $func1:ident = $v1:expr $(, $func:ident = $v:expr)*) => { ... };
+}
\ No newline at end of file diff --git a/air_test_utils/macro.stream!.html b/air_test_utils/macro.stream!.html new file mode 100644 index 00000000..2d763ca1 --- /dev/null +++ b/air_test_utils/macro.stream!.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to macro.stream.html...

+ + + \ No newline at end of file diff --git a/air_test_utils/macro.stream.html b/air_test_utils/macro.stream.html new file mode 100644 index 00000000..da31a5f7 --- /dev/null +++ b/air_test_utils/macro.stream.html @@ -0,0 +1,4 @@ +stream in air_test_utils - Rust

Macro air_test_utils::stream

source ·
macro_rules! stream {
+    ($value:expr, $generation:expr) => { ... };
+    ($value:expr, $generation:expr, $func1:ident = $v1:expr $(, $func:ident = $v:expr)*) => { ... };
+}
\ No newline at end of file diff --git a/air_test_utils/macro.stream_tracked!.html b/air_test_utils/macro.stream_tracked!.html new file mode 100644 index 00000000..03690d18 --- /dev/null +++ b/air_test_utils/macro.stream_tracked!.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to macro.stream_tracked.html...

+ + + \ No newline at end of file diff --git a/air_test_utils/macro.stream_tracked.html b/air_test_utils/macro.stream_tracked.html new file mode 100644 index 00000000..04466164 --- /dev/null +++ b/air_test_utils/macro.stream_tracked.html @@ -0,0 +1,4 @@ +stream_tracked in air_test_utils - Rust

Macro air_test_utils::stream_tracked

source ·
macro_rules! stream_tracked {
+    ($value:expr, $generation:expr, $state:expr) => { ... };
+    ($value:expr, $generation:expr, $state:expr, $func1:ident = $v1:expr $(, $func:ident = $v:expr)*) => { ... };
+}
\ No newline at end of file diff --git a/air_test_utils/macro.unused!.html b/air_test_utils/macro.unused!.html new file mode 100644 index 00000000..de0f686b --- /dev/null +++ b/air_test_utils/macro.unused!.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to macro.unused.html...

+ + + \ No newline at end of file diff --git a/air_test_utils/macro.unused.html b/air_test_utils/macro.unused.html new file mode 100644 index 00000000..8f4f5720 --- /dev/null +++ b/air_test_utils/macro.unused.html @@ -0,0 +1,5 @@ +unused in air_test_utils - Rust

Macro air_test_utils::unused

source ·
macro_rules! unused {
+    ($value:expr) => { ... };
+    ($value:expr, $func1:ident = $v1:expr $(, $func:ident = $v:expr)*) => { ... };
+}
Expand description

Please note that unused_tracked does not exist as unused is never tracked.

+
\ No newline at end of file diff --git a/air_test_utils/native_test_runner/index.html b/air_test_utils/native_test_runner/index.html new file mode 100644 index 00000000..c13942fa --- /dev/null +++ b/air_test_utils/native_test_runner/index.html @@ -0,0 +1 @@ +air_test_utils::native_test_runner - Rust

Module air_test_utils::native_test_runner

source ·

Structs§

\ No newline at end of file diff --git a/air_test_utils/native_test_runner/sidebar-items.js b/air_test_utils/native_test_runner/sidebar-items.js new file mode 100644 index 00000000..45126fc2 --- /dev/null +++ b/air_test_utils/native_test_runner/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"struct":["NativeAirRunner"]}; \ No newline at end of file diff --git a/air_test_utils/native_test_runner/struct.NativeAirRunner.html b/air_test_utils/native_test_runner/struct.NativeAirRunner.html new file mode 100644 index 00000000..0b88d260 --- /dev/null +++ b/air_test_utils/native_test_runner/struct.NativeAirRunner.html @@ -0,0 +1,46 @@ +NativeAirRunner in air_test_utils::native_test_runner - Rust
pub struct NativeAirRunner { /* private fields */ }

Trait Implementations§

source§

impl AirRunner for NativeAirRunner

source§

fn new( + current_peer_id: impl Into<String>, + test_init_parameters: TestInitParameters, +) -> LocalBoxFuture<'static, Self>

source§

fn call<'this>( + &'this mut self, + air: impl Into<String>, + prev_data: impl Into<Vec<u8>>, + data: impl Into<Vec<u8>>, + init_peer_id: impl Into<String>, + timestamp: u64, + ttl: u32, + override_current_peer_id: Option<String>, + call_results: CallResults, + keypair: &KeyPair, + particle_id: String, +) -> LocalBoxFuture<'this, Result<RawAVMOutcome, Box<dyn Error + 'this>>>

source§

fn get_current_peer_id(&self) -> &str

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_test_utils/ne_vec/index.html b/air_test_utils/ne_vec/index.html new file mode 100644 index 00000000..1d9847a2 --- /dev/null +++ b/air_test_utils/ne_vec/index.html @@ -0,0 +1,2 @@ +air_test_utils::ne_vec - Rust

Module air_test_utils::ne_vec

Structs§

  • NEVec<T> represents a non-empty Vec<T>. It derefs to Vec<T> +directly.
\ No newline at end of file diff --git a/air_test_utils/ne_vec/sidebar-items.js b/air_test_utils/ne_vec/sidebar-items.js new file mode 100644 index 00000000..2a162fde --- /dev/null +++ b/air_test_utils/ne_vec/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"struct":["NEVec"]}; \ No newline at end of file diff --git a/air_test_utils/ne_vec/struct.NEVec.html b/air_test_utils/ne_vec/struct.NEVec.html new file mode 100644 index 00000000..c6196bf2 --- /dev/null +++ b/air_test_utils/ne_vec/struct.NEVec.html @@ -0,0 +1,2534 @@ +NEVec in air_test_utils::ne_vec - Rust

Struct air_test_utils::ne_vec::NEVec

pub struct NEVec<T>(/* private fields */)
+where
+    T: Debug;
Expand description

NEVec<T> represents a non-empty Vec<T>. It derefs to Vec<T> +directly.

+

Implementations§

§

impl<T> NEVec<T>
where + T: Debug,

pub fn new(items: Vec<T>) -> Result<NEVec<T>, EmptyVec>

Creates a new non-empty vector, based on an inner Vec<T>. If +the inner vector is empty, a EmptyVec error is returned.

+

pub fn into_vec(self) -> Vec<T>

Converts this NEVec into Vec

+

Methods from Deref<Target = Vec<T>>§

1.0.0 · source

pub fn capacity(&self) -> usize

Returns the total number of elements the vector can hold without +reallocating.

+
§Examples
+
let mut vec: Vec<i32> = Vec::with_capacity(10);
+vec.push(42);
+assert!(vec.capacity() >= 10);
+
1.7.0 · source

pub fn as_slice(&self) -> &[T]

Extracts a slice containing the entire vector.

+

Equivalent to &s[..].

+
§Examples
+
use std::io::{self, Write};
+let buffer = vec![1, 2, 3, 5, 8];
+io::sink().write(buffer.as_slice()).unwrap();
+
1.37.0 · source

pub fn as_ptr(&self) -> *const T

Returns a raw pointer to the vector’s buffer, or a dangling raw pointer +valid for zero sized reads if the vector didn’t allocate.

+

The caller must ensure that the vector outlives the pointer this +function returns, or else it will end up pointing to garbage. +Modifying the vector may cause its buffer to be reallocated, +which would also make any pointers to it invalid.

+

The caller must also ensure that the memory the pointer (non-transitively) points to +is never written to (except inside an UnsafeCell) using this pointer or any pointer +derived from it. If you need to mutate the contents of the slice, use as_mut_ptr.

+

This method guarantees that for the purpose of the aliasing model, this method +does not materialize a reference to the underlying slice, and thus the returned pointer +will remain valid when mixed with other calls to as_ptr and as_mut_ptr. +Note that calling other methods that materialize mutable references to the slice, +or mutable references to specific elements you are planning on accessing through this pointer, +as well as writing to those elements, may still invalidate this pointer. +See the second example below for how this guarantee can be used.

+
§Examples
+
let x = vec![1, 2, 4];
+let x_ptr = x.as_ptr();
+
+unsafe {
+    for i in 0..x.len() {
+        assert_eq!(*x_ptr.add(i), 1 << i);
+    }
+}
+

Due to the aliasing guarantee, the following code is legal:

+ +
unsafe {
+    let mut v = vec![0, 1, 2];
+    let ptr1 = v.as_ptr();
+    let _ = ptr1.read();
+    let ptr2 = v.as_mut_ptr().offset(2);
+    ptr2.write(2);
+    // Notably, the write to `ptr2` did *not* invalidate `ptr1`
+    // because it mutated a different element:
+    let _ = ptr1.read();
+}
+
source

pub fn allocator(&self) -> &A

🔬This is a nightly-only experimental API. (allocator_api)

Returns a reference to the underlying allocator.

+
1.0.0 · source

pub fn len(&self) -> usize

Returns the number of elements in the vector, also referred to +as its ‘length’.

+
§Examples
+
let a = vec![1, 2, 3];
+assert_eq!(a.len(), 3);
+
1.0.0 · source

pub fn is_empty(&self) -> bool

Returns true if the vector contains no elements.

+
§Examples
+
let mut v = Vec::new();
+assert!(v.is_empty());
+
+v.push(1);
+assert!(!v.is_empty());
+

Methods from Deref<Target = [T]>§

1.80.0 · source

pub fn as_flattened(&self) -> &[T]

Takes a &[[T; N]], and flattens it to a &[T].

+
§Panics
+

This panics if the length of the resulting slice would overflow a usize.

+

This is only possible when flattening a slice of arrays of zero-sized +types, and thus tends to be irrelevant in practice. If +size_of::<T>() > 0, this will never panic.

+
§Examples
+
assert_eq!([[1, 2, 3], [4, 5, 6]].as_flattened(), &[1, 2, 3, 4, 5, 6]);
+
+assert_eq!(
+    [[1, 2, 3], [4, 5, 6]].as_flattened(),
+    [[1, 2], [3, 4], [5, 6]].as_flattened(),
+);
+
+let slice_of_empty_arrays: &[[i32; 0]] = &[[], [], [], [], []];
+assert!(slice_of_empty_arrays.as_flattened().is_empty());
+
+let empty_slice_of_arrays: &[[u32; 10]] = &[];
+assert!(empty_slice_of_arrays.as_flattened().is_empty());
+
1.80.0 · source

pub fn as_flattened_mut(&mut self) -> &mut [T]

Takes a &mut [[T; N]], and flattens it to a &mut [T].

+
§Panics
+

This panics if the length of the resulting slice would overflow a usize.

+

This is only possible when flattening a slice of arrays of zero-sized +types, and thus tends to be irrelevant in practice. If +size_of::<T>() > 0, this will never panic.

+
§Examples
+
fn add_5_to_all(slice: &mut [i32]) {
+    for i in slice {
+        *i += 5;
+    }
+}
+
+let mut array = [[1, 2, 3], [4, 5, 6], [7, 8, 9]];
+add_5_to_all(array.as_flattened_mut());
+assert_eq!(array, [[6, 7, 8], [9, 10, 11], [12, 13, 14]]);
+
source

pub fn as_str(&self) -> &str

🔬This is a nightly-only experimental API. (ascii_char)

Views this slice of ASCII characters as a UTF-8 str.

+
source

pub fn as_bytes(&self) -> &[u8]

🔬This is a nightly-only experimental API. (ascii_char)

Views this slice of ASCII characters as a slice of u8 bytes.

+
source

pub fn sort_floats(&mut self)

🔬This is a nightly-only experimental API. (sort_floats)

Sorts the slice of floats.

+

This sort is in-place (i.e. does not allocate), O(n * log(n)) worst-case, and uses +the ordering defined by f32::total_cmp.

+
§Current implementation
+

This uses the same sorting algorithm as sort_unstable_by.

+
§Examples
+
#![feature(sort_floats)]
+let mut v = [2.6, -5e-8, f32::NAN, 8.29, f32::INFINITY, -1.0, 0.0, -f32::INFINITY, -0.0];
+
+v.sort_floats();
+let sorted = [-f32::INFINITY, -1.0, -5e-8, -0.0, 0.0, 2.6, 8.29, f32::INFINITY, f32::NAN];
+assert_eq!(&v[..8], &sorted[..8]);
+assert!(v[8].is_nan());
+
1.79.0 · source

pub fn utf8_chunks(&self) -> Utf8Chunks<'_>

Creates an iterator over the contiguous valid UTF-8 ranges of this +slice, and the non-UTF-8 fragments in between.

+
§Examples
+

This function formats arbitrary but mostly-UTF-8 bytes into Rust source +code in the form of a C-string literal (c"...").

+ +
use std::fmt::Write as _;
+
+pub fn cstr_literal(bytes: &[u8]) -> String {
+    let mut repr = String::new();
+    repr.push_str("c\"");
+    for chunk in bytes.utf8_chunks() {
+        for ch in chunk.valid().chars() {
+            // Escapes \0, \t, \r, \n, \\, \', \", and uses \u{...} for non-printable characters.
+            write!(repr, "{}", ch.escape_debug()).unwrap();
+        }
+        for byte in chunk.invalid() {
+            write!(repr, "\\x{:02X}", byte).unwrap();
+        }
+    }
+    repr.push('"');
+    repr
+}
+
+fn main() {
+    let lit = cstr_literal(b"\xferris the \xf0\x9f\xa6\x80\x07");
+    let expected = stringify!(c"\xFErris the 🦀\u{7}");
+    assert_eq!(lit, expected);
+}
+
source

pub fn sort_floats(&mut self)

🔬This is a nightly-only experimental API. (sort_floats)

Sorts the slice of floats.

+

This sort is in-place (i.e. does not allocate), O(n * log(n)) worst-case, and uses +the ordering defined by f64::total_cmp.

+
§Current implementation
+

This uses the same sorting algorithm as sort_unstable_by.

+
§Examples
+
#![feature(sort_floats)]
+let mut v = [2.6, -5e-8, f64::NAN, 8.29, f64::INFINITY, -1.0, 0.0, -f64::INFINITY, -0.0];
+
+v.sort_floats();
+let sorted = [-f64::INFINITY, -1.0, -5e-8, -0.0, 0.0, 2.6, 8.29, f64::INFINITY, f64::NAN];
+assert_eq!(&v[..8], &sorted[..8]);
+assert!(v[8].is_nan());
+
1.23.0 · source

pub fn is_ascii(&self) -> bool

Checks if all bytes in this slice are within the ASCII range.

+
source

pub fn as_ascii(&self) -> Option<&[AsciiChar]>

🔬This is a nightly-only experimental API. (ascii_char)

If this slice is_ascii, returns it as a slice of +ASCII characters, otherwise returns None.

+
source

pub unsafe fn as_ascii_unchecked(&self) -> &[AsciiChar]

🔬This is a nightly-only experimental API. (ascii_char)

Converts this slice of bytes into a slice of ASCII characters, +without checking whether they’re valid.

+
§Safety
+

Every byte in the slice must be in 0..=127, or else this is UB.

+
1.23.0 · source

pub fn eq_ignore_ascii_case(&self, other: &[u8]) -> bool

Checks that two slices are an ASCII case-insensitive match.

+

Same as to_ascii_lowercase(a) == to_ascii_lowercase(b), +but without allocating and copying temporaries.

+
1.23.0 · source

pub fn make_ascii_uppercase(&mut self)

Converts this slice to its ASCII upper case equivalent in-place.

+

ASCII letters ‘a’ to ‘z’ are mapped to ‘A’ to ‘Z’, +but non-ASCII letters are unchanged.

+

To return a new uppercased value without modifying the existing one, use +to_ascii_uppercase.

+
1.23.0 · source

pub fn make_ascii_lowercase(&mut self)

Converts this slice to its ASCII lower case equivalent in-place.

+

ASCII letters ‘A’ to ‘Z’ are mapped to ‘a’ to ‘z’, +but non-ASCII letters are unchanged.

+

To return a new lowercased value without modifying the existing one, use +to_ascii_lowercase.

+
1.60.0 · source

pub fn escape_ascii(&self) -> EscapeAscii<'_>

Returns an iterator that produces an escaped version of this slice, +treating it as an ASCII string.

+
§Examples
+

+let s = b"0\t\r\n'\"\\\x9d";
+let escaped = s.escape_ascii().to_string();
+assert_eq!(escaped, "0\\t\\r\\n\\'\\\"\\\\\\x9d");
+
1.80.0 · source

pub fn trim_ascii_start(&self) -> &[u8]

Returns a byte slice with leading ASCII whitespace bytes removed.

+

‘Whitespace’ refers to the definition used by +u8::is_ascii_whitespace.

+
§Examples
+
assert_eq!(b" \t hello world\n".trim_ascii_start(), b"hello world\n");
+assert_eq!(b"  ".trim_ascii_start(), b"");
+assert_eq!(b"".trim_ascii_start(), b"");
+
1.80.0 · source

pub fn trim_ascii_end(&self) -> &[u8]

Returns a byte slice with trailing ASCII whitespace bytes removed.

+

‘Whitespace’ refers to the definition used by +u8::is_ascii_whitespace.

+
§Examples
+
assert_eq!(b"\r hello world\n ".trim_ascii_end(), b"\r hello world");
+assert_eq!(b"  ".trim_ascii_end(), b"");
+assert_eq!(b"".trim_ascii_end(), b"");
+
1.80.0 · source

pub fn trim_ascii(&self) -> &[u8]

Returns a byte slice with leading and trailing ASCII whitespace bytes +removed.

+

‘Whitespace’ refers to the definition used by +u8::is_ascii_whitespace.

+
§Examples
+
assert_eq!(b"\r hello world\n ".trim_ascii(), b"hello world");
+assert_eq!(b"  ".trim_ascii(), b"");
+assert_eq!(b"".trim_ascii(), b"");
+
1.0.0 · source

pub fn len(&self) -> usize

Returns the number of elements in the slice.

+
§Examples
+
let a = [1, 2, 3];
+assert_eq!(a.len(), 3);
+
1.0.0 · source

pub fn is_empty(&self) -> bool

Returns true if the slice has a length of 0.

+
§Examples
+
let a = [1, 2, 3];
+assert!(!a.is_empty());
+
+let b: &[i32] = &[];
+assert!(b.is_empty());
+
1.0.0 · source

pub fn first(&self) -> Option<&T>

Returns the first element of the slice, or None if it is empty.

+
§Examples
+
let v = [10, 40, 30];
+assert_eq!(Some(&10), v.first());
+
+let w: &[i32] = &[];
+assert_eq!(None, w.first());
+
1.0.0 · source

pub fn first_mut(&mut self) -> Option<&mut T>

Returns a mutable pointer to the first element of the slice, or None if it is empty.

+
§Examples
+
let x = &mut [0, 1, 2];
+
+if let Some(first) = x.first_mut() {
+    *first = 5;
+}
+assert_eq!(x, &[5, 1, 2]);
+
+let y: &mut [i32] = &mut [];
+assert_eq!(None, y.first_mut());
+
1.5.0 · source

pub fn split_first(&self) -> Option<(&T, &[T])>

Returns the first and all the rest of the elements of the slice, or None if it is empty.

+
§Examples
+
let x = &[0, 1, 2];
+
+if let Some((first, elements)) = x.split_first() {
+    assert_eq!(first, &0);
+    assert_eq!(elements, &[1, 2]);
+}
+
1.5.0 · source

pub fn split_first_mut(&mut self) -> Option<(&mut T, &mut [T])>

Returns the first and all the rest of the elements of the slice, or None if it is empty.

+
§Examples
+
let x = &mut [0, 1, 2];
+
+if let Some((first, elements)) = x.split_first_mut() {
+    *first = 3;
+    elements[0] = 4;
+    elements[1] = 5;
+}
+assert_eq!(x, &[3, 4, 5]);
+
1.5.0 · source

pub fn split_last(&self) -> Option<(&T, &[T])>

Returns the last and all the rest of the elements of the slice, or None if it is empty.

+
§Examples
+
let x = &[0, 1, 2];
+
+if let Some((last, elements)) = x.split_last() {
+    assert_eq!(last, &2);
+    assert_eq!(elements, &[0, 1]);
+}
+
1.5.0 · source

pub fn split_last_mut(&mut self) -> Option<(&mut T, &mut [T])>

Returns the last and all the rest of the elements of the slice, or None if it is empty.

+
§Examples
+
let x = &mut [0, 1, 2];
+
+if let Some((last, elements)) = x.split_last_mut() {
+    *last = 3;
+    elements[0] = 4;
+    elements[1] = 5;
+}
+assert_eq!(x, &[4, 5, 3]);
+
1.0.0 · source

pub fn last(&self) -> Option<&T>

Returns the last element of the slice, or None if it is empty.

+
§Examples
+
let v = [10, 40, 30];
+assert_eq!(Some(&30), v.last());
+
+let w: &[i32] = &[];
+assert_eq!(None, w.last());
+
1.0.0 · source

pub fn last_mut(&mut self) -> Option<&mut T>

Returns a mutable reference to the last item in the slice, or None if it is empty.

+
§Examples
+
let x = &mut [0, 1, 2];
+
+if let Some(last) = x.last_mut() {
+    *last = 10;
+}
+assert_eq!(x, &[0, 1, 10]);
+
+let y: &mut [i32] = &mut [];
+assert_eq!(None, y.last_mut());
+
1.77.0 · source

pub fn first_chunk<const N: usize>(&self) -> Option<&[T; N]>

Return an array reference to the first N items in the slice.

+

If the slice is not at least N in length, this will return None.

+
§Examples
+
let u = [10, 40, 30];
+assert_eq!(Some(&[10, 40]), u.first_chunk::<2>());
+
+let v: &[i32] = &[10];
+assert_eq!(None, v.first_chunk::<2>());
+
+let w: &[i32] = &[];
+assert_eq!(Some(&[]), w.first_chunk::<0>());
+
1.77.0 · source

pub fn first_chunk_mut<const N: usize>(&mut self) -> Option<&mut [T; N]>

Return a mutable array reference to the first N items in the slice.

+

If the slice is not at least N in length, this will return None.

+
§Examples
+
let x = &mut [0, 1, 2];
+
+if let Some(first) = x.first_chunk_mut::<2>() {
+    first[0] = 5;
+    first[1] = 4;
+}
+assert_eq!(x, &[5, 4, 2]);
+
+assert_eq!(None, x.first_chunk_mut::<4>());
+
1.77.0 · source

pub fn split_first_chunk<const N: usize>(&self) -> Option<(&[T; N], &[T])>

Return an array reference to the first N items in the slice and the remaining slice.

+

If the slice is not at least N in length, this will return None.

+
§Examples
+
let x = &[0, 1, 2];
+
+if let Some((first, elements)) = x.split_first_chunk::<2>() {
+    assert_eq!(first, &[0, 1]);
+    assert_eq!(elements, &[2]);
+}
+
+assert_eq!(None, x.split_first_chunk::<4>());
+
1.77.0 · source

pub fn split_first_chunk_mut<const N: usize>( + &mut self, +) -> Option<(&mut [T; N], &mut [T])>

Return a mutable array reference to the first N items in the slice and the remaining +slice.

+

If the slice is not at least N in length, this will return None.

+
§Examples
+
let x = &mut [0, 1, 2];
+
+if let Some((first, elements)) = x.split_first_chunk_mut::<2>() {
+    first[0] = 3;
+    first[1] = 4;
+    elements[0] = 5;
+}
+assert_eq!(x, &[3, 4, 5]);
+
+assert_eq!(None, x.split_first_chunk_mut::<4>());
+
1.77.0 · source

pub fn split_last_chunk<const N: usize>(&self) -> Option<(&[T], &[T; N])>

Return an array reference to the last N items in the slice and the remaining slice.

+

If the slice is not at least N in length, this will return None.

+
§Examples
+
let x = &[0, 1, 2];
+
+if let Some((elements, last)) = x.split_last_chunk::<2>() {
+    assert_eq!(elements, &[0]);
+    assert_eq!(last, &[1, 2]);
+}
+
+assert_eq!(None, x.split_last_chunk::<4>());
+
1.77.0 · source

pub fn split_last_chunk_mut<const N: usize>( + &mut self, +) -> Option<(&mut [T], &mut [T; N])>

Return a mutable array reference to the last N items in the slice and the remaining +slice.

+

If the slice is not at least N in length, this will return None.

+
§Examples
+
let x = &mut [0, 1, 2];
+
+if let Some((elements, last)) = x.split_last_chunk_mut::<2>() {
+    last[0] = 3;
+    last[1] = 4;
+    elements[0] = 5;
+}
+assert_eq!(x, &[5, 3, 4]);
+
+assert_eq!(None, x.split_last_chunk_mut::<4>());
+
1.77.0 · source

pub fn last_chunk<const N: usize>(&self) -> Option<&[T; N]>

Return an array reference to the last N items in the slice.

+

If the slice is not at least N in length, this will return None.

+
§Examples
+
let u = [10, 40, 30];
+assert_eq!(Some(&[40, 30]), u.last_chunk::<2>());
+
+let v: &[i32] = &[10];
+assert_eq!(None, v.last_chunk::<2>());
+
+let w: &[i32] = &[];
+assert_eq!(Some(&[]), w.last_chunk::<0>());
+
1.77.0 · source

pub fn last_chunk_mut<const N: usize>(&mut self) -> Option<&mut [T; N]>

Return a mutable array reference to the last N items in the slice.

+

If the slice is not at least N in length, this will return None.

+
§Examples
+
let x = &mut [0, 1, 2];
+
+if let Some(last) = x.last_chunk_mut::<2>() {
+    last[0] = 10;
+    last[1] = 20;
+}
+assert_eq!(x, &[0, 10, 20]);
+
+assert_eq!(None, x.last_chunk_mut::<4>());
+
1.0.0 · source

pub fn get<I>(&self, index: I) -> Option<&<I as SliceIndex<[T]>>::Output>
where + I: SliceIndex<[T]>,

Returns a reference to an element or subslice depending on the type of +index.

+
    +
  • If given a position, returns a reference to the element at that +position or None if out of bounds.
  • +
  • If given a range, returns the subslice corresponding to that range, +or None if out of bounds.
  • +
+
§Examples
+
let v = [10, 40, 30];
+assert_eq!(Some(&40), v.get(1));
+assert_eq!(Some(&[10, 40][..]), v.get(0..2));
+assert_eq!(None, v.get(3));
+assert_eq!(None, v.get(0..4));
+
1.0.0 · source

pub fn get_mut<I>( + &mut self, + index: I, +) -> Option<&mut <I as SliceIndex<[T]>>::Output>
where + I: SliceIndex<[T]>,

Returns a mutable reference to an element or subslice depending on the +type of index (see get) or None if the index is out of bounds.

+
§Examples
+
let x = &mut [0, 1, 2];
+
+if let Some(elem) = x.get_mut(1) {
+    *elem = 42;
+}
+assert_eq!(x, &[0, 42, 2]);
+
1.0.0 · source

pub unsafe fn get_unchecked<I>( + &self, + index: I, +) -> &<I as SliceIndex<[T]>>::Output
where + I: SliceIndex<[T]>,

Returns a reference to an element or subslice, without doing bounds +checking.

+

For a safe alternative see get.

+
§Safety
+

Calling this method with an out-of-bounds index is undefined behavior +even if the resulting reference is not used.

+

You can think of this like .get(index).unwrap_unchecked(). It’s UB +to call .get_unchecked(len), even if you immediately convert to a +pointer. And it’s UB to call .get_unchecked(..len + 1), +.get_unchecked(..=len), or similar.

+
§Examples
+
let x = &[1, 2, 4];
+
+unsafe {
+    assert_eq!(x.get_unchecked(1), &2);
+}
+
1.0.0 · source

pub unsafe fn get_unchecked_mut<I>( + &mut self, + index: I, +) -> &mut <I as SliceIndex<[T]>>::Output
where + I: SliceIndex<[T]>,

Returns a mutable reference to an element or subslice, without doing +bounds checking.

+

For a safe alternative see get_mut.

+
§Safety
+

Calling this method with an out-of-bounds index is undefined behavior +even if the resulting reference is not used.

+

You can think of this like .get_mut(index).unwrap_unchecked(). It’s +UB to call .get_unchecked_mut(len), even if you immediately convert +to a pointer. And it’s UB to call .get_unchecked_mut(..len + 1), +.get_unchecked_mut(..=len), or similar.

+
§Examples
+
let x = &mut [1, 2, 4];
+
+unsafe {
+    let elem = x.get_unchecked_mut(1);
+    *elem = 13;
+}
+assert_eq!(x, &[1, 13, 4]);
+
1.0.0 · source

pub fn as_ptr(&self) -> *const T

Returns a raw pointer to the slice’s buffer.

+

The caller must ensure that the slice outlives the pointer this +function returns, or else it will end up pointing to garbage.

+

The caller must also ensure that the memory the pointer (non-transitively) points to +is never written to (except inside an UnsafeCell) using this pointer or any pointer +derived from it. If you need to mutate the contents of the slice, use as_mut_ptr.

+

Modifying the container referenced by this slice may cause its buffer +to be reallocated, which would also make any pointers to it invalid.

+
§Examples
+
let x = &[1, 2, 4];
+let x_ptr = x.as_ptr();
+
+unsafe {
+    for i in 0..x.len() {
+        assert_eq!(x.get_unchecked(i), &*x_ptr.add(i));
+    }
+}
+
1.0.0 · source

pub fn as_mut_ptr(&mut self) -> *mut T

Returns an unsafe mutable pointer to the slice’s buffer.

+

The caller must ensure that the slice outlives the pointer this +function returns, or else it will end up pointing to garbage.

+

Modifying the container referenced by this slice may cause its buffer +to be reallocated, which would also make any pointers to it invalid.

+
§Examples
+
let x = &mut [1, 2, 4];
+let x_ptr = x.as_mut_ptr();
+
+unsafe {
+    for i in 0..x.len() {
+        *x_ptr.add(i) += 2;
+    }
+}
+assert_eq!(x, &[3, 4, 6]);
+
1.48.0 · source

pub fn as_ptr_range(&self) -> Range<*const T>

Returns the two raw pointers spanning the slice.

+

The returned range is half-open, which means that the end pointer +points one past the last element of the slice. This way, an empty +slice is represented by two equal pointers, and the difference between +the two pointers represents the size of the slice.

+

See as_ptr for warnings on using these pointers. The end pointer +requires extra caution, as it does not point to a valid element in the +slice.

+

This function is useful for interacting with foreign interfaces which +use two pointers to refer to a range of elements in memory, as is +common in C++.

+

It can also be useful to check if a pointer to an element refers to an +element of this slice:

+ +
let a = [1, 2, 3];
+let x = &a[1] as *const _;
+let y = &5 as *const _;
+
+assert!(a.as_ptr_range().contains(&x));
+assert!(!a.as_ptr_range().contains(&y));
+
1.48.0 · source

pub fn as_mut_ptr_range(&mut self) -> Range<*mut T>

Returns the two unsafe mutable pointers spanning the slice.

+

The returned range is half-open, which means that the end pointer +points one past the last element of the slice. This way, an empty +slice is represented by two equal pointers, and the difference between +the two pointers represents the size of the slice.

+

See as_mut_ptr for warnings on using these pointers. The end +pointer requires extra caution, as it does not point to a valid element +in the slice.

+

This function is useful for interacting with foreign interfaces which +use two pointers to refer to a range of elements in memory, as is +common in C++.

+
1.0.0 · source

pub fn swap(&mut self, a: usize, b: usize)

Swaps two elements in the slice.

+

If a equals to b, it’s guaranteed that elements won’t change value.

+
§Arguments
+
    +
  • a - The index of the first element
  • +
  • b - The index of the second element
  • +
+
§Panics
+

Panics if a or b are out of bounds.

+
§Examples
+
let mut v = ["a", "b", "c", "d", "e"];
+v.swap(2, 4);
+assert!(v == ["a", "b", "e", "d", "c"]);
+
source

pub unsafe fn swap_unchecked(&mut self, a: usize, b: usize)

🔬This is a nightly-only experimental API. (slice_swap_unchecked)

Swaps two elements in the slice, without doing bounds checking.

+

For a safe alternative see swap.

+
§Arguments
+
    +
  • a - The index of the first element
  • +
  • b - The index of the second element
  • +
+
§Safety
+

Calling this method with an out-of-bounds index is undefined behavior. +The caller has to ensure that a < self.len() and b < self.len().

+
§Examples
+
#![feature(slice_swap_unchecked)]
+
+let mut v = ["a", "b", "c", "d"];
+// SAFETY: we know that 1 and 3 are both indices of the slice
+unsafe { v.swap_unchecked(1, 3) };
+assert!(v == ["a", "d", "c", "b"]);
+
1.0.0 · source

pub fn reverse(&mut self)

Reverses the order of elements in the slice, in place.

+
§Examples
+
let mut v = [1, 2, 3];
+v.reverse();
+assert!(v == [3, 2, 1]);
+
1.0.0 · source

pub fn iter(&self) -> Iter<'_, T>

Returns an iterator over the slice.

+

The iterator yields all items from start to end.

+
§Examples
+
let x = &[1, 2, 4];
+let mut iterator = x.iter();
+
+assert_eq!(iterator.next(), Some(&1));
+assert_eq!(iterator.next(), Some(&2));
+assert_eq!(iterator.next(), Some(&4));
+assert_eq!(iterator.next(), None);
+
1.0.0 · source

pub fn iter_mut(&mut self) -> IterMut<'_, T>

Returns an iterator that allows modifying each value.

+

The iterator yields all items from start to end.

+
§Examples
+
let x = &mut [1, 2, 4];
+for elem in x.iter_mut() {
+    *elem += 2;
+}
+assert_eq!(x, &[3, 4, 6]);
+
1.0.0 · source

pub fn windows(&self, size: usize) -> Windows<'_, T>

Returns an iterator over all contiguous windows of length +size. The windows overlap. If the slice is shorter than +size, the iterator returns no values.

+
§Panics
+

Panics if size is 0.

+
§Examples
+
let slice = ['l', 'o', 'r', 'e', 'm'];
+let mut iter = slice.windows(3);
+assert_eq!(iter.next().unwrap(), &['l', 'o', 'r']);
+assert_eq!(iter.next().unwrap(), &['o', 'r', 'e']);
+assert_eq!(iter.next().unwrap(), &['r', 'e', 'm']);
+assert!(iter.next().is_none());
+

If the slice is shorter than size:

+ +
let slice = ['f', 'o', 'o'];
+let mut iter = slice.windows(4);
+assert!(iter.next().is_none());
+

There’s no windows_mut, as that existing would let safe code violate the +“only one &mut at a time to the same thing” rule. However, you can sometimes +use Cell::as_slice_of_cells in +conjunction with windows to accomplish something similar:

+ +
use std::cell::Cell;
+
+let mut array = ['R', 'u', 's', 't', ' ', '2', '0', '1', '5'];
+let slice = &mut array[..];
+let slice_of_cells: &[Cell<char>] = Cell::from_mut(slice).as_slice_of_cells();
+for w in slice_of_cells.windows(3) {
+    Cell::swap(&w[0], &w[2]);
+}
+assert_eq!(array, ['s', 't', ' ', '2', '0', '1', '5', 'u', 'R']);
+
1.0.0 · source

pub fn chunks(&self, chunk_size: usize) -> Chunks<'_, T>

Returns an iterator over chunk_size elements of the slice at a time, starting at the +beginning of the slice.

+

The chunks are slices and do not overlap. If chunk_size does not divide the length of the +slice, then the last chunk will not have length chunk_size.

+

See chunks_exact for a variant of this iterator that returns chunks of always exactly +chunk_size elements, and rchunks for the same iterator but starting at the end of the +slice.

+
§Panics
+

Panics if chunk_size is 0.

+
§Examples
+
let slice = ['l', 'o', 'r', 'e', 'm'];
+let mut iter = slice.chunks(2);
+assert_eq!(iter.next().unwrap(), &['l', 'o']);
+assert_eq!(iter.next().unwrap(), &['r', 'e']);
+assert_eq!(iter.next().unwrap(), &['m']);
+assert!(iter.next().is_none());
+
1.0.0 · source

pub fn chunks_mut(&mut self, chunk_size: usize) -> ChunksMut<'_, T>

Returns an iterator over chunk_size elements of the slice at a time, starting at the +beginning of the slice.

+

The chunks are mutable slices, and do not overlap. If chunk_size does not divide the +length of the slice, then the last chunk will not have length chunk_size.

+

See chunks_exact_mut for a variant of this iterator that returns chunks of always +exactly chunk_size elements, and rchunks_mut for the same iterator but starting at +the end of the slice.

+
§Panics
+

Panics if chunk_size is 0.

+
§Examples
+
let v = &mut [0, 0, 0, 0, 0];
+let mut count = 1;
+
+for chunk in v.chunks_mut(2) {
+    for elem in chunk.iter_mut() {
+        *elem += count;
+    }
+    count += 1;
+}
+assert_eq!(v, &[1, 1, 2, 2, 3]);
+
1.31.0 · source

pub fn chunks_exact(&self, chunk_size: usize) -> ChunksExact<'_, T>

Returns an iterator over chunk_size elements of the slice at a time, starting at the +beginning of the slice.

+

The chunks are slices and do not overlap. If chunk_size does not divide the length of the +slice, then the last up to chunk_size-1 elements will be omitted and can be retrieved +from the remainder function of the iterator.

+

Due to each chunk having exactly chunk_size elements, the compiler can often optimize the +resulting code better than in the case of chunks.

+

See chunks for a variant of this iterator that also returns the remainder as a smaller +chunk, and rchunks_exact for the same iterator but starting at the end of the slice.

+
§Panics
+

Panics if chunk_size is 0.

+
§Examples
+
let slice = ['l', 'o', 'r', 'e', 'm'];
+let mut iter = slice.chunks_exact(2);
+assert_eq!(iter.next().unwrap(), &['l', 'o']);
+assert_eq!(iter.next().unwrap(), &['r', 'e']);
+assert!(iter.next().is_none());
+assert_eq!(iter.remainder(), &['m']);
+
1.31.0 · source

pub fn chunks_exact_mut(&mut self, chunk_size: usize) -> ChunksExactMut<'_, T>

Returns an iterator over chunk_size elements of the slice at a time, starting at the +beginning of the slice.

+

The chunks are mutable slices, and do not overlap. If chunk_size does not divide the +length of the slice, then the last up to chunk_size-1 elements will be omitted and can be +retrieved from the into_remainder function of the iterator.

+

Due to each chunk having exactly chunk_size elements, the compiler can often optimize the +resulting code better than in the case of chunks_mut.

+

See chunks_mut for a variant of this iterator that also returns the remainder as a +smaller chunk, and rchunks_exact_mut for the same iterator but starting at the end of +the slice.

+
§Panics
+

Panics if chunk_size is 0.

+
§Examples
+
let v = &mut [0, 0, 0, 0, 0];
+let mut count = 1;
+
+for chunk in v.chunks_exact_mut(2) {
+    for elem in chunk.iter_mut() {
+        *elem += count;
+    }
+    count += 1;
+}
+assert_eq!(v, &[1, 1, 2, 2, 0]);
+
source

pub unsafe fn as_chunks_unchecked<const N: usize>(&self) -> &[[T; N]]

🔬This is a nightly-only experimental API. (slice_as_chunks)

Splits the slice into a slice of N-element arrays, +assuming that there’s no remainder.

+
§Safety
+

This may only be called when

+
    +
  • The slice splits exactly into N-element chunks (aka self.len() % N == 0).
  • +
  • N != 0.
  • +
+
§Examples
+
#![feature(slice_as_chunks)]
+let slice: &[char] = &['l', 'o', 'r', 'e', 'm', '!'];
+let chunks: &[[char; 1]] =
+    // SAFETY: 1-element chunks never have remainder
+    unsafe { slice.as_chunks_unchecked() };
+assert_eq!(chunks, &[['l'], ['o'], ['r'], ['e'], ['m'], ['!']]);
+let chunks: &[[char; 3]] =
+    // SAFETY: The slice length (6) is a multiple of 3
+    unsafe { slice.as_chunks_unchecked() };
+assert_eq!(chunks, &[['l', 'o', 'r'], ['e', 'm', '!']]);
+
+// These would be unsound:
+// let chunks: &[[_; 5]] = slice.as_chunks_unchecked() // The slice length is not a multiple of 5
+// let chunks: &[[_; 0]] = slice.as_chunks_unchecked() // Zero-length chunks are never allowed
+
source

pub fn as_chunks<const N: usize>(&self) -> (&[[T; N]], &[T])

🔬This is a nightly-only experimental API. (slice_as_chunks)

Splits the slice into a slice of N-element arrays, +starting at the beginning of the slice, +and a remainder slice with length strictly less than N.

+
§Panics
+

Panics if N is 0. This check will most probably get changed to a compile time +error before this method gets stabilized.

+
§Examples
+
#![feature(slice_as_chunks)]
+let slice = ['l', 'o', 'r', 'e', 'm'];
+let (chunks, remainder) = slice.as_chunks();
+assert_eq!(chunks, &[['l', 'o'], ['r', 'e']]);
+assert_eq!(remainder, &['m']);
+

If you expect the slice to be an exact multiple, you can combine +let-else with an empty slice pattern:

+ +
#![feature(slice_as_chunks)]
+let slice = ['R', 'u', 's', 't'];
+let (chunks, []) = slice.as_chunks::<2>() else {
+    panic!("slice didn't have even length")
+};
+assert_eq!(chunks, &[['R', 'u'], ['s', 't']]);
+
source

pub fn as_rchunks<const N: usize>(&self) -> (&[T], &[[T; N]])

🔬This is a nightly-only experimental API. (slice_as_chunks)

Splits the slice into a slice of N-element arrays, +starting at the end of the slice, +and a remainder slice with length strictly less than N.

+
§Panics
+

Panics if N is 0. This check will most probably get changed to a compile time +error before this method gets stabilized.

+
§Examples
+
#![feature(slice_as_chunks)]
+let slice = ['l', 'o', 'r', 'e', 'm'];
+let (remainder, chunks) = slice.as_rchunks();
+assert_eq!(remainder, &['l']);
+assert_eq!(chunks, &[['o', 'r'], ['e', 'm']]);
+
source

pub fn array_chunks<const N: usize>(&self) -> ArrayChunks<'_, T, N>

🔬This is a nightly-only experimental API. (array_chunks)

Returns an iterator over N elements of the slice at a time, starting at the +beginning of the slice.

+

The chunks are array references and do not overlap. If N does not divide the +length of the slice, then the last up to N-1 elements will be omitted and can be +retrieved from the remainder function of the iterator.

+

This method is the const generic equivalent of chunks_exact.

+
§Panics
+

Panics if N is 0. This check will most probably get changed to a compile time +error before this method gets stabilized.

+
§Examples
+
#![feature(array_chunks)]
+let slice = ['l', 'o', 'r', 'e', 'm'];
+let mut iter = slice.array_chunks();
+assert_eq!(iter.next().unwrap(), &['l', 'o']);
+assert_eq!(iter.next().unwrap(), &['r', 'e']);
+assert!(iter.next().is_none());
+assert_eq!(iter.remainder(), &['m']);
+
source

pub unsafe fn as_chunks_unchecked_mut<const N: usize>( + &mut self, +) -> &mut [[T; N]]

🔬This is a nightly-only experimental API. (slice_as_chunks)

Splits the slice into a slice of N-element arrays, +assuming that there’s no remainder.

+
§Safety
+

This may only be called when

+
    +
  • The slice splits exactly into N-element chunks (aka self.len() % N == 0).
  • +
  • N != 0.
  • +
+
§Examples
+
#![feature(slice_as_chunks)]
+let slice: &mut [char] = &mut ['l', 'o', 'r', 'e', 'm', '!'];
+let chunks: &mut [[char; 1]] =
+    // SAFETY: 1-element chunks never have remainder
+    unsafe { slice.as_chunks_unchecked_mut() };
+chunks[0] = ['L'];
+assert_eq!(chunks, &[['L'], ['o'], ['r'], ['e'], ['m'], ['!']]);
+let chunks: &mut [[char; 3]] =
+    // SAFETY: The slice length (6) is a multiple of 3
+    unsafe { slice.as_chunks_unchecked_mut() };
+chunks[1] = ['a', 'x', '?'];
+assert_eq!(slice, &['L', 'o', 'r', 'a', 'x', '?']);
+
+// These would be unsound:
+// let chunks: &[[_; 5]] = slice.as_chunks_unchecked_mut() // The slice length is not a multiple of 5
+// let chunks: &[[_; 0]] = slice.as_chunks_unchecked_mut() // Zero-length chunks are never allowed
+
source

pub fn as_chunks_mut<const N: usize>(&mut self) -> (&mut [[T; N]], &mut [T])

🔬This is a nightly-only experimental API. (slice_as_chunks)

Splits the slice into a slice of N-element arrays, +starting at the beginning of the slice, +and a remainder slice with length strictly less than N.

+
§Panics
+

Panics if N is 0. This check will most probably get changed to a compile time +error before this method gets stabilized.

+
§Examples
+
#![feature(slice_as_chunks)]
+let v = &mut [0, 0, 0, 0, 0];
+let mut count = 1;
+
+let (chunks, remainder) = v.as_chunks_mut();
+remainder[0] = 9;
+for chunk in chunks {
+    *chunk = [count; 2];
+    count += 1;
+}
+assert_eq!(v, &[1, 1, 2, 2, 9]);
+
source

pub fn as_rchunks_mut<const N: usize>(&mut self) -> (&mut [T], &mut [[T; N]])

🔬This is a nightly-only experimental API. (slice_as_chunks)

Splits the slice into a slice of N-element arrays, +starting at the end of the slice, +and a remainder slice with length strictly less than N.

+
§Panics
+

Panics if N is 0. This check will most probably get changed to a compile time +error before this method gets stabilized.

+
§Examples
+
#![feature(slice_as_chunks)]
+let v = &mut [0, 0, 0, 0, 0];
+let mut count = 1;
+
+let (remainder, chunks) = v.as_rchunks_mut();
+remainder[0] = 9;
+for chunk in chunks {
+    *chunk = [count; 2];
+    count += 1;
+}
+assert_eq!(v, &[9, 1, 1, 2, 2]);
+
source

pub fn array_chunks_mut<const N: usize>(&mut self) -> ArrayChunksMut<'_, T, N>

🔬This is a nightly-only experimental API. (array_chunks)

Returns an iterator over N elements of the slice at a time, starting at the +beginning of the slice.

+

The chunks are mutable array references and do not overlap. If N does not divide +the length of the slice, then the last up to N-1 elements will be omitted and +can be retrieved from the into_remainder function of the iterator.

+

This method is the const generic equivalent of chunks_exact_mut.

+
§Panics
+

Panics if N is 0. This check will most probably get changed to a compile time +error before this method gets stabilized.

+
§Examples
+
#![feature(array_chunks)]
+let v = &mut [0, 0, 0, 0, 0];
+let mut count = 1;
+
+for chunk in v.array_chunks_mut() {
+    *chunk = [count; 2];
+    count += 1;
+}
+assert_eq!(v, &[1, 1, 2, 2, 0]);
+
source

pub fn array_windows<const N: usize>(&self) -> ArrayWindows<'_, T, N>

🔬This is a nightly-only experimental API. (array_windows)

Returns an iterator over overlapping windows of N elements of a slice, +starting at the beginning of the slice.

+

This is the const generic equivalent of windows.

+

If N is greater than the size of the slice, it will return no windows.

+
§Panics
+

Panics if N is 0. This check will most probably get changed to a compile time +error before this method gets stabilized.

+
§Examples
+
#![feature(array_windows)]
+let slice = [0, 1, 2, 3];
+let mut iter = slice.array_windows();
+assert_eq!(iter.next().unwrap(), &[0, 1]);
+assert_eq!(iter.next().unwrap(), &[1, 2]);
+assert_eq!(iter.next().unwrap(), &[2, 3]);
+assert!(iter.next().is_none());
+
1.31.0 · source

pub fn rchunks(&self, chunk_size: usize) -> RChunks<'_, T>

Returns an iterator over chunk_size elements of the slice at a time, starting at the end +of the slice.

+

The chunks are slices and do not overlap. If chunk_size does not divide the length of the +slice, then the last chunk will not have length chunk_size.

+

See rchunks_exact for a variant of this iterator that returns chunks of always exactly +chunk_size elements, and chunks for the same iterator but starting at the beginning +of the slice.

+
§Panics
+

Panics if chunk_size is 0.

+
§Examples
+
let slice = ['l', 'o', 'r', 'e', 'm'];
+let mut iter = slice.rchunks(2);
+assert_eq!(iter.next().unwrap(), &['e', 'm']);
+assert_eq!(iter.next().unwrap(), &['o', 'r']);
+assert_eq!(iter.next().unwrap(), &['l']);
+assert!(iter.next().is_none());
+
1.31.0 · source

pub fn rchunks_mut(&mut self, chunk_size: usize) -> RChunksMut<'_, T>

Returns an iterator over chunk_size elements of the slice at a time, starting at the end +of the slice.

+

The chunks are mutable slices, and do not overlap. If chunk_size does not divide the +length of the slice, then the last chunk will not have length chunk_size.

+

See rchunks_exact_mut for a variant of this iterator that returns chunks of always +exactly chunk_size elements, and chunks_mut for the same iterator but starting at the +beginning of the slice.

+
§Panics
+

Panics if chunk_size is 0.

+
§Examples
+
let v = &mut [0, 0, 0, 0, 0];
+let mut count = 1;
+
+for chunk in v.rchunks_mut(2) {
+    for elem in chunk.iter_mut() {
+        *elem += count;
+    }
+    count += 1;
+}
+assert_eq!(v, &[3, 2, 2, 1, 1]);
+
1.31.0 · source

pub fn rchunks_exact(&self, chunk_size: usize) -> RChunksExact<'_, T>

Returns an iterator over chunk_size elements of the slice at a time, starting at the +end of the slice.

+

The chunks are slices and do not overlap. If chunk_size does not divide the length of the +slice, then the last up to chunk_size-1 elements will be omitted and can be retrieved +from the remainder function of the iterator.

+

Due to each chunk having exactly chunk_size elements, the compiler can often optimize the +resulting code better than in the case of rchunks.

+

See rchunks for a variant of this iterator that also returns the remainder as a smaller +chunk, and chunks_exact for the same iterator but starting at the beginning of the +slice.

+
§Panics
+

Panics if chunk_size is 0.

+
§Examples
+
let slice = ['l', 'o', 'r', 'e', 'm'];
+let mut iter = slice.rchunks_exact(2);
+assert_eq!(iter.next().unwrap(), &['e', 'm']);
+assert_eq!(iter.next().unwrap(), &['o', 'r']);
+assert!(iter.next().is_none());
+assert_eq!(iter.remainder(), &['l']);
+
1.31.0 · source

pub fn rchunks_exact_mut(&mut self, chunk_size: usize) -> RChunksExactMut<'_, T>

Returns an iterator over chunk_size elements of the slice at a time, starting at the end +of the slice.

+

The chunks are mutable slices, and do not overlap. If chunk_size does not divide the +length of the slice, then the last up to chunk_size-1 elements will be omitted and can be +retrieved from the into_remainder function of the iterator.

+

Due to each chunk having exactly chunk_size elements, the compiler can often optimize the +resulting code better than in the case of chunks_mut.

+

See rchunks_mut for a variant of this iterator that also returns the remainder as a +smaller chunk, and chunks_exact_mut for the same iterator but starting at the beginning +of the slice.

+
§Panics
+

Panics if chunk_size is 0.

+
§Examples
+
let v = &mut [0, 0, 0, 0, 0];
+let mut count = 1;
+
+for chunk in v.rchunks_exact_mut(2) {
+    for elem in chunk.iter_mut() {
+        *elem += count;
+    }
+    count += 1;
+}
+assert_eq!(v, &[0, 2, 2, 1, 1]);
+
1.77.0 · source

pub fn chunk_by<F>(&self, pred: F) -> ChunkBy<'_, T, F>
where + F: FnMut(&T, &T) -> bool,

Returns an iterator over the slice producing non-overlapping runs +of elements using the predicate to separate them.

+

The predicate is called for every pair of consecutive elements, +meaning that it is called on slice[0] and slice[1], +followed by slice[1] and slice[2], and so on.

+
§Examples
+
let slice = &[1, 1, 1, 3, 3, 2, 2, 2];
+
+let mut iter = slice.chunk_by(|a, b| a == b);
+
+assert_eq!(iter.next(), Some(&[1, 1, 1][..]));
+assert_eq!(iter.next(), Some(&[3, 3][..]));
+assert_eq!(iter.next(), Some(&[2, 2, 2][..]));
+assert_eq!(iter.next(), None);
+

This method can be used to extract the sorted subslices:

+ +
let slice = &[1, 1, 2, 3, 2, 3, 2, 3, 4];
+
+let mut iter = slice.chunk_by(|a, b| a <= b);
+
+assert_eq!(iter.next(), Some(&[1, 1, 2, 3][..]));
+assert_eq!(iter.next(), Some(&[2, 3][..]));
+assert_eq!(iter.next(), Some(&[2, 3, 4][..]));
+assert_eq!(iter.next(), None);
+
1.77.0 · source

pub fn chunk_by_mut<F>(&mut self, pred: F) -> ChunkByMut<'_, T, F>
where + F: FnMut(&T, &T) -> bool,

Returns an iterator over the slice producing non-overlapping mutable +runs of elements using the predicate to separate them.

+

The predicate is called for every pair of consecutive elements, +meaning that it is called on slice[0] and slice[1], +followed by slice[1] and slice[2], and so on.

+
§Examples
+
let slice = &mut [1, 1, 1, 3, 3, 2, 2, 2];
+
+let mut iter = slice.chunk_by_mut(|a, b| a == b);
+
+assert_eq!(iter.next(), Some(&mut [1, 1, 1][..]));
+assert_eq!(iter.next(), Some(&mut [3, 3][..]));
+assert_eq!(iter.next(), Some(&mut [2, 2, 2][..]));
+assert_eq!(iter.next(), None);
+

This method can be used to extract the sorted subslices:

+ +
let slice = &mut [1, 1, 2, 3, 2, 3, 2, 3, 4];
+
+let mut iter = slice.chunk_by_mut(|a, b| a <= b);
+
+assert_eq!(iter.next(), Some(&mut [1, 1, 2, 3][..]));
+assert_eq!(iter.next(), Some(&mut [2, 3][..]));
+assert_eq!(iter.next(), Some(&mut [2, 3, 4][..]));
+assert_eq!(iter.next(), None);
+
1.0.0 · source

pub fn split_at(&self, mid: usize) -> (&[T], &[T])

Divides one slice into two at an index.

+

The first will contain all indices from [0, mid) (excluding +the index mid itself) and the second will contain all +indices from [mid, len) (excluding the index len itself).

+
§Panics
+

Panics if mid > len. For a non-panicking alternative see +split_at_checked.

+
§Examples
+
let v = [1, 2, 3, 4, 5, 6];
+
+{
+   let (left, right) = v.split_at(0);
+   assert_eq!(left, []);
+   assert_eq!(right, [1, 2, 3, 4, 5, 6]);
+}
+
+{
+    let (left, right) = v.split_at(2);
+    assert_eq!(left, [1, 2]);
+    assert_eq!(right, [3, 4, 5, 6]);
+}
+
+{
+    let (left, right) = v.split_at(6);
+    assert_eq!(left, [1, 2, 3, 4, 5, 6]);
+    assert_eq!(right, []);
+}
+
1.0.0 · source

pub fn split_at_mut(&mut self, mid: usize) -> (&mut [T], &mut [T])

Divides one mutable slice into two at an index.

+

The first will contain all indices from [0, mid) (excluding +the index mid itself) and the second will contain all +indices from [mid, len) (excluding the index len itself).

+
§Panics
+

Panics if mid > len. For a non-panicking alternative see +split_at_mut_checked.

+
§Examples
+
let mut v = [1, 0, 3, 0, 5, 6];
+let (left, right) = v.split_at_mut(2);
+assert_eq!(left, [1, 0]);
+assert_eq!(right, [3, 0, 5, 6]);
+left[1] = 2;
+right[1] = 4;
+assert_eq!(v, [1, 2, 3, 4, 5, 6]);
+
1.79.0 · source

pub unsafe fn split_at_unchecked(&self, mid: usize) -> (&[T], &[T])

Divides one slice into two at an index, without doing bounds checking.

+

The first will contain all indices from [0, mid) (excluding +the index mid itself) and the second will contain all +indices from [mid, len) (excluding the index len itself).

+

For a safe alternative see split_at.

+
§Safety
+

Calling this method with an out-of-bounds index is undefined behavior +even if the resulting reference is not used. The caller has to ensure that +0 <= mid <= self.len().

+
§Examples
+
let v = [1, 2, 3, 4, 5, 6];
+
+unsafe {
+   let (left, right) = v.split_at_unchecked(0);
+   assert_eq!(left, []);
+   assert_eq!(right, [1, 2, 3, 4, 5, 6]);
+}
+
+unsafe {
+    let (left, right) = v.split_at_unchecked(2);
+    assert_eq!(left, [1, 2]);
+    assert_eq!(right, [3, 4, 5, 6]);
+}
+
+unsafe {
+    let (left, right) = v.split_at_unchecked(6);
+    assert_eq!(left, [1, 2, 3, 4, 5, 6]);
+    assert_eq!(right, []);
+}
+
1.79.0 · source

pub unsafe fn split_at_mut_unchecked( + &mut self, + mid: usize, +) -> (&mut [T], &mut [T])

Divides one mutable slice into two at an index, without doing bounds checking.

+

The first will contain all indices from [0, mid) (excluding +the index mid itself) and the second will contain all +indices from [mid, len) (excluding the index len itself).

+

For a safe alternative see split_at_mut.

+
§Safety
+

Calling this method with an out-of-bounds index is undefined behavior +even if the resulting reference is not used. The caller has to ensure that +0 <= mid <= self.len().

+
§Examples
+
let mut v = [1, 0, 3, 0, 5, 6];
+// scoped to restrict the lifetime of the borrows
+unsafe {
+    let (left, right) = v.split_at_mut_unchecked(2);
+    assert_eq!(left, [1, 0]);
+    assert_eq!(right, [3, 0, 5, 6]);
+    left[1] = 2;
+    right[1] = 4;
+}
+assert_eq!(v, [1, 2, 3, 4, 5, 6]);
+
1.80.0 · source

pub fn split_at_checked(&self, mid: usize) -> Option<(&[T], &[T])>

Divides one slice into two at an index, returning None if the slice is +too short.

+

If mid ≤ len returns a pair of slices where the first will contain all +indices from [0, mid) (excluding the index mid itself) and the +second will contain all indices from [mid, len) (excluding the index +len itself).

+

Otherwise, if mid > len, returns None.

+
§Examples
+
let v = [1, -2, 3, -4, 5, -6];
+
+{
+   let (left, right) = v.split_at_checked(0).unwrap();
+   assert_eq!(left, []);
+   assert_eq!(right, [1, -2, 3, -4, 5, -6]);
+}
+
+{
+    let (left, right) = v.split_at_checked(2).unwrap();
+    assert_eq!(left, [1, -2]);
+    assert_eq!(right, [3, -4, 5, -6]);
+}
+
+{
+    let (left, right) = v.split_at_checked(6).unwrap();
+    assert_eq!(left, [1, -2, 3, -4, 5, -6]);
+    assert_eq!(right, []);
+}
+
+assert_eq!(None, v.split_at_checked(7));
+
1.80.0 · source

pub fn split_at_mut_checked( + &mut self, + mid: usize, +) -> Option<(&mut [T], &mut [T])>

Divides one mutable slice into two at an index, returning None if the +slice is too short.

+

If mid ≤ len returns a pair of slices where the first will contain all +indices from [0, mid) (excluding the index mid itself) and the +second will contain all indices from [mid, len) (excluding the index +len itself).

+

Otherwise, if mid > len, returns None.

+
§Examples
+
let mut v = [1, 0, 3, 0, 5, 6];
+
+if let Some((left, right)) = v.split_at_mut_checked(2) {
+    assert_eq!(left, [1, 0]);
+    assert_eq!(right, [3, 0, 5, 6]);
+    left[1] = 2;
+    right[1] = 4;
+}
+assert_eq!(v, [1, 2, 3, 4, 5, 6]);
+
+assert_eq!(None, v.split_at_mut_checked(7));
+
1.0.0 · source

pub fn split<F>(&self, pred: F) -> Split<'_, T, F>
where + F: FnMut(&T) -> bool,

Returns an iterator over subslices separated by elements that match +pred. The matched element is not contained in the subslices.

+
§Examples
+
let slice = [10, 40, 33, 20];
+let mut iter = slice.split(|num| num % 3 == 0);
+
+assert_eq!(iter.next().unwrap(), &[10, 40]);
+assert_eq!(iter.next().unwrap(), &[20]);
+assert!(iter.next().is_none());
+

If the first element is matched, an empty slice will be the first item +returned by the iterator. Similarly, if the last element in the slice +is matched, an empty slice will be the last item returned by the +iterator:

+ +
let slice = [10, 40, 33];
+let mut iter = slice.split(|num| num % 3 == 0);
+
+assert_eq!(iter.next().unwrap(), &[10, 40]);
+assert_eq!(iter.next().unwrap(), &[]);
+assert!(iter.next().is_none());
+

If two matched elements are directly adjacent, an empty slice will be +present between them:

+ +
let slice = [10, 6, 33, 20];
+let mut iter = slice.split(|num| num % 3 == 0);
+
+assert_eq!(iter.next().unwrap(), &[10]);
+assert_eq!(iter.next().unwrap(), &[]);
+assert_eq!(iter.next().unwrap(), &[20]);
+assert!(iter.next().is_none());
+
1.0.0 · source

pub fn split_mut<F>(&mut self, pred: F) -> SplitMut<'_, T, F>
where + F: FnMut(&T) -> bool,

Returns an iterator over mutable subslices separated by elements that +match pred. The matched element is not contained in the subslices.

+
§Examples
+
let mut v = [10, 40, 30, 20, 60, 50];
+
+for group in v.split_mut(|num| *num % 3 == 0) {
+    group[0] = 1;
+}
+assert_eq!(v, [1, 40, 30, 1, 60, 1]);
+
1.51.0 · source

pub fn split_inclusive<F>(&self, pred: F) -> SplitInclusive<'_, T, F>
where + F: FnMut(&T) -> bool,

Returns an iterator over subslices separated by elements that match +pred. The matched element is contained in the end of the previous +subslice as a terminator.

+
§Examples
+
let slice = [10, 40, 33, 20];
+let mut iter = slice.split_inclusive(|num| num % 3 == 0);
+
+assert_eq!(iter.next().unwrap(), &[10, 40, 33]);
+assert_eq!(iter.next().unwrap(), &[20]);
+assert!(iter.next().is_none());
+

If the last element of the slice is matched, +that element will be considered the terminator of the preceding slice. +That slice will be the last item returned by the iterator.

+ +
let slice = [3, 10, 40, 33];
+let mut iter = slice.split_inclusive(|num| num % 3 == 0);
+
+assert_eq!(iter.next().unwrap(), &[3]);
+assert_eq!(iter.next().unwrap(), &[10, 40, 33]);
+assert!(iter.next().is_none());
+
1.51.0 · source

pub fn split_inclusive_mut<F>(&mut self, pred: F) -> SplitInclusiveMut<'_, T, F>
where + F: FnMut(&T) -> bool,

Returns an iterator over mutable subslices separated by elements that +match pred. The matched element is contained in the previous +subslice as a terminator.

+
§Examples
+
let mut v = [10, 40, 30, 20, 60, 50];
+
+for group in v.split_inclusive_mut(|num| *num % 3 == 0) {
+    let terminator_idx = group.len()-1;
+    group[terminator_idx] = 1;
+}
+assert_eq!(v, [10, 40, 1, 20, 1, 1]);
+
1.27.0 · source

pub fn rsplit<F>(&self, pred: F) -> RSplit<'_, T, F>
where + F: FnMut(&T) -> bool,

Returns an iterator over subslices separated by elements that match +pred, starting at the end of the slice and working backwards. +The matched element is not contained in the subslices.

+
§Examples
+
let slice = [11, 22, 33, 0, 44, 55];
+let mut iter = slice.rsplit(|num| *num == 0);
+
+assert_eq!(iter.next().unwrap(), &[44, 55]);
+assert_eq!(iter.next().unwrap(), &[11, 22, 33]);
+assert_eq!(iter.next(), None);
+

As with split(), if the first or last element is matched, an empty +slice will be the first (or last) item returned by the iterator.

+ +
let v = &[0, 1, 1, 2, 3, 5, 8];
+let mut it = v.rsplit(|n| *n % 2 == 0);
+assert_eq!(it.next().unwrap(), &[]);
+assert_eq!(it.next().unwrap(), &[3, 5]);
+assert_eq!(it.next().unwrap(), &[1, 1]);
+assert_eq!(it.next().unwrap(), &[]);
+assert_eq!(it.next(), None);
+
1.27.0 · source

pub fn rsplit_mut<F>(&mut self, pred: F) -> RSplitMut<'_, T, F>
where + F: FnMut(&T) -> bool,

Returns an iterator over mutable subslices separated by elements that +match pred, starting at the end of the slice and working +backwards. The matched element is not contained in the subslices.

+
§Examples
+
let mut v = [100, 400, 300, 200, 600, 500];
+
+let mut count = 0;
+for group in v.rsplit_mut(|num| *num % 3 == 0) {
+    count += 1;
+    group[0] = count;
+}
+assert_eq!(v, [3, 400, 300, 2, 600, 1]);
+
1.0.0 · source

pub fn splitn<F>(&self, n: usize, pred: F) -> SplitN<'_, T, F>
where + F: FnMut(&T) -> bool,

Returns an iterator over subslices separated by elements that match +pred, limited to returning at most n items. The matched element is +not contained in the subslices.

+

The last element returned, if any, will contain the remainder of the +slice.

+
§Examples
+

Print the slice split once by numbers divisible by 3 (i.e., [10, 40], +[20, 60, 50]):

+ +
let v = [10, 40, 30, 20, 60, 50];
+
+for group in v.splitn(2, |num| *num % 3 == 0) {
+    println!("{group:?}");
+}
+
1.0.0 · source

pub fn splitn_mut<F>(&mut self, n: usize, pred: F) -> SplitNMut<'_, T, F>
where + F: FnMut(&T) -> bool,

Returns an iterator over mutable subslices separated by elements that match +pred, limited to returning at most n items. The matched element is +not contained in the subslices.

+

The last element returned, if any, will contain the remainder of the +slice.

+
§Examples
+
let mut v = [10, 40, 30, 20, 60, 50];
+
+for group in v.splitn_mut(2, |num| *num % 3 == 0) {
+    group[0] = 1;
+}
+assert_eq!(v, [1, 40, 30, 1, 60, 50]);
+
1.0.0 · source

pub fn rsplitn<F>(&self, n: usize, pred: F) -> RSplitN<'_, T, F>
where + F: FnMut(&T) -> bool,

Returns an iterator over subslices separated by elements that match +pred limited to returning at most n items. This starts at the end of +the slice and works backwards. The matched element is not contained in +the subslices.

+

The last element returned, if any, will contain the remainder of the +slice.

+
§Examples
+

Print the slice split once, starting from the end, by numbers divisible +by 3 (i.e., [50], [10, 40, 30, 20]):

+ +
let v = [10, 40, 30, 20, 60, 50];
+
+for group in v.rsplitn(2, |num| *num % 3 == 0) {
+    println!("{group:?}");
+}
+
1.0.0 · source

pub fn rsplitn_mut<F>(&mut self, n: usize, pred: F) -> RSplitNMut<'_, T, F>
where + F: FnMut(&T) -> bool,

Returns an iterator over subslices separated by elements that match +pred limited to returning at most n items. This starts at the end of +the slice and works backwards. The matched element is not contained in +the subslices.

+

The last element returned, if any, will contain the remainder of the +slice.

+
§Examples
+
let mut s = [10, 40, 30, 20, 60, 50];
+
+for group in s.rsplitn_mut(2, |num| *num % 3 == 0) {
+    group[0] = 1;
+}
+assert_eq!(s, [1, 40, 30, 20, 60, 1]);
+
source

pub fn split_once<F>(&self, pred: F) -> Option<(&[T], &[T])>
where + F: FnMut(&T) -> bool,

🔬This is a nightly-only experimental API. (slice_split_once)

Splits the slice on the first element that matches the specified +predicate.

+

If any matching elements are present in the slice, returns the prefix +before the match and suffix after. The matching element itself is not +included. If no elements match, returns None.

+
§Examples
+
#![feature(slice_split_once)]
+let s = [1, 2, 3, 2, 4];
+assert_eq!(s.split_once(|&x| x == 2), Some((
+    &[1][..],
+    &[3, 2, 4][..]
+)));
+assert_eq!(s.split_once(|&x| x == 0), None);
+
source

pub fn rsplit_once<F>(&self, pred: F) -> Option<(&[T], &[T])>
where + F: FnMut(&T) -> bool,

🔬This is a nightly-only experimental API. (slice_split_once)

Splits the slice on the last element that matches the specified +predicate.

+

If any matching elements are present in the slice, returns the prefix +before the match and suffix after. The matching element itself is not +included. If no elements match, returns None.

+
§Examples
+
#![feature(slice_split_once)]
+let s = [1, 2, 3, 2, 4];
+assert_eq!(s.rsplit_once(|&x| x == 2), Some((
+    &[1, 2, 3][..],
+    &[4][..]
+)));
+assert_eq!(s.rsplit_once(|&x| x == 0), None);
+
1.0.0 · source

pub fn contains(&self, x: &T) -> bool
where + T: PartialEq,

Returns true if the slice contains an element with the given value.

+

This operation is O(n).

+

Note that if you have a sorted slice, binary_search may be faster.

+
§Examples
+
let v = [10, 40, 30];
+assert!(v.contains(&30));
+assert!(!v.contains(&50));
+

If you do not have a &T, but some other value that you can compare +with one (for example, String implements PartialEq<str>), you can +use iter().any:

+ +
let v = [String::from("hello"), String::from("world")]; // slice of `String`
+assert!(v.iter().any(|e| e == "hello")); // search with `&str`
+assert!(!v.iter().any(|e| e == "hi"));
+
1.0.0 · source

pub fn starts_with(&self, needle: &[T]) -> bool
where + T: PartialEq,

Returns true if needle is a prefix of the slice or equal to the slice.

+
§Examples
+
let v = [10, 40, 30];
+assert!(v.starts_with(&[10]));
+assert!(v.starts_with(&[10, 40]));
+assert!(v.starts_with(&v));
+assert!(!v.starts_with(&[50]));
+assert!(!v.starts_with(&[10, 50]));
+

Always returns true if needle is an empty slice:

+ +
let v = &[10, 40, 30];
+assert!(v.starts_with(&[]));
+let v: &[u8] = &[];
+assert!(v.starts_with(&[]));
+
1.0.0 · source

pub fn ends_with(&self, needle: &[T]) -> bool
where + T: PartialEq,

Returns true if needle is a suffix of the slice or equal to the slice.

+
§Examples
+
let v = [10, 40, 30];
+assert!(v.ends_with(&[30]));
+assert!(v.ends_with(&[40, 30]));
+assert!(v.ends_with(&v));
+assert!(!v.ends_with(&[50]));
+assert!(!v.ends_with(&[50, 30]));
+

Always returns true if needle is an empty slice:

+ +
let v = &[10, 40, 30];
+assert!(v.ends_with(&[]));
+let v: &[u8] = &[];
+assert!(v.ends_with(&[]));
+
1.51.0 · source

pub fn strip_prefix<P>(&self, prefix: &P) -> Option<&[T]>
where + P: SlicePattern<Item = T> + ?Sized, + T: PartialEq,

Returns a subslice with the prefix removed.

+

If the slice starts with prefix, returns the subslice after the prefix, wrapped in Some. +If prefix is empty, simply returns the original slice. If prefix is equal to the +original slice, returns an empty slice.

+

If the slice does not start with prefix, returns None.

+
§Examples
+
let v = &[10, 40, 30];
+assert_eq!(v.strip_prefix(&[10]), Some(&[40, 30][..]));
+assert_eq!(v.strip_prefix(&[10, 40]), Some(&[30][..]));
+assert_eq!(v.strip_prefix(&[10, 40, 30]), Some(&[][..]));
+assert_eq!(v.strip_prefix(&[50]), None);
+assert_eq!(v.strip_prefix(&[10, 50]), None);
+
+let prefix : &str = "he";
+assert_eq!(b"hello".strip_prefix(prefix.as_bytes()),
+           Some(b"llo".as_ref()));
+
1.51.0 · source

pub fn strip_suffix<P>(&self, suffix: &P) -> Option<&[T]>
where + P: SlicePattern<Item = T> + ?Sized, + T: PartialEq,

Returns a subslice with the suffix removed.

+

If the slice ends with suffix, returns the subslice before the suffix, wrapped in Some. +If suffix is empty, simply returns the original slice. If suffix is equal to the +original slice, returns an empty slice.

+

If the slice does not end with suffix, returns None.

+
§Examples
+
let v = &[10, 40, 30];
+assert_eq!(v.strip_suffix(&[30]), Some(&[10, 40][..]));
+assert_eq!(v.strip_suffix(&[40, 30]), Some(&[10][..]));
+assert_eq!(v.strip_suffix(&[10, 40, 30]), Some(&[][..]));
+assert_eq!(v.strip_suffix(&[50]), None);
+assert_eq!(v.strip_suffix(&[50, 30]), None);
+

Binary searches this slice for a given element. +If the slice is not sorted, the returned result is unspecified and +meaningless.

+

If the value is found then Result::Ok is returned, containing the +index of the matching element. If there are multiple matches, then any +one of the matches could be returned. The index is chosen +deterministically, but is subject to change in future versions of Rust. +If the value is not found then Result::Err is returned, containing +the index where a matching element could be inserted while maintaining +sorted order.

+

See also binary_search_by, binary_search_by_key, and partition_point.

+
§Examples
+

Looks up a series of four elements. The first is found, with a +uniquely determined position; the second and third are not +found; the fourth could match any position in [1, 4].

+ +
let s = [0, 1, 1, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55];
+
+assert_eq!(s.binary_search(&13),  Ok(9));
+assert_eq!(s.binary_search(&4),   Err(7));
+assert_eq!(s.binary_search(&100), Err(13));
+let r = s.binary_search(&1);
+assert!(match r { Ok(1..=4) => true, _ => false, });
+

If you want to find that whole range of matching items, rather than +an arbitrary matching one, that can be done using partition_point:

+ +
let s = [0, 1, 1, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55];
+
+let low = s.partition_point(|x| x < &1);
+assert_eq!(low, 1);
+let high = s.partition_point(|x| x <= &1);
+assert_eq!(high, 5);
+let r = s.binary_search(&1);
+assert!((low..high).contains(&r.unwrap()));
+
+assert!(s[..low].iter().all(|&x| x < 1));
+assert!(s[low..high].iter().all(|&x| x == 1));
+assert!(s[high..].iter().all(|&x| x > 1));
+
+// For something not found, the "range" of equal items is empty
+assert_eq!(s.partition_point(|x| x < &11), 9);
+assert_eq!(s.partition_point(|x| x <= &11), 9);
+assert_eq!(s.binary_search(&11), Err(9));
+

If you want to insert an item to a sorted vector, while maintaining +sort order, consider using partition_point:

+ +
let mut s = vec![0, 1, 1, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55];
+let num = 42;
+let idx = s.partition_point(|&x| x <= num);
+// If `num` is unique, `s.partition_point(|&x| x < num)` (with `<`) is equivalent to
+// `s.binary_search(&num).unwrap_or_else(|x| x)`, but using `<=` will allow `insert`
+// to shift less elements.
+s.insert(idx, num);
+assert_eq!(s, [0, 1, 1, 1, 1, 2, 3, 5, 8, 13, 21, 34, 42, 55]);
+
1.0.0 · source

pub fn binary_search_by<'a, F>(&'a self, f: F) -> Result<usize, usize>
where + F: FnMut(&'a T) -> Ordering,

Binary searches this slice with a comparator function.

+

The comparator function should return an order code that indicates +whether its argument is Less, Equal or Greater the desired +target. +If the slice is not sorted or if the comparator function does not +implement an order consistent with the sort order of the underlying +slice, the returned result is unspecified and meaningless.

+

If the value is found then Result::Ok is returned, containing the +index of the matching element. If there are multiple matches, then any +one of the matches could be returned. The index is chosen +deterministically, but is subject to change in future versions of Rust. +If the value is not found then Result::Err is returned, containing +the index where a matching element could be inserted while maintaining +sorted order.

+

See also binary_search, binary_search_by_key, and partition_point.

+
§Examples
+

Looks up a series of four elements. The first is found, with a +uniquely determined position; the second and third are not +found; the fourth could match any position in [1, 4].

+ +
let s = [0, 1, 1, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55];
+
+let seek = 13;
+assert_eq!(s.binary_search_by(|probe| probe.cmp(&seek)), Ok(9));
+let seek = 4;
+assert_eq!(s.binary_search_by(|probe| probe.cmp(&seek)), Err(7));
+let seek = 100;
+assert_eq!(s.binary_search_by(|probe| probe.cmp(&seek)), Err(13));
+let seek = 1;
+let r = s.binary_search_by(|probe| probe.cmp(&seek));
+assert!(match r { Ok(1..=4) => true, _ => false, });
+
1.10.0 · source

pub fn binary_search_by_key<'a, B, F>( + &'a self, + b: &B, + f: F, +) -> Result<usize, usize>
where + F: FnMut(&'a T) -> B, + B: Ord,

Binary searches this slice with a key extraction function.

+

Assumes that the slice is sorted by the key, for instance with +sort_by_key using the same key extraction function. +If the slice is not sorted by the key, the returned result is +unspecified and meaningless.

+

If the value is found then Result::Ok is returned, containing the +index of the matching element. If there are multiple matches, then any +one of the matches could be returned. The index is chosen +deterministically, but is subject to change in future versions of Rust. +If the value is not found then Result::Err is returned, containing +the index where a matching element could be inserted while maintaining +sorted order.

+

See also binary_search, binary_search_by, and partition_point.

+
§Examples
+

Looks up a series of four elements in a slice of pairs sorted by +their second elements. The first is found, with a uniquely +determined position; the second and third are not found; the +fourth could match any position in [1, 4].

+ +
let s = [(0, 0), (2, 1), (4, 1), (5, 1), (3, 1),
+         (1, 2), (2, 3), (4, 5), (5, 8), (3, 13),
+         (1, 21), (2, 34), (4, 55)];
+
+assert_eq!(s.binary_search_by_key(&13, |&(a, b)| b),  Ok(9));
+assert_eq!(s.binary_search_by_key(&4, |&(a, b)| b),   Err(7));
+assert_eq!(s.binary_search_by_key(&100, |&(a, b)| b), Err(13));
+let r = s.binary_search_by_key(&1, |&(a, b)| b);
+assert!(match r { Ok(1..=4) => true, _ => false, });
+
1.20.0 · source

pub fn sort_unstable(&mut self)
where + T: Ord,

Sorts the slice without preserving the initial order of equal elements.

+

This sort is unstable (i.e., may reorder equal elements), in-place (i.e., does not +allocate), and O(n * log(n)) worst-case.

+

If T: Ord does not implement a total order the resulting order is unspecified. All +original elements will remain in the slice and any possible modifications via interior +mutability are observed in the input. Same is true if T: Ord panics.

+
§Current implementation
+

The current implementation is based on ipnsort by Lukas Bergdoll and Orson Peters, which +combines the fast average case of quicksort with the fast worst case of heapsort, achieving +linear time on fully sorted and reversed inputs. On inputs with k distinct elements, the +expected time to sort the data is O(n * log(k)).

+

It is typically faster than stable sorting, except in a few special cases, e.g., when the +slice is partially sorted.

+

If T: Ord does not implement a total order, the implementation may panic.

+
§Examples
+
let mut v = [-5, 4, 1, -3, 2];
+
+v.sort_unstable();
+assert!(v == [-5, -3, 1, 2, 4]);
+
1.20.0 · source

pub fn sort_unstable_by<F>(&mut self, compare: F)
where + F: FnMut(&T, &T) -> Ordering,

Sorts the slice with a comparator function, without preserving the initial order of +equal elements.

+

This sort is unstable (i.e., may reorder equal elements), in-place (i.e., does not +allocate), and O(n * log(n)) worst-case.

+

The comparator function should define a total ordering for the elements in the slice. If the +ordering is not total, the order of the elements is unspecified.

+

If the comparator function does not implement a total order the resulting order is +unspecified. All original elements will remain in the slice and any possible modifications +via interior mutability are observed in the input. Same is true if the comparator function +panics. A total order (for all a, b and c):

+
    +
  • total and antisymmetric: exactly one of a < b, a == b or a > b is true, and
  • +
  • transitive, a < b and b < c implies a < c. The same must hold for both == and >.
  • +
+

For example, while f64 doesn’t implement Ord because NaN != NaN, we can use +partial_cmp as our sort function when we know the slice doesn’t contain a NaN.

+ +
let mut floats = [5f64, 4.0, 1.0, 3.0, 2.0];
+floats.sort_unstable_by(|a, b| a.partial_cmp(b).unwrap());
+assert_eq!(floats, [1.0, 2.0, 3.0, 4.0, 5.0]);
+
§Current implementation
+

The current implementation is based on ipnsort by Lukas Bergdoll and Orson Peters, which +combines the fast average case of quicksort with the fast worst case of heapsort, achieving +linear time on fully sorted and reversed inputs. On inputs with k distinct elements, the +expected time to sort the data is O(n * log(k)).

+

It is typically faster than stable sorting, except in a few special cases, e.g., when the +slice is partially sorted.

+

If T: Ord does not implement a total order, the implementation may panic.

+
§Examples
+
let mut v = [5, 4, 1, 3, 2];
+v.sort_unstable_by(|a, b| a.cmp(b));
+assert!(v == [1, 2, 3, 4, 5]);
+
+// reverse sorting
+v.sort_unstable_by(|a, b| b.cmp(a));
+assert!(v == [5, 4, 3, 2, 1]);
+
1.20.0 · source

pub fn sort_unstable_by_key<K, F>(&mut self, f: F)
where + F: FnMut(&T) -> K, + K: Ord,

Sorts the slice with a key extraction function, without preserving the initial order of +equal elements.

+

This sort is unstable (i.e., may reorder equal elements), in-place (i.e., does not +allocate), and O(n * log(n)) worst-case.

+

If K: Ord does not implement a total order the resulting order is unspecified. +All original elements will remain in the slice and any possible modifications via interior +mutability are observed in the input. Same is true if K: Ord panics.

+
§Current implementation
+

The current implementation is based on ipnsort by Lukas Bergdoll and Orson Peters, which +combines the fast average case of quicksort with the fast worst case of heapsort, achieving +linear time on fully sorted and reversed inputs. On inputs with k distinct elements, the +expected time to sort the data is O(n * log(k)).

+

It is typically faster than stable sorting, except in a few special cases, e.g., when the +slice is partially sorted.

+

If K: Ord does not implement a total order, the implementation may panic.

+
§Examples
+
let mut v = [-5i32, 4, 1, -3, 2];
+
+v.sort_unstable_by_key(|k| k.abs());
+assert!(v == [1, 2, -3, 4, -5]);
+
1.49.0 · source

pub fn select_nth_unstable( + &mut self, + index: usize, +) -> (&mut [T], &mut T, &mut [T])
where + T: Ord,

Reorder the slice such that the element at index after the reordering is at its final +sorted position.

+

This reordering has the additional property that any value at position i < index will be +less than or equal to any value at a position j > index. Additionally, this reordering is +unstable (i.e. any number of equal elements may end up at position index), in-place (i.e. +does not allocate), and runs in O(n) time. This function is also known as “kth element” +in other libraries.

+

It returns a triplet of the following from the reordered slice: the subslice prior to +index, the element at index, and the subslice after index; accordingly, the values in +those two subslices will respectively all be less-than-or-equal-to and +greater-than-or-equal-to the value of the element at index.

+
§Current implementation
+

The current algorithm is an introselect implementation based on ipnsort by Lukas Bergdoll +and Orson Peters, which is also the basis for sort_unstable. The fallback algorithm is +Median of Medians using Tukey’s Ninther for pivot selection, which guarantees linear runtime +for all inputs.

+

It is typically faster than stable sorting, except in a few special cases, e.g., when the +slice is nearly fully sorted, where slice::sort may be faster.

+
§Panics
+

Panics when index >= len(), meaning it always panics on empty slices.

+
§Examples
+
let mut v = [-5i32, 4, 2, -3, 1];
+
+// Find the items less than or equal to the median, the median, and greater than or equal to
+// the median.
+let (lesser, median, greater) = v.select_nth_unstable(2);
+
+assert!(lesser == [-3, -5] || lesser == [-5, -3]);
+assert_eq!(median, &mut 1);
+assert!(greater == [4, 2] || greater == [2, 4]);
+
+// We are only guaranteed the slice will be one of the following, based on the way we sort
+// about the specified index.
+assert!(v == [-3, -5, 1, 2, 4] ||
+        v == [-5, -3, 1, 2, 4] ||
+        v == [-3, -5, 1, 4, 2] ||
+        v == [-5, -3, 1, 4, 2]);
+
1.49.0 · source

pub fn select_nth_unstable_by<F>( + &mut self, + index: usize, + compare: F, +) -> (&mut [T], &mut T, &mut [T])
where + F: FnMut(&T, &T) -> Ordering,

Reorder the slice with a comparator function such that the element at index after the +reordering is at its final sorted position.

+

This reordering has the additional property that any value at position i < index will be +less than or equal to any value at a position j > index using the comparator function. +Additionally, this reordering is unstable (i.e. any number of equal elements may end up at +position index), in-place (i.e. does not allocate), and runs in O(n) time. This +function is also known as “kth element” in other libraries.

+

It returns a triplet of the following from the slice reordered according to the provided +comparator function: the subslice prior to index, the element at index, and the subslice +after index; accordingly, the values in those two subslices will respectively all be +less-than-or-equal-to and greater-than-or-equal-to the value of the element at index.

+
§Current implementation
+

The current algorithm is an introselect implementation based on ipnsort by Lukas Bergdoll +and Orson Peters, which is also the basis for sort_unstable. The fallback algorithm is +Median of Medians using Tukey’s Ninther for pivot selection, which guarantees linear runtime +for all inputs.

+

It is typically faster than stable sorting, except in a few special cases, e.g., when the +slice is nearly fully sorted, where slice::sort may be faster.

+
§Panics
+

Panics when index >= len(), meaning it always panics on empty slices.

+
§Examples
+
let mut v = [-5i32, 4, 2, -3, 1];
+
+// Find the items less than or equal to the median, the median, and greater than or equal to
+// the median as if the slice were sorted in descending order.
+let (lesser, median, greater) = v.select_nth_unstable_by(2, |a, b| b.cmp(a));
+
+assert!(lesser == [4, 2] || lesser == [2, 4]);
+assert_eq!(median, &mut 1);
+assert!(greater == [-3, -5] || greater == [-5, -3]);
+
+// We are only guaranteed the slice will be one of the following, based on the way we sort
+// about the specified index.
+assert!(v == [2, 4, 1, -5, -3] ||
+        v == [2, 4, 1, -3, -5] ||
+        v == [4, 2, 1, -5, -3] ||
+        v == [4, 2, 1, -3, -5]);
+
1.49.0 · source

pub fn select_nth_unstable_by_key<K, F>( + &mut self, + index: usize, + f: F, +) -> (&mut [T], &mut T, &mut [T])
where + F: FnMut(&T) -> K, + K: Ord,

Reorder the slice with a key extraction function such that the element at index after the +reordering is at its final sorted position.

+

This reordering has the additional property that any value at position i < index will be +less than or equal to any value at a position j > index using the key extraction function. +Additionally, this reordering is unstable (i.e. any number of equal elements may end up at +position index), in-place (i.e. does not allocate), and runs in O(n) time. This +function is also known as “kth element” in other libraries.

+

It returns a triplet of the following from the slice reordered according to the provided key +extraction function: the subslice prior to index, the element at index, and the subslice +after index; accordingly, the values in those two subslices will respectively all be +less-than-or-equal-to and greater-than-or-equal-to the value of the element at index.

+
§Current implementation
+

The current algorithm is an introselect implementation based on ipnsort by Lukas Bergdoll +and Orson Peters, which is also the basis for sort_unstable. The fallback algorithm is +Median of Medians using Tukey’s Ninther for pivot selection, which guarantees linear runtime +for all inputs.

+

It is typically faster than stable sorting, except in a few special cases, e.g., when the +slice is nearly fully sorted, where slice::sort may be faster.

+
§Panics
+

Panics when index >= len(), meaning it always panics on empty slices.

+
§Examples
+
let mut v = [-5i32, 4, 1, -3, 2];
+
+// Find the items less than or equal to the median, the median, and greater than or equal to
+// the median as if the slice were sorted according to absolute value.
+let (lesser, median, greater) = v.select_nth_unstable_by_key(2, |a| a.abs());
+
+assert!(lesser == [1, 2] || lesser == [2, 1]);
+assert_eq!(median, &mut -3);
+assert!(greater == [4, -5] || greater == [-5, 4]);
+
+// We are only guaranteed the slice will be one of the following, based on the way we sort
+// about the specified index.
+assert!(v == [1, 2, -3, 4, -5] ||
+        v == [1, 2, -3, -5, 4] ||
+        v == [2, 1, -3, 4, -5] ||
+        v == [2, 1, -3, -5, 4]);
+
source

pub fn partition_dedup(&mut self) -> (&mut [T], &mut [T])
where + T: PartialEq,

🔬This is a nightly-only experimental API. (slice_partition_dedup)

Moves all consecutive repeated elements to the end of the slice according to the +PartialEq trait implementation.

+

Returns two slices. The first contains no consecutive repeated elements. +The second contains all the duplicates in no specified order.

+

If the slice is sorted, the first returned slice contains no duplicates.

+
§Examples
+
#![feature(slice_partition_dedup)]
+
+let mut slice = [1, 2, 2, 3, 3, 2, 1, 1];
+
+let (dedup, duplicates) = slice.partition_dedup();
+
+assert_eq!(dedup, [1, 2, 3, 2, 1]);
+assert_eq!(duplicates, [2, 3, 1]);
+
source

pub fn partition_dedup_by<F>(&mut self, same_bucket: F) -> (&mut [T], &mut [T])
where + F: FnMut(&mut T, &mut T) -> bool,

🔬This is a nightly-only experimental API. (slice_partition_dedup)

Moves all but the first of consecutive elements to the end of the slice satisfying +a given equality relation.

+

Returns two slices. The first contains no consecutive repeated elements. +The second contains all the duplicates in no specified order.

+

The same_bucket function is passed references to two elements from the slice and +must determine if the elements compare equal. The elements are passed in opposite order +from their order in the slice, so if same_bucket(a, b) returns true, a is moved +at the end of the slice.

+

If the slice is sorted, the first returned slice contains no duplicates.

+
§Examples
+
#![feature(slice_partition_dedup)]
+
+let mut slice = ["foo", "Foo", "BAZ", "Bar", "bar", "baz", "BAZ"];
+
+let (dedup, duplicates) = slice.partition_dedup_by(|a, b| a.eq_ignore_ascii_case(b));
+
+assert_eq!(dedup, ["foo", "BAZ", "Bar", "baz"]);
+assert_eq!(duplicates, ["bar", "Foo", "BAZ"]);
+
source

pub fn partition_dedup_by_key<K, F>(&mut self, key: F) -> (&mut [T], &mut [T])
where + F: FnMut(&mut T) -> K, + K: PartialEq,

🔬This is a nightly-only experimental API. (slice_partition_dedup)

Moves all but the first of consecutive elements to the end of the slice that resolve +to the same key.

+

Returns two slices. The first contains no consecutive repeated elements. +The second contains all the duplicates in no specified order.

+

If the slice is sorted, the first returned slice contains no duplicates.

+
§Examples
+
#![feature(slice_partition_dedup)]
+
+let mut slice = [10, 20, 21, 30, 30, 20, 11, 13];
+
+let (dedup, duplicates) = slice.partition_dedup_by_key(|i| *i / 10);
+
+assert_eq!(dedup, [10, 20, 30, 20, 11]);
+assert_eq!(duplicates, [21, 30, 13]);
+
1.26.0 · source

pub fn rotate_left(&mut self, mid: usize)

Rotates the slice in-place such that the first mid elements of the +slice move to the end while the last self.len() - mid elements move to +the front. After calling rotate_left, the element previously at index +mid will become the first element in the slice.

+
§Panics
+

This function will panic if mid is greater than the length of the +slice. Note that mid == self.len() does not panic and is a no-op +rotation.

+
§Complexity
+

Takes linear (in self.len()) time.

+
§Examples
+
let mut a = ['a', 'b', 'c', 'd', 'e', 'f'];
+a.rotate_left(2);
+assert_eq!(a, ['c', 'd', 'e', 'f', 'a', 'b']);
+

Rotating a subslice:

+ +
let mut a = ['a', 'b', 'c', 'd', 'e', 'f'];
+a[1..5].rotate_left(1);
+assert_eq!(a, ['a', 'c', 'd', 'e', 'b', 'f']);
+
1.26.0 · source

pub fn rotate_right(&mut self, k: usize)

Rotates the slice in-place such that the first self.len() - k +elements of the slice move to the end while the last k elements move +to the front. After calling rotate_right, the element previously at +index self.len() - k will become the first element in the slice.

+
§Panics
+

This function will panic if k is greater than the length of the +slice. Note that k == self.len() does not panic and is a no-op +rotation.

+
§Complexity
+

Takes linear (in self.len()) time.

+
§Examples
+
let mut a = ['a', 'b', 'c', 'd', 'e', 'f'];
+a.rotate_right(2);
+assert_eq!(a, ['e', 'f', 'a', 'b', 'c', 'd']);
+

Rotating a subslice:

+ +
let mut a = ['a', 'b', 'c', 'd', 'e', 'f'];
+a[1..5].rotate_right(1);
+assert_eq!(a, ['a', 'e', 'b', 'c', 'd', 'f']);
+
1.50.0 · source

pub fn fill(&mut self, value: T)
where + T: Clone,

Fills self with elements by cloning value.

+
§Examples
+
let mut buf = vec![0; 10];
+buf.fill(1);
+assert_eq!(buf, vec![1; 10]);
+
1.51.0 · source

pub fn fill_with<F>(&mut self, f: F)
where + F: FnMut() -> T,

Fills self with elements returned by calling a closure repeatedly.

+

This method uses a closure to create new values. If you’d rather +Clone a given value, use fill. If you want to use the Default +trait to generate values, you can pass Default::default as the +argument.

+
§Examples
+
let mut buf = vec![1; 10];
+buf.fill_with(Default::default);
+assert_eq!(buf, vec![0; 10]);
+
1.7.0 · source

pub fn clone_from_slice(&mut self, src: &[T])
where + T: Clone,

Copies the elements from src into self.

+

The length of src must be the same as self.

+
§Panics
+

This function will panic if the two slices have different lengths.

+
§Examples
+

Cloning two elements from a slice into another:

+ +
let src = [1, 2, 3, 4];
+let mut dst = [0, 0];
+
+// Because the slices have to be the same length,
+// we slice the source slice from four elements
+// to two. It will panic if we don't do this.
+dst.clone_from_slice(&src[2..]);
+
+assert_eq!(src, [1, 2, 3, 4]);
+assert_eq!(dst, [3, 4]);
+

Rust enforces that there can only be one mutable reference with no +immutable references to a particular piece of data in a particular +scope. Because of this, attempting to use clone_from_slice on a +single slice will result in a compile failure:

+ +
let mut slice = [1, 2, 3, 4, 5];
+
+slice[..2].clone_from_slice(&slice[3..]); // compile fail!
+

To work around this, we can use split_at_mut to create two distinct +sub-slices from a slice:

+ +
let mut slice = [1, 2, 3, 4, 5];
+
+{
+    let (left, right) = slice.split_at_mut(2);
+    left.clone_from_slice(&right[1..]);
+}
+
+assert_eq!(slice, [4, 5, 3, 4, 5]);
+
1.9.0 · source

pub fn copy_from_slice(&mut self, src: &[T])
where + T: Copy,

Copies all elements from src into self, using a memcpy.

+

The length of src must be the same as self.

+

If T does not implement Copy, use clone_from_slice.

+
§Panics
+

This function will panic if the two slices have different lengths.

+
§Examples
+

Copying two elements from a slice into another:

+ +
let src = [1, 2, 3, 4];
+let mut dst = [0, 0];
+
+// Because the slices have to be the same length,
+// we slice the source slice from four elements
+// to two. It will panic if we don't do this.
+dst.copy_from_slice(&src[2..]);
+
+assert_eq!(src, [1, 2, 3, 4]);
+assert_eq!(dst, [3, 4]);
+

Rust enforces that there can only be one mutable reference with no +immutable references to a particular piece of data in a particular +scope. Because of this, attempting to use copy_from_slice on a +single slice will result in a compile failure:

+ +
let mut slice = [1, 2, 3, 4, 5];
+
+slice[..2].copy_from_slice(&slice[3..]); // compile fail!
+

To work around this, we can use split_at_mut to create two distinct +sub-slices from a slice:

+ +
let mut slice = [1, 2, 3, 4, 5];
+
+{
+    let (left, right) = slice.split_at_mut(2);
+    left.copy_from_slice(&right[1..]);
+}
+
+assert_eq!(slice, [4, 5, 3, 4, 5]);
+
1.37.0 · source

pub fn copy_within<R>(&mut self, src: R, dest: usize)
where + R: RangeBounds<usize>, + T: Copy,

Copies elements from one part of the slice to another part of itself, +using a memmove.

+

src is the range within self to copy from. dest is the starting +index of the range within self to copy to, which will have the same +length as src. The two ranges may overlap. The ends of the two ranges +must be less than or equal to self.len().

+
§Panics
+

This function will panic if either range exceeds the end of the slice, +or if the end of src is before the start.

+
§Examples
+

Copying four bytes within a slice:

+ +
let mut bytes = *b"Hello, World!";
+
+bytes.copy_within(1..5, 8);
+
+assert_eq!(&bytes, b"Hello, Wello!");
+
1.27.0 · source

pub fn swap_with_slice(&mut self, other: &mut [T])

Swaps all elements in self with those in other.

+

The length of other must be the same as self.

+
§Panics
+

This function will panic if the two slices have different lengths.

+
§Example
+

Swapping two elements across slices:

+ +
let mut slice1 = [0, 0];
+let mut slice2 = [1, 2, 3, 4];
+
+slice1.swap_with_slice(&mut slice2[2..]);
+
+assert_eq!(slice1, [3, 4]);
+assert_eq!(slice2, [1, 2, 0, 0]);
+

Rust enforces that there can only be one mutable reference to a +particular piece of data in a particular scope. Because of this, +attempting to use swap_with_slice on a single slice will result in +a compile failure:

+ +
let mut slice = [1, 2, 3, 4, 5];
+slice[..2].swap_with_slice(&mut slice[3..]); // compile fail!
+

To work around this, we can use split_at_mut to create two distinct +mutable sub-slices from a slice:

+ +
let mut slice = [1, 2, 3, 4, 5];
+
+{
+    let (left, right) = slice.split_at_mut(2);
+    left.swap_with_slice(&mut right[1..]);
+}
+
+assert_eq!(slice, [4, 5, 3, 1, 2]);
+
1.30.0 · source

pub unsafe fn align_to<U>(&self) -> (&[T], &[U], &[T])

Transmute the slice to a slice of another type, ensuring alignment of the types is +maintained.

+

This method splits the slice into three distinct slices: prefix, correctly aligned middle +slice of a new type, and the suffix slice. The middle part will be as big as possible under +the given alignment constraint and element size.

+

This method has no purpose when either input element T or output element U are +zero-sized and will return the original slice without splitting anything.

+
§Safety
+

This method is essentially a transmute with respect to the elements in the returned +middle slice, so all the usual caveats pertaining to transmute::<T, U> also apply here.

+
§Examples
+

Basic usage:

+ +
unsafe {
+    let bytes: [u8; 7] = [1, 2, 3, 4, 5, 6, 7];
+    let (prefix, shorts, suffix) = bytes.align_to::<u16>();
+    // less_efficient_algorithm_for_bytes(prefix);
+    // more_efficient_algorithm_for_aligned_shorts(shorts);
+    // less_efficient_algorithm_for_bytes(suffix);
+}
+
1.30.0 · source

pub unsafe fn align_to_mut<U>(&mut self) -> (&mut [T], &mut [U], &mut [T])

Transmute the mutable slice to a mutable slice of another type, ensuring alignment of the +types is maintained.

+

This method splits the slice into three distinct slices: prefix, correctly aligned middle +slice of a new type, and the suffix slice. The middle part will be as big as possible under +the given alignment constraint and element size.

+

This method has no purpose when either input element T or output element U are +zero-sized and will return the original slice without splitting anything.

+
§Safety
+

This method is essentially a transmute with respect to the elements in the returned +middle slice, so all the usual caveats pertaining to transmute::<T, U> also apply here.

+
§Examples
+

Basic usage:

+ +
unsafe {
+    let mut bytes: [u8; 7] = [1, 2, 3, 4, 5, 6, 7];
+    let (prefix, shorts, suffix) = bytes.align_to_mut::<u16>();
+    // less_efficient_algorithm_for_bytes(prefix);
+    // more_efficient_algorithm_for_aligned_shorts(shorts);
+    // less_efficient_algorithm_for_bytes(suffix);
+}
+
source

pub fn as_simd<const LANES: usize>(&self) -> (&[T], &[Simd<T, LANES>], &[T])
where + Simd<T, LANES>: AsRef<[T; LANES]>, + T: SimdElement, + LaneCount<LANES>: SupportedLaneCount,

🔬This is a nightly-only experimental API. (portable_simd)

Split a slice into a prefix, a middle of aligned SIMD types, and a suffix.

+

This is a safe wrapper around slice::align_to, so inherits the same +guarantees as that method.

+
§Panics
+

This will panic if the size of the SIMD type is different from +LANES times that of the scalar.

+

At the time of writing, the trait restrictions on Simd<T, LANES> keeps +that from ever happening, as only power-of-two numbers of lanes are +supported. It’s possible that, in the future, those restrictions might +be lifted in a way that would make it possible to see panics from this +method for something like LANES == 3.

+
§Examples
+
#![feature(portable_simd)]
+use core::simd::prelude::*;
+
+let short = &[1, 2, 3];
+let (prefix, middle, suffix) = short.as_simd::<4>();
+assert_eq!(middle, []); // Not enough elements for anything in the middle
+
+// They might be split in any possible way between prefix and suffix
+let it = prefix.iter().chain(suffix).copied();
+assert_eq!(it.collect::<Vec<_>>(), vec![1, 2, 3]);
+
+fn basic_simd_sum(x: &[f32]) -> f32 {
+    use std::ops::Add;
+    let (prefix, middle, suffix) = x.as_simd();
+    let sums = f32x4::from_array([
+        prefix.iter().copied().sum(),
+        0.0,
+        0.0,
+        suffix.iter().copied().sum(),
+    ]);
+    let sums = middle.iter().copied().fold(sums, f32x4::add);
+    sums.reduce_sum()
+}
+
+let numbers: Vec<f32> = (1..101).map(|x| x as _).collect();
+assert_eq!(basic_simd_sum(&numbers[1..99]), 4949.0);
+
source

pub fn as_simd_mut<const LANES: usize>( + &mut self, +) -> (&mut [T], &mut [Simd<T, LANES>], &mut [T])
where + Simd<T, LANES>: AsMut<[T; LANES]>, + T: SimdElement, + LaneCount<LANES>: SupportedLaneCount,

🔬This is a nightly-only experimental API. (portable_simd)

Split a mutable slice into a mutable prefix, a middle of aligned SIMD types, +and a mutable suffix.

+

This is a safe wrapper around slice::align_to_mut, so inherits the same +guarantees as that method.

+

This is the mutable version of slice::as_simd; see that for examples.

+
§Panics
+

This will panic if the size of the SIMD type is different from +LANES times that of the scalar.

+

At the time of writing, the trait restrictions on Simd<T, LANES> keeps +that from ever happening, as only power-of-two numbers of lanes are +supported. It’s possible that, in the future, those restrictions might +be lifted in a way that would make it possible to see panics from this +method for something like LANES == 3.

+
source

pub fn is_sorted(&self) -> bool
where + T: PartialOrd,

🔬This is a nightly-only experimental API. (is_sorted)

Checks if the elements of this slice are sorted.

+

That is, for each element a and its following element b, a <= b must hold. If the +slice yields exactly zero or one element, true is returned.

+

Note that if Self::Item is only PartialOrd, but not Ord, the above definition +implies that this function returns false if any two consecutive items are not +comparable.

+
§Examples
+
#![feature(is_sorted)]
+let empty: [i32; 0] = [];
+
+assert!([1, 2, 2, 9].is_sorted());
+assert!(![1, 3, 2, 4].is_sorted());
+assert!([0].is_sorted());
+assert!(empty.is_sorted());
+assert!(![0.0, 1.0, f32::NAN].is_sorted());
+
source

pub fn is_sorted_by<'a, F>(&'a self, compare: F) -> bool
where + F: FnMut(&'a T, &'a T) -> bool,

🔬This is a nightly-only experimental API. (is_sorted)

Checks if the elements of this slice are sorted using the given comparator function.

+

Instead of using PartialOrd::partial_cmp, this function uses the given compare +function to determine whether two elements are to be considered in sorted order.

+
§Examples
+
#![feature(is_sorted)]
+
+assert!([1, 2, 2, 9].is_sorted_by(|a, b| a <= b));
+assert!(![1, 2, 2, 9].is_sorted_by(|a, b| a < b));
+
+assert!([0].is_sorted_by(|a, b| true));
+assert!([0].is_sorted_by(|a, b| false));
+
+let empty: [i32; 0] = [];
+assert!(empty.is_sorted_by(|a, b| false));
+assert!(empty.is_sorted_by(|a, b| true));
+
source

pub fn is_sorted_by_key<'a, F, K>(&'a self, f: F) -> bool
where + F: FnMut(&'a T) -> K, + K: PartialOrd,

🔬This is a nightly-only experimental API. (is_sorted)

Checks if the elements of this slice are sorted using the given key extraction function.

+

Instead of comparing the slice’s elements directly, this function compares the keys of the +elements, as determined by f. Apart from that, it’s equivalent to is_sorted; see its +documentation for more information.

+
§Examples
+
#![feature(is_sorted)]
+
+assert!(["c", "bb", "aaa"].is_sorted_by_key(|s| s.len()));
+assert!(![-2i32, -1, 0, 3].is_sorted_by_key(|n| n.abs()));
+
1.52.0 · source

pub fn partition_point<P>(&self, pred: P) -> usize
where + P: FnMut(&T) -> bool,

Returns the index of the partition point according to the given predicate +(the index of the first element of the second partition).

+

The slice is assumed to be partitioned according to the given predicate. +This means that all elements for which the predicate returns true are at the start of the slice +and all elements for which the predicate returns false are at the end. +For example, [7, 15, 3, 5, 4, 12, 6] is partitioned under the predicate x % 2 != 0 +(all odd numbers are at the start, all even at the end).

+

If this slice is not partitioned, the returned result is unspecified and meaningless, +as this method performs a kind of binary search.

+

See also binary_search, binary_search_by, and binary_search_by_key.

+
§Examples
+
let v = [1, 2, 3, 3, 5, 6, 7];
+let i = v.partition_point(|&x| x < 5);
+
+assert_eq!(i, 4);
+assert!(v[..i].iter().all(|&x| x < 5));
+assert!(v[i..].iter().all(|&x| !(x < 5)));
+

If all elements of the slice match the predicate, including if the slice +is empty, then the length of the slice will be returned:

+ +
let a = [2, 4, 8];
+assert_eq!(a.partition_point(|x| x < &100), a.len());
+let a: [i32; 0] = [];
+assert_eq!(a.partition_point(|x| x < &100), 0);
+

If you want to insert an item to a sorted vector, while maintaining +sort order:

+ +
let mut s = vec![0, 1, 1, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55];
+let num = 42;
+let idx = s.partition_point(|&x| x <= num);
+s.insert(idx, num);
+assert_eq!(s, [0, 1, 1, 1, 1, 2, 3, 5, 8, 13, 21, 34, 42, 55]);
+
source

pub fn take<'a, R>(self: &mut &'a [T], range: R) -> Option<&'a [T]>
where + R: OneSidedRange<usize>,

🔬This is a nightly-only experimental API. (slice_take)

Removes the subslice corresponding to the given range +and returns a reference to it.

+

Returns None and does not modify the slice if the given +range is out of bounds.

+

Note that this method only accepts one-sided ranges such as +2.. or ..6, but not 2..6.

+
§Examples
+

Taking the first three elements of a slice:

+ +
#![feature(slice_take)]
+
+let mut slice: &[_] = &['a', 'b', 'c', 'd'];
+let mut first_three = slice.take(..3).unwrap();
+
+assert_eq!(slice, &['d']);
+assert_eq!(first_three, &['a', 'b', 'c']);
+

Taking the last two elements of a slice:

+ +
#![feature(slice_take)]
+
+let mut slice: &[_] = &['a', 'b', 'c', 'd'];
+let mut tail = slice.take(2..).unwrap();
+
+assert_eq!(slice, &['a', 'b']);
+assert_eq!(tail, &['c', 'd']);
+

Getting None when range is out of bounds:

+ +
#![feature(slice_take)]
+
+let mut slice: &[_] = &['a', 'b', 'c', 'd'];
+
+assert_eq!(None, slice.take(5..));
+assert_eq!(None, slice.take(..5));
+assert_eq!(None, slice.take(..=4));
+let expected: &[char] = &['a', 'b', 'c', 'd'];
+assert_eq!(Some(expected), slice.take(..4));
+
source

pub fn take_mut<'a, R>(self: &mut &'a mut [T], range: R) -> Option<&'a mut [T]>
where + R: OneSidedRange<usize>,

🔬This is a nightly-only experimental API. (slice_take)

Removes the subslice corresponding to the given range +and returns a mutable reference to it.

+

Returns None and does not modify the slice if the given +range is out of bounds.

+

Note that this method only accepts one-sided ranges such as +2.. or ..6, but not 2..6.

+
§Examples
+

Taking the first three elements of a slice:

+ +
#![feature(slice_take)]
+
+let mut slice: &mut [_] = &mut ['a', 'b', 'c', 'd'];
+let mut first_three = slice.take_mut(..3).unwrap();
+
+assert_eq!(slice, &mut ['d']);
+assert_eq!(first_three, &mut ['a', 'b', 'c']);
+

Taking the last two elements of a slice:

+ +
#![feature(slice_take)]
+
+let mut slice: &mut [_] = &mut ['a', 'b', 'c', 'd'];
+let mut tail = slice.take_mut(2..).unwrap();
+
+assert_eq!(slice, &mut ['a', 'b']);
+assert_eq!(tail, &mut ['c', 'd']);
+

Getting None when range is out of bounds:

+ +
#![feature(slice_take)]
+
+let mut slice: &mut [_] = &mut ['a', 'b', 'c', 'd'];
+
+assert_eq!(None, slice.take_mut(5..));
+assert_eq!(None, slice.take_mut(..5));
+assert_eq!(None, slice.take_mut(..=4));
+let expected: &mut [_] = &mut ['a', 'b', 'c', 'd'];
+assert_eq!(Some(expected), slice.take_mut(..4));
+
source

pub fn take_first<'a>(self: &mut &'a [T]) -> Option<&'a T>

🔬This is a nightly-only experimental API. (slice_take)

Removes the first element of the slice and returns a reference +to it.

+

Returns None if the slice is empty.

+
§Examples
+
#![feature(slice_take)]
+
+let mut slice: &[_] = &['a', 'b', 'c'];
+let first = slice.take_first().unwrap();
+
+assert_eq!(slice, &['b', 'c']);
+assert_eq!(first, &'a');
+
source

pub fn take_first_mut<'a>(self: &mut &'a mut [T]) -> Option<&'a mut T>

🔬This is a nightly-only experimental API. (slice_take)

Removes the first element of the slice and returns a mutable +reference to it.

+

Returns None if the slice is empty.

+
§Examples
+
#![feature(slice_take)]
+
+let mut slice: &mut [_] = &mut ['a', 'b', 'c'];
+let first = slice.take_first_mut().unwrap();
+*first = 'd';
+
+assert_eq!(slice, &['b', 'c']);
+assert_eq!(first, &'d');
+
source

pub fn take_last<'a>(self: &mut &'a [T]) -> Option<&'a T>

🔬This is a nightly-only experimental API. (slice_take)

Removes the last element of the slice and returns a reference +to it.

+

Returns None if the slice is empty.

+
§Examples
+
#![feature(slice_take)]
+
+let mut slice: &[_] = &['a', 'b', 'c'];
+let last = slice.take_last().unwrap();
+
+assert_eq!(slice, &['a', 'b']);
+assert_eq!(last, &'c');
+
source

pub fn take_last_mut<'a>(self: &mut &'a mut [T]) -> Option<&'a mut T>

🔬This is a nightly-only experimental API. (slice_take)

Removes the last element of the slice and returns a mutable +reference to it.

+

Returns None if the slice is empty.

+
§Examples
+
#![feature(slice_take)]
+
+let mut slice: &mut [_] = &mut ['a', 'b', 'c'];
+let last = slice.take_last_mut().unwrap();
+*last = 'd';
+
+assert_eq!(slice, &['a', 'b']);
+assert_eq!(last, &'d');
+
source

pub unsafe fn get_many_unchecked_mut<const N: usize>( + &mut self, + indices: [usize; N], +) -> [&mut T; N]

🔬This is a nightly-only experimental API. (get_many_mut)

Returns mutable references to many indices at once, without doing any checks.

+

For a safe alternative see get_many_mut.

+
§Safety
+

Calling this method with overlapping or out-of-bounds indices is undefined behavior +even if the resulting references are not used.

+
§Examples
+
#![feature(get_many_mut)]
+
+let x = &mut [1, 2, 4];
+
+unsafe {
+    let [a, b] = x.get_many_unchecked_mut([0, 2]);
+    *a *= 10;
+    *b *= 100;
+}
+assert_eq!(x, &[10, 2, 400]);
+
source

pub fn get_many_mut<const N: usize>( + &mut self, + indices: [usize; N], +) -> Result<[&mut T; N], GetManyMutError<N>>

🔬This is a nightly-only experimental API. (get_many_mut)

Returns mutable references to many indices at once.

+

Returns an error if any index is out-of-bounds, or if the same index was +passed more than once.

+
§Examples
+
#![feature(get_many_mut)]
+
+let v = &mut [1, 2, 3];
+if let Ok([a, b]) = v.get_many_mut([0, 2]) {
+    *a = 413;
+    *b = 612;
+}
+assert_eq!(v, &[413, 2, 612]);
+
1.23.0 · source

pub fn to_ascii_uppercase(&self) -> Vec<u8>

Returns a vector containing a copy of this slice where each byte +is mapped to its ASCII upper case equivalent.

+

ASCII letters ‘a’ to ‘z’ are mapped to ‘A’ to ‘Z’, +but non-ASCII letters are unchanged.

+

To uppercase the value in-place, use make_ascii_uppercase.

+
1.23.0 · source

pub fn to_ascii_lowercase(&self) -> Vec<u8>

Returns a vector containing a copy of this slice where each byte +is mapped to its ASCII lower case equivalent.

+

ASCII letters ‘A’ to ‘Z’ are mapped to ‘a’ to ‘z’, +but non-ASCII letters are unchanged.

+

To lowercase the value in-place, use make_ascii_lowercase.

+
1.0.0 · source

pub fn sort(&mut self)
where + T: Ord,

Sorts the slice, preserving initial order of equal elements.

+

This sort is stable (i.e., does not reorder equal elements) and O(n * log(n)) +worst-case.

+

If T: Ord does not implement a total order the resulting order is unspecified. All +original elements will remain in the slice and any possible modifications via interior +mutability are observed in the input. Same is true if T: Ord panics.

+

When applicable, unstable sorting is preferred because it is generally faster than stable +sorting and it doesn’t allocate auxiliary memory. See +sort_unstable. The exception are partially sorted slices, which +may be better served with slice::sort.

+
§Current implementation
+

The current implementation is based on driftsort by Orson Peters and Lukas Bergdoll, which +combines the fast average case of quicksort with the fast worst case and partial run +detection of mergesort, achieving linear time on fully sorted and reversed inputs. On inputs +with k distinct elements, the expected time to sort the data is O(n * log(k)).

+

The auxiliary memory allocation behavior depends on the input length. Short slices are +handled without allocation, medium sized slices allocate self.len() and beyond that it +clamps at self.len() / 2.

+

If T: Ord does not implement a total order, the implementation may panic.

+
§Examples
+
let mut v = [-5, 4, 1, -3, 2];
+
+v.sort();
+assert!(v == [-5, -3, 1, 2, 4]);
+
1.0.0 · source

pub fn sort_by<F>(&mut self, compare: F)
where + F: FnMut(&T, &T) -> Ordering,

Sorts the slice with a comparator function, preserving initial order of equal elements.

+

This sort is stable (i.e., does not reorder equal elements) and O(n * log(n)) +worst-case.

+

The comparator function should define a total ordering for the elements in the slice. If the +ordering is not total, the order of the elements is unspecified.

+

If the comparator function does not implement a total order the resulting order is +unspecified. All original elements will remain in the slice and any possible modifications +via interior mutability are observed in the input. Same is true if the comparator function +panics. A total order (for all a, b and c):

+
    +
  • total and antisymmetric: exactly one of a < b, a == b or a > b is true, and
  • +
  • transitive, a < b and b < c implies a < c. The same must hold for both == and >.
  • +
+

For example, while f64 doesn’t implement Ord because NaN != NaN, we can use +partial_cmp as our sort function when we know the slice doesn’t contain a NaN.

+ +
let mut floats = [5f64, 4.0, 1.0, 3.0, 2.0];
+floats.sort_unstable_by(|a, b| a.partial_cmp(b).unwrap());
+assert_eq!(floats, [1.0, 2.0, 3.0, 4.0, 5.0]);
+
§Current implementation
+

The current implementation is based on driftsort by Orson Peters and Lukas Bergdoll, which +combines the fast average case of quicksort with the fast worst case and partial run +detection of mergesort, achieving linear time on fully sorted and reversed inputs. On inputs +with k distinct elements, the expected time to sort the data is O(n * log(k)).

+

The auxiliary memory allocation behavior depends on the input length. Short slices are +handled without allocation, medium sized slices allocate self.len() and beyond that it +clamps at self.len() / 2.

+

If T: Ord does not implement a total order, the implementation may panic.

+
§Examples
+
let mut v = [5, 4, 1, 3, 2];
+v.sort_by(|a, b| a.cmp(b));
+assert!(v == [1, 2, 3, 4, 5]);
+
+// reverse sorting
+v.sort_by(|a, b| b.cmp(a));
+assert!(v == [5, 4, 3, 2, 1]);
+
1.7.0 · source

pub fn sort_by_key<K, F>(&mut self, f: F)
where + F: FnMut(&T) -> K, + K: Ord,

Sorts the slice with a key extraction function, preserving initial order of equal elements.

+

This sort is stable (i.e., does not reorder equal elements) and O(m * n * log(n)) +worst-case, where the key function is O(m).

+

If K: Ord does not implement a total order the resulting order is unspecified. +All original elements will remain in the slice and any possible modifications via interior +mutability are observed in the input. Same is true if K: Ord panics.

+
§Current implementation
+

The current implementation is based on driftsort by Orson Peters and Lukas Bergdoll, which +combines the fast average case of quicksort with the fast worst case and partial run +detection of mergesort, achieving linear time on fully sorted and reversed inputs. On inputs +with k distinct elements, the expected time to sort the data is O(n * log(k)).

+

The auxiliary memory allocation behavior depends on the input length. Short slices are +handled without allocation, medium sized slices allocate self.len() and beyond that it +clamps at self.len() / 2.

+

If K: Ord does not implement a total order, the implementation may panic.

+
§Examples
+
let mut v = [-5i32, 4, 1, -3, 2];
+
+v.sort_by_key(|k| k.abs());
+assert!(v == [1, 2, -3, 4, -5]);
+
1.34.0 · source

pub fn sort_by_cached_key<K, F>(&mut self, f: F)
where + F: FnMut(&T) -> K, + K: Ord,

Sorts the slice with a key extraction function, preserving initial order of equal elements.

+

This sort is stable (i.e., does not reorder equal elements) and O(m * n + n * +log(n)) worst-case, where the key function is O(m).

+

During sorting, the key function is called at most once per element, by using temporary +storage to remember the results of key evaluation. The order of calls to the key function is +unspecified and may change in future versions of the standard library.

+

If K: Ord does not implement a total order the resulting order is unspecified. +All original elements will remain in the slice and any possible modifications via interior +mutability are observed in the input. Same is true if K: Ord panics.

+

For simple key functions (e.g., functions that are property accesses or basic operations), +sort_by_key is likely to be faster.

+
§Current implementation
+

The current implementation is based on instruction-parallel-network sort by Lukas +Bergdoll, which combines the fast average case of randomized quicksort with the fast worst +case of heapsort, while achieving linear time on fully sorted and reversed inputs. And +O(k * log(n)) where k is the number of distinct elements in the input. It leverages +superscalar out-of-order execution capabilities commonly found in CPUs, to efficiently +perform the operation.

+

In the worst case, the algorithm allocates temporary storage in a Vec<(K, usize)> the +length of the slice.

+
§Examples
+
let mut v = [-5i32, 4, 32, -3, 2];
+
+v.sort_by_cached_key(|k| k.to_string());
+assert!(v == [-3, -5, 2, 32, 4]);
+
1.0.0 · source

pub fn to_vec(&self) -> Vec<T>
where + T: Clone,

Copies self into a new Vec.

+
§Examples
+
let s = [10, 40, 30];
+let x = s.to_vec();
+// Here, `s` and `x` can be modified independently.
+
source

pub fn to_vec_in<A>(&self, alloc: A) -> Vec<T, A>
where + A: Allocator, + T: Clone,

🔬This is a nightly-only experimental API. (allocator_api)

Copies self into a new Vec with an allocator.

+
§Examples
+
#![feature(allocator_api)]
+
+use std::alloc::System;
+
+let s = [10, 40, 30];
+let x = s.to_vec_in(System);
+// Here, `s` and `x` can be modified independently.
+
1.40.0 · source

pub fn repeat(&self, n: usize) -> Vec<T>
where + T: Copy,

Creates a vector by copying a slice n times.

+
§Panics
+

This function will panic if the capacity would overflow.

+
§Examples
+

Basic usage:

+ +
assert_eq!([1, 2].repeat(3), vec![1, 2, 1, 2, 1, 2]);
+

A panic upon overflow:

+ +
// this will panic at runtime
+b"0123456789abcdef".repeat(usize::MAX);
+
1.0.0 · source

pub fn concat<Item>(&self) -> <[T] as Concat<Item>>::Output
where + [T]: Concat<Item>, + Item: ?Sized,

Flattens a slice of T into a single value Self::Output.

+
§Examples
+
assert_eq!(["hello", "world"].concat(), "helloworld");
+assert_eq!([[1, 2], [3, 4]].concat(), [1, 2, 3, 4]);
+
1.3.0 · source

pub fn join<Separator>( + &self, + sep: Separator, +) -> <[T] as Join<Separator>>::Output
where + [T]: Join<Separator>,

Flattens a slice of T into a single value Self::Output, placing a +given separator between each.

+
§Examples
+
assert_eq!(["hello", "world"].join(" "), "hello world");
+assert_eq!([[1, 2], [3, 4]].join(&0), [1, 2, 0, 3, 4]);
+assert_eq!([[1, 2], [3, 4]].join(&[0, 0][..]), [1, 2, 0, 0, 3, 4]);
+
1.0.0 · source

pub fn connect<Separator>( + &self, + sep: Separator, +) -> <[T] as Join<Separator>>::Output
where + [T]: Join<Separator>,

👎Deprecated since 1.3.0: renamed to join

Flattens a slice of T into a single value Self::Output, placing a +given separator between each.

+
§Examples
+
assert_eq!(["hello", "world"].connect(" "), "hello world");
+assert_eq!([[1, 2], [3, 4]].connect(&0), [1, 2, 0, 3, 4]);
+

Trait Implementations§

§

impl<T> Clone for NEVec<T>
where + T: Clone + Debug,

§

fn clone(&self) -> NEVec<T>

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
§

impl<T> Debug for NEVec<T>
where + T: Debug,

§

fn fmt(&self, formatter: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
§

impl<T> Default for NEVec<T>
where + T: Default + Debug,

§

fn default() -> NEVec<T>

Returns the “default value” for a type. Read more
§

impl<T> Deref for NEVec<T>
where + T: Debug,

§

type Target = Vec<T>

The resulting type after dereferencing.
§

fn deref(&self) -> &<NEVec<T> as Deref>::Target

Dereferences the value.
§

impl<'de, T> Deserialize<'de> for NEVec<T>
where + T: Debug + Deserialize<'de>,

§

fn deserialize<__D>( + __deserializer: __D, +) -> Result<NEVec<T>, <__D as Deserializer<'de>>::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
§

impl<T> Hash for NEVec<T>
where + T: Hash + Debug,

§

fn hash<__H>(&self, state: &mut __H)
where + __H: Hasher,

Feeds this value into the given Hasher. Read more
1.3.0 · source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
§

impl<T> PartialEq for NEVec<T>
where + T: PartialEq + Debug,

§

fn eq(&self, other: &NEVec<T>) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
§

impl<T> Serialize for NEVec<T>
where + T: Debug + Serialize,

§

fn serialize<__S>( + &self, + __serializer: __S, +) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
§

impl<T> Eq for NEVec<T>
where + T: Eq + Debug,

§

impl<T> StructuralPartialEq for NEVec<T>
where + T: Debug,

Auto Trait Implementations§

§

impl<T> Freeze for NEVec<T>

§

impl<T> RefUnwindSafe for NEVec<T>
where + T: RefUnwindSafe,

§

impl<T> Send for NEVec<T>
where + T: Send,

§

impl<T> Sync for NEVec<T>
where + T: Sync,

§

impl<T> Unpin for NEVec<T>
where + T: Unpin,

§

impl<T> UnwindSafe for NEVec<T>
where + T: UnwindSafe,

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CallHasher for T
where + T: Hash + ?Sized,

§

default fn get_hash<H, B>(value: &H, build_hasher: &B) -> u64
where + H: Hash + ?Sized, + B: BuildHasher,

source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_test_utils/prelude/enum.JValue.html b/air_test_utils/prelude/enum.JValue.html new file mode 100644 index 00000000..ecda9693 --- /dev/null +++ b/air_test_utils/prelude/enum.JValue.html @@ -0,0 +1,338 @@ +JValue in air_test_utils::prelude - Rust

Enum air_test_utils::prelude::JValue

source ·
pub enum JValue {
+    Null,
+    Bool(bool),
+    Number(Number),
+    String(Rc<str>),
+    Array(Rc<[JValue]>),
+    Object(Rc<BTreeMap<Rc<str>, JValue>>),
+}
Expand description

Represents any valid JSON value with a cheap to clone Rc-based representation.

+

Variants§

§

Null

Represents a JSON null value.

+
§

Bool(bool)

Represents a JSON boolean.

+
§

Number(Number)

Represents a JSON number, whether integer or floating point.

+
§

String(Rc<str>)

Represents a JSON string.

+
§

Array(Rc<[JValue]>)

Represents a JSON array.

+
§

Object(Rc<BTreeMap<Rc<str>, JValue>>)

Represents a JSON object.

+

By default the map is backed by a BTreeMap. Enable the preserve_order +feature of serde_json to use IndexMap instead, which preserves +entries in the order they are inserted into the map. In particular, this +allows JSON data to be deserialized into a JValue and serialized to a +string while retaining the order of map keys in the input.

+

Implementations§

source§

impl JValue

source

pub fn string(s: impl Into<Rc<str>>) -> JValue

source

pub fn array(vec: impl Into<Rc<[JValue]>>) -> JValue

source

pub fn array_from_iter( + into_iter: impl IntoIterator<Item = impl Into<JValue>>, +) -> JValue

source

pub fn object(map: impl Into<BTreeMap<Rc<str>, JValue>>) -> JValue

source

pub fn object_from_pairs( + into_iter: impl IntoIterator<Item = (impl Into<Rc<str>>, impl Into<JValue>)>, +) -> JValue

source

pub fn get<I>(&self, index: I) -> Option<&JValue>
where + I: Index,

Index into a JSON array or map. A string index can be used to access a +value in a map, and a usize index can be used to access an element of an +array.

+

Returns None if the type of self does not match the type of the +index, for example if the index is a string and self is an array or a +number. Also returns None if the given key does not exist in the map +or the given index is not within the bounds of the array.

+

Square brackets can also be used to index into a value in a more concise +way. This returns JValue::Null in cases where get would have returned +None.

+
source

pub fn is_object(&self) -> bool

Returns true if the JValue is an Object. Returns false otherwise.

+

For any JValue on which is_object returns true, as_object and +as_object_mut are guaranteed to return the map representation of the +object.

+
source

pub fn as_object(&self) -> Option<&BTreeMap<Rc<str>, JValue>>

If the JValue is an Object, returns the associated Map. Returns None +otherwise.

+
source

pub fn is_array(&self) -> bool

Returns true if the JValue is an Array. Returns false otherwise.

+

For any JValue on which is_array returns true, as_array and +as_array_mut are guaranteed to return the vector representing the +array.

+
source

pub fn as_array(&self) -> Option<&[JValue]>

If the JValue is an Array, returns the associated vector. Returns None +otherwise.

+
source

pub fn is_string(&self) -> bool

Returns true if the JValue is a String. Returns false otherwise.

+

For any JValue on which is_string returns true, as_str is guaranteed +to return the string slice.

+
source

pub fn as_str(&self) -> Option<&Rc<str>>

If the JValue is a string, returns the associated str. Returns None +otherwise.

+
source

pub fn is_number(&self) -> bool

Returns true if the JValue is a Number. Returns false otherwise.

+
source

pub fn as_number(&self) -> Option<&Number>

If the JValue is a Number, returns the associated Number. Returns +None otherwise.

+
source

pub fn is_i64(&self) -> bool

Returns true if the JValue is an integer between i64::MIN and +i64::MAX.

+

For any JValue on which is_i64 returns true, as_i64 is guaranteed to +return the integer value.

+
source

pub fn is_u64(&self) -> bool

Returns true if the JValue is an integer between zero and u64::MAX.

+

For any JValue on which is_u64 returns true, as_u64 is guaranteed to +return the integer value.

+
source

pub fn is_f64(&self) -> bool

Returns true if the JValue is a number that can be represented by f64.

+

For any JValue on which is_f64 returns true, as_f64 is guaranteed to +return the floating point value.

+

Currently this function returns true if and only if both is_i64 and +is_u64 return false but this is not a guarantee in the future.

+
source

pub fn as_i64(&self) -> Option<i64>

If the JValue is an integer, represent it as i64 if possible. Returns +None otherwise.

+
source

pub fn as_u64(&self) -> Option<u64>

If the JValue is an integer, represent it as u64 if possible. Returns +None otherwise.

+
source

pub fn as_f64(&self) -> Option<f64>

If the JValue is a number, represent it as f64 if possible. Returns +None otherwise.

+
source

pub fn is_boolean(&self) -> bool

Returns true if the JValue is a Boolean. Returns false otherwise.

+

For any JValue on which is_boolean returns true, as_bool is +guaranteed to return the boolean value.

+
source

pub fn as_bool(&self) -> Option<bool>

If the JValue is a Boolean, returns the associated bool. Returns None +otherwise.

+
source

pub fn is_null(&self) -> bool

Returns true if the JValue is a Null. Returns false otherwise.

+

For any JValue on which is_null returns true, as_null is guaranteed +to return Some(()).

+
source

pub fn as_null(&self) -> Option<()>

If the JValue is a Null, returns (). Returns None otherwise.

+
source

pub fn pointer(&self, pointer: &str) -> Option<&JValue>

Looks up a value by a JSON Pointer.

+

JSON Pointer defines a string syntax for identifying a specific value +within a JavaScript Object Notation (JSON) document.

+

A Pointer is a Unicode string with the reference tokens separated by /. +Inside tokens / is replaced by ~1 and ~ is replaced by ~0. The +addressed value is returned and if there is no such value None is +returned.

+

For more information read RFC6901.

+
source

pub fn take(&mut self) -> JValue

Takes the value out of the JValue, leaving a Null in its place.

+

Trait Implementations§

source§

impl Clone for JValue

source§

fn clone(&self) -> JValue

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for JValue

source§

fn fmt(&self, formatter: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
source§

impl Default for JValue

The default value is JValue::Null.

+
source§

fn default() -> JValue

Returns the “default value” for a type. Read more
source§

impl<'de> Deserialize<'de> for JValue

source§

fn deserialize<D>( + deserializer: D, +) -> Result<JValue, <D as Deserializer<'de>>::Error>
where + D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl Display for JValue

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Display a JSON value as a string.

+
source§

impl<T> From<&[T]> for JValue
where + T: Clone + Into<JValue>,

source§

fn from(f: &[T]) -> JValue

Convert a slice to JValue::Array.

+
§Examples
+
use air_interpreter_value::JValue;
+
+let v: &[&str] = &["lorem", "ipsum", "dolor"];
+let x: JValue = v.into();
+
source§

impl From<&Number> for JValue

source§

fn from(number: &Number) -> JValue

Converts to this type from the input type.
source§

impl From<&Value> for JValue

source§

fn from(value: &Value) -> JValue

Converts to this type from the input type.
source§

impl From<&str> for JValue

source§

fn from(f: &str) -> JValue

Convert string slice to JValue::String.

+
§Examples
+
use air_interpreter_value::JValue;
+
+let s: &str = "lorem";
+let x: JValue = s.into();
+
source§

impl From<()> for JValue

source§

fn from(_: ()) -> JValue

Convert () to JValue::Null.

+
§Examples
+
use air_interpreter_value::JValue;
+
+let u = ();
+let x: JValue = u.into();
+
source§

impl From<BTreeMap<Rc<str>, JValue>> for JValue

source§

fn from(f: BTreeMap<Rc<str>, JValue>) -> JValue

Convert map (with string keys) to JValue::Object.

+
§Examples
+
use air_interpreter_value::{Map, JValue, JsonString};
+
+let mut m = Map::<JsonString, JValue>::new();
+m.insert("Lorem".into(), "ipsum".into());
+let x: JValue = m.into();
+
source§

impl<'a> From<Cow<'a, str>> for JValue

source§

fn from(f: Cow<'a, str>) -> JValue

Convert copy-on-write string to JValue::String.

+
§Examples
+
use air_interpreter_value::JValue;
+use std::borrow::Cow;
+
+let s: Cow<str> = Cow::Borrowed("lorem");
+let x: JValue = s.into();
+ +
use air_interpreter_value::JValue;
+use std::borrow::Cow;
+
+let s: Cow<str> = Cow::Owned("lorem".to_string());
+let x: JValue = s.into();
+
source§

impl<K, V> From<HashMap<K, V>> for JValue
where + K: Into<Rc<str>>, + V: Into<JValue>,

source§

fn from(f: HashMap<K, V>) -> JValue

Convert map (with string keys) to JValue::Object.

+
§Examples
+
use air_interpreter_value::JValue;
+use std::collections::HashMap;
+
+let mut m = HashMap::<&str, &str>::new();
+m.insert("Lorem", "ipsum");
+let x: JValue = m.into();
+
source§

impl From<JValue> for RawValue

source§

fn from(value: JValue) -> RawValue

Converts to this type from the input type.
source§

impl From<Number> for JValue

source§

fn from(f: Number) -> JValue

Convert serde_json::Number to JValue::Number.

+
§Examples
+
use serde_json::Number;
+use air_interpreter_value::JValue;
+
+let n = Number::from(7);
+let x: JValue = n.into();
+
source§

impl<T> From<Option<T>> for JValue
where + T: Into<JValue>,

source§

fn from(opt: Option<T>) -> JValue

Converts to this type from the input type.
source§

impl From<Rc<str>> for JValue

source§

fn from(f: Rc<str>) -> JValue

Convert JsonString to JValue::String.

+
§Examples
+
use air_interpreter_value::JValue;
+
+let s: String = "lorem".to_string();
+let x: JValue = s.into();
+
§

impl From<StreamMapKey> for JValue

§

fn from(value: StreamMapKey) -> JValue

Converts to this type from the input type.
source§

impl From<String> for JValue

source§

fn from(f: String) -> JValue

Convert String to JValue::String.

+
§Examples
+
use air_interpreter_value::JValue;
+
+let s: String = "lorem".to_string();
+let x: JValue = s.into();
+
source§

impl From<Value> for JValue

source§

fn from(value: Value) -> JValue

Converts to this type from the input type.
source§

impl<T> From<Vec<T>> for JValue
where + T: Into<JValue>,

source§

fn from(f: Vec<T>) -> JValue

Convert a Vec to JValue::Array.

+
§Examples
+
use air_interpreter_value::JValue;
+
+let v = vec!["lorem", "ipsum", "dolor"];
+let x: JValue = v.into();
+
source§

impl From<bool> for JValue

source§

fn from(f: bool) -> JValue

Convert boolean to JValue::Bool.

+
§Examples
+
use air_interpreter_value::JValue;
+
+let b = false;
+let x: JValue = b.into();
+
source§

impl From<f32> for JValue

source§

fn from(f: f32) -> JValue

Convert 32-bit floating point number to JValue::Number, or +JValue::Null if infinite or NaN.

+
§Examples
+
use air_interpreter_value::JValue;
+
+let f: f32 = 13.37;
+let x: JValue = f.into();
+
source§

impl From<f64> for JValue

source§

fn from(f: f64) -> JValue

Convert 64-bit floating point number to JValue::Number, or +JValue::Null if infinite or NaN.

+
§Examples
+
use air_interpreter_value::JValue;
+
+let f: f64 = 13.37;
+let x: JValue = f.into();
+
source§

impl From<i16> for JValue

source§

fn from(n: i16) -> JValue

Converts to this type from the input type.
source§

impl From<i32> for JValue

source§

fn from(n: i32) -> JValue

Converts to this type from the input type.
source§

impl From<i64> for JValue

source§

fn from(n: i64) -> JValue

Converts to this type from the input type.
source§

impl From<i8> for JValue

source§

fn from(n: i8) -> JValue

Converts to this type from the input type.
source§

impl From<isize> for JValue

source§

fn from(n: isize) -> JValue

Converts to this type from the input type.
source§

impl From<u16> for JValue

source§

fn from(n: u16) -> JValue

Converts to this type from the input type.
source§

impl From<u32> for JValue

source§

fn from(n: u32) -> JValue

Converts to this type from the input type.
source§

impl From<u64> for JValue

source§

fn from(n: u64) -> JValue

Converts to this type from the input type.
source§

impl From<u8> for JValue

source§

fn from(n: u8) -> JValue

Converts to this type from the input type.
source§

impl From<usize> for JValue

source§

fn from(n: usize) -> JValue

Converts to this type from the input type.
source§

impl<K, V> FromIterator<(K, V)> for JValue
where + K: Into<Rc<str>>, + V: Into<JValue>,

source§

fn from_iter<I>(iter: I) -> JValue
where + I: IntoIterator<Item = (K, V)>,

Create a JValue::Object by collecting an iterator of key-value pairs.

+
§Examples
+
use air_interpreter_value::JValue;
+
+let v: Vec<_> = vec![("lorem", 40), ("ipsum", 2)];
+let x: JValue = v.into_iter().collect();
+
source§

impl<T> FromIterator<T> for JValue
where + T: Into<JValue>,

source§

fn from_iter<I>(iter: I) -> JValue
where + I: IntoIterator<Item = T>,

Create a JValue::Array by collecting an iterator of array elements.

+
§Examples
+
use air_interpreter_value::JValue;
+
+let v = std::iter::repeat(42).take(5);
+let x: JValue = v.collect();
+ +
use air_interpreter_value::JValue;
+
+let v: Vec<_> = vec!["lorem", "ipsum", "dolor"];
+let x: JValue = v.into_iter().collect();
+ +
use std::iter::FromIterator;
+use air_interpreter_value::JValue;
+
+let x: JValue = JValue::from_iter(vec!["lorem", "ipsum", "dolor"]);
+
source§

impl<I> Index<I> for JValue
where + I: Index,

source§

fn index(&self, index: I) -> &JValue

Index into a air_interpreter_value::JValue using the syntax value[0] or +value["k"].

+

Returns JValue::Null if the type of self does not match the type of +the index, for example if the index is a string and self is an array +or a number. Also returns JValue::Null if the given key does not exist +in the map or the given index is not within the bounds of the array.

+

For retrieving deeply nested values, you should have a look at the +JValue::pointer method.

+
§

type Output = JValue

The returned type after indexing.
source§

impl PartialEq<&str> for JValue

source§

fn eq(&self, other: &&str) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl PartialEq<JValue> for &str

source§

fn eq(&self, other: &JValue) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl PartialEq<JValue> for str

source§

fn eq(&self, other: &JValue) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl PartialEq<String> for JValue

source§

fn eq(&self, other: &String) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl<'a> PartialEq<bool> for &'a JValue

source§

fn eq(&self, other: &bool) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl PartialEq<bool> for JValue

source§

fn eq(&self, other: &bool) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl<'a> PartialEq<f32> for &'a JValue

source§

fn eq(&self, other: &f32) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl PartialEq<f32> for JValue

source§

fn eq(&self, other: &f32) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl<'a> PartialEq<f64> for &'a JValue

source§

fn eq(&self, other: &f64) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl PartialEq<f64> for JValue

source§

fn eq(&self, other: &f64) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl<'a> PartialEq<i16> for &'a JValue

source§

fn eq(&self, other: &i16) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl PartialEq<i16> for JValue

source§

fn eq(&self, other: &i16) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl<'a> PartialEq<i32> for &'a JValue

source§

fn eq(&self, other: &i32) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl PartialEq<i32> for JValue

source§

fn eq(&self, other: &i32) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl<'a> PartialEq<i64> for &'a JValue

source§

fn eq(&self, other: &i64) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl PartialEq<i64> for JValue

source§

fn eq(&self, other: &i64) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl<'a> PartialEq<i8> for &'a JValue

source§

fn eq(&self, other: &i8) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl PartialEq<i8> for JValue

source§

fn eq(&self, other: &i8) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl<'a> PartialEq<isize> for &'a JValue

source§

fn eq(&self, other: &isize) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl PartialEq<isize> for JValue

source§

fn eq(&self, other: &isize) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl PartialEq<str> for JValue

source§

fn eq(&self, other: &str) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl<'a> PartialEq<u16> for &'a JValue

source§

fn eq(&self, other: &u16) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl PartialEq<u16> for JValue

source§

fn eq(&self, other: &u16) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl<'a> PartialEq<u32> for &'a JValue

source§

fn eq(&self, other: &u32) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl PartialEq<u32> for JValue

source§

fn eq(&self, other: &u32) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl<'a> PartialEq<u64> for &'a JValue

source§

fn eq(&self, other: &u64) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl PartialEq<u64> for JValue

source§

fn eq(&self, other: &u64) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl<'a> PartialEq<u8> for &'a JValue

source§

fn eq(&self, other: &u8) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl PartialEq<u8> for JValue

source§

fn eq(&self, other: &u8) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl<'a> PartialEq<usize> for &'a JValue

source§

fn eq(&self, other: &usize) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl PartialEq<usize> for JValue

source§

fn eq(&self, other: &usize) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl PartialEq for JValue

source§

fn eq(&self, other: &JValue) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl Serialize for JValue

source§

fn serialize<S>( + &self, + serializer: S, +) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error>
where + S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Eq for JValue

source§

impl StructuralPartialEq for JValue

Auto Trait Implementations§

§

impl Freeze for JValue

§

impl RefUnwindSafe for JValue

§

impl !Send for JValue

§

impl !Sync for JValue

§

impl Unpin for JValue

§

impl UnwindSafe for JValue

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_test_utils/prelude/index.html b/air_test_utils/prelude/index.html new file mode 100644 index 00000000..cc331b8a --- /dev/null +++ b/air_test_utils/prelude/index.html @@ -0,0 +1 @@ +air_test_utils::prelude - Rust

Module air_test_utils::prelude

source ·

Re-exports§

Macros§

  • Construct a serde_json::Value from a JSON literal.

Enums§

  • Represents any valid JSON value with a cheap to clone Rc-based representation.
\ No newline at end of file diff --git a/air_test_utils/prelude/macro.json!.html b/air_test_utils/prelude/macro.json!.html new file mode 100644 index 00000000..e0dcb6f4 --- /dev/null +++ b/air_test_utils/prelude/macro.json!.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to macro.json.html...

+ + + \ No newline at end of file diff --git a/air_test_utils/prelude/macro.json.html b/air_test_utils/prelude/macro.json.html new file mode 100644 index 00000000..a16e081c --- /dev/null +++ b/air_test_utils/prelude/macro.json.html @@ -0,0 +1,41 @@ +json in air_test_utils::prelude - Rust

Macro air_test_utils::prelude::json

source ·
macro_rules! json {
+    ($($json:tt)+) => { ... };
+}
Expand description

Construct a serde_json::Value from a JSON literal.

+ +
let value = json!({
+    "code": 200,
+    "success": true,
+    "payload": {
+        "features": [
+            "serde",
+            "json"
+        ],
+        "homepage": null
+    }
+});
+

Variables or expressions can be interpolated into the JSON literal. Any type +interpolated into an array element or object value must implement Serde’s +Serialize trait, while any type interpolated into a object key must +implement Into<String>. If the Serialize implementation of the +interpolated type decides to fail, or if the interpolated type contains a +map with non-string keys, the json! macro will panic.

+ +
let code = 200;
+let features = vec!["serde", "json"];
+
+let value = json!({
+    "code": code,
+    "success": code == 200,
+    "payload": {
+        features[0]: features[1]
+    }
+});
+

Trailing commas are allowed inside both arrays and objects.

+ +
let value = json!([
+    "notice",
+    "the",
+    "trailing",
+    "comma -->",
+]);
+
\ No newline at end of file diff --git a/air_test_utils/prelude/sidebar-items.js b/air_test_utils/prelude/sidebar-items.js new file mode 100644 index 00000000..748ce724 --- /dev/null +++ b/air_test_utils/prelude/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"enum":["JValue"],"macro":["json"]}; \ No newline at end of file diff --git a/air_test_utils/raw_outcome/index.html b/air_test_utils/raw_outcome/index.html new file mode 100644 index 00000000..a0e1ec16 --- /dev/null +++ b/air_test_utils/raw_outcome/index.html @@ -0,0 +1 @@ +air_test_utils::raw_outcome - Rust

Module air_test_utils::raw_outcome

source ·

Structs§

  • This struct is very similar to AVMOutcome, but keeps error_code and error_msg for test purposes.
\ No newline at end of file diff --git a/air_test_utils/raw_outcome/sidebar-items.js b/air_test_utils/raw_outcome/sidebar-items.js new file mode 100644 index 00000000..8e993c1f --- /dev/null +++ b/air_test_utils/raw_outcome/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"struct":["RawAVMOutcome"]}; \ No newline at end of file diff --git a/air_test_utils/raw_outcome/struct.RawAVMOutcome.html b/air_test_utils/raw_outcome/struct.RawAVMOutcome.html new file mode 100644 index 00000000..d84c4df0 --- /dev/null +++ b/air_test_utils/raw_outcome/struct.RawAVMOutcome.html @@ -0,0 +1,61 @@ +RawAVMOutcome in air_test_utils::raw_outcome - Rust

Struct air_test_utils::raw_outcome::RawAVMOutcome

source ·
pub struct RawAVMOutcome {
+    pub ret_code: i64,
+    pub error_message: String,
+    pub data: Vec<u8>,
+    pub call_requests: HashMap<u32, CallRequestParams>,
+    pub next_peer_pks: Vec<String>,
+    pub soft_limits_triggering: SoftLimitsTriggering,
+}
Expand description

This struct is very similar to AVMOutcome, but keeps error_code and error_msg for test purposes.

+

Fields§

§ret_code: i64§error_message: String§data: Vec<u8>§call_requests: HashMap<u32, CallRequestParams>§next_peer_pks: Vec<String>§soft_limits_triggering: SoftLimitsTriggering

Implementations§

Trait Implementations§

source§

impl Clone for RawAVMOutcome

source§

fn clone(&self) -> RawAVMOutcome

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for RawAVMOutcome

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
source§

impl<'de> Deserialize<'de> for RawAVMOutcome

source§

fn deserialize<__D>( + __deserializer: __D, +) -> Result<RawAVMOutcome, <__D as Deserializer<'de>>::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl PartialEq for RawAVMOutcome

source§

fn eq(&self, other: &RawAVMOutcome) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl Serialize for RawAVMOutcome

source§

fn serialize<__S>( + &self, + __serializer: __S, +) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Eq for RawAVMOutcome

source§

impl StructuralPartialEq for RawAVMOutcome

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_test_utils/sidebar-items.js b/air_test_utils/sidebar-items.js new file mode 100644 index 00000000..ed8a43d5 --- /dev/null +++ b/air_test_utils/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"constant":["CALL_SERVICE_SUCCESS"],"enum":["AVMError","ArchivedCallResult","ArchivedCanonResult","ArchivedExecutedState","ArchivedProvenance","ArchivedSender","ArchivedValueRef","CallResult","CallResultResolver","CallSeDeErrors","CanonResult","CanonResultResolver","CidStoreVerificationError","DataDeserializationError","ExecutedState","ExecutedStateResolver","HostImportError","IType","IValue","Provenance","ProvenanceResolver","RunnerError","Sender","SenderResolver","ValueRef","ValueRefResolver"],"fn":["check_error","data_from_result","data_version","env_from_result","into_raw_result","is_interpreter_succeded","print_trace","raw_data_from_trace","raw_data_from_trace_with_canon","trace_from_result"],"macro":["_trace_value_body","assert_error_eq","assert_next_pks","call_vm","checked_call_vm","failed","rc","scalar","scalar_tracked","stream","stream_tracked","unused"],"mod":["avm_runner","call_services","executed_state","key_utils","native_test_runner","ne_vec","prelude","raw_outcome","test_runner","verification","wasm_test_runner"],"struct":["AVM","AVMConfig","AVMMemoryStats","AVMOutcome","AVMRuntimeLimits","AnomalyData","ApResult","ApResultResolver","AquaVMRuntimeLimits","ArchivedApResult","ArchivedCallServiceFailed","ArchivedCanonCidAggregate","ArchivedCanonResultCidAggregate","ArchivedCidInfo","ArchivedCidStore","ArchivedExecutionTrace","ArchivedFoldResult","ArchivedFoldSubTraceLore","ArchivedGenerationIdx","ArchivedInterpreterData","ArchivedParResult","ArchivedRawValue","ArchivedServiceResultCidAggregate","ArchivedSubTraceDesc","ArchivedTracePos","CallRequestParams","CallServiceFailed","CallServiceFailedResolver","CallServiceResult","CanonCidAggregate","CanonCidAggregateResolver","CanonResultCidAggregate","CanonResultCidAggregateResolver","CidInfo","CidInfoResolver","CidStore","CidStoreResolver","CidTracker","ErrorAVMOutcome","ExecutionTrace","ExecutionTraceResolver","FoldResult","FoldResultResolver","FoldSubTraceLore","FoldSubTraceLoreResolver","GenerationIdx","GenerationIdxResolver","InterpreterData","InterpreterDataEnvelope","InterpreterDataEnvelopeRepr","InterpreterDataResolver","ParResult","ParResultResolver","ParticleParameters","RawAVMOutcome","RawValue","RawValueResolver","SecurityTetraplet","ServiceResultCidAggregate","ServiceResultCidAggregateResolver","SoftLimitsTriggering","SubTraceDesc","SubTraceDescResolver","TracePos","TracePosResolver","Versions"],"trait":["DataStore"],"type":["AVMDataStore","AVMResult","CallRequests","CallResults","CallServiceClosure","FoldLore","HostExportedFunc","HostImportDescriptor","InterpreterDataEnvelopeFormat","PosType","RunnerResult","TraceLen"]}; \ No newline at end of file diff --git a/air_test_utils/struct.AVM.html b/air_test_utils/struct.AVM.html new file mode 100644 index 00000000..9969f9cc --- /dev/null +++ b/air_test_utils/struct.AVM.html @@ -0,0 +1,52 @@ +AVM in air_test_utils - Rust

Struct air_test_utils::AVM

source ·
pub struct AVM<E, WB>
where + WB: WasmBackend,
{ /* private fields */ }

Implementations§

source§

impl<E, WB> AVM<E, WB>
where + WB: WasmBackend,

source

pub async fn new( + config: AVMConfig<E>, + wasm_backend: WB, +) -> Result<AVM<E, WB>, AVMError<E>>

Create AVM with provided config.

+
source

pub async fn call( + &mut self, + air: impl Into<String>, + data: impl Into<Vec<u8>>, + particle_parameters: ParticleParameters<'_>, + call_results: HashMap<u32, CallServiceResult>, + keypair: &KeyPair, +) -> Result<AVMOutcome, AVMError<E>>

source

pub fn cleanup_data( + &mut self, + particle_id: &str, + current_peer_id: &str, +) -> Result<(), AVMError<E>>

Cleanup data that become obsolete.

+
source

pub fn memory_stats(&self) -> AVMMemoryStats

Return memory stat of an interpreter heap.

+

Auto Trait Implementations§

§

impl<E, WB> !Freeze for AVM<E, WB>

§

impl<E, WB> !RefUnwindSafe for AVM<E, WB>

§

impl<E, WB> Send for AVM<E, WB>

§

impl<E, WB> !Sync for AVM<E, WB>

§

impl<E, WB> Unpin for AVM<E, WB>
where + WB: Unpin, + <WB as WasmBackend>::Store: Unpin,

§

impl<E, WB> !UnwindSafe for AVM<E, WB>

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_test_utils/struct.AVMConfig.html b/air_test_utils/struct.AVMConfig.html new file mode 100644 index 00000000..1b9dc3b8 --- /dev/null +++ b/air_test_utils/struct.AVMConfig.html @@ -0,0 +1,40 @@ +AVMConfig in air_test_utils - Rust

Struct air_test_utils::AVMConfig

source ·
pub struct AVMConfig<E> {
+    pub air_wasm_path: PathBuf,
+    pub max_heap_size: Option<u64>,
+    pub logging_mask: i32,
+    pub data_store: Box<dyn DataStore<Error = E> + Sync + Send>,
+}
Expand description

Describes behaviour of the AVM.

+

Fields§

§air_wasm_path: PathBuf

Path to a AIR interpreter Wasm file.

+
§max_heap_size: Option<u64>

Maximum heap size in bytes available for the interpreter.

+
§logging_mask: i32

Mask used to filter logs, for details see log_utf8_string in fluence-faas.

+
§data_store: Box<dyn DataStore<Error = E> + Sync + Send>

Auto Trait Implementations§

§

impl<E> Freeze for AVMConfig<E>

§

impl<E> !RefUnwindSafe for AVMConfig<E>

§

impl<E> Send for AVMConfig<E>

§

impl<E> Sync for AVMConfig<E>

§

impl<E> Unpin for AVMConfig<E>

§

impl<E> !UnwindSafe for AVMConfig<E>

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_test_utils/struct.AVMMemoryStats.html b/air_test_utils/struct.AVMMemoryStats.html new file mode 100644 index 00000000..168b8218 --- /dev/null +++ b/air_test_utils/struct.AVMMemoryStats.html @@ -0,0 +1,41 @@ +AVMMemoryStats in air_test_utils - Rust

Struct air_test_utils::AVMMemoryStats

source ·
pub struct AVMMemoryStats {
+    pub memory_size: usize,
+    pub total_memory_limit: Option<u64>,
+    pub allocation_rejects: Option<u32>,
+}
Expand description

Return statistic of AVM server Wasm module heap footprint.

+

Fields§

§memory_size: usize

Size of currently used linear memory in bytes. +Please note that linear memory contains not only heap, but globals, shadow stack and so on.

+
§total_memory_limit: Option<u64>

Possibly set max memory size for AVM server.

+
§allocation_rejects: Option<u32>

Number of allocations rejected due to memory limit. +May be not recorded by some backends in Marine.

+

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_test_utils/struct.AVMOutcome.html b/air_test_utils/struct.AVMOutcome.html new file mode 100644 index 00000000..e299eb12 --- /dev/null +++ b/air_test_utils/struct.AVMOutcome.html @@ -0,0 +1,70 @@ +AVMOutcome in air_test_utils - Rust

Struct air_test_utils::AVMOutcome

source ·
pub struct AVMOutcome {
+    pub data: Vec<u8>,
+    pub call_requests: HashMap<u32, CallRequestParams>,
+    pub next_peer_pks: Vec<String>,
+    pub memory_delta: usize,
+    pub execution_time: Duration,
+    pub soft_limits_triggering: SoftLimitsTriggering,
+}

Fields§

§data: Vec<u8>

Contains script data that should be preserved in an executor of this interpreter +regardless of ret_code value.

+
§call_requests: HashMap<u32, CallRequestParams>

Collected parameters of all met call instructions that could be executed on a current peer.

+
§next_peer_pks: Vec<String>

Public keys of peers that should receive data.

+
§memory_delta: usize

Memory in bytes AVM linear heap was extended during execution by.

+
§execution_time: Duration

Time of a particle execution +(it counts only execution time without operations with DataStore and so on)

+
§soft_limits_triggering: SoftLimitsTriggering

To store and convey soft limits triggering flags.

+

Implementations§

source§

impl AVMOutcome

source

pub fn from_raw_outcome( + raw_outcome: RawAVMOutcome, + memory_delta: usize, + execution_time: Duration, +) -> Result<AVMOutcome, ErrorAVMOutcome>

Trait Implementations§

source§

impl Clone for AVMOutcome

source§

fn clone(&self) -> AVMOutcome

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for AVMOutcome

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
source§

impl<'de> Deserialize<'de> for AVMOutcome

source§

fn deserialize<__D>( + __deserializer: __D, +) -> Result<AVMOutcome, <__D as Deserializer<'de>>::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl PartialEq for AVMOutcome

source§

fn eq(&self, other: &AVMOutcome) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl Serialize for AVMOutcome

source§

fn serialize<__S>( + &self, + __serializer: __S, +) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Eq for AVMOutcome

source§

impl StructuralPartialEq for AVMOutcome

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_test_utils/struct.AVMRuntimeLimits.html b/air_test_utils/struct.AVMRuntimeLimits.html new file mode 100644 index 00000000..c804cf31 --- /dev/null +++ b/air_test_utils/struct.AVMRuntimeLimits.html @@ -0,0 +1,44 @@ +AVMRuntimeLimits in air_test_utils - Rust

Struct air_test_utils::AVMRuntimeLimits

source ·
pub struct AVMRuntimeLimits {
+    pub air_size_limit: Option<u64>,
+    pub particle_size_limit: Option<u64>,
+    pub call_result_size_limit: Option<u64>,
+    pub hard_limit_enabled: bool,
+}

Fields§

§air_size_limit: Option<u64>§particle_size_limit: Option<u64>

The particle data size limit.

+
§call_result_size_limit: Option<u64>

This is the limit for the size of service call result.

+
§hard_limit_enabled: bool

This knob controls hard RAM limits behavior for AVMRunner.

+

Implementations§

source§

impl AVMRuntimeLimits

source

pub fn new( + air_size_limit: Option<u64>, + particle_size_limit: Option<u64>, + call_result_size_limit: Option<u64>, + hard_limit_enabled: bool, +) -> AVMRuntimeLimits

Trait Implementations§

source§

impl Default for AVMRuntimeLimits

source§

fn default() -> AVMRuntimeLimits

Returns the “default value” for a type. Read more
source§

impl From<AVMRuntimeLimits> for AquaVMRuntimeLimits

source§

fn from(value: AVMRuntimeLimits) -> AquaVMRuntimeLimits

Converts to this type from the input type.
source§

impl From<TestInitParameters> for AVMRuntimeLimits

source§

fn from(value: TestInitParameters) -> Self

Converts to this type from the input type.

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_test_utils/struct.AnomalyData.html b/air_test_utils/struct.AnomalyData.html new file mode 100644 index 00000000..d66b0293 --- /dev/null +++ b/air_test_utils/struct.AnomalyData.html @@ -0,0 +1,70 @@ +AnomalyData in air_test_utils - Rust

Struct air_test_utils::AnomalyData

source ·
pub struct AnomalyData<'data> {
+    pub air_script: Cow<'data, str>,
+    pub particle: Cow<'data, [u8]>,
+    pub prev_data: Cow<'data, [u8]>,
+    pub current_data: Cow<'data, [u8]>,
+    pub call_results: Cow<'data, [u8]>,
+    pub avm_outcome: Cow<'data, [u8]>,
+    pub execution_time: Duration,
+    pub memory_delta: usize,
+}

Fields§

§air_script: Cow<'data, str>§particle: Cow<'data, [u8]>§prev_data: Cow<'data, [u8]>§current_data: Cow<'data, [u8]>§call_results: Cow<'data, [u8]>§avm_outcome: Cow<'data, [u8]>§execution_time: Duration§memory_delta: usize

Implementations§

source§

impl<'data> AnomalyData<'data>

source

pub fn new( + air_script: &'data str, + particle: &'data [u8], + prev_data: &'data [u8], + current_data: &'data [u8], + call_results: &'data [u8], + avm_outcome: &'data [u8], + execution_time: Duration, + memory_delta: usize, +) -> AnomalyData<'data>

Trait Implementations§

source§

impl<'data> Clone for AnomalyData<'data>

source§

fn clone(&self) -> AnomalyData<'data>

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl<'data> Debug for AnomalyData<'data>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
source§

impl<'de, 'data> Deserialize<'de> for AnomalyData<'data>
where + 'de: 'data,

source§

fn deserialize<__D>( + __deserializer: __D, +) -> Result<AnomalyData<'data>, <__D as Deserializer<'de>>::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl<'data> PartialEq for AnomalyData<'data>

source§

fn eq(&self, other: &AnomalyData<'data>) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl<'data> Serialize for AnomalyData<'data>

source§

fn serialize<__S>( + &self, + __serializer: __S, +) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl<'data> Eq for AnomalyData<'data>

source§

impl<'data> StructuralPartialEq for AnomalyData<'data>

Auto Trait Implementations§

§

impl<'data> Freeze for AnomalyData<'data>

§

impl<'data> RefUnwindSafe for AnomalyData<'data>

§

impl<'data> Send for AnomalyData<'data>

§

impl<'data> Sync for AnomalyData<'data>

§

impl<'data> Unpin for AnomalyData<'data>

§

impl<'data> UnwindSafe for AnomalyData<'data>

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_test_utils/struct.ApResult.html b/air_test_utils/struct.ApResult.html new file mode 100644 index 00000000..ab09926d --- /dev/null +++ b/air_test_utils/struct.ApResult.html @@ -0,0 +1,93 @@ +ApResult in air_test_utils - Rust

Struct air_test_utils::ApResult

source ·
pub struct ApResult {
+    pub res_generations: Vec<GenerationIdx>,
+}
Expand description

Describes result of applying functor apply to streams.

+

Fields§

§res_generations: Vec<GenerationIdx>

Implementations§

source§

impl ApResult

source

pub fn new(res_generation: GenerationIdx) -> ApResult

source

pub fn stub() -> ApResult

Trait Implementations§

source§

impl Archive for ApResult
where + Vec<GenerationIdx>: Archive,

§

type Archived = ArchivedApResult

The archived representation of this type. Read more
§

type Resolver = ApResultResolver

The resolver for this type. It must contain all the additional information from serializing +needed to make the archived type from the normal type.
source§

unsafe fn resolve( + &self, + pos: usize, + resolver: <ApResult as Archive>::Resolver, + out: *mut <ApResult as Archive>::Archived, +)

Creates the archived version of this value at the given position and writes it to the given +output. Read more
source§

impl Clone for ApResult

source§

fn clone(&self) -> ApResult

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for ApResult

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
source§

impl Default for ApResult

source§

fn default() -> ApResult

Returns the “default value” for a type. Read more
source§

impl<'de> Deserialize<'de> for ApResult

source§

fn deserialize<__D>( + __deserializer: __D, +) -> Result<ApResult, <__D as Deserializer<'de>>::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl<__D> Deserialize<ApResult, __D> for <ApResult as Archive>::Archived
where + __D: Fallible + ?Sized, + Vec<GenerationIdx>: Archive, + <Vec<GenerationIdx> as Archive>::Archived: Deserialize<Vec<GenerationIdx>, __D>,

source§

fn deserialize( + &self, + deserializer: &mut __D, +) -> Result<ApResult, <__D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl PartialEq for ApResult

source§

fn eq(&self, other: &ApResult) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl<__S> Serialize<__S> for ApResult
where + __S: Fallible + ?Sized, + Vec<GenerationIdx>: Serialize<__S>,

source§

fn serialize( + &self, + serializer: &mut __S, +) -> Result<<ApResult as Archive>::Resolver, <__S as Fallible>::Error>

Writes the dependencies for the object and returns a resolver that can create the archived +type.
source§

impl Serialize for ApResult

source§

fn serialize<__S>( + &self, + __serializer: __S, +) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Eq for ApResult

source§

impl StructuralPartialEq for ApResult

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
§

impl<T> ArchiveUnsized for T
where + T: Archive,

§

type Archived = <T as Archive>::Archived

The archived counterpart of this type. Unlike Archive, it may be unsized. Read more
§

type MetadataResolver = ()

The resolver for the metadata of this type. Read more
§

unsafe fn resolve_metadata( + &self, + _: usize, + _: <T as ArchiveUnsized>::MetadataResolver, + _: *mut <<T as ArchiveUnsized>::Archived as ArchivePointee>::ArchivedMetadata, +)

Creates the archived version of the metadata for this value at the given position and writes +it to the given output. Read more
§

unsafe fn resolve_unsized( + &self, + from: usize, + to: usize, + resolver: Self::MetadataResolver, + out: *mut RelPtr<Self::Archived, <isize as Archive>::Archived>, +)

Resolves a relative pointer to this value with the given from and to and writes it to +the given output. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
§

impl<T, S> SerializeUnsized<S> for T
where + T: Serialize<S>, + S: Serializer + ?Sized,

§

fn serialize_unsized( + &self, + serializer: &mut S, +) -> Result<usize, <S as Fallible>::Error>

Writes the object and returns the position of the archived type.
§

fn serialize_metadata(&self, _: &mut S) -> Result<(), <S as Fallible>::Error>

Serializes the metadata for the given type.
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_test_utils/struct.ApResultResolver.html b/air_test_utils/struct.ApResultResolver.html new file mode 100644 index 00000000..e601fb7c --- /dev/null +++ b/air_test_utils/struct.ApResultResolver.html @@ -0,0 +1,33 @@ +ApResultResolver in air_test_utils - Rust

Struct air_test_utils::ApResultResolver

source ·
pub struct ApResultResolver
where + Vec<GenerationIdx>: Archive,
{ /* private fields */ }
Expand description

The resolver for an archived ApResult

+

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_test_utils/struct.AquaVMRuntimeLimits.html b/air_test_utils/struct.AquaVMRuntimeLimits.html new file mode 100644 index 00000000..5ae98ff0 --- /dev/null +++ b/air_test_utils/struct.AquaVMRuntimeLimits.html @@ -0,0 +1,47 @@ +AquaVMRuntimeLimits in air_test_utils - Rust

Struct air_test_utils::AquaVMRuntimeLimits

source ·
pub struct AquaVMRuntimeLimits {
+    pub air_size_limit: u64,
+    pub particle_size_limit: u64,
+    pub call_result_size_limit: u64,
+    pub hard_limit_enabled: bool,
+}

Fields§

§air_size_limit: u64§particle_size_limit: u64

The particle data size limit.

+
§call_result_size_limit: u64

This is the limit for the size of service call result.

+
§hard_limit_enabled: bool

This knob controls hard RAM limits behavior for AVMRunner.

+

Implementations§

source§

impl AquaVMRuntimeLimits

source

pub fn new( + air_size_limit: u64, + particle_size_limit: u64, + call_result_size_limit: u64, + hard_limit_enabled: bool, +) -> AquaVMRuntimeLimits

Trait Implementations§

source§

impl Clone for AquaVMRuntimeLimits

source§

fn clone(&self) -> AquaVMRuntimeLimits

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for AquaVMRuntimeLimits

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
source§

impl From<AVMRuntimeLimits> for AquaVMRuntimeLimits

source§

fn from(value: AVMRuntimeLimits) -> AquaVMRuntimeLimits

Converts to this type from the input type.
source§

impl From<TestInitParameters> for AquaVMRuntimeLimits

source§

fn from(value: TestInitParameters) -> Self

Converts to this type from the input type.
source§

impl Copy for AquaVMRuntimeLimits

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
source§

impl<T> CloneToUninit for T
where + T: Copy,

source§

unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_test_utils/struct.ArchivedApResult.html b/air_test_utils/struct.ArchivedApResult.html new file mode 100644 index 00000000..fcd66d59 --- /dev/null +++ b/air_test_utils/struct.ArchivedApResult.html @@ -0,0 +1,43 @@ +ArchivedApResult in air_test_utils - Rust

Struct air_test_utils::ArchivedApResult

source ·
#[repr(C)]
pub struct ArchivedApResult
where + Vec<GenerationIdx>: Archive,
{ + pub res_generations: <Vec<GenerationIdx> as Archive>::Archived, +}
Expand description

An archived ApResult

+

Fields§

§res_generations: <Vec<GenerationIdx> as Archive>::Archived

The archived counterpart of ApResult::res_generations

+

Trait Implementations§

source§

impl<__C> CheckBytes<__C> for ArchivedApResult
where + Vec<GenerationIdx>: Archive, + <Vec<GenerationIdx> as Archive>::Archived: CheckBytes<__C>, + __C: ?Sized,

§

type Error = StructCheckError

The error that may result from checking the type.
source§

unsafe fn check_bytes<'__bytecheck>( + value: *const ArchivedApResult, + context: &mut __C, +) -> Result<&'__bytecheck ArchivedApResult, StructCheckError>

Checks whether the given pointer points to a valid value within the +given context. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_test_utils/struct.ArchivedCallServiceFailed.html b/air_test_utils/struct.ArchivedCallServiceFailed.html new file mode 100644 index 00000000..370f55c2 --- /dev/null +++ b/air_test_utils/struct.ArchivedCallServiceFailed.html @@ -0,0 +1,48 @@ +ArchivedCallServiceFailed in air_test_utils - Rust

Struct air_test_utils::ArchivedCallServiceFailed

source ·
#[repr(C)]
pub struct ArchivedCallServiceFailed
where + i32: Archive, + Rc<String>: Archive,
{ + pub ret_code: <i32 as Archive>::Archived, + pub message: <Rc<String> as Archive>::Archived, +}
Expand description

An archived CallServiceFailed

+

Fields§

§ret_code: <i32 as Archive>::Archived

The archived counterpart of CallServiceFailed::ret_code

+
§message: <Rc<String> as Archive>::Archived

The archived counterpart of CallServiceFailed::message

+

Trait Implementations§

source§

impl<__C> CheckBytes<__C> for ArchivedCallServiceFailed
where + i32: Archive, + Rc<String>: Archive, + <i32 as Archive>::Archived: CheckBytes<__C>, + <Rc<String> as Archive>::Archived: CheckBytes<__C>, + __C: ?Sized,

§

type Error = StructCheckError

The error that may result from checking the type.
source§

unsafe fn check_bytes<'__bytecheck>( + value: *const ArchivedCallServiceFailed, + context: &mut __C, +) -> Result<&'__bytecheck ArchivedCallServiceFailed, StructCheckError>

Checks whether the given pointer points to a valid value within the +given context. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_test_utils/struct.ArchivedCanonCidAggregate.html b/air_test_utils/struct.ArchivedCanonCidAggregate.html new file mode 100644 index 00000000..2efcf947 --- /dev/null +++ b/air_test_utils/struct.ArchivedCanonCidAggregate.html @@ -0,0 +1,53 @@ +ArchivedCanonCidAggregate in air_test_utils - Rust

Struct air_test_utils::ArchivedCanonCidAggregate

source ·
#[repr(C)]
pub struct ArchivedCanonCidAggregate
where + CID<RawValue>: Archive, + CID<SecurityTetraplet>: Archive, + Provenance: Archive,
{ + pub value: <CID<RawValue> as Archive>::Archived, + pub tetraplet: <CID<SecurityTetraplet> as Archive>::Archived, + pub provenance: <Provenance as Archive>::Archived, +}
Expand description

An archived CanonCidAggregate

+

Fields§

§value: <CID<RawValue> as Archive>::Archived

The archived counterpart of CanonCidAggregate::value

+
§tetraplet: <CID<SecurityTetraplet> as Archive>::Archived

The archived counterpart of CanonCidAggregate::tetraplet

+
§provenance: <Provenance as Archive>::Archived

The archived counterpart of CanonCidAggregate::provenance

+

Trait Implementations§

source§

impl<__C> CheckBytes<__C> for ArchivedCanonCidAggregate
where + CID<RawValue>: Archive, + CID<SecurityTetraplet>: Archive, + Provenance: Archive, + <CID<RawValue> as Archive>::Archived: CheckBytes<__C>, + <CID<SecurityTetraplet> as Archive>::Archived: CheckBytes<__C>, + <Provenance as Archive>::Archived: CheckBytes<__C>, + __C: ?Sized,

§

type Error = StructCheckError

The error that may result from checking the type.
source§

unsafe fn check_bytes<'__bytecheck>( + value: *const ArchivedCanonCidAggregate, + context: &mut __C, +) -> Result<&'__bytecheck ArchivedCanonCidAggregate, StructCheckError>

Checks whether the given pointer points to a valid value within the +given context. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_test_utils/struct.ArchivedCanonResultCidAggregate.html b/air_test_utils/struct.ArchivedCanonResultCidAggregate.html new file mode 100644 index 00000000..a8c224a2 --- /dev/null +++ b/air_test_utils/struct.ArchivedCanonResultCidAggregate.html @@ -0,0 +1,48 @@ +ArchivedCanonResultCidAggregate in air_test_utils - Rust
#[repr(C)]
pub struct ArchivedCanonResultCidAggregate
where + CID<SecurityTetraplet>: Archive, + Vec<CID<CanonCidAggregate>>: Archive,
{ + pub tetraplet: <CID<SecurityTetraplet> as Archive>::Archived, + pub values: <Vec<CID<CanonCidAggregate>> as Archive>::Archived, +}
Expand description

Fields§

§tetraplet: <CID<SecurityTetraplet> as Archive>::Archived

The archived counterpart of CanonResultCidAggregate::tetraplet

+
§values: <Vec<CID<CanonCidAggregate>> as Archive>::Archived

The archived counterpart of CanonResultCidAggregate::values

+

Trait Implementations§

source§

impl<__C> CheckBytes<__C> for ArchivedCanonResultCidAggregate
where + CID<SecurityTetraplet>: Archive, + Vec<CID<CanonCidAggregate>>: Archive, + <CID<SecurityTetraplet> as Archive>::Archived: CheckBytes<__C>, + <Vec<CID<CanonCidAggregate>> as Archive>::Archived: CheckBytes<__C>, + __C: ?Sized,

§

type Error = StructCheckError

The error that may result from checking the type.
source§

unsafe fn check_bytes<'__bytecheck>( + value: *const ArchivedCanonResultCidAggregate, + context: &mut __C, +) -> Result<&'__bytecheck ArchivedCanonResultCidAggregate, StructCheckError>

Checks whether the given pointer points to a valid value within the +given context. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_test_utils/struct.ArchivedCidInfo.html b/air_test_utils/struct.ArchivedCidInfo.html new file mode 100644 index 00000000..d6138815 --- /dev/null +++ b/air_test_utils/struct.ArchivedCidInfo.html @@ -0,0 +1,63 @@ +ArchivedCidInfo in air_test_utils - Rust

Struct air_test_utils::ArchivedCidInfo

source ·
#[repr(C)]
pub struct ArchivedCidInfo{ + pub value_store: <CidStore<RawValue> as Archive>::Archived, + pub tetraplet_store: <CidStore<SecurityTetraplet> as Archive>::Archived, + pub canon_element_store: <CidStore<CanonCidAggregate> as Archive>::Archived, + pub canon_result_store: <CidStore<CanonResultCidAggregate> as Archive>::Archived, + pub service_result_store: <CidStore<ServiceResultCidAggregate> as Archive>::Archived, +}
Expand description

An archived CidInfo

+

Fields§

§value_store: <CidStore<RawValue> as Archive>::Archived

The archived counterpart of CidInfo::value_store

+
§tetraplet_store: <CidStore<SecurityTetraplet> as Archive>::Archived

The archived counterpart of CidInfo::tetraplet_store

+
§canon_element_store: <CidStore<CanonCidAggregate> as Archive>::Archived

The archived counterpart of CidInfo::canon_element_store

+
§canon_result_store: <CidStore<CanonResultCidAggregate> as Archive>::Archived

The archived counterpart of CidInfo::canon_result_store

+
§service_result_store: <CidStore<ServiceResultCidAggregate> as Archive>::Archived

The archived counterpart of CidInfo::service_result_store

+

Trait Implementations§

source§

impl<__C> CheckBytes<__C> for ArchivedCidInfo
where + CidStore<RawValue>: Archive, + CidStore<SecurityTetraplet>: Archive, + CidStore<CanonCidAggregate>: Archive, + CidStore<CanonResultCidAggregate>: Archive, + CidStore<ServiceResultCidAggregate>: Archive, + <CidStore<RawValue> as Archive>::Archived: CheckBytes<__C>, + <CidStore<SecurityTetraplet> as Archive>::Archived: CheckBytes<__C>, + <CidStore<CanonCidAggregate> as Archive>::Archived: CheckBytes<__C>, + <CidStore<CanonResultCidAggregate> as Archive>::Archived: CheckBytes<__C>, + <CidStore<ServiceResultCidAggregate> as Archive>::Archived: CheckBytes<__C>, + __C: ?Sized,

§

type Error = StructCheckError

The error that may result from checking the type.
source§

unsafe fn check_bytes<'__bytecheck>( + value: *const ArchivedCidInfo, + context: &mut __C, +) -> Result<&'__bytecheck ArchivedCidInfo, StructCheckError>

Checks whether the given pointer points to a valid value within the +given context. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_test_utils/struct.ArchivedCidStore.html b/air_test_utils/struct.ArchivedCidStore.html new file mode 100644 index 00000000..d0834ff8 --- /dev/null +++ b/air_test_utils/struct.ArchivedCidStore.html @@ -0,0 +1,41 @@ +ArchivedCidStore in air_test_utils - Rust

Struct air_test_utils::ArchivedCidStore

source ·
#[repr(C)]
pub struct ArchivedCidStore<Val>(/* private fields */) +where + With<HashMap<CID<Val>, Rc<Val>>, AsVec>: Archive;
Expand description

An archived CidStore

+

Trait Implementations§

source§

impl<__C, Val> CheckBytes<__C> for ArchivedCidStore<Val>
where + With<HashMap<CID<Val>, Rc<Val>>, AsVec>: Archive, + <With<HashMap<CID<Val>, Rc<Val>>, AsVec> as Archive>::Archived: CheckBytes<__C>, + __C: ?Sized,

§

type Error = TupleStructCheckError

The error that may result from checking the type.
source§

unsafe fn check_bytes<'__bytecheck>( + value: *const ArchivedCidStore<Val>, + context: &mut __C, +) -> Result<&'__bytecheck ArchivedCidStore<Val>, TupleStructCheckError>

Checks whether the given pointer points to a valid value within the +given context. Read more

Auto Trait Implementations§

§

impl<Val> !Freeze for ArchivedCidStore<Val>

§

impl<Val> !RefUnwindSafe for ArchivedCidStore<Val>

§

impl<Val> !Send for ArchivedCidStore<Val>

§

impl<Val> !Sync for ArchivedCidStore<Val>

§

impl<Val> !Unpin for ArchivedCidStore<Val>

§

impl<Val> !UnwindSafe for ArchivedCidStore<Val>

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_test_utils/struct.ArchivedExecutionTrace.html b/air_test_utils/struct.ArchivedExecutionTrace.html new file mode 100644 index 00000000..54d4d3db --- /dev/null +++ b/air_test_utils/struct.ArchivedExecutionTrace.html @@ -0,0 +1,41 @@ +ArchivedExecutionTrace in air_test_utils - Rust

Struct air_test_utils::ArchivedExecutionTrace

source ·
#[repr(C)]
pub struct ArchivedExecutionTrace(/* private fields */) +where + Vec<ExecutedState>: Archive;
Expand description

An archived ExecutionTrace

+

Trait Implementations§

source§

impl<__C> CheckBytes<__C> for ArchivedExecutionTrace
where + Vec<ExecutedState>: Archive, + <Vec<ExecutedState> as Archive>::Archived: CheckBytes<__C>, + __C: ?Sized,

§

type Error = TupleStructCheckError

The error that may result from checking the type.
source§

unsafe fn check_bytes<'__bytecheck>( + value: *const ArchivedExecutionTrace, + context: &mut __C, +) -> Result<&'__bytecheck ArchivedExecutionTrace, TupleStructCheckError>

Checks whether the given pointer points to a valid value within the +given context. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_test_utils/struct.ArchivedFoldResult.html b/air_test_utils/struct.ArchivedFoldResult.html new file mode 100644 index 00000000..cf80a7dd --- /dev/null +++ b/air_test_utils/struct.ArchivedFoldResult.html @@ -0,0 +1,43 @@ +ArchivedFoldResult in air_test_utils - Rust

Struct air_test_utils::ArchivedFoldResult

source ·
#[repr(C)]
pub struct ArchivedFoldResult
where + Vec<FoldSubTraceLore>: Archive,
{ + pub lore: <Vec<FoldSubTraceLore> as Archive>::Archived, +}
Expand description

An archived FoldResult

+

Fields§

§lore: <Vec<FoldSubTraceLore> as Archive>::Archived

The archived counterpart of FoldResult::lore

+

Trait Implementations§

source§

impl<__C> CheckBytes<__C> for ArchivedFoldResult
where + Vec<FoldSubTraceLore>: Archive, + <Vec<FoldSubTraceLore> as Archive>::Archived: CheckBytes<__C>, + __C: ?Sized,

§

type Error = StructCheckError

The error that may result from checking the type.
source§

unsafe fn check_bytes<'__bytecheck>( + value: *const ArchivedFoldResult, + context: &mut __C, +) -> Result<&'__bytecheck ArchivedFoldResult, StructCheckError>

Checks whether the given pointer points to a valid value within the +given context. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_test_utils/struct.ArchivedFoldSubTraceLore.html b/air_test_utils/struct.ArchivedFoldSubTraceLore.html new file mode 100644 index 00000000..75dc4eba --- /dev/null +++ b/air_test_utils/struct.ArchivedFoldSubTraceLore.html @@ -0,0 +1,48 @@ +ArchivedFoldSubTraceLore in air_test_utils - Rust

Struct air_test_utils::ArchivedFoldSubTraceLore

source ·
#[repr(C)]
pub struct ArchivedFoldSubTraceLore
where + TracePos: Archive, + Vec<SubTraceDesc>: Archive,
{ + pub value_pos: <TracePos as Archive>::Archived, + pub subtraces_desc: <Vec<SubTraceDesc> as Archive>::Archived, +}
Expand description

An archived FoldSubTraceLore

+

Fields§

§value_pos: <TracePos as Archive>::Archived

The archived counterpart of FoldSubTraceLore::value_pos

+
§subtraces_desc: <Vec<SubTraceDesc> as Archive>::Archived

The archived counterpart of FoldSubTraceLore::subtraces_desc

+

Trait Implementations§

source§

impl<__C> CheckBytes<__C> for ArchivedFoldSubTraceLore
where + TracePos: Archive, + Vec<SubTraceDesc>: Archive, + <TracePos as Archive>::Archived: CheckBytes<__C>, + <Vec<SubTraceDesc> as Archive>::Archived: CheckBytes<__C>, + __C: ?Sized,

§

type Error = StructCheckError

The error that may result from checking the type.
source§

unsafe fn check_bytes<'__bytecheck>( + value: *const ArchivedFoldSubTraceLore, + context: &mut __C, +) -> Result<&'__bytecheck ArchivedFoldSubTraceLore, StructCheckError>

Checks whether the given pointer points to a valid value within the +given context. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_test_utils/struct.ArchivedGenerationIdx.html b/air_test_utils/struct.ArchivedGenerationIdx.html new file mode 100644 index 00000000..bdd99fa5 --- /dev/null +++ b/air_test_utils/struct.ArchivedGenerationIdx.html @@ -0,0 +1,41 @@ +ArchivedGenerationIdx in air_test_utils - Rust

Struct air_test_utils::ArchivedGenerationIdx

source ·
#[repr(C)]
pub struct ArchivedGenerationIdx(/* private fields */) +where + u32: Archive;
Expand description

An archived GenerationIdx

+

Trait Implementations§

source§

impl<__C> CheckBytes<__C> for ArchivedGenerationIdx
where + u32: Archive, + <u32 as Archive>::Archived: CheckBytes<__C>, + __C: ?Sized,

§

type Error = TupleStructCheckError

The error that may result from checking the type.
source§

unsafe fn check_bytes<'__bytecheck>( + value: *const ArchivedGenerationIdx, + context: &mut __C, +) -> Result<&'__bytecheck ArchivedGenerationIdx, TupleStructCheckError>

Checks whether the given pointer points to a valid value within the +given context. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_test_utils/struct.ArchivedInterpreterData.html b/air_test_utils/struct.ArchivedInterpreterData.html new file mode 100644 index 00000000..94e5f33a --- /dev/null +++ b/air_test_utils/struct.ArchivedInterpreterData.html @@ -0,0 +1,58 @@ +ArchivedInterpreterData in air_test_utils - Rust

Struct air_test_utils::ArchivedInterpreterData

source ·
#[repr(C)]
pub struct ArchivedInterpreterData
where + ExecutionTrace: Archive, + u32: Archive, + CidInfo: Archive, + SignatureStore: Archive,
{ + pub trace: <ExecutionTrace as Archive>::Archived, + pub last_call_request_id: <u32 as Archive>::Archived, + pub cid_info: <CidInfo as Archive>::Archived, + pub signatures: <SignatureStore as Archive>::Archived, +}
Expand description

An archived InterpreterData

+

Fields§

§trace: <ExecutionTrace as Archive>::Archived

The archived counterpart of InterpreterData::trace

+
§last_call_request_id: <u32 as Archive>::Archived

The archived counterpart of InterpreterData::last_call_request_id

+
§cid_info: <CidInfo as Archive>::Archived

The archived counterpart of InterpreterData::cid_info

+
§signatures: <SignatureStore as Archive>::Archived

The archived counterpart of InterpreterData::signatures

+

Trait Implementations§

source§

impl<__C> CheckBytes<__C> for ArchivedInterpreterData
where + ExecutionTrace: Archive, + u32: Archive, + CidInfo: Archive, + SignatureStore: Archive, + <ExecutionTrace as Archive>::Archived: CheckBytes<__C>, + <u32 as Archive>::Archived: CheckBytes<__C>, + <CidInfo as Archive>::Archived: CheckBytes<__C>, + <SignatureStore as Archive>::Archived: CheckBytes<__C>, + __C: ?Sized,

§

type Error = StructCheckError

The error that may result from checking the type.
source§

unsafe fn check_bytes<'__bytecheck>( + value: *const ArchivedInterpreterData, + context: &mut __C, +) -> Result<&'__bytecheck ArchivedInterpreterData, StructCheckError>

Checks whether the given pointer points to a valid value within the +given context. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_test_utils/struct.ArchivedParResult.html b/air_test_utils/struct.ArchivedParResult.html new file mode 100644 index 00000000..53bcc50b --- /dev/null +++ b/air_test_utils/struct.ArchivedParResult.html @@ -0,0 +1,45 @@ +ArchivedParResult in air_test_utils - Rust

Struct air_test_utils::ArchivedParResult

source ·
#[repr(C)]
pub struct ArchivedParResult
where + u32: Archive,
{ + pub left_size: <u32 as Archive>::Archived, + pub right_size: <u32 as Archive>::Archived, +}
Expand description

An archived ParResult

+

Fields§

§left_size: <u32 as Archive>::Archived

The archived counterpart of ParResult::left_size

+
§right_size: <u32 as Archive>::Archived

The archived counterpart of ParResult::right_size

+

Trait Implementations§

source§

impl<__C> CheckBytes<__C> for ArchivedParResult
where + u32: Archive, + <u32 as Archive>::Archived: CheckBytes<__C>, + __C: ?Sized,

§

type Error = StructCheckError

The error that may result from checking the type.
source§

unsafe fn check_bytes<'__bytecheck>( + value: *const ArchivedParResult, + context: &mut __C, +) -> Result<&'__bytecheck ArchivedParResult, StructCheckError>

Checks whether the given pointer points to a valid value within the +given context. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_test_utils/struct.ArchivedRawValue.html b/air_test_utils/struct.ArchivedRawValue.html new file mode 100644 index 00000000..5d0ccde0 --- /dev/null +++ b/air_test_utils/struct.ArchivedRawValue.html @@ -0,0 +1,43 @@ +ArchivedRawValue in air_test_utils - Rust

Struct air_test_utils::ArchivedRawValue

source ·
#[repr(C)]
pub struct ArchivedRawValue
where + Box<str>: Archive, + With<RefCell<Option<JValue>>, Skip>: Archive,
{ /* private fields */ }
Expand description

An archived RawValue

+

Trait Implementations§

source§

impl<__C> CheckBytes<__C> for ArchivedRawValue
where + Box<str>: Archive, + With<RefCell<Option<JValue>>, Skip>: Archive, + <Box<str> as Archive>::Archived: CheckBytes<__C>, + <With<RefCell<Option<JValue>>, Skip> as Archive>::Archived: CheckBytes<__C>, + __C: ?Sized,

§

type Error = StructCheckError

The error that may result from checking the type.
source§

unsafe fn check_bytes<'__bytecheck>( + value: *const ArchivedRawValue, + context: &mut __C, +) -> Result<&'__bytecheck ArchivedRawValue, StructCheckError>

Checks whether the given pointer points to a valid value within the +given context. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_test_utils/struct.ArchivedServiceResultCidAggregate.html b/air_test_utils/struct.ArchivedServiceResultCidAggregate.html new file mode 100644 index 00000000..a672cea2 --- /dev/null +++ b/air_test_utils/struct.ArchivedServiceResultCidAggregate.html @@ -0,0 +1,53 @@ +ArchivedServiceResultCidAggregate in air_test_utils - Rust
#[repr(C)]
pub struct ArchivedServiceResultCidAggregate
where + CID<RawValue>: Archive, + Rc<str>: Archive, + CID<SecurityTetraplet>: Archive,
{ + pub value_cid: <CID<RawValue> as Archive>::Archived, + pub argument_hash: <Rc<str> as Archive>::Archived, + pub tetraplet_cid: <CID<SecurityTetraplet> as Archive>::Archived, +}
Expand description

Fields§

§value_cid: <CID<RawValue> as Archive>::Archived

The archived counterpart of ServiceResultCidAggregate::value_cid

+
§argument_hash: <Rc<str> as Archive>::Archived

The archived counterpart of ServiceResultCidAggregate::argument_hash

+
§tetraplet_cid: <CID<SecurityTetraplet> as Archive>::Archived

The archived counterpart of ServiceResultCidAggregate::tetraplet_cid

+

Trait Implementations§

source§

impl<__C> CheckBytes<__C> for ArchivedServiceResultCidAggregate
where + CID<RawValue>: Archive, + Rc<str>: Archive, + CID<SecurityTetraplet>: Archive, + <CID<RawValue> as Archive>::Archived: CheckBytes<__C>, + <Rc<str> as Archive>::Archived: CheckBytes<__C>, + <CID<SecurityTetraplet> as Archive>::Archived: CheckBytes<__C>, + __C: ?Sized,

§

type Error = StructCheckError

The error that may result from checking the type.
source§

unsafe fn check_bytes<'__bytecheck>( + value: *const ArchivedServiceResultCidAggregate, + context: &mut __C, +) -> Result<&'__bytecheck ArchivedServiceResultCidAggregate, StructCheckError>

Checks whether the given pointer points to a valid value within the +given context. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_test_utils/struct.ArchivedSubTraceDesc.html b/air_test_utils/struct.ArchivedSubTraceDesc.html new file mode 100644 index 00000000..ba77f95a --- /dev/null +++ b/air_test_utils/struct.ArchivedSubTraceDesc.html @@ -0,0 +1,48 @@ +ArchivedSubTraceDesc in air_test_utils - Rust

Struct air_test_utils::ArchivedSubTraceDesc

source ·
#[repr(C)]
pub struct ArchivedSubTraceDesc
where + TracePos: Archive, + u32: Archive,
{ + pub begin_pos: <TracePos as Archive>::Archived, + pub subtrace_len: <u32 as Archive>::Archived, +}
Expand description

An archived SubTraceDesc

+

Fields§

§begin_pos: <TracePos as Archive>::Archived

The archived counterpart of SubTraceDesc::begin_pos

+
§subtrace_len: <u32 as Archive>::Archived

The archived counterpart of SubTraceDesc::subtrace_len

+

Trait Implementations§

source§

impl<__C> CheckBytes<__C> for ArchivedSubTraceDesc
where + TracePos: Archive, + u32: Archive, + <TracePos as Archive>::Archived: CheckBytes<__C>, + <u32 as Archive>::Archived: CheckBytes<__C>, + __C: ?Sized,

§

type Error = StructCheckError

The error that may result from checking the type.
source§

unsafe fn check_bytes<'__bytecheck>( + value: *const ArchivedSubTraceDesc, + context: &mut __C, +) -> Result<&'__bytecheck ArchivedSubTraceDesc, StructCheckError>

Checks whether the given pointer points to a valid value within the +given context. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_test_utils/struct.ArchivedTracePos.html b/air_test_utils/struct.ArchivedTracePos.html new file mode 100644 index 00000000..72e1d7b1 --- /dev/null +++ b/air_test_utils/struct.ArchivedTracePos.html @@ -0,0 +1,41 @@ +ArchivedTracePos in air_test_utils - Rust

Struct air_test_utils::ArchivedTracePos

source ·
#[repr(C)]
pub struct ArchivedTracePos(/* private fields */) +where + u32: Archive;
Expand description

An archived TracePos

+

Trait Implementations§

source§

impl<__C> CheckBytes<__C> for ArchivedTracePos
where + u32: Archive, + <u32 as Archive>::Archived: CheckBytes<__C>, + __C: ?Sized,

§

type Error = TupleStructCheckError

The error that may result from checking the type.
source§

unsafe fn check_bytes<'__bytecheck>( + value: *const ArchivedTracePos, + context: &mut __C, +) -> Result<&'__bytecheck ArchivedTracePos, TupleStructCheckError>

Checks whether the given pointer points to a valid value within the +given context. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_test_utils/struct.CallRequestParams.html b/air_test_utils/struct.CallRequestParams.html new file mode 100644 index 00000000..c794ed3b --- /dev/null +++ b/air_test_utils/struct.CallRequestParams.html @@ -0,0 +1,67 @@ +CallRequestParams in air_test_utils - Rust

Struct air_test_utils::CallRequestParams

source ·
pub struct CallRequestParams {
+    pub service_id: String,
+    pub function_name: String,
+    pub arguments: Vec<Value>,
+    pub tetraplets: Vec<Vec<SecurityTetraplet>>,
+}
Expand description

Contains arguments of a call instruction and all other necessary information +required for calling a service.

+

Fields§

§service_id: String

Id of a service that should be called.

+
§function_name: String

Name of a function from service identified by service_id that should be called.

+
§arguments: Vec<Value>

Arguments that should be passed to the function.

+
§tetraplets: Vec<Vec<SecurityTetraplet>>

Tetraplets that should be passed to the service.

+

Implementations§

source§

impl CallRequestParams

source

pub fn new( + service_id: impl Into<String>, + function_name: impl Into<String>, + arguments: Vec<Value>, + tetraplets: Vec<Vec<SecurityTetraplet>>, +) -> CallRequestParams

Trait Implementations§

source§

impl Clone for CallRequestParams

source§

fn clone(&self) -> CallRequestParams

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for CallRequestParams

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
source§

impl<'de> Deserialize<'de> for CallRequestParams

source§

fn deserialize<__D>( + __deserializer: __D, +) -> Result<CallRequestParams, <__D as Deserializer<'de>>::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl PartialEq for CallRequestParams

source§

fn eq(&self, other: &CallRequestParams) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl Serialize for CallRequestParams

source§

fn serialize<__S>( + &self, + __serializer: __S, +) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Eq for CallRequestParams

source§

impl StructuralPartialEq for CallRequestParams

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_test_utils/struct.CallServiceFailed.html b/air_test_utils/struct.CallServiceFailed.html new file mode 100644 index 00000000..f7d77e2b --- /dev/null +++ b/air_test_utils/struct.CallServiceFailed.html @@ -0,0 +1,98 @@ +CallServiceFailed in air_test_utils - Rust

Struct air_test_utils::CallServiceFailed

source ·
pub struct CallServiceFailed {
+    pub ret_code: i32,
+    pub message: Rc<String>,
+}

Fields§

§ret_code: i32§message: Rc<String>

This field contains a JSON-serialized value, not a plain error message.

+

Implementations§

source§

impl CallServiceFailed

source

pub fn new(ret_code: i32, message: Rc<String>) -> CallServiceFailed

source

pub fn to_value(&self) -> JValue

Trait Implementations§

source§

impl Archive for CallServiceFailed
where + i32: Archive, + Rc<String>: Archive,

§

type Archived = ArchivedCallServiceFailed

The archived representation of this type. Read more
§

type Resolver = CallServiceFailedResolver

The resolver for this type. It must contain all the additional information from serializing +needed to make the archived type from the normal type.
source§

unsafe fn resolve( + &self, + pos: usize, + resolver: <CallServiceFailed as Archive>::Resolver, + out: *mut <CallServiceFailed as Archive>::Archived, +)

Creates the archived version of this value at the given position and writes it to the given +output. Read more
source§

impl Clone for CallServiceFailed

source§

fn clone(&self) -> CallServiceFailed

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for CallServiceFailed

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
source§

impl<'de> Deserialize<'de> for CallServiceFailed

source§

fn deserialize<__D>( + __deserializer: __D, +) -> Result<CallServiceFailed, <__D as Deserializer<'de>>::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl<__D> Deserialize<CallServiceFailed, __D> for <CallServiceFailed as Archive>::Archived
where + __D: Fallible + ?Sized, + i32: Archive, + <i32 as Archive>::Archived: Deserialize<i32, __D>, + Rc<String>: Archive, + <Rc<String> as Archive>::Archived: Deserialize<Rc<String>, __D>,

source§

fn deserialize( + &self, + deserializer: &mut __D, +) -> Result<CallServiceFailed, <__D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl PartialEq for CallServiceFailed

source§

fn eq(&self, other: &CallServiceFailed) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl<__S> Serialize<__S> for CallServiceFailed
where + __S: Fallible + ?Sized, + i32: Serialize<__S>, + Rc<String>: Serialize<__S>,

source§

fn serialize( + &self, + serializer: &mut __S, +) -> Result<<CallServiceFailed as Archive>::Resolver, <__S as Fallible>::Error>

Writes the dependencies for the object and returns a resolver that can create the archived +type.
source§

impl Serialize for CallServiceFailed

source§

fn serialize<__S>( + &self, + __serializer: __S, +) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Eq for CallServiceFailed

source§

impl StructuralPartialEq for CallServiceFailed

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
§

impl<T> ArchiveUnsized for T
where + T: Archive,

§

type Archived = <T as Archive>::Archived

The archived counterpart of this type. Unlike Archive, it may be unsized. Read more
§

type MetadataResolver = ()

The resolver for the metadata of this type. Read more
§

unsafe fn resolve_metadata( + &self, + _: usize, + _: <T as ArchiveUnsized>::MetadataResolver, + _: *mut <<T as ArchiveUnsized>::Archived as ArchivePointee>::ArchivedMetadata, +)

Creates the archived version of the metadata for this value at the given position and writes +it to the given output. Read more
§

unsafe fn resolve_unsized( + &self, + from: usize, + to: usize, + resolver: Self::MetadataResolver, + out: *mut RelPtr<Self::Archived, <isize as Archive>::Archived>, +)

Resolves a relative pointer to this value with the given from and to and writes it to +the given output. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
§

impl<T, S> SerializeUnsized<S> for T
where + T: Serialize<S>, + S: Serializer + ?Sized,

§

fn serialize_unsized( + &self, + serializer: &mut S, +) -> Result<usize, <S as Fallible>::Error>

Writes the object and returns the position of the archived type.
§

fn serialize_metadata(&self, _: &mut S) -> Result<(), <S as Fallible>::Error>

Serializes the metadata for the given type.
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_test_utils/struct.CallServiceFailedResolver.html b/air_test_utils/struct.CallServiceFailedResolver.html new file mode 100644 index 00000000..f138a90b --- /dev/null +++ b/air_test_utils/struct.CallServiceFailedResolver.html @@ -0,0 +1,34 @@ +CallServiceFailedResolver in air_test_utils - Rust

Struct air_test_utils::CallServiceFailedResolver

source ·
pub struct CallServiceFailedResolver
where + i32: Archive, + Rc<String>: Archive,
{ /* private fields */ }
Expand description

The resolver for an archived CallServiceFailed

+

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_test_utils/struct.CallServiceResult.html b/air_test_utils/struct.CallServiceResult.html new file mode 100644 index 00000000..e57bf819 --- /dev/null +++ b/air_test_utils/struct.CallServiceResult.html @@ -0,0 +1,58 @@ +CallServiceResult in air_test_utils - Rust

Struct air_test_utils::CallServiceResult

source ·
pub struct CallServiceResult {
+    pub ret_code: i32,
+    pub result: Value,
+}
Expand description

Represents an executed host function result.

+

Fields§

§ret_code: i32

A error code service or builtin returned, where CALL_SERVICE_SUCCESS represents success.

+
§result: Value

Resulted JValue returned by a service string.

+

Implementations§

Trait Implementations§

source§

impl Clone for CallServiceResult

source§

fn clone(&self) -> CallServiceResult

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for CallServiceResult

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
source§

impl Default for CallServiceResult

source§

fn default() -> CallServiceResult

Returns the “default value” for a type. Read more
source§

impl<'de> Deserialize<'de> for CallServiceResult

source§

fn deserialize<__D>( + __deserializer: __D, +) -> Result<CallServiceResult, <__D as Deserializer<'de>>::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl Display for CallServiceResult

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
source§

impl PartialEq for CallServiceResult

source§

fn eq(&self, other: &CallServiceResult) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl Serialize for CallServiceResult

source§

fn serialize<__S>( + &self, + __serializer: __S, +) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Eq for CallServiceResult

source§

impl StructuralPartialEq for CallServiceResult

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_test_utils/struct.CanonCidAggregate.html b/air_test_utils/struct.CanonCidAggregate.html new file mode 100644 index 00000000..c08e432a --- /dev/null +++ b/air_test_utils/struct.CanonCidAggregate.html @@ -0,0 +1,107 @@ +CanonCidAggregate in air_test_utils - Rust

Struct air_test_utils::CanonCidAggregate

source ·
pub struct CanonCidAggregate {
+    pub value: CID<RawValue>,
+    pub tetraplet: CID<SecurityTetraplet>,
+    pub provenance: Provenance,
+}
Expand description

The type Canon trace CID refers to.

+

Fields§

§value: CID<RawValue>§tetraplet: CID<SecurityTetraplet>§provenance: Provenance

Implementations§

source§

impl CanonCidAggregate

source

pub fn new( + value: CID<RawValue>, + tetraplet: CID<SecurityTetraplet>, + provenance: Provenance, +) -> CanonCidAggregate

Trait Implementations§

source§

impl Archive for CanonCidAggregate
where + CID<RawValue>: Archive, + CID<SecurityTetraplet>: Archive, + Provenance: Archive,

§

type Archived = ArchivedCanonCidAggregate

The archived representation of this type. Read more
§

type Resolver = CanonCidAggregateResolver

The resolver for this type. It must contain all the additional information from serializing +needed to make the archived type from the normal type.
source§

unsafe fn resolve( + &self, + pos: usize, + resolver: <CanonCidAggregate as Archive>::Resolver, + out: *mut <CanonCidAggregate as Archive>::Archived, +)

Creates the archived version of this value at the given position and writes it to the given +output. Read more
source§

impl Clone for CanonCidAggregate

source§

fn clone(&self) -> CanonCidAggregate

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for CanonCidAggregate

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
source§

impl<'de> Deserialize<'de> for CanonCidAggregate

source§

fn deserialize<__D>( + __deserializer: __D, +) -> Result<CanonCidAggregate, <__D as Deserializer<'de>>::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl<__D> Deserialize<CanonCidAggregate, __D> for <CanonCidAggregate as Archive>::Archived
where + __D: Fallible + ?Sized, + CID<RawValue>: Archive, + <CID<RawValue> as Archive>::Archived: Deserialize<CID<RawValue>, __D>, + CID<SecurityTetraplet>: Archive, + <CID<SecurityTetraplet> as Archive>::Archived: Deserialize<CID<SecurityTetraplet>, __D>, + Provenance: Archive, + <Provenance as Archive>::Archived: Deserialize<Provenance, __D>,

source§

fn deserialize( + &self, + deserializer: &mut __D, +) -> Result<CanonCidAggregate, <__D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl PartialEq for CanonCidAggregate

source§

fn eq(&self, other: &CanonCidAggregate) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl<__S> Serialize<__S> for CanonCidAggregate
where + __S: Fallible + ?Sized, + CID<RawValue>: Serialize<__S>, + CID<SecurityTetraplet>: Serialize<__S>, + Provenance: Serialize<__S>,

source§

fn serialize( + &self, + serializer: &mut __S, +) -> Result<<CanonCidAggregate as Archive>::Resolver, <__S as Fallible>::Error>

Writes the dependencies for the object and returns a resolver that can create the archived +type.
source§

impl Serialize for CanonCidAggregate

source§

fn serialize<__S>( + &self, + __serializer: __S, +) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Eq for CanonCidAggregate

source§

impl StructuralPartialEq for CanonCidAggregate

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
§

impl<T> ArchiveUnsized for T
where + T: Archive,

§

type Archived = <T as Archive>::Archived

The archived counterpart of this type. Unlike Archive, it may be unsized. Read more
§

type MetadataResolver = ()

The resolver for the metadata of this type. Read more
§

unsafe fn resolve_metadata( + &self, + _: usize, + _: <T as ArchiveUnsized>::MetadataResolver, + _: *mut <<T as ArchiveUnsized>::Archived as ArchivePointee>::ArchivedMetadata, +)

Creates the archived version of the metadata for this value at the given position and writes +it to the given output. Read more
§

unsafe fn resolve_unsized( + &self, + from: usize, + to: usize, + resolver: Self::MetadataResolver, + out: *mut RelPtr<Self::Archived, <isize as Archive>::Archived>, +)

Resolves a relative pointer to this value with the given from and to and writes it to +the given output. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
§

impl<T, S> SerializeUnsized<S> for T
where + T: Serialize<S>, + S: Serializer + ?Sized,

§

fn serialize_unsized( + &self, + serializer: &mut S, +) -> Result<usize, <S as Fallible>::Error>

Writes the object and returns the position of the archived type.
§

fn serialize_metadata(&self, _: &mut S) -> Result<(), <S as Fallible>::Error>

Serializes the metadata for the given type.
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_test_utils/struct.CanonCidAggregateResolver.html b/air_test_utils/struct.CanonCidAggregateResolver.html new file mode 100644 index 00000000..c62c3d74 --- /dev/null +++ b/air_test_utils/struct.CanonCidAggregateResolver.html @@ -0,0 +1,35 @@ +CanonCidAggregateResolver in air_test_utils - Rust

Struct air_test_utils::CanonCidAggregateResolver

source ·
pub struct CanonCidAggregateResolver
where + CID<RawValue>: Archive, + CID<SecurityTetraplet>: Archive, + Provenance: Archive,
{ /* private fields */ }
Expand description

The resolver for an archived CanonCidAggregate

+

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_test_utils/struct.CanonResultCidAggregate.html b/air_test_utils/struct.CanonResultCidAggregate.html new file mode 100644 index 00000000..8183d6e0 --- /dev/null +++ b/air_test_utils/struct.CanonResultCidAggregate.html @@ -0,0 +1,100 @@ +CanonResultCidAggregate in air_test_utils - Rust

Struct air_test_utils::CanonResultCidAggregate

source ·
pub struct CanonResultCidAggregate {
+    pub tetraplet: CID<SecurityTetraplet>,
+    pub values: Vec<CID<CanonCidAggregate>>,
+}

Fields§

§tetraplet: CID<SecurityTetraplet>§values: Vec<CID<CanonCidAggregate>>

Implementations§

Trait Implementations§

source§

impl Archive for CanonResultCidAggregate
where + CID<SecurityTetraplet>: Archive, + Vec<CID<CanonCidAggregate>>: Archive,

§

type Archived = ArchivedCanonResultCidAggregate

The archived representation of this type. Read more
§

type Resolver = CanonResultCidAggregateResolver

The resolver for this type. It must contain all the additional information from serializing +needed to make the archived type from the normal type.
source§

unsafe fn resolve( + &self, + pos: usize, + resolver: <CanonResultCidAggregate as Archive>::Resolver, + out: *mut <CanonResultCidAggregate as Archive>::Archived, +)

Creates the archived version of this value at the given position and writes it to the given +output. Read more
source§

impl Clone for CanonResultCidAggregate

source§

fn clone(&self) -> CanonResultCidAggregate

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for CanonResultCidAggregate

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
source§

impl<'de> Deserialize<'de> for CanonResultCidAggregate

source§

fn deserialize<__D>( + __deserializer: __D, +) -> Result<CanonResultCidAggregate, <__D as Deserializer<'de>>::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl<__D> Deserialize<CanonResultCidAggregate, __D> for <CanonResultCidAggregate as Archive>::Archived
where + __D: Fallible + ?Sized, + CID<SecurityTetraplet>: Archive, + <CID<SecurityTetraplet> as Archive>::Archived: Deserialize<CID<SecurityTetraplet>, __D>, + Vec<CID<CanonCidAggregate>>: Archive, + <Vec<CID<CanonCidAggregate>> as Archive>::Archived: Deserialize<Vec<CID<CanonCidAggregate>>, __D>,

source§

fn deserialize( + &self, + deserializer: &mut __D, +) -> Result<CanonResultCidAggregate, <__D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl PartialEq for CanonResultCidAggregate

source§

fn eq(&self, other: &CanonResultCidAggregate) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl<__S> Serialize<__S> for CanonResultCidAggregate
where + __S: Fallible + ?Sized, + CID<SecurityTetraplet>: Serialize<__S>, + Vec<CID<CanonCidAggregate>>: Serialize<__S>,

source§

fn serialize( + &self, + serializer: &mut __S, +) -> Result<<CanonResultCidAggregate as Archive>::Resolver, <__S as Fallible>::Error>

Writes the dependencies for the object and returns a resolver that can create the archived +type.
source§

impl Serialize for CanonResultCidAggregate

source§

fn serialize<__S>( + &self, + __serializer: __S, +) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Eq for CanonResultCidAggregate

source§

impl StructuralPartialEq for CanonResultCidAggregate

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
§

impl<T> ArchiveUnsized for T
where + T: Archive,

§

type Archived = <T as Archive>::Archived

The archived counterpart of this type. Unlike Archive, it may be unsized. Read more
§

type MetadataResolver = ()

The resolver for the metadata of this type. Read more
§

unsafe fn resolve_metadata( + &self, + _: usize, + _: <T as ArchiveUnsized>::MetadataResolver, + _: *mut <<T as ArchiveUnsized>::Archived as ArchivePointee>::ArchivedMetadata, +)

Creates the archived version of the metadata for this value at the given position and writes +it to the given output. Read more
§

unsafe fn resolve_unsized( + &self, + from: usize, + to: usize, + resolver: Self::MetadataResolver, + out: *mut RelPtr<Self::Archived, <isize as Archive>::Archived>, +)

Resolves a relative pointer to this value with the given from and to and writes it to +the given output. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
§

impl<T, S> SerializeUnsized<S> for T
where + T: Serialize<S>, + S: Serializer + ?Sized,

§

fn serialize_unsized( + &self, + serializer: &mut S, +) -> Result<usize, <S as Fallible>::Error>

Writes the object and returns the position of the archived type.
§

fn serialize_metadata(&self, _: &mut S) -> Result<(), <S as Fallible>::Error>

Serializes the metadata for the given type.
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_test_utils/struct.CanonResultCidAggregateResolver.html b/air_test_utils/struct.CanonResultCidAggregateResolver.html new file mode 100644 index 00000000..d036ba57 --- /dev/null +++ b/air_test_utils/struct.CanonResultCidAggregateResolver.html @@ -0,0 +1,34 @@ +CanonResultCidAggregateResolver in air_test_utils - Rust
pub struct CanonResultCidAggregateResolver
where + CID<SecurityTetraplet>: Archive, + Vec<CID<CanonCidAggregate>>: Archive,
{ /* private fields */ }
Expand description

The resolver for an archived CanonResultCidAggregate

+

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_test_utils/struct.CidInfo.html b/air_test_utils/struct.CidInfo.html new file mode 100644 index 00000000..92b6a1bc --- /dev/null +++ b/air_test_utils/struct.CidInfo.html @@ -0,0 +1,117 @@ +CidInfo in air_test_utils - Rust

Struct air_test_utils::CidInfo

source ·
pub struct CidInfo {
+    pub value_store: CidStore<RawValue>,
+    pub tetraplet_store: CidStore<SecurityTetraplet>,
+    pub canon_element_store: CidStore<CanonCidAggregate>,
+    pub canon_result_store: CidStore<CanonResultCidAggregate>,
+    pub service_result_store: CidStore<ServiceResultCidAggregate>,
+}

Fields§

§value_store: CidStore<RawValue>

Map CID to value.

+
§tetraplet_store: CidStore<SecurityTetraplet>

Map CID to a tetraplet.

+
§canon_element_store: CidStore<CanonCidAggregate>

Map CID to a canon element value.

+
§canon_result_store: CidStore<CanonResultCidAggregate>

Map CID to a canon result.

+
§service_result_store: CidStore<ServiceResultCidAggregate>

Map CID to a service result aggregate.

+

Implementations§

Trait Implementations§

source§

impl Archive for CidInfo

§

type Archived = ArchivedCidInfo

The archived representation of this type. Read more
§

type Resolver = CidInfoResolver

The resolver for this type. It must contain all the additional information from serializing +needed to make the archived type from the normal type.
source§

unsafe fn resolve( + &self, + pos: usize, + resolver: <CidInfo as Archive>::Resolver, + out: *mut <CidInfo as Archive>::Archived, +)

Creates the archived version of this value at the given position and writes it to the given +output. Read more
source§

impl Clone for CidInfo

source§

fn clone(&self) -> CidInfo

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for CidInfo

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
source§

impl Default for CidInfo

source§

fn default() -> CidInfo

Returns the “default value” for a type. Read more
source§

impl<'de> Deserialize<'de> for CidInfo

source§

fn deserialize<__D>( + __deserializer: __D, +) -> Result<CidInfo, <__D as Deserializer<'de>>::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl<__D> Deserialize<CidInfo, __D> for <CidInfo as Archive>::Archived
where + __D: Fallible + ?Sized, + CidStore<RawValue>: Archive, + <CidStore<RawValue> as Archive>::Archived: Deserialize<CidStore<RawValue>, __D>, + CidStore<SecurityTetraplet>: Archive, + <CidStore<SecurityTetraplet> as Archive>::Archived: Deserialize<CidStore<SecurityTetraplet>, __D>, + CidStore<CanonCidAggregate>: Archive, + <CidStore<CanonCidAggregate> as Archive>::Archived: Deserialize<CidStore<CanonCidAggregate>, __D>, + CidStore<CanonResultCidAggregate>: Archive, + <CidStore<CanonResultCidAggregate> as Archive>::Archived: Deserialize<CidStore<CanonResultCidAggregate>, __D>, + CidStore<ServiceResultCidAggregate>: Archive, + <CidStore<ServiceResultCidAggregate> as Archive>::Archived: Deserialize<CidStore<ServiceResultCidAggregate>, __D>,

source§

fn deserialize( + &self, + deserializer: &mut __D, +) -> Result<CidInfo, <__D as Fallible>::Error>

Deserializes using the given deserializer
§

impl From<ExecutionCidState> for CidInfo

§

fn from(value: ExecutionCidState) -> CidInfo

Converts to this type from the input type.
source§

impl PartialEq for CidInfo

source§

fn eq(&self, other: &CidInfo) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl<__S> Serialize<__S> for CidInfo
where + __S: Fallible + ?Sized, + CidStore<RawValue>: Serialize<__S>, + CidStore<SecurityTetraplet>: Serialize<__S>, + CidStore<CanonCidAggregate>: Serialize<__S>, + CidStore<CanonResultCidAggregate>: Serialize<__S>, + CidStore<ServiceResultCidAggregate>: Serialize<__S>,

source§

fn serialize( + &self, + serializer: &mut __S, +) -> Result<<CidInfo as Archive>::Resolver, <__S as Fallible>::Error>

Writes the dependencies for the object and returns a resolver that can create the archived +type.
source§

impl Serialize for CidInfo

source§

fn serialize<__S>( + &self, + __serializer: __S, +) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Eq for CidInfo

source§

impl StructuralPartialEq for CidInfo

Auto Trait Implementations§

§

impl Freeze for CidInfo

§

impl !RefUnwindSafe for CidInfo

§

impl !Send for CidInfo

§

impl !Sync for CidInfo

§

impl Unpin for CidInfo

§

impl !UnwindSafe for CidInfo

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
§

impl<T> ArchiveUnsized for T
where + T: Archive,

§

type Archived = <T as Archive>::Archived

The archived counterpart of this type. Unlike Archive, it may be unsized. Read more
§

type MetadataResolver = ()

The resolver for the metadata of this type. Read more
§

unsafe fn resolve_metadata( + &self, + _: usize, + _: <T as ArchiveUnsized>::MetadataResolver, + _: *mut <<T as ArchiveUnsized>::Archived as ArchivePointee>::ArchivedMetadata, +)

Creates the archived version of the metadata for this value at the given position and writes +it to the given output. Read more
§

unsafe fn resolve_unsized( + &self, + from: usize, + to: usize, + resolver: Self::MetadataResolver, + out: *mut RelPtr<Self::Archived, <isize as Archive>::Archived>, +)

Resolves a relative pointer to this value with the given from and to and writes it to +the given output. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
§

impl<T, S> SerializeUnsized<S> for T
where + T: Serialize<S>, + S: Serializer + ?Sized,

§

fn serialize_unsized( + &self, + serializer: &mut S, +) -> Result<usize, <S as Fallible>::Error>

Writes the object and returns the position of the archived type.
§

fn serialize_metadata(&self, _: &mut S) -> Result<(), <S as Fallible>::Error>

Serializes the metadata for the given type.
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_test_utils/struct.CidInfoResolver.html b/air_test_utils/struct.CidInfoResolver.html new file mode 100644 index 00000000..d4a93d0b --- /dev/null +++ b/air_test_utils/struct.CidInfoResolver.html @@ -0,0 +1,37 @@ +CidInfoResolver in air_test_utils - Rust

Struct air_test_utils::CidInfoResolver

source ·
pub struct CidInfoResolver{ /* private fields */ }
Expand description

The resolver for an archived CidInfo

+

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_test_utils/struct.CidStore.html b/air_test_utils/struct.CidStore.html new file mode 100644 index 00000000..167e1e79 --- /dev/null +++ b/air_test_utils/struct.CidStore.html @@ -0,0 +1,104 @@ +CidStore in air_test_utils - Rust

Struct air_test_utils::CidStore

source ·
pub struct CidStore<Val>(/* private fields */);
Expand description

Stores CID to Value corresponance.

+

Implementations§

source§

impl<Val> CidStore<Val>

source

pub fn new() -> CidStore<Val>

source

pub fn get(&self, cid: &CID<Val>) -> Option<Rc<Val>>

source

pub fn is_empty(&self) -> bool

source

pub fn len(&self) -> usize

source

pub fn iter(&self) -> impl Iterator<Item = (&CID<Val>, &Rc<Val>)>

source

pub fn check_reference<Src>( + &self, + _source_cid: &CID<Src>, + target_cid: &CID<Val>, +) -> Result<(), CidStoreVerificationError>

source§

impl<Val> CidStore<Val>
where + Val: Serialize,

source§

impl CidStore<RawValue>

Trait Implementations§

source§

impl<Val> Archive for CidStore<Val>
where + With<HashMap<CID<Val>, Rc<Val>>, AsVec>: Archive,

§

type Archived = ArchivedCidStore<Val>

The archived representation of this type. Read more
§

type Resolver = CidStoreResolver<Val>

The resolver for this type. It must contain all the additional information from serializing +needed to make the archived type from the normal type.
source§

unsafe fn resolve( + &self, + pos: usize, + resolver: <CidStore<Val> as Archive>::Resolver, + out: *mut <CidStore<Val> as Archive>::Archived, +)

Creates the archived version of this value at the given position and writes it to the given +output. Read more
source§

impl<Val> Clone for CidStore<Val>
where + Val: Clone,

source§

fn clone(&self) -> CidStore<Val>

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl<Val> Debug for CidStore<Val>
where + Val: Debug,

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
source§

impl<Val> Default for CidStore<Val>

source§

fn default() -> CidStore<Val>

Returns the “default value” for a type. Read more
source§

impl<'de, Val> Deserialize<'de> for CidStore<Val>
where + Val: Deserialize<'de>,

source§

fn deserialize<__D>( + __deserializer: __D, +) -> Result<CidStore<Val>, <__D as Deserializer<'de>>::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl<__D, Val> Deserialize<CidStore<Val>, __D> for <CidStore<Val> as Archive>::Archived
where + __D: Fallible + ?Sized, + With<HashMap<CID<Val>, Rc<Val>>, AsVec>: Archive, + <With<HashMap<CID<Val>, Rc<Val>>, AsVec> as Archive>::Archived: Deserialize<With<HashMap<CID<Val>, Rc<Val>>, AsVec>, __D>,

source§

fn deserialize( + &self, + deserializer: &mut __D, +) -> Result<CidStore<Val>, <__D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<Val> From<CidTracker<Val>> for CidStore<Val>

source§

fn from(value: CidTracker<Val>) -> CidStore<Val>

Converts to this type from the input type.
source§

impl<Val> IntoIterator for CidStore<Val>

§

type Item = (CID<Val>, Rc<Val>)

The type of the elements being iterated over.
§

type IntoIter = IntoIter<CID<Val>, Rc<Val>>

Which kind of iterator are we turning this into?
source§

fn into_iter(self) -> <CidStore<Val> as IntoIterator>::IntoIter

Creates an iterator from a value. Read more
source§

impl<Val> PartialEq for CidStore<Val>
where + Val: PartialEq,

source§

fn eq(&self, other: &CidStore<Val>) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl<__S, Val> Serialize<__S> for CidStore<Val>
where + __S: Fallible + ?Sized, + With<HashMap<CID<Val>, Rc<Val>>, AsVec>: Serialize<__S>,

source§

fn serialize( + &self, + serializer: &mut __S, +) -> Result<<CidStore<Val> as Archive>::Resolver, <__S as Fallible>::Error>

Writes the dependencies for the object and returns a resolver that can create the archived +type.
source§

impl<Val> Serialize for CidStore<Val>
where + Val: Serialize,

source§

fn serialize<__S>( + &self, + __serializer: __S, +) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl<Val> Eq for CidStore<Val>
where + Val: Eq,

source§

impl<Val> StructuralPartialEq for CidStore<Val>

Auto Trait Implementations§

§

impl<Val> Freeze for CidStore<Val>

§

impl<Val> RefUnwindSafe for CidStore<Val>
where + Val: RefUnwindSafe,

§

impl<Val> !Send for CidStore<Val>

§

impl<Val> !Sync for CidStore<Val>

§

impl<Val> Unpin for CidStore<Val>

§

impl<Val> UnwindSafe for CidStore<Val>
where + Val: RefUnwindSafe,

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
§

impl<T> ArchiveUnsized for T
where + T: Archive,

§

type Archived = <T as Archive>::Archived

The archived counterpart of this type. Unlike Archive, it may be unsized. Read more
§

type MetadataResolver = ()

The resolver for the metadata of this type. Read more
§

unsafe fn resolve_metadata( + &self, + _: usize, + _: <T as ArchiveUnsized>::MetadataResolver, + _: *mut <<T as ArchiveUnsized>::Archived as ArchivePointee>::ArchivedMetadata, +)

Creates the archived version of the metadata for this value at the given position and writes +it to the given output. Read more
§

unsafe fn resolve_unsized( + &self, + from: usize, + to: usize, + resolver: Self::MetadataResolver, + out: *mut RelPtr<Self::Archived, <isize as Archive>::Archived>, +)

Resolves a relative pointer to this value with the given from and to and writes it to +the given output. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
§

impl<T, S> SerializeUnsized<S> for T
where + T: Serialize<S>, + S: Serializer + ?Sized,

§

fn serialize_unsized( + &self, + serializer: &mut S, +) -> Result<usize, <S as Fallible>::Error>

Writes the object and returns the position of the archived type.
§

fn serialize_metadata(&self, _: &mut S) -> Result<(), <S as Fallible>::Error>

Serializes the metadata for the given type.
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_test_utils/struct.CidStoreResolver.html b/air_test_utils/struct.CidStoreResolver.html new file mode 100644 index 00000000..9245e1e7 --- /dev/null +++ b/air_test_utils/struct.CidStoreResolver.html @@ -0,0 +1,34 @@ +CidStoreResolver in air_test_utils - Rust

Struct air_test_utils::CidStoreResolver

source ·
pub struct CidStoreResolver<Val>(/* private fields */)
+where
+    With<HashMap<CID<Val>, Rc<Val>>, AsVec>: Archive;
Expand description

The resolver for an archived CidStore

+

Auto Trait Implementations§

§

impl<Val> !Freeze for CidStoreResolver<Val>

§

impl<Val> !RefUnwindSafe for CidStoreResolver<Val>

§

impl<Val> !Send for CidStoreResolver<Val>

§

impl<Val> !Sync for CidStoreResolver<Val>

§

impl<Val> !Unpin for CidStoreResolver<Val>

§

impl<Val> !UnwindSafe for CidStoreResolver<Val>

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_test_utils/struct.CidTracker.html b/air_test_utils/struct.CidTracker.html new file mode 100644 index 00000000..e81cd12f --- /dev/null +++ b/air_test_utils/struct.CidTracker.html @@ -0,0 +1,47 @@ +CidTracker in air_test_utils - Rust

Struct air_test_utils::CidTracker

source ·
pub struct CidTracker<Val = JValue> { /* private fields */ }

Implementations§

source§

impl<Val> CidTracker<Val>

source

pub fn new() -> CidTracker<Val>

source

pub fn from_cid_stores( + prev_cid_map: CidStore<Val>, + current_cid_map: CidStore<Val>, +) -> CidTracker<Val>

source

pub fn get(&self, cid: &CID<Val>) -> Option<Rc<Val>>

source§

impl<Val> CidTracker<Val>
where + Val: Serialize,

source

pub fn track_value( + &mut self, + value: impl Into<Rc<Val>>, +) -> Result<CID<Val>, CidCalculationError>

source§

impl CidTracker<RawValue>

source

pub fn track_raw_value( + &mut self, + value: impl Into<Rc<RawValue>>, +) -> CID<RawValue>

Trait Implementations§

source§

impl<Val> Clone for CidTracker<Val>
where + Val: Clone,

source§

fn clone(&self) -> CidTracker<Val>

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl<Val> Debug for CidTracker<Val>
where + Val: Debug,

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
source§

impl<Val> Default for CidTracker<Val>

source§

fn default() -> CidTracker<Val>

Returns the “default value” for a type. Read more
source§

impl<Val> From<CidTracker<Val>> for CidStore<Val>

source§

fn from(value: CidTracker<Val>) -> CidStore<Val>

Converts to this type from the input type.

Auto Trait Implementations§

§

impl<Val> Freeze for CidTracker<Val>

§

impl<Val> RefUnwindSafe for CidTracker<Val>
where + Val: RefUnwindSafe,

§

impl<Val = JValue> !Send for CidTracker<Val>

§

impl<Val = JValue> !Sync for CidTracker<Val>

§

impl<Val> Unpin for CidTracker<Val>

§

impl<Val> UnwindSafe for CidTracker<Val>
where + Val: RefUnwindSafe,

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_test_utils/struct.ErrorAVMOutcome.html b/air_test_utils/struct.ErrorAVMOutcome.html new file mode 100644 index 00000000..ca753955 --- /dev/null +++ b/air_test_utils/struct.ErrorAVMOutcome.html @@ -0,0 +1,55 @@ +ErrorAVMOutcome in air_test_utils - Rust

Struct air_test_utils::ErrorAVMOutcome

source ·
pub struct ErrorAVMOutcome {
+    pub error_code: i64,
+    pub error_message: String,
+    pub outcome: AVMOutcome,
+}

Fields§

§error_code: i64§error_message: String§outcome: AVMOutcome

Trait Implementations§

source§

impl Clone for ErrorAVMOutcome

source§

fn clone(&self) -> ErrorAVMOutcome

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for ErrorAVMOutcome

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
source§

impl<'de> Deserialize<'de> for ErrorAVMOutcome

source§

fn deserialize<__D>( + __deserializer: __D, +) -> Result<ErrorAVMOutcome, <__D as Deserializer<'de>>::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl PartialEq for ErrorAVMOutcome

source§

fn eq(&self, other: &ErrorAVMOutcome) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl Serialize for ErrorAVMOutcome

source§

fn serialize<__S>( + &self, + __serializer: __S, +) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Eq for ErrorAVMOutcome

source§

impl StructuralPartialEq for ErrorAVMOutcome

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_test_utils/struct.ExecutionTrace.html b/air_test_utils/struct.ExecutionTrace.html new file mode 100644 index 00000000..8ee6737f --- /dev/null +++ b/air_test_utils/struct.ExecutionTrace.html @@ -0,0 +1,1180 @@ +ExecutionTrace in air_test_utils - Rust

Struct air_test_utils::ExecutionTrace

source ·
pub struct ExecutionTrace(/* private fields */);

Implementations§

source§

impl ExecutionTrace

source

pub fn get(&self, index: TracePos) -> Option<&ExecutedState>

source

pub fn get_mut(&mut self, index: TracePos) -> Option<&mut ExecutedState>

source

pub fn pop(&mut self) -> Option<ExecutedState>

source

pub fn push(&mut self, value: ExecutedState)

source

pub fn trace_states_count(&self) -> u32

Methods from Deref<Target = [ExecutedState]>§

1.80.0 · source

pub fn as_flattened(&self) -> &[T]

Takes a &[[T; N]], and flattens it to a &[T].

+
§Panics
+

This panics if the length of the resulting slice would overflow a usize.

+

This is only possible when flattening a slice of arrays of zero-sized +types, and thus tends to be irrelevant in practice. If +size_of::<T>() > 0, this will never panic.

+
§Examples
+
assert_eq!([[1, 2, 3], [4, 5, 6]].as_flattened(), &[1, 2, 3, 4, 5, 6]);
+
+assert_eq!(
+    [[1, 2, 3], [4, 5, 6]].as_flattened(),
+    [[1, 2], [3, 4], [5, 6]].as_flattened(),
+);
+
+let slice_of_empty_arrays: &[[i32; 0]] = &[[], [], [], [], []];
+assert!(slice_of_empty_arrays.as_flattened().is_empty());
+
+let empty_slice_of_arrays: &[[u32; 10]] = &[];
+assert!(empty_slice_of_arrays.as_flattened().is_empty());
+
source

pub fn as_str(&self) -> &str

🔬This is a nightly-only experimental API. (ascii_char)

Views this slice of ASCII characters as a UTF-8 str.

+
source

pub fn as_bytes(&self) -> &[u8]

🔬This is a nightly-only experimental API. (ascii_char)

Views this slice of ASCII characters as a slice of u8 bytes.

+
1.79.0 · source

pub fn utf8_chunks(&self) -> Utf8Chunks<'_>

Creates an iterator over the contiguous valid UTF-8 ranges of this +slice, and the non-UTF-8 fragments in between.

+
§Examples
+

This function formats arbitrary but mostly-UTF-8 bytes into Rust source +code in the form of a C-string literal (c"...").

+ +
use std::fmt::Write as _;
+
+pub fn cstr_literal(bytes: &[u8]) -> String {
+    let mut repr = String::new();
+    repr.push_str("c\"");
+    for chunk in bytes.utf8_chunks() {
+        for ch in chunk.valid().chars() {
+            // Escapes \0, \t, \r, \n, \\, \', \", and uses \u{...} for non-printable characters.
+            write!(repr, "{}", ch.escape_debug()).unwrap();
+        }
+        for byte in chunk.invalid() {
+            write!(repr, "\\x{:02X}", byte).unwrap();
+        }
+    }
+    repr.push('"');
+    repr
+}
+
+fn main() {
+    let lit = cstr_literal(b"\xferris the \xf0\x9f\xa6\x80\x07");
+    let expected = stringify!(c"\xFErris the 🦀\u{7}");
+    assert_eq!(lit, expected);
+}
+
1.23.0 · source

pub fn is_ascii(&self) -> bool

Checks if all bytes in this slice are within the ASCII range.

+
source

pub fn as_ascii(&self) -> Option<&[AsciiChar]>

🔬This is a nightly-only experimental API. (ascii_char)

If this slice is_ascii, returns it as a slice of +ASCII characters, otherwise returns None.

+
source

pub unsafe fn as_ascii_unchecked(&self) -> &[AsciiChar]

🔬This is a nightly-only experimental API. (ascii_char)

Converts this slice of bytes into a slice of ASCII characters, +without checking whether they’re valid.

+
§Safety
+

Every byte in the slice must be in 0..=127, or else this is UB.

+
1.23.0 · source

pub fn eq_ignore_ascii_case(&self, other: &[u8]) -> bool

Checks that two slices are an ASCII case-insensitive match.

+

Same as to_ascii_lowercase(a) == to_ascii_lowercase(b), +but without allocating and copying temporaries.

+
1.60.0 · source

pub fn escape_ascii(&self) -> EscapeAscii<'_>

Returns an iterator that produces an escaped version of this slice, +treating it as an ASCII string.

+
§Examples
+

+let s = b"0\t\r\n'\"\\\x9d";
+let escaped = s.escape_ascii().to_string();
+assert_eq!(escaped, "0\\t\\r\\n\\'\\\"\\\\\\x9d");
+
1.80.0 · source

pub fn trim_ascii_start(&self) -> &[u8]

Returns a byte slice with leading ASCII whitespace bytes removed.

+

‘Whitespace’ refers to the definition used by +u8::is_ascii_whitespace.

+
§Examples
+
assert_eq!(b" \t hello world\n".trim_ascii_start(), b"hello world\n");
+assert_eq!(b"  ".trim_ascii_start(), b"");
+assert_eq!(b"".trim_ascii_start(), b"");
+
1.80.0 · source

pub fn trim_ascii_end(&self) -> &[u8]

Returns a byte slice with trailing ASCII whitespace bytes removed.

+

‘Whitespace’ refers to the definition used by +u8::is_ascii_whitespace.

+
§Examples
+
assert_eq!(b"\r hello world\n ".trim_ascii_end(), b"\r hello world");
+assert_eq!(b"  ".trim_ascii_end(), b"");
+assert_eq!(b"".trim_ascii_end(), b"");
+
1.80.0 · source

pub fn trim_ascii(&self) -> &[u8]

Returns a byte slice with leading and trailing ASCII whitespace bytes +removed.

+

‘Whitespace’ refers to the definition used by +u8::is_ascii_whitespace.

+
§Examples
+
assert_eq!(b"\r hello world\n ".trim_ascii(), b"hello world");
+assert_eq!(b"  ".trim_ascii(), b"");
+assert_eq!(b"".trim_ascii(), b"");
+
1.0.0 · source

pub fn len(&self) -> usize

Returns the number of elements in the slice.

+
§Examples
+
let a = [1, 2, 3];
+assert_eq!(a.len(), 3);
+
1.0.0 · source

pub fn is_empty(&self) -> bool

Returns true if the slice has a length of 0.

+
§Examples
+
let a = [1, 2, 3];
+assert!(!a.is_empty());
+
+let b: &[i32] = &[];
+assert!(b.is_empty());
+
1.0.0 · source

pub fn first(&self) -> Option<&T>

Returns the first element of the slice, or None if it is empty.

+
§Examples
+
let v = [10, 40, 30];
+assert_eq!(Some(&10), v.first());
+
+let w: &[i32] = &[];
+assert_eq!(None, w.first());
+
1.5.0 · source

pub fn split_first(&self) -> Option<(&T, &[T])>

Returns the first and all the rest of the elements of the slice, or None if it is empty.

+
§Examples
+
let x = &[0, 1, 2];
+
+if let Some((first, elements)) = x.split_first() {
+    assert_eq!(first, &0);
+    assert_eq!(elements, &[1, 2]);
+}
+
1.5.0 · source

pub fn split_last(&self) -> Option<(&T, &[T])>

Returns the last and all the rest of the elements of the slice, or None if it is empty.

+
§Examples
+
let x = &[0, 1, 2];
+
+if let Some((last, elements)) = x.split_last() {
+    assert_eq!(last, &2);
+    assert_eq!(elements, &[0, 1]);
+}
+
1.0.0 · source

pub fn last(&self) -> Option<&T>

Returns the last element of the slice, or None if it is empty.

+
§Examples
+
let v = [10, 40, 30];
+assert_eq!(Some(&30), v.last());
+
+let w: &[i32] = &[];
+assert_eq!(None, w.last());
+
1.77.0 · source

pub fn first_chunk<const N: usize>(&self) -> Option<&[T; N]>

Return an array reference to the first N items in the slice.

+

If the slice is not at least N in length, this will return None.

+
§Examples
+
let u = [10, 40, 30];
+assert_eq!(Some(&[10, 40]), u.first_chunk::<2>());
+
+let v: &[i32] = &[10];
+assert_eq!(None, v.first_chunk::<2>());
+
+let w: &[i32] = &[];
+assert_eq!(Some(&[]), w.first_chunk::<0>());
+
1.77.0 · source

pub fn split_first_chunk<const N: usize>(&self) -> Option<(&[T; N], &[T])>

Return an array reference to the first N items in the slice and the remaining slice.

+

If the slice is not at least N in length, this will return None.

+
§Examples
+
let x = &[0, 1, 2];
+
+if let Some((first, elements)) = x.split_first_chunk::<2>() {
+    assert_eq!(first, &[0, 1]);
+    assert_eq!(elements, &[2]);
+}
+
+assert_eq!(None, x.split_first_chunk::<4>());
+
1.77.0 · source

pub fn split_last_chunk<const N: usize>(&self) -> Option<(&[T], &[T; N])>

Return an array reference to the last N items in the slice and the remaining slice.

+

If the slice is not at least N in length, this will return None.

+
§Examples
+
let x = &[0, 1, 2];
+
+if let Some((elements, last)) = x.split_last_chunk::<2>() {
+    assert_eq!(elements, &[0]);
+    assert_eq!(last, &[1, 2]);
+}
+
+assert_eq!(None, x.split_last_chunk::<4>());
+
1.77.0 · source

pub fn last_chunk<const N: usize>(&self) -> Option<&[T; N]>

Return an array reference to the last N items in the slice.

+

If the slice is not at least N in length, this will return None.

+
§Examples
+
let u = [10, 40, 30];
+assert_eq!(Some(&[40, 30]), u.last_chunk::<2>());
+
+let v: &[i32] = &[10];
+assert_eq!(None, v.last_chunk::<2>());
+
+let w: &[i32] = &[];
+assert_eq!(Some(&[]), w.last_chunk::<0>());
+
1.0.0 · source

pub fn get<I>(&self, index: I) -> Option<&<I as SliceIndex<[T]>>::Output>
where + I: SliceIndex<[T]>,

Returns a reference to an element or subslice depending on the type of +index.

+
    +
  • If given a position, returns a reference to the element at that +position or None if out of bounds.
  • +
  • If given a range, returns the subslice corresponding to that range, +or None if out of bounds.
  • +
+
§Examples
+
let v = [10, 40, 30];
+assert_eq!(Some(&40), v.get(1));
+assert_eq!(Some(&[10, 40][..]), v.get(0..2));
+assert_eq!(None, v.get(3));
+assert_eq!(None, v.get(0..4));
+
1.0.0 · source

pub unsafe fn get_unchecked<I>( + &self, + index: I, +) -> &<I as SliceIndex<[T]>>::Output
where + I: SliceIndex<[T]>,

Returns a reference to an element or subslice, without doing bounds +checking.

+

For a safe alternative see get.

+
§Safety
+

Calling this method with an out-of-bounds index is undefined behavior +even if the resulting reference is not used.

+

You can think of this like .get(index).unwrap_unchecked(). It’s UB +to call .get_unchecked(len), even if you immediately convert to a +pointer. And it’s UB to call .get_unchecked(..len + 1), +.get_unchecked(..=len), or similar.

+
§Examples
+
let x = &[1, 2, 4];
+
+unsafe {
+    assert_eq!(x.get_unchecked(1), &2);
+}
+
1.0.0 · source

pub fn as_ptr(&self) -> *const T

Returns a raw pointer to the slice’s buffer.

+

The caller must ensure that the slice outlives the pointer this +function returns, or else it will end up pointing to garbage.

+

The caller must also ensure that the memory the pointer (non-transitively) points to +is never written to (except inside an UnsafeCell) using this pointer or any pointer +derived from it. If you need to mutate the contents of the slice, use as_mut_ptr.

+

Modifying the container referenced by this slice may cause its buffer +to be reallocated, which would also make any pointers to it invalid.

+
§Examples
+
let x = &[1, 2, 4];
+let x_ptr = x.as_ptr();
+
+unsafe {
+    for i in 0..x.len() {
+        assert_eq!(x.get_unchecked(i), &*x_ptr.add(i));
+    }
+}
+
1.48.0 · source

pub fn as_ptr_range(&self) -> Range<*const T>

Returns the two raw pointers spanning the slice.

+

The returned range is half-open, which means that the end pointer +points one past the last element of the slice. This way, an empty +slice is represented by two equal pointers, and the difference between +the two pointers represents the size of the slice.

+

See as_ptr for warnings on using these pointers. The end pointer +requires extra caution, as it does not point to a valid element in the +slice.

+

This function is useful for interacting with foreign interfaces which +use two pointers to refer to a range of elements in memory, as is +common in C++.

+

It can also be useful to check if a pointer to an element refers to an +element of this slice:

+ +
let a = [1, 2, 3];
+let x = &a[1] as *const _;
+let y = &5 as *const _;
+
+assert!(a.as_ptr_range().contains(&x));
+assert!(!a.as_ptr_range().contains(&y));
+
1.0.0 · source

pub fn iter(&self) -> Iter<'_, T>

Returns an iterator over the slice.

+

The iterator yields all items from start to end.

+
§Examples
+
let x = &[1, 2, 4];
+let mut iterator = x.iter();
+
+assert_eq!(iterator.next(), Some(&1));
+assert_eq!(iterator.next(), Some(&2));
+assert_eq!(iterator.next(), Some(&4));
+assert_eq!(iterator.next(), None);
+
1.0.0 · source

pub fn windows(&self, size: usize) -> Windows<'_, T>

Returns an iterator over all contiguous windows of length +size. The windows overlap. If the slice is shorter than +size, the iterator returns no values.

+
§Panics
+

Panics if size is 0.

+
§Examples
+
let slice = ['l', 'o', 'r', 'e', 'm'];
+let mut iter = slice.windows(3);
+assert_eq!(iter.next().unwrap(), &['l', 'o', 'r']);
+assert_eq!(iter.next().unwrap(), &['o', 'r', 'e']);
+assert_eq!(iter.next().unwrap(), &['r', 'e', 'm']);
+assert!(iter.next().is_none());
+

If the slice is shorter than size:

+ +
let slice = ['f', 'o', 'o'];
+let mut iter = slice.windows(4);
+assert!(iter.next().is_none());
+

There’s no windows_mut, as that existing would let safe code violate the +“only one &mut at a time to the same thing” rule. However, you can sometimes +use Cell::as_slice_of_cells in +conjunction with windows to accomplish something similar:

+ +
use std::cell::Cell;
+
+let mut array = ['R', 'u', 's', 't', ' ', '2', '0', '1', '5'];
+let slice = &mut array[..];
+let slice_of_cells: &[Cell<char>] = Cell::from_mut(slice).as_slice_of_cells();
+for w in slice_of_cells.windows(3) {
+    Cell::swap(&w[0], &w[2]);
+}
+assert_eq!(array, ['s', 't', ' ', '2', '0', '1', '5', 'u', 'R']);
+
1.0.0 · source

pub fn chunks(&self, chunk_size: usize) -> Chunks<'_, T>

Returns an iterator over chunk_size elements of the slice at a time, starting at the +beginning of the slice.

+

The chunks are slices and do not overlap. If chunk_size does not divide the length of the +slice, then the last chunk will not have length chunk_size.

+

See chunks_exact for a variant of this iterator that returns chunks of always exactly +chunk_size elements, and rchunks for the same iterator but starting at the end of the +slice.

+
§Panics
+

Panics if chunk_size is 0.

+
§Examples
+
let slice = ['l', 'o', 'r', 'e', 'm'];
+let mut iter = slice.chunks(2);
+assert_eq!(iter.next().unwrap(), &['l', 'o']);
+assert_eq!(iter.next().unwrap(), &['r', 'e']);
+assert_eq!(iter.next().unwrap(), &['m']);
+assert!(iter.next().is_none());
+
1.31.0 · source

pub fn chunks_exact(&self, chunk_size: usize) -> ChunksExact<'_, T>

Returns an iterator over chunk_size elements of the slice at a time, starting at the +beginning of the slice.

+

The chunks are slices and do not overlap. If chunk_size does not divide the length of the +slice, then the last up to chunk_size-1 elements will be omitted and can be retrieved +from the remainder function of the iterator.

+

Due to each chunk having exactly chunk_size elements, the compiler can often optimize the +resulting code better than in the case of chunks.

+

See chunks for a variant of this iterator that also returns the remainder as a smaller +chunk, and rchunks_exact for the same iterator but starting at the end of the slice.

+
§Panics
+

Panics if chunk_size is 0.

+
§Examples
+
let slice = ['l', 'o', 'r', 'e', 'm'];
+let mut iter = slice.chunks_exact(2);
+assert_eq!(iter.next().unwrap(), &['l', 'o']);
+assert_eq!(iter.next().unwrap(), &['r', 'e']);
+assert!(iter.next().is_none());
+assert_eq!(iter.remainder(), &['m']);
+
source

pub unsafe fn as_chunks_unchecked<const N: usize>(&self) -> &[[T; N]]

🔬This is a nightly-only experimental API. (slice_as_chunks)

Splits the slice into a slice of N-element arrays, +assuming that there’s no remainder.

+
§Safety
+

This may only be called when

+
    +
  • The slice splits exactly into N-element chunks (aka self.len() % N == 0).
  • +
  • N != 0.
  • +
+
§Examples
+
#![feature(slice_as_chunks)]
+let slice: &[char] = &['l', 'o', 'r', 'e', 'm', '!'];
+let chunks: &[[char; 1]] =
+    // SAFETY: 1-element chunks never have remainder
+    unsafe { slice.as_chunks_unchecked() };
+assert_eq!(chunks, &[['l'], ['o'], ['r'], ['e'], ['m'], ['!']]);
+let chunks: &[[char; 3]] =
+    // SAFETY: The slice length (6) is a multiple of 3
+    unsafe { slice.as_chunks_unchecked() };
+assert_eq!(chunks, &[['l', 'o', 'r'], ['e', 'm', '!']]);
+
+// These would be unsound:
+// let chunks: &[[_; 5]] = slice.as_chunks_unchecked() // The slice length is not a multiple of 5
+// let chunks: &[[_; 0]] = slice.as_chunks_unchecked() // Zero-length chunks are never allowed
+
source

pub fn as_chunks<const N: usize>(&self) -> (&[[T; N]], &[T])

🔬This is a nightly-only experimental API. (slice_as_chunks)

Splits the slice into a slice of N-element arrays, +starting at the beginning of the slice, +and a remainder slice with length strictly less than N.

+
§Panics
+

Panics if N is 0. This check will most probably get changed to a compile time +error before this method gets stabilized.

+
§Examples
+
#![feature(slice_as_chunks)]
+let slice = ['l', 'o', 'r', 'e', 'm'];
+let (chunks, remainder) = slice.as_chunks();
+assert_eq!(chunks, &[['l', 'o'], ['r', 'e']]);
+assert_eq!(remainder, &['m']);
+

If you expect the slice to be an exact multiple, you can combine +let-else with an empty slice pattern:

+ +
#![feature(slice_as_chunks)]
+let slice = ['R', 'u', 's', 't'];
+let (chunks, []) = slice.as_chunks::<2>() else {
+    panic!("slice didn't have even length")
+};
+assert_eq!(chunks, &[['R', 'u'], ['s', 't']]);
+
source

pub fn as_rchunks<const N: usize>(&self) -> (&[T], &[[T; N]])

🔬This is a nightly-only experimental API. (slice_as_chunks)

Splits the slice into a slice of N-element arrays, +starting at the end of the slice, +and a remainder slice with length strictly less than N.

+
§Panics
+

Panics if N is 0. This check will most probably get changed to a compile time +error before this method gets stabilized.

+
§Examples
+
#![feature(slice_as_chunks)]
+let slice = ['l', 'o', 'r', 'e', 'm'];
+let (remainder, chunks) = slice.as_rchunks();
+assert_eq!(remainder, &['l']);
+assert_eq!(chunks, &[['o', 'r'], ['e', 'm']]);
+
source

pub fn array_chunks<const N: usize>(&self) -> ArrayChunks<'_, T, N>

🔬This is a nightly-only experimental API. (array_chunks)

Returns an iterator over N elements of the slice at a time, starting at the +beginning of the slice.

+

The chunks are array references and do not overlap. If N does not divide the +length of the slice, then the last up to N-1 elements will be omitted and can be +retrieved from the remainder function of the iterator.

+

This method is the const generic equivalent of chunks_exact.

+
§Panics
+

Panics if N is 0. This check will most probably get changed to a compile time +error before this method gets stabilized.

+
§Examples
+
#![feature(array_chunks)]
+let slice = ['l', 'o', 'r', 'e', 'm'];
+let mut iter = slice.array_chunks();
+assert_eq!(iter.next().unwrap(), &['l', 'o']);
+assert_eq!(iter.next().unwrap(), &['r', 'e']);
+assert!(iter.next().is_none());
+assert_eq!(iter.remainder(), &['m']);
+
source

pub fn array_windows<const N: usize>(&self) -> ArrayWindows<'_, T, N>

🔬This is a nightly-only experimental API. (array_windows)

Returns an iterator over overlapping windows of N elements of a slice, +starting at the beginning of the slice.

+

This is the const generic equivalent of windows.

+

If N is greater than the size of the slice, it will return no windows.

+
§Panics
+

Panics if N is 0. This check will most probably get changed to a compile time +error before this method gets stabilized.

+
§Examples
+
#![feature(array_windows)]
+let slice = [0, 1, 2, 3];
+let mut iter = slice.array_windows();
+assert_eq!(iter.next().unwrap(), &[0, 1]);
+assert_eq!(iter.next().unwrap(), &[1, 2]);
+assert_eq!(iter.next().unwrap(), &[2, 3]);
+assert!(iter.next().is_none());
+
1.31.0 · source

pub fn rchunks(&self, chunk_size: usize) -> RChunks<'_, T>

Returns an iterator over chunk_size elements of the slice at a time, starting at the end +of the slice.

+

The chunks are slices and do not overlap. If chunk_size does not divide the length of the +slice, then the last chunk will not have length chunk_size.

+

See rchunks_exact for a variant of this iterator that returns chunks of always exactly +chunk_size elements, and chunks for the same iterator but starting at the beginning +of the slice.

+
§Panics
+

Panics if chunk_size is 0.

+
§Examples
+
let slice = ['l', 'o', 'r', 'e', 'm'];
+let mut iter = slice.rchunks(2);
+assert_eq!(iter.next().unwrap(), &['e', 'm']);
+assert_eq!(iter.next().unwrap(), &['o', 'r']);
+assert_eq!(iter.next().unwrap(), &['l']);
+assert!(iter.next().is_none());
+
1.31.0 · source

pub fn rchunks_exact(&self, chunk_size: usize) -> RChunksExact<'_, T>

Returns an iterator over chunk_size elements of the slice at a time, starting at the +end of the slice.

+

The chunks are slices and do not overlap. If chunk_size does not divide the length of the +slice, then the last up to chunk_size-1 elements will be omitted and can be retrieved +from the remainder function of the iterator.

+

Due to each chunk having exactly chunk_size elements, the compiler can often optimize the +resulting code better than in the case of rchunks.

+

See rchunks for a variant of this iterator that also returns the remainder as a smaller +chunk, and chunks_exact for the same iterator but starting at the beginning of the +slice.

+
§Panics
+

Panics if chunk_size is 0.

+
§Examples
+
let slice = ['l', 'o', 'r', 'e', 'm'];
+let mut iter = slice.rchunks_exact(2);
+assert_eq!(iter.next().unwrap(), &['e', 'm']);
+assert_eq!(iter.next().unwrap(), &['o', 'r']);
+assert!(iter.next().is_none());
+assert_eq!(iter.remainder(), &['l']);
+
1.77.0 · source

pub fn chunk_by<F>(&self, pred: F) -> ChunkBy<'_, T, F>
where + F: FnMut(&T, &T) -> bool,

Returns an iterator over the slice producing non-overlapping runs +of elements using the predicate to separate them.

+

The predicate is called for every pair of consecutive elements, +meaning that it is called on slice[0] and slice[1], +followed by slice[1] and slice[2], and so on.

+
§Examples
+
let slice = &[1, 1, 1, 3, 3, 2, 2, 2];
+
+let mut iter = slice.chunk_by(|a, b| a == b);
+
+assert_eq!(iter.next(), Some(&[1, 1, 1][..]));
+assert_eq!(iter.next(), Some(&[3, 3][..]));
+assert_eq!(iter.next(), Some(&[2, 2, 2][..]));
+assert_eq!(iter.next(), None);
+

This method can be used to extract the sorted subslices:

+ +
let slice = &[1, 1, 2, 3, 2, 3, 2, 3, 4];
+
+let mut iter = slice.chunk_by(|a, b| a <= b);
+
+assert_eq!(iter.next(), Some(&[1, 1, 2, 3][..]));
+assert_eq!(iter.next(), Some(&[2, 3][..]));
+assert_eq!(iter.next(), Some(&[2, 3, 4][..]));
+assert_eq!(iter.next(), None);
+
1.0.0 · source

pub fn split_at(&self, mid: usize) -> (&[T], &[T])

Divides one slice into two at an index.

+

The first will contain all indices from [0, mid) (excluding +the index mid itself) and the second will contain all +indices from [mid, len) (excluding the index len itself).

+
§Panics
+

Panics if mid > len. For a non-panicking alternative see +split_at_checked.

+
§Examples
+
let v = [1, 2, 3, 4, 5, 6];
+
+{
+   let (left, right) = v.split_at(0);
+   assert_eq!(left, []);
+   assert_eq!(right, [1, 2, 3, 4, 5, 6]);
+}
+
+{
+    let (left, right) = v.split_at(2);
+    assert_eq!(left, [1, 2]);
+    assert_eq!(right, [3, 4, 5, 6]);
+}
+
+{
+    let (left, right) = v.split_at(6);
+    assert_eq!(left, [1, 2, 3, 4, 5, 6]);
+    assert_eq!(right, []);
+}
+
1.79.0 · source

pub unsafe fn split_at_unchecked(&self, mid: usize) -> (&[T], &[T])

Divides one slice into two at an index, without doing bounds checking.

+

The first will contain all indices from [0, mid) (excluding +the index mid itself) and the second will contain all +indices from [mid, len) (excluding the index len itself).

+

For a safe alternative see split_at.

+
§Safety
+

Calling this method with an out-of-bounds index is undefined behavior +even if the resulting reference is not used. The caller has to ensure that +0 <= mid <= self.len().

+
§Examples
+
let v = [1, 2, 3, 4, 5, 6];
+
+unsafe {
+   let (left, right) = v.split_at_unchecked(0);
+   assert_eq!(left, []);
+   assert_eq!(right, [1, 2, 3, 4, 5, 6]);
+}
+
+unsafe {
+    let (left, right) = v.split_at_unchecked(2);
+    assert_eq!(left, [1, 2]);
+    assert_eq!(right, [3, 4, 5, 6]);
+}
+
+unsafe {
+    let (left, right) = v.split_at_unchecked(6);
+    assert_eq!(left, [1, 2, 3, 4, 5, 6]);
+    assert_eq!(right, []);
+}
+
1.80.0 · source

pub fn split_at_checked(&self, mid: usize) -> Option<(&[T], &[T])>

Divides one slice into two at an index, returning None if the slice is +too short.

+

If mid ≤ len returns a pair of slices where the first will contain all +indices from [0, mid) (excluding the index mid itself) and the +second will contain all indices from [mid, len) (excluding the index +len itself).

+

Otherwise, if mid > len, returns None.

+
§Examples
+
let v = [1, -2, 3, -4, 5, -6];
+
+{
+   let (left, right) = v.split_at_checked(0).unwrap();
+   assert_eq!(left, []);
+   assert_eq!(right, [1, -2, 3, -4, 5, -6]);
+}
+
+{
+    let (left, right) = v.split_at_checked(2).unwrap();
+    assert_eq!(left, [1, -2]);
+    assert_eq!(right, [3, -4, 5, -6]);
+}
+
+{
+    let (left, right) = v.split_at_checked(6).unwrap();
+    assert_eq!(left, [1, -2, 3, -4, 5, -6]);
+    assert_eq!(right, []);
+}
+
+assert_eq!(None, v.split_at_checked(7));
+
1.0.0 · source

pub fn split<F>(&self, pred: F) -> Split<'_, T, F>
where + F: FnMut(&T) -> bool,

Returns an iterator over subslices separated by elements that match +pred. The matched element is not contained in the subslices.

+
§Examples
+
let slice = [10, 40, 33, 20];
+let mut iter = slice.split(|num| num % 3 == 0);
+
+assert_eq!(iter.next().unwrap(), &[10, 40]);
+assert_eq!(iter.next().unwrap(), &[20]);
+assert!(iter.next().is_none());
+

If the first element is matched, an empty slice will be the first item +returned by the iterator. Similarly, if the last element in the slice +is matched, an empty slice will be the last item returned by the +iterator:

+ +
let slice = [10, 40, 33];
+let mut iter = slice.split(|num| num % 3 == 0);
+
+assert_eq!(iter.next().unwrap(), &[10, 40]);
+assert_eq!(iter.next().unwrap(), &[]);
+assert!(iter.next().is_none());
+

If two matched elements are directly adjacent, an empty slice will be +present between them:

+ +
let slice = [10, 6, 33, 20];
+let mut iter = slice.split(|num| num % 3 == 0);
+
+assert_eq!(iter.next().unwrap(), &[10]);
+assert_eq!(iter.next().unwrap(), &[]);
+assert_eq!(iter.next().unwrap(), &[20]);
+assert!(iter.next().is_none());
+
1.51.0 · source

pub fn split_inclusive<F>(&self, pred: F) -> SplitInclusive<'_, T, F>
where + F: FnMut(&T) -> bool,

Returns an iterator over subslices separated by elements that match +pred. The matched element is contained in the end of the previous +subslice as a terminator.

+
§Examples
+
let slice = [10, 40, 33, 20];
+let mut iter = slice.split_inclusive(|num| num % 3 == 0);
+
+assert_eq!(iter.next().unwrap(), &[10, 40, 33]);
+assert_eq!(iter.next().unwrap(), &[20]);
+assert!(iter.next().is_none());
+

If the last element of the slice is matched, +that element will be considered the terminator of the preceding slice. +That slice will be the last item returned by the iterator.

+ +
let slice = [3, 10, 40, 33];
+let mut iter = slice.split_inclusive(|num| num % 3 == 0);
+
+assert_eq!(iter.next().unwrap(), &[3]);
+assert_eq!(iter.next().unwrap(), &[10, 40, 33]);
+assert!(iter.next().is_none());
+
1.27.0 · source

pub fn rsplit<F>(&self, pred: F) -> RSplit<'_, T, F>
where + F: FnMut(&T) -> bool,

Returns an iterator over subslices separated by elements that match +pred, starting at the end of the slice and working backwards. +The matched element is not contained in the subslices.

+
§Examples
+
let slice = [11, 22, 33, 0, 44, 55];
+let mut iter = slice.rsplit(|num| *num == 0);
+
+assert_eq!(iter.next().unwrap(), &[44, 55]);
+assert_eq!(iter.next().unwrap(), &[11, 22, 33]);
+assert_eq!(iter.next(), None);
+

As with split(), if the first or last element is matched, an empty +slice will be the first (or last) item returned by the iterator.

+ +
let v = &[0, 1, 1, 2, 3, 5, 8];
+let mut it = v.rsplit(|n| *n % 2 == 0);
+assert_eq!(it.next().unwrap(), &[]);
+assert_eq!(it.next().unwrap(), &[3, 5]);
+assert_eq!(it.next().unwrap(), &[1, 1]);
+assert_eq!(it.next().unwrap(), &[]);
+assert_eq!(it.next(), None);
+
1.0.0 · source

pub fn splitn<F>(&self, n: usize, pred: F) -> SplitN<'_, T, F>
where + F: FnMut(&T) -> bool,

Returns an iterator over subslices separated by elements that match +pred, limited to returning at most n items. The matched element is +not contained in the subslices.

+

The last element returned, if any, will contain the remainder of the +slice.

+
§Examples
+

Print the slice split once by numbers divisible by 3 (i.e., [10, 40], +[20, 60, 50]):

+ +
let v = [10, 40, 30, 20, 60, 50];
+
+for group in v.splitn(2, |num| *num % 3 == 0) {
+    println!("{group:?}");
+}
+
1.0.0 · source

pub fn rsplitn<F>(&self, n: usize, pred: F) -> RSplitN<'_, T, F>
where + F: FnMut(&T) -> bool,

Returns an iterator over subslices separated by elements that match +pred limited to returning at most n items. This starts at the end of +the slice and works backwards. The matched element is not contained in +the subslices.

+

The last element returned, if any, will contain the remainder of the +slice.

+
§Examples
+

Print the slice split once, starting from the end, by numbers divisible +by 3 (i.e., [50], [10, 40, 30, 20]):

+ +
let v = [10, 40, 30, 20, 60, 50];
+
+for group in v.rsplitn(2, |num| *num % 3 == 0) {
+    println!("{group:?}");
+}
+
source

pub fn split_once<F>(&self, pred: F) -> Option<(&[T], &[T])>
where + F: FnMut(&T) -> bool,

🔬This is a nightly-only experimental API. (slice_split_once)

Splits the slice on the first element that matches the specified +predicate.

+

If any matching elements are present in the slice, returns the prefix +before the match and suffix after. The matching element itself is not +included. If no elements match, returns None.

+
§Examples
+
#![feature(slice_split_once)]
+let s = [1, 2, 3, 2, 4];
+assert_eq!(s.split_once(|&x| x == 2), Some((
+    &[1][..],
+    &[3, 2, 4][..]
+)));
+assert_eq!(s.split_once(|&x| x == 0), None);
+
source

pub fn rsplit_once<F>(&self, pred: F) -> Option<(&[T], &[T])>
where + F: FnMut(&T) -> bool,

🔬This is a nightly-only experimental API. (slice_split_once)

Splits the slice on the last element that matches the specified +predicate.

+

If any matching elements are present in the slice, returns the prefix +before the match and suffix after. The matching element itself is not +included. If no elements match, returns None.

+
§Examples
+
#![feature(slice_split_once)]
+let s = [1, 2, 3, 2, 4];
+assert_eq!(s.rsplit_once(|&x| x == 2), Some((
+    &[1, 2, 3][..],
+    &[4][..]
+)));
+assert_eq!(s.rsplit_once(|&x| x == 0), None);
+
1.0.0 · source

pub fn contains(&self, x: &T) -> bool
where + T: PartialEq,

Returns true if the slice contains an element with the given value.

+

This operation is O(n).

+

Note that if you have a sorted slice, binary_search may be faster.

+
§Examples
+
let v = [10, 40, 30];
+assert!(v.contains(&30));
+assert!(!v.contains(&50));
+

If you do not have a &T, but some other value that you can compare +with one (for example, String implements PartialEq<str>), you can +use iter().any:

+ +
let v = [String::from("hello"), String::from("world")]; // slice of `String`
+assert!(v.iter().any(|e| e == "hello")); // search with `&str`
+assert!(!v.iter().any(|e| e == "hi"));
+
1.0.0 · source

pub fn starts_with(&self, needle: &[T]) -> bool
where + T: PartialEq,

Returns true if needle is a prefix of the slice or equal to the slice.

+
§Examples
+
let v = [10, 40, 30];
+assert!(v.starts_with(&[10]));
+assert!(v.starts_with(&[10, 40]));
+assert!(v.starts_with(&v));
+assert!(!v.starts_with(&[50]));
+assert!(!v.starts_with(&[10, 50]));
+

Always returns true if needle is an empty slice:

+ +
let v = &[10, 40, 30];
+assert!(v.starts_with(&[]));
+let v: &[u8] = &[];
+assert!(v.starts_with(&[]));
+
1.0.0 · source

pub fn ends_with(&self, needle: &[T]) -> bool
where + T: PartialEq,

Returns true if needle is a suffix of the slice or equal to the slice.

+
§Examples
+
let v = [10, 40, 30];
+assert!(v.ends_with(&[30]));
+assert!(v.ends_with(&[40, 30]));
+assert!(v.ends_with(&v));
+assert!(!v.ends_with(&[50]));
+assert!(!v.ends_with(&[50, 30]));
+

Always returns true if needle is an empty slice:

+ +
let v = &[10, 40, 30];
+assert!(v.ends_with(&[]));
+let v: &[u8] = &[];
+assert!(v.ends_with(&[]));
+
1.51.0 · source

pub fn strip_prefix<P>(&self, prefix: &P) -> Option<&[T]>
where + P: SlicePattern<Item = T> + ?Sized, + T: PartialEq,

Returns a subslice with the prefix removed.

+

If the slice starts with prefix, returns the subslice after the prefix, wrapped in Some. +If prefix is empty, simply returns the original slice. If prefix is equal to the +original slice, returns an empty slice.

+

If the slice does not start with prefix, returns None.

+
§Examples
+
let v = &[10, 40, 30];
+assert_eq!(v.strip_prefix(&[10]), Some(&[40, 30][..]));
+assert_eq!(v.strip_prefix(&[10, 40]), Some(&[30][..]));
+assert_eq!(v.strip_prefix(&[10, 40, 30]), Some(&[][..]));
+assert_eq!(v.strip_prefix(&[50]), None);
+assert_eq!(v.strip_prefix(&[10, 50]), None);
+
+let prefix : &str = "he";
+assert_eq!(b"hello".strip_prefix(prefix.as_bytes()),
+           Some(b"llo".as_ref()));
+
1.51.0 · source

pub fn strip_suffix<P>(&self, suffix: &P) -> Option<&[T]>
where + P: SlicePattern<Item = T> + ?Sized, + T: PartialEq,

Returns a subslice with the suffix removed.

+

If the slice ends with suffix, returns the subslice before the suffix, wrapped in Some. +If suffix is empty, simply returns the original slice. If suffix is equal to the +original slice, returns an empty slice.

+

If the slice does not end with suffix, returns None.

+
§Examples
+
let v = &[10, 40, 30];
+assert_eq!(v.strip_suffix(&[30]), Some(&[10, 40][..]));
+assert_eq!(v.strip_suffix(&[40, 30]), Some(&[10][..]));
+assert_eq!(v.strip_suffix(&[10, 40, 30]), Some(&[][..]));
+assert_eq!(v.strip_suffix(&[50]), None);
+assert_eq!(v.strip_suffix(&[50, 30]), None);
+

Binary searches this slice for a given element. +If the slice is not sorted, the returned result is unspecified and +meaningless.

+

If the value is found then Result::Ok is returned, containing the +index of the matching element. If there are multiple matches, then any +one of the matches could be returned. The index is chosen +deterministically, but is subject to change in future versions of Rust. +If the value is not found then Result::Err is returned, containing +the index where a matching element could be inserted while maintaining +sorted order.

+

See also binary_search_by, binary_search_by_key, and partition_point.

+
§Examples
+

Looks up a series of four elements. The first is found, with a +uniquely determined position; the second and third are not +found; the fourth could match any position in [1, 4].

+ +
let s = [0, 1, 1, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55];
+
+assert_eq!(s.binary_search(&13),  Ok(9));
+assert_eq!(s.binary_search(&4),   Err(7));
+assert_eq!(s.binary_search(&100), Err(13));
+let r = s.binary_search(&1);
+assert!(match r { Ok(1..=4) => true, _ => false, });
+

If you want to find that whole range of matching items, rather than +an arbitrary matching one, that can be done using partition_point:

+ +
let s = [0, 1, 1, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55];
+
+let low = s.partition_point(|x| x < &1);
+assert_eq!(low, 1);
+let high = s.partition_point(|x| x <= &1);
+assert_eq!(high, 5);
+let r = s.binary_search(&1);
+assert!((low..high).contains(&r.unwrap()));
+
+assert!(s[..low].iter().all(|&x| x < 1));
+assert!(s[low..high].iter().all(|&x| x == 1));
+assert!(s[high..].iter().all(|&x| x > 1));
+
+// For something not found, the "range" of equal items is empty
+assert_eq!(s.partition_point(|x| x < &11), 9);
+assert_eq!(s.partition_point(|x| x <= &11), 9);
+assert_eq!(s.binary_search(&11), Err(9));
+

If you want to insert an item to a sorted vector, while maintaining +sort order, consider using partition_point:

+ +
let mut s = vec![0, 1, 1, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55];
+let num = 42;
+let idx = s.partition_point(|&x| x <= num);
+// If `num` is unique, `s.partition_point(|&x| x < num)` (with `<`) is equivalent to
+// `s.binary_search(&num).unwrap_or_else(|x| x)`, but using `<=` will allow `insert`
+// to shift less elements.
+s.insert(idx, num);
+assert_eq!(s, [0, 1, 1, 1, 1, 2, 3, 5, 8, 13, 21, 34, 42, 55]);
+
1.0.0 · source

pub fn binary_search_by<'a, F>(&'a self, f: F) -> Result<usize, usize>
where + F: FnMut(&'a T) -> Ordering,

Binary searches this slice with a comparator function.

+

The comparator function should return an order code that indicates +whether its argument is Less, Equal or Greater the desired +target. +If the slice is not sorted or if the comparator function does not +implement an order consistent with the sort order of the underlying +slice, the returned result is unspecified and meaningless.

+

If the value is found then Result::Ok is returned, containing the +index of the matching element. If there are multiple matches, then any +one of the matches could be returned. The index is chosen +deterministically, but is subject to change in future versions of Rust. +If the value is not found then Result::Err is returned, containing +the index where a matching element could be inserted while maintaining +sorted order.

+

See also binary_search, binary_search_by_key, and partition_point.

+
§Examples
+

Looks up a series of four elements. The first is found, with a +uniquely determined position; the second and third are not +found; the fourth could match any position in [1, 4].

+ +
let s = [0, 1, 1, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55];
+
+let seek = 13;
+assert_eq!(s.binary_search_by(|probe| probe.cmp(&seek)), Ok(9));
+let seek = 4;
+assert_eq!(s.binary_search_by(|probe| probe.cmp(&seek)), Err(7));
+let seek = 100;
+assert_eq!(s.binary_search_by(|probe| probe.cmp(&seek)), Err(13));
+let seek = 1;
+let r = s.binary_search_by(|probe| probe.cmp(&seek));
+assert!(match r { Ok(1..=4) => true, _ => false, });
+
1.10.0 · source

pub fn binary_search_by_key<'a, B, F>( + &'a self, + b: &B, + f: F, +) -> Result<usize, usize>
where + F: FnMut(&'a T) -> B, + B: Ord,

Binary searches this slice with a key extraction function.

+

Assumes that the slice is sorted by the key, for instance with +sort_by_key using the same key extraction function. +If the slice is not sorted by the key, the returned result is +unspecified and meaningless.

+

If the value is found then Result::Ok is returned, containing the +index of the matching element. If there are multiple matches, then any +one of the matches could be returned. The index is chosen +deterministically, but is subject to change in future versions of Rust. +If the value is not found then Result::Err is returned, containing +the index where a matching element could be inserted while maintaining +sorted order.

+

See also binary_search, binary_search_by, and partition_point.

+
§Examples
+

Looks up a series of four elements in a slice of pairs sorted by +their second elements. The first is found, with a uniquely +determined position; the second and third are not found; the +fourth could match any position in [1, 4].

+ +
let s = [(0, 0), (2, 1), (4, 1), (5, 1), (3, 1),
+         (1, 2), (2, 3), (4, 5), (5, 8), (3, 13),
+         (1, 21), (2, 34), (4, 55)];
+
+assert_eq!(s.binary_search_by_key(&13, |&(a, b)| b),  Ok(9));
+assert_eq!(s.binary_search_by_key(&4, |&(a, b)| b),   Err(7));
+assert_eq!(s.binary_search_by_key(&100, |&(a, b)| b), Err(13));
+let r = s.binary_search_by_key(&1, |&(a, b)| b);
+assert!(match r { Ok(1..=4) => true, _ => false, });
+
1.30.0 · source

pub unsafe fn align_to<U>(&self) -> (&[T], &[U], &[T])

Transmute the slice to a slice of another type, ensuring alignment of the types is +maintained.

+

This method splits the slice into three distinct slices: prefix, correctly aligned middle +slice of a new type, and the suffix slice. The middle part will be as big as possible under +the given alignment constraint and element size.

+

This method has no purpose when either input element T or output element U are +zero-sized and will return the original slice without splitting anything.

+
§Safety
+

This method is essentially a transmute with respect to the elements in the returned +middle slice, so all the usual caveats pertaining to transmute::<T, U> also apply here.

+
§Examples
+

Basic usage:

+ +
unsafe {
+    let bytes: [u8; 7] = [1, 2, 3, 4, 5, 6, 7];
+    let (prefix, shorts, suffix) = bytes.align_to::<u16>();
+    // less_efficient_algorithm_for_bytes(prefix);
+    // more_efficient_algorithm_for_aligned_shorts(shorts);
+    // less_efficient_algorithm_for_bytes(suffix);
+}
+
source

pub fn as_simd<const LANES: usize>(&self) -> (&[T], &[Simd<T, LANES>], &[T])
where + Simd<T, LANES>: AsRef<[T; LANES]>, + T: SimdElement, + LaneCount<LANES>: SupportedLaneCount,

🔬This is a nightly-only experimental API. (portable_simd)

Split a slice into a prefix, a middle of aligned SIMD types, and a suffix.

+

This is a safe wrapper around slice::align_to, so inherits the same +guarantees as that method.

+
§Panics
+

This will panic if the size of the SIMD type is different from +LANES times that of the scalar.

+

At the time of writing, the trait restrictions on Simd<T, LANES> keeps +that from ever happening, as only power-of-two numbers of lanes are +supported. It’s possible that, in the future, those restrictions might +be lifted in a way that would make it possible to see panics from this +method for something like LANES == 3.

+
§Examples
+
#![feature(portable_simd)]
+use core::simd::prelude::*;
+
+let short = &[1, 2, 3];
+let (prefix, middle, suffix) = short.as_simd::<4>();
+assert_eq!(middle, []); // Not enough elements for anything in the middle
+
+// They might be split in any possible way between prefix and suffix
+let it = prefix.iter().chain(suffix).copied();
+assert_eq!(it.collect::<Vec<_>>(), vec![1, 2, 3]);
+
+fn basic_simd_sum(x: &[f32]) -> f32 {
+    use std::ops::Add;
+    let (prefix, middle, suffix) = x.as_simd();
+    let sums = f32x4::from_array([
+        prefix.iter().copied().sum(),
+        0.0,
+        0.0,
+        suffix.iter().copied().sum(),
+    ]);
+    let sums = middle.iter().copied().fold(sums, f32x4::add);
+    sums.reduce_sum()
+}
+
+let numbers: Vec<f32> = (1..101).map(|x| x as _).collect();
+assert_eq!(basic_simd_sum(&numbers[1..99]), 4949.0);
+
source

pub fn is_sorted(&self) -> bool
where + T: PartialOrd,

🔬This is a nightly-only experimental API. (is_sorted)

Checks if the elements of this slice are sorted.

+

That is, for each element a and its following element b, a <= b must hold. If the +slice yields exactly zero or one element, true is returned.

+

Note that if Self::Item is only PartialOrd, but not Ord, the above definition +implies that this function returns false if any two consecutive items are not +comparable.

+
§Examples
+
#![feature(is_sorted)]
+let empty: [i32; 0] = [];
+
+assert!([1, 2, 2, 9].is_sorted());
+assert!(![1, 3, 2, 4].is_sorted());
+assert!([0].is_sorted());
+assert!(empty.is_sorted());
+assert!(![0.0, 1.0, f32::NAN].is_sorted());
+
source

pub fn is_sorted_by<'a, F>(&'a self, compare: F) -> bool
where + F: FnMut(&'a T, &'a T) -> bool,

🔬This is a nightly-only experimental API. (is_sorted)

Checks if the elements of this slice are sorted using the given comparator function.

+

Instead of using PartialOrd::partial_cmp, this function uses the given compare +function to determine whether two elements are to be considered in sorted order.

+
§Examples
+
#![feature(is_sorted)]
+
+assert!([1, 2, 2, 9].is_sorted_by(|a, b| a <= b));
+assert!(![1, 2, 2, 9].is_sorted_by(|a, b| a < b));
+
+assert!([0].is_sorted_by(|a, b| true));
+assert!([0].is_sorted_by(|a, b| false));
+
+let empty: [i32; 0] = [];
+assert!(empty.is_sorted_by(|a, b| false));
+assert!(empty.is_sorted_by(|a, b| true));
+
source

pub fn is_sorted_by_key<'a, F, K>(&'a self, f: F) -> bool
where + F: FnMut(&'a T) -> K, + K: PartialOrd,

🔬This is a nightly-only experimental API. (is_sorted)

Checks if the elements of this slice are sorted using the given key extraction function.

+

Instead of comparing the slice’s elements directly, this function compares the keys of the +elements, as determined by f. Apart from that, it’s equivalent to is_sorted; see its +documentation for more information.

+
§Examples
+
#![feature(is_sorted)]
+
+assert!(["c", "bb", "aaa"].is_sorted_by_key(|s| s.len()));
+assert!(![-2i32, -1, 0, 3].is_sorted_by_key(|n| n.abs()));
+
1.52.0 · source

pub fn partition_point<P>(&self, pred: P) -> usize
where + P: FnMut(&T) -> bool,

Returns the index of the partition point according to the given predicate +(the index of the first element of the second partition).

+

The slice is assumed to be partitioned according to the given predicate. +This means that all elements for which the predicate returns true are at the start of the slice +and all elements for which the predicate returns false are at the end. +For example, [7, 15, 3, 5, 4, 12, 6] is partitioned under the predicate x % 2 != 0 +(all odd numbers are at the start, all even at the end).

+

If this slice is not partitioned, the returned result is unspecified and meaningless, +as this method performs a kind of binary search.

+

See also binary_search, binary_search_by, and binary_search_by_key.

+
§Examples
+
let v = [1, 2, 3, 3, 5, 6, 7];
+let i = v.partition_point(|&x| x < 5);
+
+assert_eq!(i, 4);
+assert!(v[..i].iter().all(|&x| x < 5));
+assert!(v[i..].iter().all(|&x| !(x < 5)));
+

If all elements of the slice match the predicate, including if the slice +is empty, then the length of the slice will be returned:

+ +
let a = [2, 4, 8];
+assert_eq!(a.partition_point(|x| x < &100), a.len());
+let a: [i32; 0] = [];
+assert_eq!(a.partition_point(|x| x < &100), 0);
+

If you want to insert an item to a sorted vector, while maintaining +sort order:

+ +
let mut s = vec![0, 1, 1, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55];
+let num = 42;
+let idx = s.partition_point(|&x| x <= num);
+s.insert(idx, num);
+assert_eq!(s, [0, 1, 1, 1, 1, 2, 3, 5, 8, 13, 21, 34, 42, 55]);
+
1.23.0 · source

pub fn to_ascii_uppercase(&self) -> Vec<u8>

Returns a vector containing a copy of this slice where each byte +is mapped to its ASCII upper case equivalent.

+

ASCII letters ‘a’ to ‘z’ are mapped to ‘A’ to ‘Z’, +but non-ASCII letters are unchanged.

+

To uppercase the value in-place, use make_ascii_uppercase.

+
1.23.0 · source

pub fn to_ascii_lowercase(&self) -> Vec<u8>

Returns a vector containing a copy of this slice where each byte +is mapped to its ASCII lower case equivalent.

+

ASCII letters ‘A’ to ‘Z’ are mapped to ‘a’ to ‘z’, +but non-ASCII letters are unchanged.

+

To lowercase the value in-place, use make_ascii_lowercase.

+
1.0.0 · source

pub fn to_vec(&self) -> Vec<T>
where + T: Clone,

Copies self into a new Vec.

+
§Examples
+
let s = [10, 40, 30];
+let x = s.to_vec();
+// Here, `s` and `x` can be modified independently.
+
source

pub fn to_vec_in<A>(&self, alloc: A) -> Vec<T, A>
where + A: Allocator, + T: Clone,

🔬This is a nightly-only experimental API. (allocator_api)

Copies self into a new Vec with an allocator.

+
§Examples
+
#![feature(allocator_api)]
+
+use std::alloc::System;
+
+let s = [10, 40, 30];
+let x = s.to_vec_in(System);
+// Here, `s` and `x` can be modified independently.
+
1.40.0 · source

pub fn repeat(&self, n: usize) -> Vec<T>
where + T: Copy,

Creates a vector by copying a slice n times.

+
§Panics
+

This function will panic if the capacity would overflow.

+
§Examples
+

Basic usage:

+ +
assert_eq!([1, 2].repeat(3), vec![1, 2, 1, 2, 1, 2]);
+

A panic upon overflow:

+ +
// this will panic at runtime
+b"0123456789abcdef".repeat(usize::MAX);
+
1.0.0 · source

pub fn concat<Item>(&self) -> <[T] as Concat<Item>>::Output
where + [T]: Concat<Item>, + Item: ?Sized,

Flattens a slice of T into a single value Self::Output.

+
§Examples
+
assert_eq!(["hello", "world"].concat(), "helloworld");
+assert_eq!([[1, 2], [3, 4]].concat(), [1, 2, 3, 4]);
+
1.3.0 · source

pub fn join<Separator>( + &self, + sep: Separator, +) -> <[T] as Join<Separator>>::Output
where + [T]: Join<Separator>,

Flattens a slice of T into a single value Self::Output, placing a +given separator between each.

+
§Examples
+
assert_eq!(["hello", "world"].join(" "), "hello world");
+assert_eq!([[1, 2], [3, 4]].join(&0), [1, 2, 0, 3, 4]);
+assert_eq!([[1, 2], [3, 4]].join(&[0, 0][..]), [1, 2, 0, 0, 3, 4]);
+
1.0.0 · source

pub fn connect<Separator>( + &self, + sep: Separator, +) -> <[T] as Join<Separator>>::Output
where + [T]: Join<Separator>,

👎Deprecated since 1.3.0: renamed to join

Flattens a slice of T into a single value Self::Output, placing a +given separator between each.

+
§Examples
+
assert_eq!(["hello", "world"].connect(" "), "hello world");
+assert_eq!([[1, 2], [3, 4]].connect(&0), [1, 2, 0, 3, 4]);
+

Trait Implementations§

source§

impl Archive for ExecutionTrace
where + Vec<ExecutedState>: Archive,

§

type Archived = ArchivedExecutionTrace

The archived representation of this type. Read more
§

type Resolver = ExecutionTraceResolver

The resolver for this type. It must contain all the additional information from serializing +needed to make the archived type from the normal type.
source§

unsafe fn resolve( + &self, + pos: usize, + resolver: <ExecutionTrace as Archive>::Resolver, + out: *mut <ExecutionTrace as Archive>::Archived, +)

Creates the archived version of this value at the given position and writes it to the given +output. Read more
source§

impl Clone for ExecutionTrace

source§

fn clone(&self) -> ExecutionTrace

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for ExecutionTrace

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
source§

impl Default for ExecutionTrace

source§

fn default() -> ExecutionTrace

Returns the “default value” for a type. Read more
source§

impl Deref for ExecutionTrace

§

type Target = [ExecutedState]

The resulting type after dereferencing.
source§

fn deref(&self) -> &[ExecutedState]

Dereferences the value.
source§

impl<'de> Deserialize<'de> for ExecutionTrace

source§

fn deserialize<__D>( + __deserializer: __D, +) -> Result<ExecutionTrace, <__D as Deserializer<'de>>::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl<__D> Deserialize<ExecutionTrace, __D> for <ExecutionTrace as Archive>::Archived
where + __D: Fallible + ?Sized, + Vec<ExecutedState>: Archive, + <Vec<ExecutedState> as Archive>::Archived: Deserialize<Vec<ExecutedState>, __D>,

source§

fn deserialize( + &self, + deserializer: &mut __D, +) -> Result<ExecutionTrace, <__D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl From<Vec<ExecutedState>> for ExecutionTrace

source§

fn from(vec: Vec<ExecutedState>) -> ExecutionTrace

Converts to this type from the input type.
source§

impl Index<TracePos> for ExecutionTrace

§

type Output = ExecutedState

The returned type after indexing.
source§

fn index(&self, index: TracePos) -> &<ExecutionTrace as Index<TracePos>>::Output

Performs the indexing (container[index]) operation. Read more
source§

impl IndexMut<TracePos> for ExecutionTrace

source§

fn index_mut( + &mut self, + index: TracePos, +) -> &mut <ExecutionTrace as Index<TracePos>>::Output

Performs the mutable indexing (container[index]) operation. Read more
source§

impl<'trace> IntoIterator for &'trace ExecutionTrace

§

type Item = &'trace ExecutedState

The type of the elements being iterated over.
§

type IntoIter = <&'trace Vec<ExecutedState> as IntoIterator>::IntoIter

Which kind of iterator are we turning this into?
source§

fn into_iter(self) -> <&'trace ExecutionTrace as IntoIterator>::IntoIter

Creates an iterator from a value. Read more
source§

impl PartialEq<Vec<ExecutedState>> for ExecutionTrace

source§

fn eq(&self, other: &Vec<ExecutedState>) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl PartialEq for ExecutionTrace

source§

fn eq(&self, other: &ExecutionTrace) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl<__S> Serialize<__S> for ExecutionTrace
where + __S: Fallible + ?Sized, + Vec<ExecutedState>: Serialize<__S>,

source§

fn serialize( + &self, + serializer: &mut __S, +) -> Result<<ExecutionTrace as Archive>::Resolver, <__S as Fallible>::Error>

Writes the dependencies for the object and returns a resolver that can create the archived +type.
source§

impl Serialize for ExecutionTrace

source§

fn serialize<__S>( + &self, + __serializer: __S, +) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Eq for ExecutionTrace

source§

impl StructuralPartialEq for ExecutionTrace

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
§

impl<T> ArchiveUnsized for T
where + T: Archive,

§

type Archived = <T as Archive>::Archived

The archived counterpart of this type. Unlike Archive, it may be unsized. Read more
§

type MetadataResolver = ()

The resolver for the metadata of this type. Read more
§

unsafe fn resolve_metadata( + &self, + _: usize, + _: <T as ArchiveUnsized>::MetadataResolver, + _: *mut <<T as ArchiveUnsized>::Archived as ArchivePointee>::ArchivedMetadata, +)

Creates the archived version of the metadata for this value at the given position and writes +it to the given output. Read more
§

unsafe fn resolve_unsized( + &self, + from: usize, + to: usize, + resolver: Self::MetadataResolver, + out: *mut RelPtr<Self::Archived, <isize as Archive>::Archived>, +)

Resolves a relative pointer to this value with the given from and to and writes it to +the given output. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
§

impl<T, S> SerializeUnsized<S> for T
where + T: Serialize<S>, + S: Serializer + ?Sized,

§

fn serialize_unsized( + &self, + serializer: &mut S, +) -> Result<usize, <S as Fallible>::Error>

Writes the object and returns the position of the archived type.
§

fn serialize_metadata(&self, _: &mut S) -> Result<(), <S as Fallible>::Error>

Serializes the metadata for the given type.
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_test_utils/struct.ExecutionTraceResolver.html b/air_test_utils/struct.ExecutionTraceResolver.html new file mode 100644 index 00000000..ee9e93b4 --- /dev/null +++ b/air_test_utils/struct.ExecutionTraceResolver.html @@ -0,0 +1,34 @@ +ExecutionTraceResolver in air_test_utils - Rust

Struct air_test_utils::ExecutionTraceResolver

source ·
pub struct ExecutionTraceResolver(/* private fields */)
+where
+    Vec<ExecutedState>: Archive;
Expand description

The resolver for an archived ExecutionTrace

+

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_test_utils/struct.FoldResult.html b/air_test_utils/struct.FoldResult.html new file mode 100644 index 00000000..a3138580 --- /dev/null +++ b/air_test_utils/struct.FoldResult.html @@ -0,0 +1,92 @@ +FoldResult in air_test_utils - Rust

Struct air_test_utils::FoldResult

source ·
pub struct FoldResult {
+    pub lore: Vec<FoldSubTraceLore>,
+}

Fields§

§lore: Vec<FoldSubTraceLore>

Trait Implementations§

source§

impl Archive for FoldResult
where + Vec<FoldSubTraceLore>: Archive,

§

type Archived = ArchivedFoldResult

The archived representation of this type. Read more
§

type Resolver = FoldResultResolver

The resolver for this type. It must contain all the additional information from serializing +needed to make the archived type from the normal type.
source§

unsafe fn resolve( + &self, + pos: usize, + resolver: <FoldResult as Archive>::Resolver, + out: *mut <FoldResult as Archive>::Archived, +)

Creates the archived version of this value at the given position and writes it to the given +output. Read more
source§

impl Clone for FoldResult

source§

fn clone(&self) -> FoldResult

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for FoldResult

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
source§

impl Default for FoldResult

source§

fn default() -> FoldResult

Returns the “default value” for a type. Read more
source§

impl<'de> Deserialize<'de> for FoldResult

source§

fn deserialize<__D>( + __deserializer: __D, +) -> Result<FoldResult, <__D as Deserializer<'de>>::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl<__D> Deserialize<FoldResult, __D> for <FoldResult as Archive>::Archived
where + __D: Fallible + ?Sized, + Vec<FoldSubTraceLore>: Archive, + <Vec<FoldSubTraceLore> as Archive>::Archived: Deserialize<Vec<FoldSubTraceLore>, __D>,

source§

fn deserialize( + &self, + deserializer: &mut __D, +) -> Result<FoldResult, <__D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl PartialEq for FoldResult

source§

fn eq(&self, other: &FoldResult) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl<__S> Serialize<__S> for FoldResult
where + __S: Fallible + ?Sized, + Vec<FoldSubTraceLore>: Serialize<__S>,

source§

fn serialize( + &self, + serializer: &mut __S, +) -> Result<<FoldResult as Archive>::Resolver, <__S as Fallible>::Error>

Writes the dependencies for the object and returns a resolver that can create the archived +type.
source§

impl Serialize for FoldResult

source§

fn serialize<__S>( + &self, + __serializer: __S, +) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Eq for FoldResult

source§

impl StructuralPartialEq for FoldResult

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
§

impl<T> ArchiveUnsized for T
where + T: Archive,

§

type Archived = <T as Archive>::Archived

The archived counterpart of this type. Unlike Archive, it may be unsized. Read more
§

type MetadataResolver = ()

The resolver for the metadata of this type. Read more
§

unsafe fn resolve_metadata( + &self, + _: usize, + _: <T as ArchiveUnsized>::MetadataResolver, + _: *mut <<T as ArchiveUnsized>::Archived as ArchivePointee>::ArchivedMetadata, +)

Creates the archived version of the metadata for this value at the given position and writes +it to the given output. Read more
§

unsafe fn resolve_unsized( + &self, + from: usize, + to: usize, + resolver: Self::MetadataResolver, + out: *mut RelPtr<Self::Archived, <isize as Archive>::Archived>, +)

Resolves a relative pointer to this value with the given from and to and writes it to +the given output. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
§

impl<T, S> SerializeUnsized<S> for T
where + T: Serialize<S>, + S: Serializer + ?Sized,

§

fn serialize_unsized( + &self, + serializer: &mut S, +) -> Result<usize, <S as Fallible>::Error>

Writes the object and returns the position of the archived type.
§

fn serialize_metadata(&self, _: &mut S) -> Result<(), <S as Fallible>::Error>

Serializes the metadata for the given type.
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_test_utils/struct.FoldResultResolver.html b/air_test_utils/struct.FoldResultResolver.html new file mode 100644 index 00000000..5837b0a2 --- /dev/null +++ b/air_test_utils/struct.FoldResultResolver.html @@ -0,0 +1,33 @@ +FoldResultResolver in air_test_utils - Rust

Struct air_test_utils::FoldResultResolver

source ·
pub struct FoldResultResolver
where + Vec<FoldSubTraceLore>: Archive,
{ /* private fields */ }
Expand description

The resolver for an archived FoldResult

+

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_test_utils/struct.FoldSubTraceLore.html b/air_test_utils/struct.FoldSubTraceLore.html new file mode 100644 index 00000000..0948cae1 --- /dev/null +++ b/air_test_utils/struct.FoldSubTraceLore.html @@ -0,0 +1,117 @@ +FoldSubTraceLore in air_test_utils - Rust

Struct air_test_utils::FoldSubTraceLore

source ·
pub struct FoldSubTraceLore {
+    pub value_pos: TracePos,
+    pub subtraces_desc: Vec<SubTraceDesc>,
+}
Expand description

Let’s consider an example of trace that could be produces by the following fold: +(fold $stream v +(call 1) +(call 2) +(next v) +(call 3) +(call 4) +) +x +Having started with stream with two elements {v1, v2} the resulted trace would looks like +[(1) (2)] [(1) (2)] [(3) (4)] [(3) (4)] <— the sequence of call states +v1 v2 v2 v1 <–– corresponding values from $stream that +the iterable v had at the moment of call

+

From this example, it could be seen that each instruction sequence inside fold is divided into +two intervals (left and right), each of these intervals has borders [begin, end). +So, this struct describes position inside overall execution_step trace belongs to one fold iteration.

+

Fields§

§value_pos: TracePos

Position of current value in a trace.

+
§subtraces_desc: Vec<SubTraceDesc>

Descriptors of a subtrace that are corresponded to the current value. Technically, now +it always contains two values, and Vec here is used to have a possibility to handle more +than one next inside fold in future.

+

Trait Implementations§

source§

impl Archive for FoldSubTraceLore
where + TracePos: Archive, + Vec<SubTraceDesc>: Archive,

§

type Archived = ArchivedFoldSubTraceLore

The archived representation of this type. Read more
§

type Resolver = FoldSubTraceLoreResolver

The resolver for this type. It must contain all the additional information from serializing +needed to make the archived type from the normal type.
source§

unsafe fn resolve( + &self, + pos: usize, + resolver: <FoldSubTraceLore as Archive>::Resolver, + out: *mut <FoldSubTraceLore as Archive>::Archived, +)

Creates the archived version of this value at the given position and writes it to the given +output. Read more
source§

impl Clone for FoldSubTraceLore

source§

fn clone(&self) -> FoldSubTraceLore

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for FoldSubTraceLore

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
source§

impl Default for FoldSubTraceLore

source§

fn default() -> FoldSubTraceLore

Returns the “default value” for a type. Read more
source§

impl<'de> Deserialize<'de> for FoldSubTraceLore

source§

fn deserialize<__D>( + __deserializer: __D, +) -> Result<FoldSubTraceLore, <__D as Deserializer<'de>>::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl<__D> Deserialize<FoldSubTraceLore, __D> for <FoldSubTraceLore as Archive>::Archived
where + __D: Fallible + ?Sized, + TracePos: Archive, + <TracePos as Archive>::Archived: Deserialize<TracePos, __D>, + Vec<SubTraceDesc>: Archive, + <Vec<SubTraceDesc> as Archive>::Archived: Deserialize<Vec<SubTraceDesc>, __D>,

source§

fn deserialize( + &self, + deserializer: &mut __D, +) -> Result<FoldSubTraceLore, <__D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl PartialEq for FoldSubTraceLore

source§

fn eq(&self, other: &FoldSubTraceLore) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl<__S> Serialize<__S> for FoldSubTraceLore
where + __S: Fallible + ?Sized, + TracePos: Serialize<__S>, + Vec<SubTraceDesc>: Serialize<__S>,

source§

fn serialize( + &self, + serializer: &mut __S, +) -> Result<<FoldSubTraceLore as Archive>::Resolver, <__S as Fallible>::Error>

Writes the dependencies for the object and returns a resolver that can create the archived +type.
source§

impl Serialize for FoldSubTraceLore

source§

fn serialize<__S>( + &self, + __serializer: __S, +) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Eq for FoldSubTraceLore

source§

impl StructuralPartialEq for FoldSubTraceLore

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
§

impl<T> ArchiveUnsized for T
where + T: Archive,

§

type Archived = <T as Archive>::Archived

The archived counterpart of this type. Unlike Archive, it may be unsized. Read more
§

type MetadataResolver = ()

The resolver for the metadata of this type. Read more
§

unsafe fn resolve_metadata( + &self, + _: usize, + _: <T as ArchiveUnsized>::MetadataResolver, + _: *mut <<T as ArchiveUnsized>::Archived as ArchivePointee>::ArchivedMetadata, +)

Creates the archived version of the metadata for this value at the given position and writes +it to the given output. Read more
§

unsafe fn resolve_unsized( + &self, + from: usize, + to: usize, + resolver: Self::MetadataResolver, + out: *mut RelPtr<Self::Archived, <isize as Archive>::Archived>, +)

Resolves a relative pointer to this value with the given from and to and writes it to +the given output. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
§

impl<T, S> SerializeUnsized<S> for T
where + T: Serialize<S>, + S: Serializer + ?Sized,

§

fn serialize_unsized( + &self, + serializer: &mut S, +) -> Result<usize, <S as Fallible>::Error>

Writes the object and returns the position of the archived type.
§

fn serialize_metadata(&self, _: &mut S) -> Result<(), <S as Fallible>::Error>

Serializes the metadata for the given type.
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_test_utils/struct.FoldSubTraceLoreResolver.html b/air_test_utils/struct.FoldSubTraceLoreResolver.html new file mode 100644 index 00000000..aa44f760 --- /dev/null +++ b/air_test_utils/struct.FoldSubTraceLoreResolver.html @@ -0,0 +1,34 @@ +FoldSubTraceLoreResolver in air_test_utils - Rust

Struct air_test_utils::FoldSubTraceLoreResolver

source ·
pub struct FoldSubTraceLoreResolver
where + TracePos: Archive, + Vec<SubTraceDesc>: Archive,
{ /* private fields */ }
Expand description

The resolver for an archived FoldSubTraceLore

+

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_test_utils/struct.GenerationIdx.html b/air_test_utils/struct.GenerationIdx.html new file mode 100644 index 00000000..a7e2816f --- /dev/null +++ b/air_test_utils/struct.GenerationIdx.html @@ -0,0 +1,135 @@ +GenerationIdx in air_test_utils - Rust

Struct air_test_utils::GenerationIdx

source ·
pub struct GenerationIdx(/* private fields */);

Implementations§

Trait Implementations§

source§

impl Archive for GenerationIdx
where + u32: Archive,

§

type Archived = ArchivedGenerationIdx

The archived representation of this type. Read more
§

type Resolver = GenerationIdxResolver

The resolver for this type. It must contain all the additional information from serializing +needed to make the archived type from the normal type.
source§

unsafe fn resolve( + &self, + pos: usize, + resolver: <GenerationIdx as Archive>::Resolver, + out: *mut <GenerationIdx as Archive>::Archived, +)

Creates the archived version of this value at the given position and writes it to the given +output. Read more
source§

impl Clone for GenerationIdx

source§

fn clone(&self) -> GenerationIdx

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for GenerationIdx

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
source§

impl Default for GenerationIdx

source§

fn default() -> GenerationIdx

Returns the “default value” for a type. Read more
source§

impl<'de> Deserialize<'de> for GenerationIdx

source§

fn deserialize<__D>( + __deserializer: __D, +) -> Result<GenerationIdx, <__D as Deserializer<'de>>::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl<__D> Deserialize<GenerationIdx, __D> for <GenerationIdx as Archive>::Archived
where + __D: Fallible + ?Sized, + u32: Archive, + <u32 as Archive>::Archived: Deserialize<u32, __D>,

source§

fn deserialize( + &self, + deserializer: &mut __D, +) -> Result<GenerationIdx, <__D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl Display for GenerationIdx

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
source§

impl From<usize> for GenerationIdx

source§

fn from(value: usize) -> GenerationIdx

Converts to this type from the input type.
source§

impl Hash for GenerationIdx

source§

fn hash<__H>(&self, state: &mut __H)
where + __H: Hasher,

Feeds this value into the given Hasher. Read more
1.3.0 · source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
source§

impl Ord for GenerationIdx

source§

fn cmp(&self, other: &GenerationIdx) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · source§

fn max(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · source§

fn min(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · source§

fn clamp(self, min: Self, max: Self) -> Self
where + Self: Sized + PartialOrd,

Restrict a value to a certain interval. Read more
source§

impl PartialEq<usize> for GenerationIdx

source§

fn eq(&self, other: &usize) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl PartialEq for GenerationIdx

source§

fn eq(&self, other: &GenerationIdx) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl PartialOrd<usize> for GenerationIdx

source§

fn partial_cmp(&self, other: &usize) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · source§

fn lt(&self, other: &Rhs) -> bool

This method tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · source§

fn le(&self, other: &Rhs) -> bool

This method tests less than or equal to (for self and other) and is used by the <= +operator. Read more
1.0.0 · source§

fn gt(&self, other: &Rhs) -> bool

This method tests greater than (for self and other) and is used by the > operator. Read more
1.0.0 · source§

fn ge(&self, other: &Rhs) -> bool

This method tests greater than or equal to (for self and other) and is used by the >= +operator. Read more
source§

impl PartialOrd for GenerationIdx

source§

fn partial_cmp(&self, other: &GenerationIdx) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · source§

fn lt(&self, other: &Rhs) -> bool

This method tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · source§

fn le(&self, other: &Rhs) -> bool

This method tests less than or equal to (for self and other) and is used by the <= +operator. Read more
1.0.0 · source§

fn gt(&self, other: &Rhs) -> bool

This method tests greater than (for self and other) and is used by the > operator. Read more
1.0.0 · source§

fn ge(&self, other: &Rhs) -> bool

This method tests greater than or equal to (for self and other) and is used by the >= +operator. Read more
source§

impl<__S> Serialize<__S> for GenerationIdx
where + __S: Fallible + ?Sized, + u32: Serialize<__S>,

source§

fn serialize( + &self, + serializer: &mut __S, +) -> Result<<GenerationIdx as Archive>::Resolver, <__S as Fallible>::Error>

Writes the dependencies for the object and returns a resolver that can create the archived +type.
source§

impl Serialize for GenerationIdx

source§

fn serialize<__S>( + &self, + __serializer: __S, +) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Copy for GenerationIdx

source§

impl Eq for GenerationIdx

source§

impl StructuralPartialEq for GenerationIdx

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
§

impl<T> ArchiveUnsized for T
where + T: Archive,

§

type Archived = <T as Archive>::Archived

The archived counterpart of this type. Unlike Archive, it may be unsized. Read more
§

type MetadataResolver = ()

The resolver for the metadata of this type. Read more
§

unsafe fn resolve_metadata( + &self, + _: usize, + _: <T as ArchiveUnsized>::MetadataResolver, + _: *mut <<T as ArchiveUnsized>::Archived as ArchivePointee>::ArchivedMetadata, +)

Creates the archived version of the metadata for this value at the given position and writes +it to the given output. Read more
§

unsafe fn resolve_unsized( + &self, + from: usize, + to: usize, + resolver: Self::MetadataResolver, + out: *mut RelPtr<Self::Archived, <isize as Archive>::Archived>, +)

Resolves a relative pointer to this value with the given from and to and writes it to +the given output. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CallHasher for T
where + T: Hash + ?Sized,

§

default fn get_hash<H, B>(value: &H, build_hasher: &B) -> u64
where + H: Hash + ?Sized, + B: BuildHasher,

source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
source§

impl<T> CloneToUninit for T
where + T: Copy,

source§

unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<Q, K> Comparable<K> for Q
where + Q: Ord + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn compare(&self, key: &K) -> Ordering

Compare self to key and return their ordering.
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
§

impl<T, S> SerializeUnsized<S> for T
where + T: Serialize<S>, + S: Serializer + ?Sized,

§

fn serialize_unsized( + &self, + serializer: &mut S, +) -> Result<usize, <S as Fallible>::Error>

Writes the object and returns the position of the archived type.
§

fn serialize_metadata(&self, _: &mut S) -> Result<(), <S as Fallible>::Error>

Serializes the metadata for the given type.
§

impl<K, V> TiSliceIndex<K, V> for K
where + usize: From<K>,

§

type Output = V

The output type returned by methods.
§

fn get( + self, + slice: &TiSlice<K, V>, +) -> Option<&<K as TiSliceIndex<K, V>>::Output>

Returns a shared reference to the output at this location, if in +bounds.
§

fn get_mut( + self, + slice: &mut TiSlice<K, V>, +) -> Option<&mut <K as TiSliceIndex<K, V>>::Output>

Returns a mutable reference to the output at this location, if in +bounds.
§

unsafe fn get_unchecked( + self, + slice: &TiSlice<K, V>, +) -> &<K as TiSliceIndex<K, V>>::Output

Returns a shared reference to the output at this location, without +performing any bounds checking. +Calling this method with an out-of-bounds index is undefined behavior +even if the resulting reference is not used.
§

unsafe fn get_unchecked_mut( + self, + slice: &mut TiSlice<K, V>, +) -> &mut <K as TiSliceIndex<K, V>>::Output

Returns a mutable reference to the output at this location, without +performing any bounds checking. +Calling this method with an out-of-bounds index is undefined behavior +even if the resulting reference is not used.
§

fn index(self, slice: &TiSlice<K, V>) -> &<K as TiSliceIndex<K, V>>::Output

Returns a shared reference to the output at this location, panicking +if out of bounds.
§

fn index_mut( + self, + slice: &mut TiSlice<K, V>, +) -> &mut <K as TiSliceIndex<K, V>>::Output

Returns a mutable reference to the output at this location, panicking +if out of bounds.
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_test_utils/struct.GenerationIdxResolver.html b/air_test_utils/struct.GenerationIdxResolver.html new file mode 100644 index 00000000..a1f2ad45 --- /dev/null +++ b/air_test_utils/struct.GenerationIdxResolver.html @@ -0,0 +1,34 @@ +GenerationIdxResolver in air_test_utils - Rust

Struct air_test_utils::GenerationIdxResolver

source ·
pub struct GenerationIdxResolver(/* private fields */)
+where
+    u32: Archive;
Expand description

The resolver for an archived GenerationIdx

+

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_test_utils/struct.InterpreterData.html b/air_test_utils/struct.InterpreterData.html new file mode 100644 index 00000000..b0903cee --- /dev/null +++ b/air_test_utils/struct.InterpreterData.html @@ -0,0 +1,111 @@ +InterpreterData in air_test_utils - Rust

Struct air_test_utils::InterpreterData

source ·
pub struct InterpreterData {
+    pub trace: ExecutionTrace,
+    pub last_call_request_id: u32,
+    pub cid_info: CidInfo,
+    pub signatures: SignatureStore,
+}
Expand description

The AIR interpreter could be considered as a function +f(prev_data: InterpreterData, current_data: InterpreterData, … ) -> (result_data: InterpreterData, …). +This function receives prev and current data and produces a result data. All these data +have the following format.

+

Fields§

§trace: ExecutionTrace

Trace of AIR execution, which contains executed call, par, fold, and ap states.

+
§last_call_request_id: u32

Last exposed to a peer call request id. All next call request ids will be bigger than this.

+
§cid_info: CidInfo

CID-to-somethings mappings.

+
§signatures: SignatureStore

Signature store.

+

Every peer signs call results and canon values it produced (all together), and stores the signatures +in this store.

+

Implementations§

source§

impl InterpreterData

source

pub fn try_from_slice( + slice: &[u8], +) -> Result<InterpreterData, DataDeserializationError>

source

pub fn serialize( + &self, +) -> Result<Vec<u8>, CompositeSerializerError<Infallible, AllocScratchError, SharedSerializeMapError>>

Trait Implementations§

source§

impl Archive for InterpreterData
where + ExecutionTrace: Archive, + u32: Archive, + CidInfo: Archive, + SignatureStore: Archive,

§

type Archived = ArchivedInterpreterData

The archived representation of this type. Read more
§

type Resolver = InterpreterDataResolver

The resolver for this type. It must contain all the additional information from serializing +needed to make the archived type from the normal type.
source§

unsafe fn resolve( + &self, + pos: usize, + resolver: <InterpreterData as Archive>::Resolver, + out: *mut <InterpreterData as Archive>::Archived, +)

Creates the archived version of this value at the given position and writes it to the given +output. Read more
source§

impl Clone for InterpreterData

source§

fn clone(&self) -> InterpreterData

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for InterpreterData

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
source§

impl Default for InterpreterData

source§

fn default() -> InterpreterData

Returns the “default value” for a type. Read more
source§

impl<'de> Deserialize<'de> for InterpreterData

source§

fn deserialize<__D>( + __deserializer: __D, +) -> Result<InterpreterData, <__D as Deserializer<'de>>::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl<__D> Deserialize<InterpreterData, __D> for <InterpreterData as Archive>::Archived
where + __D: Fallible + ?Sized, + ExecutionTrace: Archive, + <ExecutionTrace as Archive>::Archived: Deserialize<ExecutionTrace, __D>, + u32: Archive, + <u32 as Archive>::Archived: Deserialize<u32, __D>, + CidInfo: Archive, + <CidInfo as Archive>::Archived: Deserialize<CidInfo, __D>, + SignatureStore: Archive, + <SignatureStore as Archive>::Archived: Deserialize<SignatureStore, __D>,

source§

fn deserialize( + &self, + deserializer: &mut __D, +) -> Result<InterpreterData, <__D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<__S> Serialize<__S> for InterpreterData
where + __S: Fallible + ?Sized, + ExecutionTrace: Serialize<__S>, + u32: Serialize<__S>, + CidInfo: Serialize<__S>, + SignatureStore: Serialize<__S>,

source§

fn serialize( + &self, + serializer: &mut __S, +) -> Result<<InterpreterData as Archive>::Resolver, <__S as Fallible>::Error>

Writes the dependencies for the object and returns a resolver that can create the archived +type.
source§

impl Serialize for InterpreterData

source§

fn serialize<__S>( + &self, + __serializer: __S, +) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
§

impl<T> ArchiveUnsized for T
where + T: Archive,

§

type Archived = <T as Archive>::Archived

The archived counterpart of this type. Unlike Archive, it may be unsized. Read more
§

type MetadataResolver = ()

The resolver for the metadata of this type. Read more
§

unsafe fn resolve_metadata( + &self, + _: usize, + _: <T as ArchiveUnsized>::MetadataResolver, + _: *mut <<T as ArchiveUnsized>::Archived as ArchivePointee>::ArchivedMetadata, +)

Creates the archived version of the metadata for this value at the given position and writes +it to the given output. Read more
§

unsafe fn resolve_unsized( + &self, + from: usize, + to: usize, + resolver: Self::MetadataResolver, + out: *mut RelPtr<Self::Archived, <isize as Archive>::Archived>, +)

Resolves a relative pointer to this value with the given from and to and writes it to +the given output. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
§

impl<T, S> SerializeUnsized<S> for T
where + T: Serialize<S>, + S: Serializer + ?Sized,

§

fn serialize_unsized( + &self, + serializer: &mut S, +) -> Result<usize, <S as Fallible>::Error>

Writes the object and returns the position of the archived type.
§

fn serialize_metadata(&self, _: &mut S) -> Result<(), <S as Fallible>::Error>

Serializes the metadata for the given type.
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_test_utils/struct.InterpreterDataEnvelope.html b/air_test_utils/struct.InterpreterDataEnvelope.html new file mode 100644 index 00000000..41fdbf1a --- /dev/null +++ b/air_test_utils/struct.InterpreterDataEnvelope.html @@ -0,0 +1,61 @@ +InterpreterDataEnvelope in air_test_utils - Rust

Struct air_test_utils::InterpreterDataEnvelope

source ·
pub struct InterpreterDataEnvelope<'a> {
+    pub versions: Versions,
+    pub inner_data: Cow<'a, [u8]>,
+}
Expand description

An envelope for the AIR interpreter data that makes AIR data version info accessible in a stable way.

+

Fields§

§versions: Versions

Versions of data and an interpreter produced this data.

+
§inner_data: Cow<'a, [u8]>

Implementations§

source§

impl InterpreterDataEnvelope<'_>

source

pub fn new(interpreter_version: Version) -> InterpreterDataEnvelope<'_>

source

pub fn from_execution_result( + trace: ExecutionTrace, + cid_info: CidInfo, + signatures: SignatureStore, + last_call_request_id: u32, + interpreter_version: Version, +) -> InterpreterDataEnvelope<'_>

source

pub fn try_get_versions( + slice: &[u8], +) -> Result<Versions, DataDeserializationError>

Tries to de InterpreterData from slice according to the data version. +Tries to de only versions part of interpreter data.

+
source

pub fn serialize( + &self, +) -> Result<Vec<u8>, <InterpreterDataEnvelopeRepr as Representation>::SerializeError>

source§

impl<'data> InterpreterDataEnvelope<'data>

Trait Implementations§

source§

impl<'a> Clone for InterpreterDataEnvelope<'a>

source§

fn clone(&self) -> InterpreterDataEnvelope<'a>

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl<'a> Debug for InterpreterDataEnvelope<'a>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
source§

impl<'de, 'a> Deserialize<'de> for InterpreterDataEnvelope<'a>
where + 'de: 'a,

source§

fn deserialize<__D>( + __deserializer: __D, +) -> Result<InterpreterDataEnvelope<'a>, <__D as Deserializer<'de>>::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl<'a> Serialize for InterpreterDataEnvelope<'a>

source§

fn serialize<__S>( + &self, + __serializer: __S, +) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_test_utils/struct.InterpreterDataEnvelopeRepr.html b/air_test_utils/struct.InterpreterDataEnvelopeRepr.html new file mode 100644 index 00000000..dddf321c --- /dev/null +++ b/air_test_utils/struct.InterpreterDataEnvelopeRepr.html @@ -0,0 +1,34 @@ +InterpreterDataEnvelopeRepr in air_test_utils - Rust

Struct air_test_utils::InterpreterDataEnvelopeRepr

source ·
pub struct InterpreterDataEnvelopeRepr;

Trait Implementations§

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_test_utils/struct.InterpreterDataResolver.html b/air_test_utils/struct.InterpreterDataResolver.html new file mode 100644 index 00000000..64268d98 --- /dev/null +++ b/air_test_utils/struct.InterpreterDataResolver.html @@ -0,0 +1,36 @@ +InterpreterDataResolver in air_test_utils - Rust

Struct air_test_utils::InterpreterDataResolver

source ·
pub struct InterpreterDataResolver
where + ExecutionTrace: Archive, + u32: Archive, + CidInfo: Archive, + SignatureStore: Archive,
{ /* private fields */ }
Expand description

The resolver for an archived InterpreterData

+

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_test_utils/struct.ParResult.html b/air_test_utils/struct.ParResult.html new file mode 100644 index 00000000..f6dcac90 --- /dev/null +++ b/air_test_utils/struct.ParResult.html @@ -0,0 +1,87 @@ +ParResult in air_test_utils - Rust

Struct air_test_utils::ParResult

source ·
pub struct ParResult {
+    pub left_size: u32,
+    pub right_size: u32,
+}

Fields§

§left_size: u32§right_size: u32

Implementations§

source§

impl ParResult

source

pub fn new(left_size: u32, right_size: u32) -> ParResult

source

pub fn size(&self) -> Option<u32>

Returns a size of subtrace that this par describes in execution_step trace.

+

Trait Implementations§

source§

impl Archive for ParResult
where + u32: Archive,

§

type Archived = ArchivedParResult

The archived representation of this type. Read more
§

type Resolver = ParResultResolver

The resolver for this type. It must contain all the additional information from serializing +needed to make the archived type from the normal type.
source§

unsafe fn resolve( + &self, + pos: usize, + resolver: <ParResult as Archive>::Resolver, + out: *mut <ParResult as Archive>::Archived, +)

Creates the archived version of this value at the given position and writes it to the given +output. Read more
source§

impl Clone for ParResult

source§

fn clone(&self) -> ParResult

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for ParResult

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
source§

impl Default for ParResult

source§

fn default() -> ParResult

Returns the “default value” for a type. Read more
source§

impl<__D> Deserialize<ParResult, __D> for <ParResult as Archive>::Archived
where + __D: Fallible + ?Sized, + u32: Archive, + <u32 as Archive>::Archived: Deserialize<u32, __D>,

source§

fn deserialize( + &self, + deserializer: &mut __D, +) -> Result<ParResult, <__D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl PartialEq for ParResult

source§

fn eq(&self, other: &ParResult) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl<__S> Serialize<__S> for ParResult
where + __S: Fallible + ?Sized, + u32: Serialize<__S>,

source§

fn serialize( + &self, + serializer: &mut __S, +) -> Result<<ParResult as Archive>::Resolver, <__S as Fallible>::Error>

Writes the dependencies for the object and returns a resolver that can create the archived +type.
source§

impl Copy for ParResult

source§

impl Eq for ParResult

source§

impl StructuralPartialEq for ParResult

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
§

impl<T> ArchiveUnsized for T
where + T: Archive,

§

type Archived = <T as Archive>::Archived

The archived counterpart of this type. Unlike Archive, it may be unsized. Read more
§

type MetadataResolver = ()

The resolver for the metadata of this type. Read more
§

unsafe fn resolve_metadata( + &self, + _: usize, + _: <T as ArchiveUnsized>::MetadataResolver, + _: *mut <<T as ArchiveUnsized>::Archived as ArchivePointee>::ArchivedMetadata, +)

Creates the archived version of the metadata for this value at the given position and writes +it to the given output. Read more
§

unsafe fn resolve_unsized( + &self, + from: usize, + to: usize, + resolver: Self::MetadataResolver, + out: *mut RelPtr<Self::Archived, <isize as Archive>::Archived>, +)

Resolves a relative pointer to this value with the given from and to and writes it to +the given output. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
source§

impl<T> CloneToUninit for T
where + T: Copy,

source§

unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
§

impl<T, S> SerializeUnsized<S> for T
where + T: Serialize<S>, + S: Serializer + ?Sized,

§

fn serialize_unsized( + &self, + serializer: &mut S, +) -> Result<usize, <S as Fallible>::Error>

Writes the object and returns the position of the archived type.
§

fn serialize_metadata(&self, _: &mut S) -> Result<(), <S as Fallible>::Error>

Serializes the metadata for the given type.
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_test_utils/struct.ParResultResolver.html b/air_test_utils/struct.ParResultResolver.html new file mode 100644 index 00000000..c0276ea2 --- /dev/null +++ b/air_test_utils/struct.ParResultResolver.html @@ -0,0 +1,33 @@ +ParResultResolver in air_test_utils - Rust

Struct air_test_utils::ParResultResolver

source ·
pub struct ParResultResolver
where + u32: Archive,
{ /* private fields */ }
Expand description

The resolver for an archived ParResult

+

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_test_utils/struct.ParticleParameters.html b/air_test_utils/struct.ParticleParameters.html new file mode 100644 index 00000000..1cc65d9b --- /dev/null +++ b/air_test_utils/struct.ParticleParameters.html @@ -0,0 +1,54 @@ +ParticleParameters in air_test_utils - Rust

Struct air_test_utils::ParticleParameters

source ·
pub struct ParticleParameters<'ctx> {
+    pub init_peer_id: Cow<'ctx, str>,
+    pub particle_id: Cow<'ctx, str>,
+    pub timestamp: u64,
+    pub ttl: u32,
+    pub current_peer_id: Cow<'ctx, str>,
+}
Expand description

Represents parameters obtained from a particle.

+

Fields§

§init_peer_id: Cow<'ctx, str>§particle_id: Cow<'ctx, str>§timestamp: u64§ttl: u32§current_peer_id: Cow<'ctx, str>

Implementations§

source§

impl<'ctx> ParticleParameters<'ctx>

source

pub fn new( + init_peer_id: Cow<'ctx, str>, + particle_id: Cow<'ctx, str>, + timestamp: u64, + ttl: u32, + current_peer_id: Cow<'ctx, str>, +) -> ParticleParameters<'ctx>

Trait Implementations§

source§

impl<'ctx> Clone for ParticleParameters<'ctx>

source§

fn clone(&self) -> ParticleParameters<'ctx>

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl<'ctx> Debug for ParticleParameters<'ctx>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
source§

impl<'de, 'ctx> Deserialize<'de> for ParticleParameters<'ctx>

source§

fn deserialize<__D>( + __deserializer: __D, +) -> Result<ParticleParameters<'ctx>, <__D as Deserializer<'de>>::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl<'ctx> Serialize for ParticleParameters<'ctx>

source§

fn serialize<__S>( + &self, + __serializer: __S, +) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more

Auto Trait Implementations§

§

impl<'ctx> Freeze for ParticleParameters<'ctx>

§

impl<'ctx> RefUnwindSafe for ParticleParameters<'ctx>

§

impl<'ctx> Send for ParticleParameters<'ctx>

§

impl<'ctx> Sync for ParticleParameters<'ctx>

§

impl<'ctx> Unpin for ParticleParameters<'ctx>

§

impl<'ctx> UnwindSafe for ParticleParameters<'ctx>

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_test_utils/struct.RawAVMOutcome.html b/air_test_utils/struct.RawAVMOutcome.html new file mode 100644 index 00000000..ec625200 --- /dev/null +++ b/air_test_utils/struct.RawAVMOutcome.html @@ -0,0 +1,61 @@ +RawAVMOutcome in air_test_utils - Rust

Struct air_test_utils::RawAVMOutcome

source ·
pub struct RawAVMOutcome {
+    pub ret_code: i64,
+    pub error_message: String,
+    pub data: Vec<u8>,
+    pub call_requests: HashMap<u32, CallRequestParams>,
+    pub next_peer_pks: Vec<String>,
+    pub soft_limits_triggering: SoftLimitsTriggering,
+}
Expand description

This struct is very similar to AVMOutcome, but keeps error_code and error_msg for test purposes.

+

Fields§

§ret_code: i64§error_message: String§data: Vec<u8>§call_requests: HashMap<u32, CallRequestParams>§next_peer_pks: Vec<String>§soft_limits_triggering: SoftLimitsTriggering

Implementations§

Trait Implementations§

source§

impl Clone for RawAVMOutcome

source§

fn clone(&self) -> RawAVMOutcome

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for RawAVMOutcome

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
source§

impl<'de> Deserialize<'de> for RawAVMOutcome

source§

fn deserialize<__D>( + __deserializer: __D, +) -> Result<RawAVMOutcome, <__D as Deserializer<'de>>::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl PartialEq for RawAVMOutcome

source§

fn eq(&self, other: &RawAVMOutcome) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl Serialize for RawAVMOutcome

source§

fn serialize<__S>( + &self, + __serializer: __S, +) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Eq for RawAVMOutcome

source§

impl StructuralPartialEq for RawAVMOutcome

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_test_utils/struct.RawValue.html b/air_test_utils/struct.RawValue.html new file mode 100644 index 00000000..46f06a2e --- /dev/null +++ b/air_test_utils/struct.RawValue.html @@ -0,0 +1,94 @@ +RawValue in air_test_utils - Rust

Struct air_test_utils::RawValue

source ·
pub struct RawValue { /* private fields */ }

Implementations§

source§

impl RawValue

source

pub fn from_value(value: impl Into<JValue>) -> RawValue

source

pub fn get_value(&self) -> JValue

Trait Implementations§

source§

impl Archive for RawValue
where + Box<str>: Archive, + With<RefCell<Option<JValue>>, Skip>: Archive,

§

type Archived = ArchivedRawValue

The archived representation of this type. Read more
§

type Resolver = RawValueResolver

The resolver for this type. It must contain all the additional information from serializing +needed to make the archived type from the normal type.
source§

unsafe fn resolve( + &self, + pos: usize, + resolver: <RawValue as Archive>::Resolver, + out: *mut <RawValue as Archive>::Archived, +)

Creates the archived version of this value at the given position and writes it to the given +output. Read more
source§

impl Clone for RawValue

source§

fn clone(&self) -> RawValue

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for RawValue

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
source§

impl<'de> Deserialize<'de> for RawValue

source§

fn deserialize<__D>( + __deserializer: __D, +) -> Result<RawValue, <__D as Deserializer<'de>>::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl<__D> Deserialize<RawValue, __D> for <RawValue as Archive>::Archived
where + __D: Fallible + ?Sized, + Box<str>: Archive, + <Box<str> as Archive>::Archived: Deserialize<Box<str>, __D>, + With<RefCell<Option<JValue>>, Skip>: Archive, + <With<RefCell<Option<JValue>>, Skip> as Archive>::Archived: Deserialize<With<RefCell<Option<JValue>>, Skip>, __D>,

source§

fn deserialize( + &self, + deserializer: &mut __D, +) -> Result<RawValue, <__D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl From<JValue> for RawValue

source§

fn from(value: JValue) -> RawValue

Converts to this type from the input type.
source§

impl PartialEq for RawValue

source§

fn eq(&self, other: &RawValue) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl<__S> Serialize<__S> for RawValue
where + __S: Fallible + ?Sized, + Box<str>: Serialize<__S>, + With<RefCell<Option<JValue>>, Skip>: Serialize<__S>,

source§

fn serialize( + &self, + serializer: &mut __S, +) -> Result<<RawValue as Archive>::Resolver, <__S as Fallible>::Error>

Writes the dependencies for the object and returns a resolver that can create the archived +type.
source§

impl Serialize for RawValue

source§

fn serialize<__S>( + &self, + __serializer: __S, +) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Eq for RawValue

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
§

impl<T> ArchiveUnsized for T
where + T: Archive,

§

type Archived = <T as Archive>::Archived

The archived counterpart of this type. Unlike Archive, it may be unsized. Read more
§

type MetadataResolver = ()

The resolver for the metadata of this type. Read more
§

unsafe fn resolve_metadata( + &self, + _: usize, + _: <T as ArchiveUnsized>::MetadataResolver, + _: *mut <<T as ArchiveUnsized>::Archived as ArchivePointee>::ArchivedMetadata, +)

Creates the archived version of the metadata for this value at the given position and writes +it to the given output. Read more
§

unsafe fn resolve_unsized( + &self, + from: usize, + to: usize, + resolver: Self::MetadataResolver, + out: *mut RelPtr<Self::Archived, <isize as Archive>::Archived>, +)

Resolves a relative pointer to this value with the given from and to and writes it to +the given output. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
§

impl<T, S> SerializeUnsized<S> for T
where + T: Serialize<S>, + S: Serializer + ?Sized,

§

fn serialize_unsized( + &self, + serializer: &mut S, +) -> Result<usize, <S as Fallible>::Error>

Writes the object and returns the position of the archived type.
§

fn serialize_metadata(&self, _: &mut S) -> Result<(), <S as Fallible>::Error>

Serializes the metadata for the given type.
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_test_utils/struct.RawValueResolver.html b/air_test_utils/struct.RawValueResolver.html new file mode 100644 index 00000000..909c08e0 --- /dev/null +++ b/air_test_utils/struct.RawValueResolver.html @@ -0,0 +1,34 @@ +RawValueResolver in air_test_utils - Rust

Struct air_test_utils::RawValueResolver

source ·
pub struct RawValueResolver
where + Box<str>: Archive, + With<RefCell<Option<JValue>>, Skip>: Archive,
{ /* private fields */ }
Expand description

The resolver for an archived RawValue

+

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_test_utils/struct.SecurityTetraplet.html b/air_test_utils/struct.SecurityTetraplet.html new file mode 100644 index 00000000..91cac78e --- /dev/null +++ b/air_test_utils/struct.SecurityTetraplet.html @@ -0,0 +1,114 @@ +SecurityTetraplet in air_test_utils - Rust

Struct air_test_utils::SecurityTetraplet

pub struct SecurityTetraplet {
+    pub peer_pk: String,
+    pub service_id: String,
+    pub function_name: String,
+    pub lens: String,
+}
Expand description

Describes an origin that set corresponding value.

+

Fields§

§peer_pk: String

Id of a peer where corresponding value was set.

+
§service_id: String

Id of a service that set corresponding value.

+
§function_name: String

Name of a function that returned corresponding value.

+
§lens: String

Value was produced by applying this lens to the output from call_service.

+

Implementations§

§

impl SecurityTetraplet

pub fn new( + peer_pk: impl Into<String>, + service_id: impl Into<String>, + function_name: impl Into<String>, + lens: impl Into<String>, +) -> SecurityTetraplet

pub fn literal_tetraplet(init_peer_id: impl Into<String>) -> SecurityTetraplet

Create a tetraplet for string literals defined in the script +such as variable here (call ("" "") "" ["variable_1"]).

+

pub fn add_lens(&mut self, lens: &str)

Trait Implementations§

§

impl Archive for SecurityTetraplet
where + String: Archive,

§

type Archived = ArchivedSecurityTetraplet

The archived representation of this type. Read more
§

type Resolver = SecurityTetrapletResolver

The resolver for this type. It must contain all the additional information from serializing +needed to make the archived type from the normal type.
§

unsafe fn resolve( + &self, + pos: usize, + resolver: <SecurityTetraplet as Archive>::Resolver, + out: *mut <SecurityTetraplet as Archive>::Archived, +)

Creates the archived version of this value at the given position and writes it to the given +output. Read more
§

impl Clone for SecurityTetraplet

§

fn clone(&self) -> SecurityTetraplet

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
§

impl Debug for SecurityTetraplet

§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
§

impl Default for SecurityTetraplet

§

fn default() -> SecurityTetraplet

Returns the “default value” for a type. Read more
§

impl<'de> Deserialize<'de> for SecurityTetraplet

§

fn deserialize<__D>( + __deserializer: __D, +) -> Result<SecurityTetraplet, <__D as Deserializer<'de>>::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
§

impl<__D> Deserialize<SecurityTetraplet, __D> for <SecurityTetraplet as Archive>::Archived
where + __D: Fallible + ?Sized, + String: Archive, + <String as Archive>::Archived: Deserialize<String, __D>,

§

fn deserialize( + &self, + deserializer: &mut __D, +) -> Result<SecurityTetraplet, <__D as Fallible>::Error>

Deserializes using the given deserializer
§

impl Display for SecurityTetraplet

§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
source§

impl From<ResolvedTriplet> for SecurityTetraplet

source§

fn from(triplet: ResolvedTriplet) -> SecurityTetraplet

Converts to this type from the input type.
§

impl Hash for SecurityTetraplet

§

fn hash<__H>(&self, state: &mut __H)
where + __H: Hasher,

Feeds this value into the given Hasher. Read more
1.3.0 · source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
§

impl PartialEq for SecurityTetraplet

§

fn eq(&self, other: &SecurityTetraplet) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
§

impl<__S> Serialize<__S> for SecurityTetraplet
where + __S: Fallible + ?Sized, + String: Serialize<__S>,

§

fn serialize( + &self, + serializer: &mut __S, +) -> Result<<SecurityTetraplet as Archive>::Resolver, <__S as Fallible>::Error>

Writes the dependencies for the object and returns a resolver that can create the archived +type.
§

impl Serialize for SecurityTetraplet

§

fn serialize<__S>( + &self, + __serializer: __S, +) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
§

impl Eq for SecurityTetraplet

§

impl StructuralPartialEq for SecurityTetraplet

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
§

impl<T> ArchiveUnsized for T
where + T: Archive,

§

type Archived = <T as Archive>::Archived

The archived counterpart of this type. Unlike Archive, it may be unsized. Read more
§

type MetadataResolver = ()

The resolver for the metadata of this type. Read more
§

unsafe fn resolve_metadata( + &self, + _: usize, + _: <T as ArchiveUnsized>::MetadataResolver, + _: *mut <<T as ArchiveUnsized>::Archived as ArchivePointee>::ArchivedMetadata, +)

Creates the archived version of the metadata for this value at the given position and writes +it to the given output. Read more
§

unsafe fn resolve_unsized( + &self, + from: usize, + to: usize, + resolver: Self::MetadataResolver, + out: *mut RelPtr<Self::Archived, <isize as Archive>::Archived>, +)

Resolves a relative pointer to this value with the given from and to and writes it to +the given output. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CallHasher for T
where + T: Hash + ?Sized,

§

default fn get_hash<H, B>(value: &H, build_hasher: &B) -> u64
where + H: Hash + ?Sized, + B: BuildHasher,

source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
§

impl<T, S> SerializeUnsized<S> for T
where + T: Serialize<S>, + S: Serializer + ?Sized,

§

fn serialize_unsized( + &self, + serializer: &mut S, +) -> Result<usize, <S as Fallible>::Error>

Writes the object and returns the position of the archived type.
§

fn serialize_metadata(&self, _: &mut S) -> Result<(), <S as Fallible>::Error>

Serializes the metadata for the given type.
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_test_utils/struct.ServiceResultCidAggregate.html b/air_test_utils/struct.ServiceResultCidAggregate.html new file mode 100644 index 00000000..9defa21c --- /dev/null +++ b/air_test_utils/struct.ServiceResultCidAggregate.html @@ -0,0 +1,109 @@ +ServiceResultCidAggregate in air_test_utils - Rust

Struct air_test_utils::ServiceResultCidAggregate

source ·
pub struct ServiceResultCidAggregate {
+    pub value_cid: CID<RawValue>,
+    pub argument_hash: Rc<str>,
+    pub tetraplet_cid: CID<SecurityTetraplet>,
+}
Expand description

A proof of service result execution result.

+

Fields§

§value_cid: CID<RawValue>§argument_hash: Rc<str>

Hash of the call arguments.

+
§tetraplet_cid: CID<SecurityTetraplet>

The tetraplet of the call result.

+

Implementations§

source§

impl ServiceResultCidAggregate

source

pub fn new( + value_cid: CID<RawValue>, + argument_hash: Rc<str>, + tetraplet_cid: CID<SecurityTetraplet>, +) -> ServiceResultCidAggregate

Trait Implementations§

source§

impl Archive for ServiceResultCidAggregate
where + CID<RawValue>: Archive, + Rc<str>: Archive, + CID<SecurityTetraplet>: Archive,

§

type Archived = ArchivedServiceResultCidAggregate

The archived representation of this type. Read more
§

type Resolver = ServiceResultCidAggregateResolver

The resolver for this type. It must contain all the additional information from serializing +needed to make the archived type from the normal type.
source§

unsafe fn resolve( + &self, + pos: usize, + resolver: <ServiceResultCidAggregate as Archive>::Resolver, + out: *mut <ServiceResultCidAggregate as Archive>::Archived, +)

Creates the archived version of this value at the given position and writes it to the given +output. Read more
source§

impl Clone for ServiceResultCidAggregate

source§

fn clone(&self) -> ServiceResultCidAggregate

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for ServiceResultCidAggregate

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
source§

impl<'de> Deserialize<'de> for ServiceResultCidAggregate

source§

fn deserialize<__D>( + __deserializer: __D, +) -> Result<ServiceResultCidAggregate, <__D as Deserializer<'de>>::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl<__D> Deserialize<ServiceResultCidAggregate, __D> for <ServiceResultCidAggregate as Archive>::Archived
where + __D: Fallible + ?Sized, + CID<RawValue>: Archive, + <CID<RawValue> as Archive>::Archived: Deserialize<CID<RawValue>, __D>, + Rc<str>: Archive, + <Rc<str> as Archive>::Archived: Deserialize<Rc<str>, __D>, + CID<SecurityTetraplet>: Archive, + <CID<SecurityTetraplet> as Archive>::Archived: Deserialize<CID<SecurityTetraplet>, __D>,

source§

fn deserialize( + &self, + deserializer: &mut __D, +) -> Result<ServiceResultCidAggregate, <__D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl PartialEq for ServiceResultCidAggregate

source§

fn eq(&self, other: &ServiceResultCidAggregate) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl<__S> Serialize<__S> for ServiceResultCidAggregate
where + __S: Fallible + ?Sized, + CID<RawValue>: Serialize<__S>, + Rc<str>: Serialize<__S>, + CID<SecurityTetraplet>: Serialize<__S>,

source§

fn serialize( + &self, + serializer: &mut __S, +) -> Result<<ServiceResultCidAggregate as Archive>::Resolver, <__S as Fallible>::Error>

Writes the dependencies for the object and returns a resolver that can create the archived +type.
source§

impl Serialize for ServiceResultCidAggregate

source§

fn serialize<__S>( + &self, + __serializer: __S, +) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Eq for ServiceResultCidAggregate

source§

impl StructuralPartialEq for ServiceResultCidAggregate

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
§

impl<T> ArchiveUnsized for T
where + T: Archive,

§

type Archived = <T as Archive>::Archived

The archived counterpart of this type. Unlike Archive, it may be unsized. Read more
§

type MetadataResolver = ()

The resolver for the metadata of this type. Read more
§

unsafe fn resolve_metadata( + &self, + _: usize, + _: <T as ArchiveUnsized>::MetadataResolver, + _: *mut <<T as ArchiveUnsized>::Archived as ArchivePointee>::ArchivedMetadata, +)

Creates the archived version of the metadata for this value at the given position and writes +it to the given output. Read more
§

unsafe fn resolve_unsized( + &self, + from: usize, + to: usize, + resolver: Self::MetadataResolver, + out: *mut RelPtr<Self::Archived, <isize as Archive>::Archived>, +)

Resolves a relative pointer to this value with the given from and to and writes it to +the given output. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
§

impl<T, S> SerializeUnsized<S> for T
where + T: Serialize<S>, + S: Serializer + ?Sized,

§

fn serialize_unsized( + &self, + serializer: &mut S, +) -> Result<usize, <S as Fallible>::Error>

Writes the object and returns the position of the archived type.
§

fn serialize_metadata(&self, _: &mut S) -> Result<(), <S as Fallible>::Error>

Serializes the metadata for the given type.
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_test_utils/struct.ServiceResultCidAggregateResolver.html b/air_test_utils/struct.ServiceResultCidAggregateResolver.html new file mode 100644 index 00000000..9a084ccb --- /dev/null +++ b/air_test_utils/struct.ServiceResultCidAggregateResolver.html @@ -0,0 +1,35 @@ +ServiceResultCidAggregateResolver in air_test_utils - Rust
pub struct ServiceResultCidAggregateResolver
where + CID<RawValue>: Archive, + Rc<str>: Archive, + CID<SecurityTetraplet>: Archive,
{ /* private fields */ }
Expand description

The resolver for an archived ServiceResultCidAggregate

+

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_test_utils/struct.SoftLimitsTriggering.html b/air_test_utils/struct.SoftLimitsTriggering.html new file mode 100644 index 00000000..f3170aef --- /dev/null +++ b/air_test_utils/struct.SoftLimitsTriggering.html @@ -0,0 +1,61 @@ +SoftLimitsTriggering in air_test_utils - Rust

Struct air_test_utils::SoftLimitsTriggering

source ·
pub struct SoftLimitsTriggering {
+    pub air_size_limit_exceeded: bool,
+    pub particle_size_limit_exceeded: bool,
+    pub call_result_size_limit_exceeded: bool,
+}
Expand description

This stores soft limits triggering flags.

+

Fields§

§air_size_limit_exceeded: bool§particle_size_limit_exceeded: bool§call_result_size_limit_exceeded: bool

Implementations§

source§

impl SoftLimitsTriggering

source

pub fn new( + air_size_limit_exceeded: bool, + particle_size_limit_exceeded: bool, + call_result_size_limit_exceeded: bool, +) -> SoftLimitsTriggering

source

pub fn are_limits_exceeded(&self) -> bool

Trait Implementations§

source§

impl Clone for SoftLimitsTriggering

source§

fn clone(&self) -> SoftLimitsTriggering

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for SoftLimitsTriggering

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
source§

impl Default for SoftLimitsTriggering

source§

fn default() -> SoftLimitsTriggering

Returns the “default value” for a type. Read more
source§

impl<'de> Deserialize<'de> for SoftLimitsTriggering

source§

fn deserialize<__D>( + __deserializer: __D, +) -> Result<SoftLimitsTriggering, <__D as Deserializer<'de>>::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl PartialEq for SoftLimitsTriggering

source§

fn eq(&self, other: &SoftLimitsTriggering) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl Serialize for SoftLimitsTriggering

source§

fn serialize<__S>( + &self, + __serializer: __S, +) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Copy for SoftLimitsTriggering

source§

impl Eq for SoftLimitsTriggering

source§

impl StructuralPartialEq for SoftLimitsTriggering

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
source§

impl<T> CloneToUninit for T
where + T: Copy,

source§

unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_test_utils/struct.SubTraceDesc.html b/air_test_utils/struct.SubTraceDesc.html new file mode 100644 index 00000000..fb0cdbc3 --- /dev/null +++ b/air_test_utils/struct.SubTraceDesc.html @@ -0,0 +1,101 @@ +SubTraceDesc in air_test_utils - Rust

Struct air_test_utils::SubTraceDesc

source ·
pub struct SubTraceDesc {
+    pub begin_pos: TracePos,
+    pub subtrace_len: u32,
+}
Expand description

Descriptor of a subtrace inside execution trace.

+

Fields§

§begin_pos: TracePos

Start position in a trace of this subtrace.

+
§subtrace_len: u32

Length of the subtrace.

+

Implementations§

source§

impl SubTraceDesc

source

pub fn new(begin_pos: TracePos, subtrace_len: usize) -> SubTraceDesc

Trait Implementations§

source§

impl Archive for SubTraceDesc
where + TracePos: Archive, + u32: Archive,

§

type Archived = ArchivedSubTraceDesc

The archived representation of this type. Read more
§

type Resolver = SubTraceDescResolver

The resolver for this type. It must contain all the additional information from serializing +needed to make the archived type from the normal type.
source§

unsafe fn resolve( + &self, + pos: usize, + resolver: <SubTraceDesc as Archive>::Resolver, + out: *mut <SubTraceDesc as Archive>::Archived, +)

Creates the archived version of this value at the given position and writes it to the given +output. Read more
source§

impl Clone for SubTraceDesc

source§

fn clone(&self) -> SubTraceDesc

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for SubTraceDesc

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
source§

impl Default for SubTraceDesc

source§

fn default() -> SubTraceDesc

Returns the “default value” for a type. Read more
source§

impl<'de> Deserialize<'de> for SubTraceDesc

source§

fn deserialize<__D>( + __deserializer: __D, +) -> Result<SubTraceDesc, <__D as Deserializer<'de>>::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl<__D> Deserialize<SubTraceDesc, __D> for <SubTraceDesc as Archive>::Archived
where + __D: Fallible + ?Sized, + TracePos: Archive, + <TracePos as Archive>::Archived: Deserialize<TracePos, __D>, + u32: Archive, + <u32 as Archive>::Archived: Deserialize<u32, __D>,

source§

fn deserialize( + &self, + deserializer: &mut __D, +) -> Result<SubTraceDesc, <__D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl PartialEq for SubTraceDesc

source§

fn eq(&self, other: &SubTraceDesc) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl<__S> Serialize<__S> for SubTraceDesc
where + __S: Fallible + ?Sized, + TracePos: Serialize<__S>, + u32: Serialize<__S>,

source§

fn serialize( + &self, + serializer: &mut __S, +) -> Result<<SubTraceDesc as Archive>::Resolver, <__S as Fallible>::Error>

Writes the dependencies for the object and returns a resolver that can create the archived +type.
source§

impl Serialize for SubTraceDesc

source§

fn serialize<__S>( + &self, + __serializer: __S, +) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Copy for SubTraceDesc

source§

impl Eq for SubTraceDesc

source§

impl StructuralPartialEq for SubTraceDesc

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
§

impl<T> ArchiveUnsized for T
where + T: Archive,

§

type Archived = <T as Archive>::Archived

The archived counterpart of this type. Unlike Archive, it may be unsized. Read more
§

type MetadataResolver = ()

The resolver for the metadata of this type. Read more
§

unsafe fn resolve_metadata( + &self, + _: usize, + _: <T as ArchiveUnsized>::MetadataResolver, + _: *mut <<T as ArchiveUnsized>::Archived as ArchivePointee>::ArchivedMetadata, +)

Creates the archived version of the metadata for this value at the given position and writes +it to the given output. Read more
§

unsafe fn resolve_unsized( + &self, + from: usize, + to: usize, + resolver: Self::MetadataResolver, + out: *mut RelPtr<Self::Archived, <isize as Archive>::Archived>, +)

Resolves a relative pointer to this value with the given from and to and writes it to +the given output. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
source§

impl<T> CloneToUninit for T
where + T: Copy,

source§

unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
§

impl<T, S> SerializeUnsized<S> for T
where + T: Serialize<S>, + S: Serializer + ?Sized,

§

fn serialize_unsized( + &self, + serializer: &mut S, +) -> Result<usize, <S as Fallible>::Error>

Writes the object and returns the position of the archived type.
§

fn serialize_metadata(&self, _: &mut S) -> Result<(), <S as Fallible>::Error>

Serializes the metadata for the given type.
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_test_utils/struct.SubTraceDescResolver.html b/air_test_utils/struct.SubTraceDescResolver.html new file mode 100644 index 00000000..269c43f4 --- /dev/null +++ b/air_test_utils/struct.SubTraceDescResolver.html @@ -0,0 +1,34 @@ +SubTraceDescResolver in air_test_utils - Rust

Struct air_test_utils::SubTraceDescResolver

source ·
pub struct SubTraceDescResolver
where + TracePos: Archive, + u32: Archive,
{ /* private fields */ }
Expand description

The resolver for an archived SubTraceDesc

+

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_test_utils/struct.TracePos.html b/air_test_utils/struct.TracePos.html new file mode 100644 index 00000000..df93b9b5 --- /dev/null +++ b/air_test_utils/struct.TracePos.html @@ -0,0 +1,137 @@ +TracePos in air_test_utils - Rust

Struct air_test_utils::TracePos

source ·
pub struct TracePos(/* private fields */);

Trait Implementations§

source§

impl Add<u32> for TracePos

§

type Output = TracePos

The resulting type after applying the + operator.
source§

fn add(self, rhs: u32) -> TracePos

Performs the + operation. Read more
source§

impl Add for TracePos

§

type Output = TracePos

The resulting type after applying the + operator.
source§

fn add(self, rhs: TracePos) -> TracePos

Performs the + operation. Read more
source§

impl AddAssign<u32> for TracePos

source§

fn add_assign(&mut self, rhs: u32)

Performs the += operation. Read more
source§

impl AddAssign for TracePos

source§

fn add_assign(&mut self, rhs: TracePos)

Performs the += operation. Read more
source§

impl Archive for TracePos
where + u32: Archive,

§

type Archived = ArchivedTracePos

The archived representation of this type. Read more
§

type Resolver = TracePosResolver

The resolver for this type. It must contain all the additional information from serializing +needed to make the archived type from the normal type.
source§

unsafe fn resolve( + &self, + pos: usize, + resolver: <TracePos as Archive>::Resolver, + out: *mut <TracePos as Archive>::Archived, +)

Creates the archived version of this value at the given position and writes it to the given +output. Read more
source§

impl CheckedAdd for TracePos

source§

fn checked_add(&self, other: &TracePos) -> Option<TracePos>

Adds two numbers, checking for overflow. If overflow happens, None is +returned.
source§

impl Clone for TracePos

source§

fn clone(&self) -> TracePos

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for TracePos

source§

fn fmt(&self, fmt: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
source§

impl Default for TracePos

source§

fn default() -> TracePos

Returns the “default value” for a type. Read more
source§

impl<'de> Deserialize<'de> for TracePos

source§

fn deserialize<__D>( + __deserializer: __D, +) -> Result<TracePos, <__D as Deserializer<'de>>::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl<__D> Deserialize<TracePos, __D> for <TracePos as Archive>::Archived
where + __D: Fallible + ?Sized, + u32: Archive, + <u32 as Archive>::Archived: Deserialize<u32, __D>,

source§

fn deserialize( + &self, + deserializer: &mut __D, +) -> Result<TracePos, <__D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl Display for TracePos

source§

fn fmt(&self, fmt: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
source§

impl From<u32> for TracePos

source§

fn from(v: u32) -> TracePos

Converts to this type from the input type.
source§

impl Hash for TracePos

source§

fn hash<__H>(&self, state: &mut __H)
where + __H: Hasher,

Feeds this value into the given Hasher. Read more
1.3.0 · source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
source§

impl Index<TracePos> for ExecutionTrace

§

type Output = ExecutedState

The returned type after indexing.
source§

fn index(&self, index: TracePos) -> &<ExecutionTrace as Index<TracePos>>::Output

Performs the indexing (container[index]) operation. Read more
source§

impl IndexMut<TracePos> for ExecutionTrace

source§

fn index_mut( + &mut self, + index: TracePos, +) -> &mut <ExecutionTrace as Index<TracePos>>::Output

Performs the mutable indexing (container[index]) operation. Read more
source§

impl Ord for TracePos

source§

fn cmp(&self, other: &TracePos) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · source§

fn max(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · source§

fn min(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · source§

fn clamp(self, min: Self, max: Self) -> Self
where + Self: Sized + PartialOrd,

Restrict a value to a certain interval. Read more
source§

impl PartialEq for TracePos

source§

fn eq(&self, other: &TracePos) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl PartialOrd for TracePos

source§

fn partial_cmp(&self, other: &TracePos) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · source§

fn lt(&self, other: &Rhs) -> bool

This method tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · source§

fn le(&self, other: &Rhs) -> bool

This method tests less than or equal to (for self and other) and is used by the <= +operator. Read more
1.0.0 · source§

fn gt(&self, other: &Rhs) -> bool

This method tests greater than (for self and other) and is used by the > operator. Read more
1.0.0 · source§

fn ge(&self, other: &Rhs) -> bool

This method tests greater than or equal to (for self and other) and is used by the >= +operator. Read more
source§

impl<__S> Serialize<__S> for TracePos
where + __S: Fallible + ?Sized, + u32: Serialize<__S>,

source§

fn serialize( + &self, + serializer: &mut __S, +) -> Result<<TracePos as Archive>::Resolver, <__S as Fallible>::Error>

Writes the dependencies for the object and returns a resolver that can create the archived +type.
source§

impl Serialize for TracePos

source§

fn serialize<__S>( + &self, + __serializer: __S, +) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Sub<u32> for TracePos

§

type Output = TracePos

The resulting type after applying the - operator.
source§

fn sub(self, rhs: u32) -> TracePos

Performs the - operation. Read more
source§

impl Sub for TracePos

§

type Output = TracePos

The resulting type after applying the - operator.
source§

fn sub(self, rhs: TracePos) -> TracePos

Performs the - operation. Read more
source§

impl TryFrom<usize> for TracePos

§

type Error = <u32 as TryFrom<usize>>::Error

The type returned in the event of a conversion error.
source§

fn try_from( + value: usize, +) -> Result<TracePos, <TracePos as TryFrom<usize>>::Error>

Performs the conversion.
source§

impl Copy for TracePos

source§

impl Eq for TracePos

source§

impl StructuralPartialEq for TracePos

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
§

impl<T> ArchiveUnsized for T
where + T: Archive,

§

type Archived = <T as Archive>::Archived

The archived counterpart of this type. Unlike Archive, it may be unsized. Read more
§

type MetadataResolver = ()

The resolver for the metadata of this type. Read more
§

unsafe fn resolve_metadata( + &self, + _: usize, + _: <T as ArchiveUnsized>::MetadataResolver, + _: *mut <<T as ArchiveUnsized>::Archived as ArchivePointee>::ArchivedMetadata, +)

Creates the archived version of the metadata for this value at the given position and writes +it to the given output. Read more
§

unsafe fn resolve_unsized( + &self, + from: usize, + to: usize, + resolver: Self::MetadataResolver, + out: *mut RelPtr<Self::Archived, <isize as Archive>::Archived>, +)

Resolves a relative pointer to this value with the given from and to and writes it to +the given output. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CallHasher for T
where + T: Hash + ?Sized,

§

default fn get_hash<H, B>(value: &H, build_hasher: &B) -> u64
where + H: Hash + ?Sized, + B: BuildHasher,

source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
source§

impl<T> CloneToUninit for T
where + T: Copy,

source§

unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<Q, K> Comparable<K> for Q
where + Q: Ord + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn compare(&self, key: &K) -> Ordering

Compare self to key and return their ordering.
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
§

impl<T, S> SerializeUnsized<S> for T
where + T: Serialize<S>, + S: Serializer + ?Sized,

§

fn serialize_unsized( + &self, + serializer: &mut S, +) -> Result<usize, <S as Fallible>::Error>

Writes the object and returns the position of the archived type.
§

fn serialize_metadata(&self, _: &mut S) -> Result<(), <S as Fallible>::Error>

Serializes the metadata for the given type.
§

impl<K, V> TiSliceIndex<K, V> for K
where + usize: From<K>,

§

type Output = V

The output type returned by methods.
§

fn get( + self, + slice: &TiSlice<K, V>, +) -> Option<&<K as TiSliceIndex<K, V>>::Output>

Returns a shared reference to the output at this location, if in +bounds.
§

fn get_mut( + self, + slice: &mut TiSlice<K, V>, +) -> Option<&mut <K as TiSliceIndex<K, V>>::Output>

Returns a mutable reference to the output at this location, if in +bounds.
§

unsafe fn get_unchecked( + self, + slice: &TiSlice<K, V>, +) -> &<K as TiSliceIndex<K, V>>::Output

Returns a shared reference to the output at this location, without +performing any bounds checking. +Calling this method with an out-of-bounds index is undefined behavior +even if the resulting reference is not used.
§

unsafe fn get_unchecked_mut( + self, + slice: &mut TiSlice<K, V>, +) -> &mut <K as TiSliceIndex<K, V>>::Output

Returns a mutable reference to the output at this location, without +performing any bounds checking. +Calling this method with an out-of-bounds index is undefined behavior +even if the resulting reference is not used.
§

fn index(self, slice: &TiSlice<K, V>) -> &<K as TiSliceIndex<K, V>>::Output

Returns a shared reference to the output at this location, panicking +if out of bounds.
§

fn index_mut( + self, + slice: &mut TiSlice<K, V>, +) -> &mut <K as TiSliceIndex<K, V>>::Output

Returns a mutable reference to the output at this location, panicking +if out of bounds.
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_test_utils/struct.TracePosResolver.html b/air_test_utils/struct.TracePosResolver.html new file mode 100644 index 00000000..5a4da5a1 --- /dev/null +++ b/air_test_utils/struct.TracePosResolver.html @@ -0,0 +1,34 @@ +TracePosResolver in air_test_utils - Rust

Struct air_test_utils::TracePosResolver

source ·
pub struct TracePosResolver(/* private fields */)
+where
+    u32: Archive;
Expand description

The resolver for an archived TracePos

+

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_test_utils/struct.Versions.html b/air_test_utils/struct.Versions.html new file mode 100644 index 00000000..e85b956d --- /dev/null +++ b/air_test_utils/struct.Versions.html @@ -0,0 +1,49 @@ +Versions in air_test_utils - Rust

Struct air_test_utils::Versions

source ·
pub struct Versions {
+    pub data_version: Version,
+    pub interpreter_version: Version,
+}

Fields§

§data_version: Version

Version of this data format.

+
§interpreter_version: Version

Version of an interpreter produced this data.

+

Implementations§

source§

impl Versions

source

pub fn new(interpreter_version: Version) -> Versions

Trait Implementations§

source§

impl Clone for Versions

source§

fn clone(&self) -> Versions

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for Versions

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
source§

impl<'de> Deserialize<'de> for Versions

source§

fn deserialize<__D>( + __deserializer: __D, +) -> Result<Versions, <__D as Deserializer<'de>>::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl FromSerialized<Versions> for InterpreterDataEnvelopeRepr

source§

impl Serialize for Versions

source§

fn serialize<__S>( + &self, + __serializer: __S, +) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/air_test_utils/test_runner/fn.create_avm.html b/air_test_utils/test_runner/fn.create_avm.html new file mode 100644 index 00000000..34720a24 --- /dev/null +++ b/air_test_utils/test_runner/fn.create_avm.html @@ -0,0 +1,4 @@ +create_avm in air_test_utils::test_runner - Rust

Function air_test_utils::test_runner::create_avm

source ·
pub async fn create_avm(
+    call_service: CallServiceClosure<'static>,
+    current_peer_id: impl Into<String>,
+) -> TestRunner
\ No newline at end of file diff --git a/air_test_utils/test_runner/fn.create_avm_with_key.html b/air_test_utils/test_runner/fn.create_avm_with_key.html new file mode 100644 index 00000000..c2655cc3 --- /dev/null +++ b/air_test_utils/test_runner/fn.create_avm_with_key.html @@ -0,0 +1,5 @@ +create_avm_with_key in air_test_utils::test_runner - Rust

Function air_test_utils::test_runner::create_avm_with_key

source ·
pub async fn create_avm_with_key<R: AirRunner>(
+    keypair: impl Into<KeyPair>,
+    call_service: CallServiceClosure<'static>,
+    test_init_parameters: TestInitParameters,
+) -> TestRunner<R>
\ No newline at end of file diff --git a/air_test_utils/test_runner/fn.create_custom_avm.html b/air_test_utils/test_runner/fn.create_custom_avm.html new file mode 100644 index 00000000..8d761348 --- /dev/null +++ b/air_test_utils/test_runner/fn.create_custom_avm.html @@ -0,0 +1,4 @@ +create_custom_avm in air_test_utils::test_runner - Rust

Function air_test_utils::test_runner::create_custom_avm

source ·
pub async fn create_custom_avm<R: AirRunner>(
+    call_service: CallServiceClosure<'static>,
+    current_peer_id: impl Into<String>,
+) -> TestRunner<R>
\ No newline at end of file diff --git a/air_test_utils/test_runner/index.html b/air_test_utils/test_runner/index.html new file mode 100644 index 00000000..1469cff8 --- /dev/null +++ b/air_test_utils/test_runner/index.html @@ -0,0 +1 @@ +air_test_utils::test_runner - Rust

Module air_test_utils::test_runner

source ·

Re-exports§

Structs§

Traits§

Functions§

\ No newline at end of file diff --git a/air_test_utils/test_runner/sidebar-items.js b/air_test_utils/test_runner/sidebar-items.js new file mode 100644 index 00000000..9203f2b7 --- /dev/null +++ b/air_test_utils/test_runner/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"fn":["create_avm","create_avm_with_key","create_custom_avm"],"struct":["TestInitParameters","TestRunParameters","TestRunner"],"trait":["AirRunner"]}; \ No newline at end of file diff --git a/air_test_utils/test_runner/struct.TestInitParameters.html b/air_test_utils/test_runner/struct.TestInitParameters.html new file mode 100644 index 00000000..bdad6b89 --- /dev/null +++ b/air_test_utils/test_runner/struct.TestInitParameters.html @@ -0,0 +1,45 @@ +TestInitParameters in air_test_utils::test_runner - Rust

Struct air_test_utils::test_runner::TestInitParameters

source ·
pub struct TestInitParameters {
+    pub air_size_limit: Option<u64>,
+    pub particle_size_limit: Option<u64>,
+    pub call_result_size_limit: Option<u64>,
+    pub hard_limit_enabled: bool,
+}
Expand description

This struct is used to set limits for the test runner creating AVMRunner.

+

Fields§

§air_size_limit: Option<u64>§particle_size_limit: Option<u64>§call_result_size_limit: Option<u64>§hard_limit_enabled: bool

Implementations§

source§

impl TestInitParameters

source

pub fn new( + air_size_limit: u64, + particle_size_limit: u64, + call_result_size_limit: u64, + hard_limit_enabled: bool, +) -> Self

source

pub fn no_limits() -> Self

Trait Implementations§

source§

impl Clone for TestInitParameters

source§

fn clone(&self) -> TestInitParameters

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for TestInitParameters

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Default for TestInitParameters

source§

fn default() -> TestInitParameters

Returns the “default value” for a type. Read more
source§

impl From<TestInitParameters> for AVMRuntimeLimits

source§

fn from(value: TestInitParameters) -> Self

Converts to this type from the input type.
source§

impl From<TestInitParameters> for AquaVMRuntimeLimits

source§

fn from(value: TestInitParameters) -> Self

Converts to this type from the input type.
source§

impl Copy for TestInitParameters

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
source§

impl<T> CloneToUninit for T
where + T: Copy,

source§

unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_test_utils/test_runner/struct.TestRunParameters.html b/air_test_utils/test_runner/struct.TestRunParameters.html new file mode 100644 index 00000000..abd5e5a9 --- /dev/null +++ b/air_test_utils/test_runner/struct.TestRunParameters.html @@ -0,0 +1,44 @@ +TestRunParameters in air_test_utils::test_runner - Rust

Struct air_test_utils::test_runner::TestRunParameters

source ·
pub struct TestRunParameters {
+    pub init_peer_id: String,
+    pub timestamp: u64,
+    pub ttl: u32,
+    pub override_current_peer_id: Option<String>,
+    pub particle_id: String,
+}

Fields§

§init_peer_id: String§timestamp: u64§ttl: u32§override_current_peer_id: Option<String>§particle_id: String

Implementations§

source§

impl TestRunParameters

source

pub fn new( + init_peer_id: impl Into<String>, + timestamp: u64, + ttl: u32, + particle_id: impl Into<String>, +) -> Self

source

pub fn from_init_peer_id(init_peer_id: impl Into<String>) -> Self

source

pub fn from_timestamp(timestamp: u64) -> Self

source

pub fn from_ttl(ttl: u32) -> Self

source

pub fn with_particle_id(self, particle_id: impl Into<String>) -> Self

Trait Implementations§

source§

impl Clone for TestRunParameters

source§

fn clone(&self) -> TestRunParameters

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for TestRunParameters

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Default for TestRunParameters

source§

fn default() -> TestRunParameters

Returns the “default value” for a type. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_test_utils/test_runner/struct.TestRunner.html b/air_test_utils/test_runner/struct.TestRunner.html new file mode 100644 index 00000000..54315d01 --- /dev/null +++ b/air_test_utils/test_runner/struct.TestRunner.html @@ -0,0 +1,54 @@ +TestRunner in air_test_utils::test_runner - Rust

Struct air_test_utils::test_runner::TestRunner

source ·
pub struct TestRunner<R = DefaultAirRunner> {
+    pub runner: R,
+    pub keypair: KeyPair,
+    /* private fields */
+}

Fields§

§runner: R§keypair: KeyPair

Implementations§

source§

impl<R: AirRunner> TestRunner<R>

source

pub async fn call( + &mut self, + air: impl Into<String>, + prev_data: impl Into<Vec<u8>>, + data: impl Into<Vec<u8>>, + test_run_params: TestRunParameters, +) -> Result<RawAVMOutcome, String>

source

pub async fn call_single<'this>( + &'this mut self, + air: impl Into<String>, + prev_data: impl Into<Vec<u8>>, + data: impl Into<Vec<u8>>, + init_peer_id: impl Into<String>, + timestamp: u64, + ttl: u32, + override_current_peer_id: Option<String>, + call_results: CallResults, + particle_id: impl Into<String>, +) -> Result<RawAVMOutcome, Box<dyn Error + 'this>>

Auto Trait Implementations§

§

impl<R> Freeze for TestRunner<R>
where + R: Freeze,

§

impl<R = WasmAirRunner> !RefUnwindSafe for TestRunner<R>

§

impl<R = WasmAirRunner> !Send for TestRunner<R>

§

impl<R = WasmAirRunner> !Sync for TestRunner<R>

§

impl<R> Unpin for TestRunner<R>
where + R: Unpin,

§

impl<R = WasmAirRunner> !UnwindSafe for TestRunner<R>

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_test_utils/test_runner/trait.AirRunner.html b/air_test_utils/test_runner/trait.AirRunner.html new file mode 100644 index 00000000..4e780a1c --- /dev/null +++ b/air_test_utils/test_runner/trait.AirRunner.html @@ -0,0 +1,36 @@ +AirRunner in air_test_utils::test_runner - Rust

Trait air_test_utils::test_runner::AirRunner

source ·
pub trait AirRunner {
+    // Required methods
+    fn new(
+        current_call_id: impl Into<String>,
+        test_init_parameters: TestInitParameters,
+    ) -> LocalBoxFuture<'static, Self>;
+    fn call<'this>(
+        &'this mut self,
+        air: impl Into<String>,
+        prev_data: impl Into<Vec<u8>>,
+        data: impl Into<Vec<u8>>,
+        init_peer_id: impl Into<String>,
+        timestamp: u64,
+        ttl: u32,
+        override_current_peer_id: Option<String>,
+        call_results: CallResults,
+        key_pair: &KeyPair,
+        particle_id: String,
+    ) -> LocalBoxFuture<'this, Result<RawAVMOutcome, Box<dyn Error + 'this>>>;
+    fn get_current_peer_id(&self) -> &str;
+}

Required Methods§

source

fn new( + current_call_id: impl Into<String>, + test_init_parameters: TestInitParameters, +) -> LocalBoxFuture<'static, Self>

source

fn call<'this>( + &'this mut self, + air: impl Into<String>, + prev_data: impl Into<Vec<u8>>, + data: impl Into<Vec<u8>>, + init_peer_id: impl Into<String>, + timestamp: u64, + ttl: u32, + override_current_peer_id: Option<String>, + call_results: CallResults, + key_pair: &KeyPair, + particle_id: String, +) -> LocalBoxFuture<'this, Result<RawAVMOutcome, Box<dyn Error + 'this>>>

source

fn get_current_peer_id(&self) -> &str

Object Safety§

This trait is not object safe.

Implementors§

\ No newline at end of file diff --git a/air_test_utils/trait.DataStore.html b/air_test_utils/trait.DataStore.html new file mode 100644 index 00000000..f9e49ad1 --- /dev/null +++ b/air_test_utils/trait.DataStore.html @@ -0,0 +1,69 @@ +DataStore in air_test_utils - Rust

Trait air_test_utils::DataStore

source ·
pub trait DataStore {
+    type Error;
+
+    // Required methods
+    fn initialize(&mut self) -> Result<(), Self::Error>;
+    fn store_data(
+        &mut self,
+        data: &[u8],
+        particle_id: &str,
+        current_peer_id: &str,
+    ) -> Result<(), Self::Error>;
+    fn read_data(
+        &mut self,
+        particle_id: &str,
+        current_peer_id: &str,
+    ) -> Result<Vec<u8>, Self::Error>;
+    fn cleanup_data(
+        &mut self,
+        particle_id: &str,
+        current_peer_id: &str,
+    ) -> Result<(), Self::Error>;
+    fn detect_anomaly(
+        &self,
+        execution_time: Duration,
+        memory_delta: usize,
+        outcome: &RawAVMOutcome,
+    ) -> bool;
+    fn collect_anomaly_data(
+        &mut self,
+        particle_id: &str,
+        current_peer_id: &str,
+        anomaly_data: AnomalyData<'_>,
+    ) -> Result<(), Self::Error>;
+}
Expand description

This trait is used for

+
    +
  • persisting prev_data between successive calls of an interpreter
  • +
  • logging previous, current, and new data in case of spikes
  • +
+

Required Associated Types§

Required Methods§

source

fn initialize(&mut self) -> Result<(), Self::Error>

source

fn store_data( + &mut self, + data: &[u8], + particle_id: &str, + current_peer_id: &str, +) -> Result<(), Self::Error>

source

fn read_data( + &mut self, + particle_id: &str, + current_peer_id: &str, +) -> Result<Vec<u8>, Self::Error>

source

fn cleanup_data( + &mut self, + particle_id: &str, + current_peer_id: &str, +) -> Result<(), Self::Error>

Cleanup data that become obsolete.

+
source

fn detect_anomaly( + &self, + execution_time: Duration, + memory_delta: usize, + outcome: &RawAVMOutcome, +) -> bool

Returns true if an anomaly happened and it’s necessary to save execution data +for debugging purposes. +execution_time - time taken by the interpreter to execute provided script +memory_delta - count of bytes on which an interpreter heap has been extended +during execution of a particle +outcome - a result of AquaVM invocation

+
source

fn collect_anomaly_data( + &mut self, + particle_id: &str, + current_peer_id: &str, + anomaly_data: AnomalyData<'_>, +) -> Result<(), Self::Error>

Implementors§

\ No newline at end of file diff --git a/air_test_utils/type.AVMDataStore.html b/air_test_utils/type.AVMDataStore.html new file mode 100644 index 00000000..6de35c02 --- /dev/null +++ b/air_test_utils/type.AVMDataStore.html @@ -0,0 +1 @@ +AVMDataStore in air_test_utils - Rust

Type Alias air_test_utils::AVMDataStore

source ·
pub type AVMDataStore<E> = Box<dyn DataStore<Error = E> + Sync + Send>;

Aliased Type§

struct AVMDataStore<E>(/* private fields */);
\ No newline at end of file diff --git a/air_test_utils/type.AVMResult.html b/air_test_utils/type.AVMResult.html new file mode 100644 index 00000000..c8c083c1 --- /dev/null +++ b/air_test_utils/type.AVMResult.html @@ -0,0 +1,6 @@ +AVMResult in air_test_utils - Rust

Type Alias air_test_utils::AVMResult

source ·
pub type AVMResult<T, E> = Result<T, AVMError<E>>;

Aliased Type§

enum AVMResult<T, E> {
+    Ok(T),
+    Err(AVMError<E>),
+}

Variants§

§1.0.0

Ok(T)

Contains the success value

+
§1.0.0

Err(AVMError<E>)

Contains the error value

+
\ No newline at end of file diff --git a/air_test_utils/type.CallRequests.html b/air_test_utils/type.CallRequests.html new file mode 100644 index 00000000..9f01dd9a --- /dev/null +++ b/air_test_utils/type.CallRequests.html @@ -0,0 +1 @@ +CallRequests in air_test_utils - Rust

Type Alias air_test_utils::CallRequests

source ·
pub type CallRequests = HashMap<u32, CallRequestParams>;

Aliased Type§

struct CallRequests { /* private fields */ }
\ No newline at end of file diff --git a/air_test_utils/type.CallResults.html b/air_test_utils/type.CallResults.html new file mode 100644 index 00000000..94fc88f9 --- /dev/null +++ b/air_test_utils/type.CallResults.html @@ -0,0 +1 @@ +CallResults in air_test_utils - Rust

Type Alias air_test_utils::CallResults

source ·
pub type CallResults = HashMap<u32, CallServiceResult>;

Aliased Type§

struct CallResults { /* private fields */ }
\ No newline at end of file diff --git a/air_test_utils/type.CallServiceClosure.html b/air_test_utils/type.CallServiceClosure.html new file mode 100644 index 00000000..cc983eaf --- /dev/null +++ b/air_test_utils/type.CallServiceClosure.html @@ -0,0 +1 @@ +CallServiceClosure in air_test_utils - Rust

Type Alias air_test_utils::CallServiceClosure

source ·
pub type CallServiceClosure<'x> = Box<dyn Fn(CallRequestParams) -> LocalBoxFuture<'x, CallServiceResult> + 'static>;

Aliased Type§

struct CallServiceClosure<'x>(/* private fields */);
\ No newline at end of file diff --git a/air_test_utils/type.FoldLore.html b/air_test_utils/type.FoldLore.html new file mode 100644 index 00000000..26a8c446 --- /dev/null +++ b/air_test_utils/type.FoldLore.html @@ -0,0 +1,3 @@ +FoldLore in air_test_utils - Rust

Type Alias air_test_utils::FoldLore

source ·
pub type FoldLore = Vec<FoldSubTraceLore>;
Expand description

This type represents all information in an execution trace about states executed during +a fold execution.

+

Aliased Type§

struct FoldLore { /* private fields */ }
\ No newline at end of file diff --git a/air_test_utils/type.HostExportedFunc.html b/air_test_utils/type.HostExportedFunc.html new file mode 100644 index 00000000..3ca6be31 --- /dev/null +++ b/air_test_utils/type.HostExportedFunc.html @@ -0,0 +1 @@ +HostExportedFunc in air_test_utils - Rust

Type Alias air_test_utils::HostExportedFunc

pub type HostExportedFunc = Box<dyn for<'c> Fn(&mut <WasmtimeWasmBackend as WasmBackend>::ImportCallContext<'c>, Vec<IValue>) -> Option<IValue> + Sync + Send>;

Aliased Type§

struct HostExportedFunc(/* private fields */);
\ No newline at end of file diff --git a/air_test_utils/type.HostImportDescriptor.html b/air_test_utils/type.HostImportDescriptor.html new file mode 100644 index 00000000..8195aa2f --- /dev/null +++ b/air_test_utils/type.HostImportDescriptor.html @@ -0,0 +1,11 @@ +HostImportDescriptor in air_test_utils - Rust

Type Alias air_test_utils::HostImportDescriptor

pub type HostImportDescriptor = HostImportDescriptor<WasmtimeWasmBackend>;

Aliased Type§

struct HostImportDescriptor {
+    pub host_exported_func: Box<dyn for<'c> Fn(&mut WasmtimeImportCallContext<'c>, Vec<IValue>) -> Option<IValue> + Sync + Send>,
+    pub argument_types: Vec<IType>,
+    pub output_type: Option<IType>,
+    pub error_handler: Option<Box<dyn Fn(&HostImportError) -> Option<IValue> + Sync + Send>>,
+}

Fields§

§host_exported_func: Box<dyn for<'c> Fn(&mut WasmtimeImportCallContext<'c>, Vec<IValue>) -> Option<IValue> + Sync + Send>

This closure will be invoked for corresponding import.

+
§argument_types: Vec<IType>

Type of the closure arguments.

+
§output_type: Option<IType>

Types of output of the closure.

+
§error_handler: Option<Box<dyn Fn(&HostImportError) -> Option<IValue> + Sync + Send>>

If Some, this closure is called with error when errors is encountered while lifting. +If None, panic will occur.

+
\ No newline at end of file diff --git a/air_test_utils/type.InterpreterDataEnvelopeFormat.html b/air_test_utils/type.InterpreterDataEnvelopeFormat.html new file mode 100644 index 00000000..3156c6f6 --- /dev/null +++ b/air_test_utils/type.InterpreterDataEnvelopeFormat.html @@ -0,0 +1 @@ +InterpreterDataEnvelopeFormat in air_test_utils - Rust

Type Alias air_test_utils::InterpreterDataEnvelopeFormat

source ·
pub type InterpreterDataEnvelopeFormat = RmpSerdeFormat;

Aliased Type§

struct InterpreterDataEnvelopeFormat;
\ No newline at end of file diff --git a/air_test_utils/type.PosType.html b/air_test_utils/type.PosType.html new file mode 100644 index 00000000..8c52c084 --- /dev/null +++ b/air_test_utils/type.PosType.html @@ -0,0 +1 @@ +PosType in air_test_utils - Rust

Type Alias air_test_utils::PosType

source ·
pub type PosType = u32;
\ No newline at end of file diff --git a/air_test_utils/type.RunnerResult.html b/air_test_utils/type.RunnerResult.html new file mode 100644 index 00000000..129c077c --- /dev/null +++ b/air_test_utils/type.RunnerResult.html @@ -0,0 +1,6 @@ +RunnerResult in air_test_utils - Rust

Type Alias air_test_utils::RunnerResult

source ·
pub type RunnerResult<T> = Result<T, RunnerError>;

Aliased Type§

enum RunnerResult<T> {
+    Ok(T),
+    Err(RunnerError),
+}

Variants§

§1.0.0

Ok(T)

Contains the success value

+
§1.0.0

Err(RunnerError)

Contains the error value

+
\ No newline at end of file diff --git a/air_test_utils/type.TraceLen.html b/air_test_utils/type.TraceLen.html new file mode 100644 index 00000000..05deb3c2 --- /dev/null +++ b/air_test_utils/type.TraceLen.html @@ -0,0 +1 @@ +TraceLen in air_test_utils - Rust

Type Alias air_test_utils::TraceLen

source ·
pub type TraceLen = u32;
\ No newline at end of file diff --git a/air_test_utils/verification/enum.DataVerifierError.html b/air_test_utils/verification/enum.DataVerifierError.html new file mode 100644 index 00000000..e29eedb6 --- /dev/null +++ b/air_test_utils/verification/enum.DataVerifierError.html @@ -0,0 +1,50 @@ +DataVerifierError in air_test_utils::verification - Rust
pub enum DataVerifierError {
+    MalformedKey {
+        error: KeyError,
+        key: String,
+    },
+    MalformedSignature(DecodingError),
+    PeerIdNotFound(String),
+    SignatureMismatch {
+        error: Box<VerificationError>,
+        cids: Vec<Rc<str>>,
+        peer_id: String,
+    },
+    MergeMismatch {
+        peer_id: String,
+        larger_cids: Vec<Rc<str>>,
+        smaller_cids: Vec<Rc<str>>,
+    },
+}

Variants§

§

MalformedKey

Fields

§error: KeyError
§

MalformedSignature(DecodingError)

§

PeerIdNotFound(String)

§

SignatureMismatch

Fields

§cids: Vec<Rc<str>>
§peer_id: String
§

MergeMismatch

Fields

§peer_id: String
§larger_cids: Vec<Rc<str>>
§smaller_cids: Vec<Rc<str>>

Trait Implementations§

source§

impl Debug for DataVerifierError

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
source§

impl Display for DataVerifierError

source§

fn fmt(&self, __formatter: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
source§

impl Error for DataVerifierError

source§

fn source(&self) -> Option<&(dyn Error + 'static)>

The lower-level source of this error, if any. Read more
1.0.0 · source§

fn description(&self) -> &str

👎Deprecated since 1.42.0: use the Display impl or to_string()
1.0.0 · source§

fn cause(&self) -> Option<&dyn Error>

👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
source§

fn provide<'a>(&'a self, request: &mut Request<'a>)

🔬This is a nightly-only experimental API. (error_generic_member_access)
Provides type based access to context intended for error reports. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
§

impl<T> Error for T
where + T: Error + 'static,

§

fn as_error(&self) -> &(dyn Error + 'static)

Gets this error as an std::error::Error.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_test_utils/verification/index.html b/air_test_utils/verification/index.html new file mode 100644 index 00000000..0515abc6 --- /dev/null +++ b/air_test_utils/verification/index.html @@ -0,0 +1 @@ +air_test_utils::verification - Rust

Module air_test_utils::verification

source ·

Structs§

  • An util for verificating particular data’s signatures.

Enums§

\ No newline at end of file diff --git a/air_test_utils/verification/sidebar-items.js b/air_test_utils/verification/sidebar-items.js new file mode 100644 index 00000000..6cb9cc28 --- /dev/null +++ b/air_test_utils/verification/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"enum":["DataVerifierError"],"struct":["DataVerifier"]}; \ No newline at end of file diff --git a/air_test_utils/verification/struct.DataVerifier.html b/air_test_utils/verification/struct.DataVerifier.html new file mode 100644 index 00000000..693b3fff --- /dev/null +++ b/air_test_utils/verification/struct.DataVerifier.html @@ -0,0 +1,46 @@ +DataVerifier in air_test_utils::verification - Rust

Struct air_test_utils::verification::DataVerifier

source ·
pub struct DataVerifier<'data> { /* private fields */ }
Expand description

An util for verificating particular data’s signatures.

+

Implementations§

source§

impl<'data> DataVerifier<'data>

source

pub fn new( + data: &'data InterpreterData, + salt: &'data str, +) -> Result<DataVerifier<'data>, DataVerifierError>

source

pub fn verify(&self) -> Result<(), DataVerifierError>

Verify each peers’ signatures.

+
source

pub fn merge( + self, + other: DataVerifier<'data>, +) -> Result<SignatureStore, DataVerifierError>

For each peer, merge previous and current CID multisets by determining the largest set.

+

This code uses an invariant: peer’s multiset of produced CIDs is always a superset of +previous invocation’s multiset:

+

A_0 ⊆ A_1 ⊆ … ⊆ A_n.

+

So, the largest multiset is selected as the result of merging, the invariant is checked, +and a error is returned if it is violated.

+

If the multisets are of same size, they have to be equal.

+

Auto Trait Implementations§

§

impl<'data> Freeze for DataVerifier<'data>

§

impl<'data> RefUnwindSafe for DataVerifier<'data>

§

impl<'data> !Send for DataVerifier<'data>

§

impl<'data> !Sync for DataVerifier<'data>

§

impl<'data> Unpin for DataVerifier<'data>

§

impl<'data> UnwindSafe for DataVerifier<'data>

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_test_utils/wasm_test_runner/index.html b/air_test_utils/wasm_test_runner/index.html new file mode 100644 index 00000000..0903b732 --- /dev/null +++ b/air_test_utils/wasm_test_runner/index.html @@ -0,0 +1 @@ +air_test_utils::wasm_test_runner - Rust

Module air_test_utils::wasm_test_runner

source ·

Structs§

\ No newline at end of file diff --git a/air_test_utils/wasm_test_runner/sidebar-items.js b/air_test_utils/wasm_test_runner/sidebar-items.js new file mode 100644 index 00000000..5bdb850c --- /dev/null +++ b/air_test_utils/wasm_test_runner/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"struct":["ReleaseWasmAirRunner","WasmAirRunner"]}; \ No newline at end of file diff --git a/air_test_utils/wasm_test_runner/struct.ReleaseWasmAirRunner.html b/air_test_utils/wasm_test_runner/struct.ReleaseWasmAirRunner.html new file mode 100644 index 00000000..f4495ab8 --- /dev/null +++ b/air_test_utils/wasm_test_runner/struct.ReleaseWasmAirRunner.html @@ -0,0 +1,47 @@ +ReleaseWasmAirRunner in air_test_utils::wasm_test_runner - Rust
pub struct ReleaseWasmAirRunner { /* private fields */ }
Expand description

WASM runner that runs release build form benchmarking.

+

Trait Implementations§

source§

impl AirRunner for ReleaseWasmAirRunner

source§

fn new( + current_peer_id: impl Into<String>, + test_init_parameters: TestInitParameters, +) -> LocalBoxFuture<'static, Self>

source§

fn call<'this>( + &'this mut self, + air: impl Into<String>, + prev_data: impl Into<Vec<u8>>, + data: impl Into<Vec<u8>>, + init_peer_id: impl Into<String>, + timestamp: u64, + ttl: u32, + override_current_peer_id: Option<String>, + call_results: CallResults, + keypair: &KeyPair, + particle_id: String, +) -> LocalBoxFuture<'this, Result<RawAVMOutcome, Box<dyn Error + 'this>>>

source§

fn get_current_peer_id(&self) -> &str

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_test_utils/wasm_test_runner/struct.WasmAirRunner.html b/air_test_utils/wasm_test_runner/struct.WasmAirRunner.html new file mode 100644 index 00000000..71af8e51 --- /dev/null +++ b/air_test_utils/wasm_test_runner/struct.WasmAirRunner.html @@ -0,0 +1,46 @@ +WasmAirRunner in air_test_utils::wasm_test_runner - Rust

Struct air_test_utils::wasm_test_runner::WasmAirRunner

source ·
pub struct WasmAirRunner { /* private fields */ }

Trait Implementations§

source§

impl AirRunner for WasmAirRunner

source§

fn new( + current_peer_id: impl Into<String>, + test_init_parameters: TestInitParameters, +) -> LocalBoxFuture<'static, Self>

source§

fn call<'this>( + &'this mut self, + air: impl Into<String>, + prev_data: impl Into<Vec<u8>>, + data: impl Into<Vec<u8>>, + init_peer_id: impl Into<String>, + timestamp: u64, + ttl: u32, + override_current_peer_id: Option<String>, + call_results: CallResults, + keypair: &KeyPair, + particle_id: String, +) -> LocalBoxFuture<'this, Result<RawAVMOutcome, Box<dyn Error + 'this>>>

source§

fn get_current_peer_id(&self) -> &str

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_trace_handler/all.html b/air_trace_handler/all.html new file mode 100644 index 00000000..b1463041 --- /dev/null +++ b/air_trace_handler/all.html @@ -0,0 +1 @@ +List of all items in this crate
\ No newline at end of file diff --git a/air_trace_handler/data_keeper/errors/enum.KeeperError.html b/air_trace_handler/data_keeper/errors/enum.KeeperError.html new file mode 100644 index 00000000..f33b85cc --- /dev/null +++ b/air_trace_handler/data_keeper/errors/enum.KeeperError.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../air_trace_handler/enum.KeeperError.html...

+ + + \ No newline at end of file diff --git a/air_trace_handler/enum.GenerationCompactificationError.html b/air_trace_handler/enum.GenerationCompactificationError.html new file mode 100644 index 00000000..6185be3d --- /dev/null +++ b/air_trace_handler/enum.GenerationCompactificationError.html @@ -0,0 +1,33 @@ +GenerationCompactificationError in air_trace_handler - Rust
pub enum GenerationCompactificationError {
+    TracePosPointsToNowhere(TracePos),
+    TracePosPointsToInvalidState {
+        position: TracePos,
+        state: ExecutedState,
+    },
+}

Variants§

§

TracePosPointsToNowhere(TracePos)

§

TracePosPointsToInvalidState

Fields

§position: TracePos

Implementations§

Trait Implementations§

source§

impl Debug for GenerationCompactificationError

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Display for GenerationCompactificationError

source§

fn fmt(&self, __formatter: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Error for GenerationCompactificationError

1.30.0 · source§

fn source(&self) -> Option<&(dyn Error + 'static)>

The lower-level source of this error, if any. Read more
1.0.0 · source§

fn description(&self) -> &str

👎Deprecated since 1.42.0: use the Display impl or to_string()
1.0.0 · source§

fn cause(&self) -> Option<&dyn Error>

👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
source§

fn provide<'a>(&'a self, request: &mut Request<'a>)

🔬This is a nightly-only experimental API. (error_generic_member_access)
Provides type based access to context intended for error reports. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
§

impl<T> Error for T
where + T: Error + 'static,

§

fn as_error(&self) -> &(dyn Error + 'static)

Gets this error as an std::error::Error.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_trace_handler/enum.IntConversionError.html b/air_trace_handler/enum.IntConversionError.html new file mode 100644 index 00000000..3631dc2f --- /dev/null +++ b/air_trace_handler/enum.IntConversionError.html @@ -0,0 +1,29 @@ +IntConversionError in air_trace_handler - Rust

Enum air_trace_handler::IntConversionError

source ·
pub enum IntConversionError {
+    TryIntoTracePosError(TryFromIntError),
+}

Variants§

§

TryIntoTracePosError(TryFromIntError)

Trait Implementations§

source§

impl Debug for IntConversionError

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Display for IntConversionError

source§

fn fmt(&self, __formatter: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Error for IntConversionError

1.30.0 · source§

fn source(&self) -> Option<&(dyn Error + 'static)>

The lower-level source of this error, if any. Read more
1.0.0 · source§

fn description(&self) -> &str

👎Deprecated since 1.42.0: use the Display impl or to_string()
1.0.0 · source§

fn cause(&self) -> Option<&dyn Error>

👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
source§

fn provide<'a>(&'a self, request: &mut Request<'a>)

🔬This is a nightly-only experimental API. (error_generic_member_access)
Provides type based access to context intended for error reports. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
§

impl<T> Error for T
where + T: Error + 'static,

§

fn as_error(&self) -> &(dyn Error + 'static)

Gets this error as an std::error::Error.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_trace_handler/enum.KeeperError.html b/air_trace_handler/enum.KeeperError.html new file mode 100644 index 00000000..118f3c96 --- /dev/null +++ b/air_trace_handler/enum.KeeperError.html @@ -0,0 +1,55 @@ +KeeperError in air_trace_handler - Rust

Enum air_trace_handler::KeeperError

source ·
pub enum KeeperError {
+    SetSubtraceLenFailed {
+        requested_subtrace_len: TraceLen,
+        trace_position: TracePos,
+        trace_len: TraceLen,
+    },
+    SetSubtraceLenAndPosFailed {
+        requested_pos: TracePos,
+        requested_subtrace_len: TraceLen,
+        trace_len: TraceLen,
+    },
+    NoElementAtPosition {
+        position: TracePos,
+        trace_len: TraceLen,
+    },
+    NoStreamState {
+        state: ExecutedState,
+    },
+}
Expand description

Errors arose out while accessing various interpreter data.

+

Variants§

§

SetSubtraceLenFailed

Errors occurred when trace_len - trace_position < requested_subtrace_len.

+

Fields

§requested_subtrace_len: TraceLen
§trace_position: TracePos
§trace_len: TraceLen
§

SetSubtraceLenAndPosFailed

Errors occurred when +requested_subtrace_len != 0 && requested_pos + requested_subtrace_len > trace_len.

+

Fields

§requested_pos: TracePos
§requested_subtrace_len: TraceLen
§trace_len: TraceLen
§

NoElementAtPosition

Errors occurred when Fold FSM tries to obtain stream generation by value_pos from a trace, +but this value_pos is bigger than the trace length.

+

Fields

§position: TracePos
§trace_len: TraceLen
§

NoStreamState

Errors occurred when Fold FSM tries to obtain stream generation by value_pos from a trace, +but such state doesn’t belong to values in streams (it doesn’t contain a generation).

+

Fields

Trait Implementations§

source§

impl Debug for KeeperError

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Display for KeeperError

source§

fn fmt(&self, __formatter: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Error for KeeperError

1.30.0 · source§

fn source(&self) -> Option<&(dyn Error + 'static)>

The lower-level source of this error, if any. Read more
1.0.0 · source§

fn description(&self) -> &str

👎Deprecated since 1.42.0: use the Display impl or to_string()
1.0.0 · source§

fn cause(&self) -> Option<&dyn Error>

👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
source§

fn provide<'a>(&'a self, request: &mut Request<'a>)

🔬This is a nightly-only experimental API. (error_generic_member_access)
Provides type based access to context intended for error reports. Read more
source§

impl From<KeeperError> for MergeError

source§

fn from(source: KeeperError) -> Self

Converts to this type from the input type.
source§

impl From<KeeperError> for StateFSMError

source§

fn from(source: KeeperError) -> Self

Converts to this type from the input type.
source§

impl From<KeeperError> for TraceHandlerError

source§

fn from(source: KeeperError) -> Self

Converts to this type from the input type.
source§

impl PartialEq for KeeperError

source§

fn eq(&self, other: &KeeperError) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl Eq for KeeperError

source§

impl StructuralPartialEq for KeeperError

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
§

impl<T> Error for T
where + T: Error + 'static,

§

fn as_error(&self) -> &(dyn Error + 'static)

Gets this error as an std::error::Error.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_trace_handler/enum.StateFSMError.html b/air_trace_handler/enum.StateFSMError.html new file mode 100644 index 00000000..24adde74 --- /dev/null +++ b/air_trace_handler/enum.StateFSMError.html @@ -0,0 +1,46 @@ +StateFSMError in air_trace_handler - Rust

Enum air_trace_handler::StateFSMError

source ·
pub enum StateFSMError {
+    ParQueueIsEmpty,
+    FoldFSMNotFound(u32),
+    ParLenOverflow(ParResult),
+    ParPosOverflow(ParResult, TracePos, MergeCtxType),
+    ParLenUnderflow(ParResult, TraceLen, MergeCtxType),
+    FoldPosOverflow(ResolvedFold, TracePos, MergeCtxType),
+    FoldLenUnderflow(ResolvedFold, TracePos, MergeCtxType),
+    KeeperError(KeeperError),
+}
Expand description

Errors arose out of merging previous data with a new.

+

Variants§

§

ParQueueIsEmpty

Error occurred while trying to access or pop elements from an empty par queue.

+
§

FoldFSMNotFound(u32)

Errors occurred while trying to access or pop elements from queue, +which contains element of different type.

+
§

ParLenOverflow(ParResult)

Errors occurred when ParResult.0 + ParResult.1 overflows.

+
§

ParPosOverflow(ParResult, TracePos, MergeCtxType)

Errors occurred when slider.position() + ParResult.0 + ParResult.1 overflows.

+
§

ParLenUnderflow(ParResult, TraceLen, MergeCtxType)

Errors occurred when ParResult.0 + ParResult.1 value is bigger than current subgraph size.

+
§

FoldPosOverflow(ResolvedFold, TracePos, MergeCtxType)

Errors occurred when {0}.fold_states_count + {1} overflows.

+
§

FoldLenUnderflow(ResolvedFold, TracePos, MergeCtxType)

Errors occurred when {1} - 1{0}.fold_states_count underflows.

+
§

KeeperError(KeeperError)

Errors bubbled from DataKeeper.

+

Trait Implementations§

source§

impl Debug for StateFSMError

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Display for StateFSMError

source§

fn fmt(&self, __formatter: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Error for StateFSMError

source§

fn source(&self) -> Option<&(dyn Error + 'static)>

The lower-level source of this error, if any. Read more
1.0.0 · source§

fn description(&self) -> &str

👎Deprecated since 1.42.0: use the Display impl or to_string()
1.0.0 · source§

fn cause(&self) -> Option<&dyn Error>

👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
source§

fn provide<'a>(&'a self, request: &mut Request<'a>)

🔬This is a nightly-only experimental API. (error_generic_member_access)
Provides type based access to context intended for error reports. Read more
source§

impl From<KeeperError> for StateFSMError

source§

fn from(source: KeeperError) -> Self

Converts to this type from the input type.
source§

impl From<StateFSMError> for TraceHandlerError

source§

fn from(source: StateFSMError) -> Self

Converts to this type from the input type.

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
§

impl<T> Error for T
where + T: Error + 'static,

§

fn as_error(&self) -> &(dyn Error + 'static)

Gets this error as an std::error::Error.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_trace_handler/enum.SubgraphType.html b/air_trace_handler/enum.SubgraphType.html new file mode 100644 index 00000000..15ab557c --- /dev/null +++ b/air_trace_handler/enum.SubgraphType.html @@ -0,0 +1,34 @@ +SubgraphType in air_trace_handler - Rust

Enum air_trace_handler::SubgraphType

source ·
pub enum SubgraphType {
+    Left,
+    Right,
+}

Variants§

§

Left

§

Right

Trait Implementations§

source§

impl Clone for SubgraphType

source§

fn clone(&self) -> SubgraphType

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for SubgraphType

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Display for SubgraphType

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl PartialEq for SubgraphType

source§

fn eq(&self, other: &SubgraphType) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl Copy for SubgraphType

source§

impl Eq for SubgraphType

source§

impl StructuralPartialEq for SubgraphType

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
source§

impl<T> CloneToUninit for T
where + T: Copy,

source§

unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_trace_handler/enum.TraceHandlerError.html b/air_trace_handler/enum.TraceHandlerError.html new file mode 100644 index 00000000..15d79cfb --- /dev/null +++ b/air_trace_handler/enum.TraceHandlerError.html @@ -0,0 +1,32 @@ +TraceHandlerError in air_trace_handler - Rust

Enum air_trace_handler::TraceHandlerError

source ·
pub enum TraceHandlerError {
+    KeeperError(KeeperError),
+    MergeError(MergeError),
+    StateFSMError(StateFSMError),
+}
Expand description

Errors arose out of merging previous data with a new.

+

Variants§

§

KeeperError(KeeperError)

§

MergeError(MergeError)

§

StateFSMError(StateFSMError)

Trait Implementations§

source§

impl Debug for TraceHandlerError

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Display for TraceHandlerError

source§

fn fmt(&self, __formatter: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Error for TraceHandlerError

source§

fn source(&self) -> Option<&(dyn Error + 'static)>

The lower-level source of this error, if any. Read more
1.0.0 · source§

fn description(&self) -> &str

👎Deprecated since 1.42.0: use the Display impl or to_string()
1.0.0 · source§

fn cause(&self) -> Option<&dyn Error>

👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
source§

fn provide<'a>(&'a self, request: &mut Request<'a>)

🔬This is a nightly-only experimental API. (error_generic_member_access)
Provides type based access to context intended for error reports. Read more
source§

impl From<KeeperError> for TraceHandlerError

source§

fn from(source: KeeperError) -> Self

Converts to this type from the input type.
source§

impl From<MergeError> for TraceHandlerError

source§

fn from(source: MergeError) -> Self

Converts to this type from the input type.
source§

impl From<StateFSMError> for TraceHandlerError

source§

fn from(source: StateFSMError) -> Self

Converts to this type from the input type.

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
§

impl<T> Error for T
where + T: Error + 'static,

§

fn as_error(&self) -> &(dyn Error + 'static)

Gets this error as an std::error::Error.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_trace_handler/errors/enum.GenerationCompactificationError.html b/air_trace_handler/errors/enum.GenerationCompactificationError.html new file mode 100644 index 00000000..5c10b4c0 --- /dev/null +++ b/air_trace_handler/errors/enum.GenerationCompactificationError.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_trace_handler/enum.GenerationCompactificationError.html...

+ + + \ No newline at end of file diff --git a/air_trace_handler/errors/enum.IntConversionError.html b/air_trace_handler/errors/enum.IntConversionError.html new file mode 100644 index 00000000..a52bf007 --- /dev/null +++ b/air_trace_handler/errors/enum.IntConversionError.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_trace_handler/enum.IntConversionError.html...

+ + + \ No newline at end of file diff --git a/air_trace_handler/errors/enum.TraceHandlerError.html b/air_trace_handler/errors/enum.TraceHandlerError.html new file mode 100644 index 00000000..a21974c5 --- /dev/null +++ b/air_trace_handler/errors/enum.TraceHandlerError.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_trace_handler/enum.TraceHandlerError.html...

+ + + \ No newline at end of file diff --git a/air_trace_handler/handler/struct.TraceHandler.html b/air_trace_handler/handler/struct.TraceHandler.html new file mode 100644 index 00000000..ad2ca2ff --- /dev/null +++ b/air_trace_handler/handler/struct.TraceHandler.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../air_trace_handler/struct.TraceHandler.html...

+ + + \ No newline at end of file diff --git a/air_trace_handler/index.html b/air_trace_handler/index.html new file mode 100644 index 00000000..cc00e259 --- /dev/null +++ b/air_trace_handler/index.html @@ -0,0 +1 @@ +air_trace_handler - Rust

Crate air_trace_handler

source ·

Re-exports§

Modules§

Structs§

Enums§

Type Aliases§

\ No newline at end of file diff --git a/air_trace_handler/merger/ap_merger/enum.MergerApResult.html b/air_trace_handler/merger/ap_merger/enum.MergerApResult.html new file mode 100644 index 00000000..b245ce30 --- /dev/null +++ b/air_trace_handler/merger/ap_merger/enum.MergerApResult.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../air_trace_handler/merger/enum.MergerApResult.html...

+ + + \ No newline at end of file diff --git a/air_trace_handler/merger/ap_merger/struct.MetApResult.html b/air_trace_handler/merger/ap_merger/struct.MetApResult.html new file mode 100644 index 00000000..8773bd44 --- /dev/null +++ b/air_trace_handler/merger/ap_merger/struct.MetApResult.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../air_trace_handler/merger/struct.MetApResult.html...

+ + + \ No newline at end of file diff --git a/air_trace_handler/merger/call_merger/enum.MergerCallResult.html b/air_trace_handler/merger/call_merger/enum.MergerCallResult.html new file mode 100644 index 00000000..1fb7254e --- /dev/null +++ b/air_trace_handler/merger/call_merger/enum.MergerCallResult.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../air_trace_handler/merger/enum.MergerCallResult.html...

+ + + \ No newline at end of file diff --git a/air_trace_handler/merger/call_merger/struct.MetCallResult.html b/air_trace_handler/merger/call_merger/struct.MetCallResult.html new file mode 100644 index 00000000..d30b9282 --- /dev/null +++ b/air_trace_handler/merger/call_merger/struct.MetCallResult.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../air_trace_handler/merger/struct.MetCallResult.html...

+ + + \ No newline at end of file diff --git a/air_trace_handler/merger/canon_merger/enum.MergerCanonResult.html b/air_trace_handler/merger/canon_merger/enum.MergerCanonResult.html new file mode 100644 index 00000000..4eae807c --- /dev/null +++ b/air_trace_handler/merger/canon_merger/enum.MergerCanonResult.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../air_trace_handler/merger/enum.MergerCanonResult.html...

+ + + \ No newline at end of file diff --git a/air_trace_handler/merger/enum.ApResultError.html b/air_trace_handler/merger/enum.ApResultError.html new file mode 100644 index 00000000..fbddb16d --- /dev/null +++ b/air_trace_handler/merger/enum.ApResultError.html @@ -0,0 +1,30 @@ +ApResultError in air_trace_handler::merger - Rust

Enum air_trace_handler::merger::ApResultError

source ·
pub enum ApResultError {
+    InvalidDstGenerations(ApResult),
+}

Variants§

§

InvalidDstGenerations(ApResult)

Error occurred when Ap results contains not 1 generation in destination.

+

Trait Implementations§

source§

impl Debug for ApResultError

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Display for ApResultError

source§

fn fmt(&self, __formatter: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Error for ApResultError

1.30.0 · source§

fn source(&self) -> Option<&(dyn Error + 'static)>

The lower-level source of this error, if any. Read more
1.0.0 · source§

fn description(&self) -> &str

👎Deprecated since 1.42.0: use the Display impl or to_string()
1.0.0 · source§

fn cause(&self) -> Option<&dyn Error>

👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
source§

fn provide<'a>(&'a self, request: &mut Request<'a>)

🔬This is a nightly-only experimental API. (error_generic_member_access)
Provides type based access to context intended for error reports. Read more
source§

impl From<ApResultError> for MergeError

source§

fn from(source: ApResultError) -> Self

Converts to this type from the input type.

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
§

impl<T> Error for T
where + T: Error + 'static,

§

fn as_error(&self) -> &(dyn Error + 'static)

Gets this error as an std::error::Error.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_trace_handler/merger/enum.CallResultError.html b/air_trace_handler/merger/enum.CallResultError.html new file mode 100644 index 00000000..c1bb36fb --- /dev/null +++ b/air_trace_handler/merger/enum.CallResultError.html @@ -0,0 +1,37 @@ +CallResultError in air_trace_handler::merger - Rust

Enum air_trace_handler::merger::CallResultError

source ·
pub enum CallResultError {
+    ValuesNotEqual {
+        prev_value: ValueRef,
+        current_value: ValueRef,
+    },
+    IncompatibleCallResults {
+        prev_call: CallResult,
+        current_call: CallResult,
+    },
+}

Variants§

§

ValuesNotEqual

Fields

§prev_value: ValueRef
§current_value: ValueRef
§

IncompatibleCallResults

Errors occurred when previous and current call results are incompatible.

+

Fields

§prev_call: CallResult
§current_call: CallResult

Trait Implementations§

source§

impl Debug for CallResultError

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Display for CallResultError

source§

fn fmt(&self, __formatter: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Error for CallResultError

1.30.0 · source§

fn source(&self) -> Option<&(dyn Error + 'static)>

The lower-level source of this error, if any. Read more
1.0.0 · source§

fn description(&self) -> &str

👎Deprecated since 1.42.0: use the Display impl or to_string()
1.0.0 · source§

fn cause(&self) -> Option<&dyn Error>

👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
source§

fn provide<'a>(&'a self, request: &mut Request<'a>)

🔬This is a nightly-only experimental API. (error_generic_member_access)
Provides type based access to context intended for error reports. Read more
source§

impl From<CallResultError> for MergeError

source§

fn from(source: CallResultError) -> Self

Converts to this type from the input type.

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
§

impl<T> Error for T
where + T: Error + 'static,

§

fn as_error(&self) -> &(dyn Error + 'static)

Gets this error as an std::error::Error.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_trace_handler/merger/enum.CanonResultError.html b/air_trace_handler/merger/enum.CanonResultError.html new file mode 100644 index 00000000..841562e0 --- /dev/null +++ b/air_trace_handler/merger/enum.CanonResultError.html @@ -0,0 +1,32 @@ +CanonResultError in air_trace_handler::merger - Rust

Enum air_trace_handler::merger::CanonResultError

source ·
pub enum CanonResultError {
+    IncompatibleState {
+        prev_canon_result: CanonResult,
+        current_canon_result: CanonResult,
+    },
+}

Variants§

§

IncompatibleState

Fields

§prev_canon_result: CanonResult
§current_canon_result: CanonResult

Trait Implementations§

source§

impl Debug for CanonResultError

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Display for CanonResultError

source§

fn fmt(&self, __formatter: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Error for CanonResultError

1.30.0 · source§

fn source(&self) -> Option<&(dyn Error + 'static)>

The lower-level source of this error, if any. Read more
1.0.0 · source§

fn description(&self) -> &str

👎Deprecated since 1.42.0: use the Display impl or to_string()
1.0.0 · source§

fn cause(&self) -> Option<&dyn Error>

👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
source§

fn provide<'a>(&'a self, request: &mut Request<'a>)

🔬This is a nightly-only experimental API. (error_generic_member_access)
Provides type based access to context intended for error reports. Read more
source§

impl From<CanonResultError> for MergeError

source§

fn from(source: CanonResultError) -> Self

Converts to this type from the input type.

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
§

impl<T> Error for T
where + T: Error + 'static,

§

fn as_error(&self) -> &(dyn Error + 'static)

Gets this error as an std::error::Error.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_trace_handler/merger/enum.DataType.html b/air_trace_handler/merger/enum.DataType.html new file mode 100644 index 00000000..18ddc918 --- /dev/null +++ b/air_trace_handler/merger/enum.DataType.html @@ -0,0 +1,32 @@ +DataType in air_trace_handler::merger - Rust

Enum air_trace_handler::merger::DataType

source ·
pub enum DataType {
+    Previous,
+    Current,
+}

Variants§

§

Previous

§

Current

Trait Implementations§

source§

impl Clone for DataType

source§

fn clone(&self) -> DataType

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for DataType

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Display for DataType

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Copy for DataType

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
source§

impl<T> CloneToUninit for T
where + T: Copy,

source§

unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_trace_handler/merger/enum.FoldResultError.html b/air_trace_handler/merger/enum.FoldResultError.html new file mode 100644 index 00000000..69f33c14 --- /dev/null +++ b/air_trace_handler/merger/enum.FoldResultError.html @@ -0,0 +1,36 @@ +FoldResultError in air_trace_handler::merger - Rust

Enum air_trace_handler::merger::FoldResultError

source ·
pub enum FoldResultError {
+    SubtraceLenOverflow {
+        fold_result: FoldResult,
+        count: usize,
+    },
+    SeveralRecordsWithSamePos(FoldResult, TracePos),
+    FoldIncorrectSubtracesCount(usize),
+}

Variants§

§

SubtraceLenOverflow

Fields

§fold_result: FoldResult
§count: usize
§

SeveralRecordsWithSamePos(FoldResult, TracePos)

There are several lores with the same value_pos.

+
§

FoldIncorrectSubtracesCount(usize)

Errors occurred when one of the fold subtrace lore doesn’t contain 2 descriptors.

+

Trait Implementations§

source§

impl Debug for FoldResultError

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Display for FoldResultError

source§

fn fmt(&self, __formatter: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Error for FoldResultError

1.30.0 · source§

fn source(&self) -> Option<&(dyn Error + 'static)>

The lower-level source of this error, if any. Read more
1.0.0 · source§

fn description(&self) -> &str

👎Deprecated since 1.42.0: use the Display impl or to_string()
1.0.0 · source§

fn cause(&self) -> Option<&dyn Error>

👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
source§

fn provide<'a>(&'a self, request: &mut Request<'a>)

🔬This is a nightly-only experimental API. (error_generic_member_access)
Provides type based access to context intended for error reports. Read more
source§

impl From<FoldResultError> for MergeError

source§

fn from(source: FoldResultError) -> Self

Converts to this type from the input type.

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
§

impl<T> Error for T
where + T: Error + 'static,

§

fn as_error(&self) -> &(dyn Error + 'static)

Gets this error as an std::error::Error.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_trace_handler/merger/enum.MergeCtxType.html b/air_trace_handler/merger/enum.MergeCtxType.html new file mode 100644 index 00000000..56456a7b --- /dev/null +++ b/air_trace_handler/merger/enum.MergeCtxType.html @@ -0,0 +1,32 @@ +MergeCtxType in air_trace_handler::merger - Rust

Enum air_trace_handler::merger::MergeCtxType

source ·
pub enum MergeCtxType {
+    Current,
+    Previous,
+}

Variants§

§

Current

§

Previous

Trait Implementations§

source§

impl Clone for MergeCtxType

source§

fn clone(&self) -> MergeCtxType

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for MergeCtxType

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Display for MergeCtxType

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Copy for MergeCtxType

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
source§

impl<T> CloneToUninit for T
where + T: Copy,

source§

unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_trace_handler/merger/enum.MergeError.html b/air_trace_handler/merger/enum.MergeError.html new file mode 100644 index 00000000..e7f14295 --- /dev/null +++ b/air_trace_handler/merger/enum.MergeError.html @@ -0,0 +1,39 @@ +MergeError in air_trace_handler::merger - Rust

Enum air_trace_handler::merger::MergeError

source ·
pub enum MergeError {
+    IncompatibleExecutedStates(ExecutedState, ExecutedState),
+    DifferentExecutedStateExpected(ExecutedState, DataType, &'static str),
+    KeeperError(KeeperError),
+    IncorrectApResult(ApResultError),
+    IncorrectCallResult(CallResultError),
+    IncorrectCanonResult(CanonResultError),
+    IncorrectFoldResult(FoldResultError),
+}
Expand description

Errors arose out of merging previous data with a new.

+

Variants§

§

IncompatibleExecutedStates(ExecutedState, ExecutedState)

Errors occurred when previous and current executed states are incompatible.

+
§

DifferentExecutedStateExpected(ExecutedState, DataType, &'static str)

Merger was expected to see other state that was obtained from one of traces +(the other state was absent).

+
§

KeeperError(KeeperError)

§

IncorrectApResult(ApResultError)

§

IncorrectCallResult(CallResultError)

§

IncorrectCanonResult(CanonResultError)

§

IncorrectFoldResult(FoldResultError)

Trait Implementations§

source§

impl Debug for MergeError

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Display for MergeError

source§

fn fmt(&self, __formatter: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Error for MergeError

source§

fn source(&self) -> Option<&(dyn Error + 'static)>

The lower-level source of this error, if any. Read more
1.0.0 · source§

fn description(&self) -> &str

👎Deprecated since 1.42.0: use the Display impl or to_string()
1.0.0 · source§

fn cause(&self) -> Option<&dyn Error>

👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
source§

fn provide<'a>(&'a self, request: &mut Request<'a>)

🔬This is a nightly-only experimental API. (error_generic_member_access)
Provides type based access to context intended for error reports. Read more
source§

impl From<ApResultError> for MergeError

source§

fn from(source: ApResultError) -> Self

Converts to this type from the input type.
source§

impl From<CallResultError> for MergeError

source§

fn from(source: CallResultError) -> Self

Converts to this type from the input type.
source§

impl From<CanonResultError> for MergeError

source§

fn from(source: CanonResultError) -> Self

Converts to this type from the input type.
source§

impl From<FoldResultError> for MergeError

source§

fn from(source: FoldResultError) -> Self

Converts to this type from the input type.
source§

impl From<KeeperError> for MergeError

source§

fn from(source: KeeperError) -> Self

Converts to this type from the input type.
source§

impl From<MergeError> for TraceHandlerError

source§

fn from(source: MergeError) -> Self

Converts to this type from the input type.

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
§

impl<T> Error for T
where + T: Error + 'static,

§

fn as_error(&self) -> &(dyn Error + 'static)

Gets this error as an std::error::Error.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_trace_handler/merger/enum.MergerApResult.html b/air_trace_handler/merger/enum.MergerApResult.html new file mode 100644 index 00000000..79d104c7 --- /dev/null +++ b/air_trace_handler/merger/enum.MergerApResult.html @@ -0,0 +1,33 @@ +MergerApResult in air_trace_handler::merger - Rust

Enum air_trace_handler::merger::MergerApResult

source ·
pub enum MergerApResult {
+    NotMet,
+    Met(MetApResult),
+}

Variants§

§

NotMet

There is no corresponding state in a trace for this call.

+
§

Met(MetApResult)

There was a state in at least one of the contexts. If there were two states in +both contexts, they were successfully merged.

+

Trait Implementations§

source§

impl Clone for MergerApResult

source§

fn clone(&self) -> MergerApResult

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for MergerApResult

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_trace_handler/merger/enum.MergerCallResult.html b/air_trace_handler/merger/enum.MergerCallResult.html new file mode 100644 index 00000000..a1f9e368 --- /dev/null +++ b/air_trace_handler/merger/enum.MergerCallResult.html @@ -0,0 +1,33 @@ +MergerCallResult in air_trace_handler::merger - Rust

Enum air_trace_handler::merger::MergerCallResult

source ·
pub enum MergerCallResult {
+    NotMet,
+    Met(MetCallResult),
+}

Variants§

§

NotMet

There is no corresponding state in a trace for this call.

+
§

Met(MetCallResult)

There was a state in at least one of the contexts. If there were two states in +both contexts, they were successfully merged.

+

Trait Implementations§

source§

impl Clone for MergerCallResult

source§

fn clone(&self) -> MergerCallResult

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for MergerCallResult

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_trace_handler/merger/enum.MergerCanonResult.html b/air_trace_handler/merger/enum.MergerCanonResult.html new file mode 100644 index 00000000..65dc93b6 --- /dev/null +++ b/air_trace_handler/merger/enum.MergerCanonResult.html @@ -0,0 +1,33 @@ +MergerCanonResult in air_trace_handler::merger - Rust

Enum air_trace_handler::merger::MergerCanonResult

source ·
pub enum MergerCanonResult {
+    Empty,
+    CanonResult(CanonResult),
+}

Variants§

§

Empty

There is no corresponding state in a trace for this call.

+
§

CanonResult(CanonResult)

There was a state in at least one of the contexts. If there were two states in +both contexts, they were successfully merged.

+

Trait Implementations§

source§

impl Clone for MergerCanonResult

source§

fn clone(&self) -> MergerCanonResult

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for MergerCanonResult

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_trace_handler/merger/enum.PreparationScheme.html b/air_trace_handler/merger/enum.PreparationScheme.html new file mode 100644 index 00000000..9dd02ab8 --- /dev/null +++ b/air_trace_handler/merger/enum.PreparationScheme.html @@ -0,0 +1,32 @@ +PreparationScheme in air_trace_handler::merger - Rust

Enum air_trace_handler::merger::PreparationScheme

source ·
pub enum PreparationScheme {
+    Previous,
+    Current,
+    Both,
+}

Variants§

§

Previous

§

Current

§

Both

Trait Implementations§

source§

impl Clone for PreparationScheme

source§

fn clone(&self) -> PreparationScheme

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for PreparationScheme

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl From<PreparationScheme> for ValueSource

source§

fn from(scheme: PreparationScheme) -> Self

Converts to this type from the input type.
source§

impl Copy for PreparationScheme

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
source§

impl<T> CloneToUninit for T
where + T: Copy,

source§

unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_trace_handler/merger/enum.ValueSource.html b/air_trace_handler/merger/enum.ValueSource.html new file mode 100644 index 00000000..7972db78 --- /dev/null +++ b/air_trace_handler/merger/enum.ValueSource.html @@ -0,0 +1,31 @@ +ValueSource in air_trace_handler::merger - Rust

Enum air_trace_handler::merger::ValueSource

source ·
pub enum ValueSource {
+    PreviousData,
+    CurrentData,
+}

Variants§

§

PreviousData

§

CurrentData

Trait Implementations§

source§

impl Clone for ValueSource

source§

fn clone(&self) -> ValueSource

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for ValueSource

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl From<PreparationScheme> for ValueSource

source§

fn from(scheme: PreparationScheme) -> Self

Converts to this type from the input type.
source§

impl Copy for ValueSource

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
source§

impl<T> CloneToUninit for T
where + T: Copy,

source§

unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_trace_handler/merger/errors/enum.ApResultError.html b/air_trace_handler/merger/errors/enum.ApResultError.html new file mode 100644 index 00000000..d8940206 --- /dev/null +++ b/air_trace_handler/merger/errors/enum.ApResultError.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../air_trace_handler/merger/enum.ApResultError.html...

+ + + \ No newline at end of file diff --git a/air_trace_handler/merger/errors/enum.CallResultError.html b/air_trace_handler/merger/errors/enum.CallResultError.html new file mode 100644 index 00000000..a285eb8d --- /dev/null +++ b/air_trace_handler/merger/errors/enum.CallResultError.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../air_trace_handler/merger/enum.CallResultError.html...

+ + + \ No newline at end of file diff --git a/air_trace_handler/merger/errors/enum.CanonResultError.html b/air_trace_handler/merger/errors/enum.CanonResultError.html new file mode 100644 index 00000000..4a0c60c4 --- /dev/null +++ b/air_trace_handler/merger/errors/enum.CanonResultError.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../air_trace_handler/merger/enum.CanonResultError.html...

+ + + \ No newline at end of file diff --git a/air_trace_handler/merger/errors/enum.DataType.html b/air_trace_handler/merger/errors/enum.DataType.html new file mode 100644 index 00000000..0211c8cf --- /dev/null +++ b/air_trace_handler/merger/errors/enum.DataType.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../air_trace_handler/merger/enum.DataType.html...

+ + + \ No newline at end of file diff --git a/air_trace_handler/merger/errors/enum.FoldResultError.html b/air_trace_handler/merger/errors/enum.FoldResultError.html new file mode 100644 index 00000000..d3229eaa --- /dev/null +++ b/air_trace_handler/merger/errors/enum.FoldResultError.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../air_trace_handler/merger/enum.FoldResultError.html...

+ + + \ No newline at end of file diff --git a/air_trace_handler/merger/errors/enum.MergeError.html b/air_trace_handler/merger/errors/enum.MergeError.html new file mode 100644 index 00000000..8d6e7b7d --- /dev/null +++ b/air_trace_handler/merger/errors/enum.MergeError.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../air_trace_handler/merger/enum.MergeError.html...

+ + + \ No newline at end of file diff --git a/air_trace_handler/merger/fold_merger/fold_lore_resolver/struct.ResolvedFold.html b/air_trace_handler/merger/fold_merger/fold_lore_resolver/struct.ResolvedFold.html new file mode 100644 index 00000000..3700902f --- /dev/null +++ b/air_trace_handler/merger/fold_merger/fold_lore_resolver/struct.ResolvedFold.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../../air_trace_handler/merger/struct.ResolvedFold.html...

+ + + \ No newline at end of file diff --git a/air_trace_handler/merger/fold_merger/fold_lore_resolver/struct.ResolvedSubTraceDescs.html b/air_trace_handler/merger/fold_merger/fold_lore_resolver/struct.ResolvedSubTraceDescs.html new file mode 100644 index 00000000..00695223 --- /dev/null +++ b/air_trace_handler/merger/fold_merger/fold_lore_resolver/struct.ResolvedSubTraceDescs.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../../air_trace_handler/merger/struct.ResolvedSubTraceDescs.html...

+ + + \ No newline at end of file diff --git a/air_trace_handler/merger/fold_merger/struct.MergerFoldResult.html b/air_trace_handler/merger/fold_merger/struct.MergerFoldResult.html new file mode 100644 index 00000000..dd7762ad --- /dev/null +++ b/air_trace_handler/merger/fold_merger/struct.MergerFoldResult.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../air_trace_handler/merger/struct.MergerFoldResult.html...

+ + + \ No newline at end of file diff --git a/air_trace_handler/merger/index.html b/air_trace_handler/merger/index.html new file mode 100644 index 00000000..441bb808 --- /dev/null +++ b/air_trace_handler/merger/index.html @@ -0,0 +1 @@ +air_trace_handler::merger - Rust
\ No newline at end of file diff --git a/air_trace_handler/merger/par_merger/struct.MergerParResult.html b/air_trace_handler/merger/par_merger/struct.MergerParResult.html new file mode 100644 index 00000000..efad2685 --- /dev/null +++ b/air_trace_handler/merger/par_merger/struct.MergerParResult.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../air_trace_handler/merger/struct.MergerParResult.html...

+ + + \ No newline at end of file diff --git a/air_trace_handler/merger/position_mapping/enum.PreparationScheme.html b/air_trace_handler/merger/position_mapping/enum.PreparationScheme.html new file mode 100644 index 00000000..adf0170c --- /dev/null +++ b/air_trace_handler/merger/position_mapping/enum.PreparationScheme.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../air_trace_handler/merger/enum.PreparationScheme.html...

+ + + \ No newline at end of file diff --git a/air_trace_handler/merger/sidebar-items.js b/air_trace_handler/merger/sidebar-items.js new file mode 100644 index 00000000..76cbe94c --- /dev/null +++ b/air_trace_handler/merger/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"enum":["ApResultError","CallResultError","CanonResultError","DataType","FoldResultError","MergeCtxType","MergeError","MergerApResult","MergerCallResult","MergerCanonResult","PreparationScheme","ValueSource"],"struct":["MergerFoldResult","MergerParResult","MetApResult","MetCallResult","ResolvedFold","ResolvedSubTraceDescs"]}; \ No newline at end of file diff --git a/air_trace_handler/merger/struct.MergerFoldResult.html b/air_trace_handler/merger/struct.MergerFoldResult.html new file mode 100644 index 00000000..d6a4975b --- /dev/null +++ b/air_trace_handler/merger/struct.MergerFoldResult.html @@ -0,0 +1,30 @@ +MergerFoldResult in air_trace_handler::merger - Rust

Struct air_trace_handler::merger::MergerFoldResult

source ·
pub struct MergerFoldResult {
+    pub prev_fold_lore: ResolvedFold,
+    pub current_fold_lore: ResolvedFold,
+}

Fields§

§prev_fold_lore: ResolvedFold§current_fold_lore: ResolvedFold

Trait Implementations§

source§

impl Clone for MergerFoldResult

source§

fn clone(&self) -> MergerFoldResult

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for MergerFoldResult

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Default for MergerFoldResult

source§

fn default() -> MergerFoldResult

Returns the “default value” for a type. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_trace_handler/merger/struct.MergerParResult.html b/air_trace_handler/merger/struct.MergerParResult.html new file mode 100644 index 00000000..7d0b6a19 --- /dev/null +++ b/air_trace_handler/merger/struct.MergerParResult.html @@ -0,0 +1,31 @@ +MergerParResult in air_trace_handler::merger - Rust

Struct air_trace_handler::merger::MergerParResult

source ·
pub struct MergerParResult {
+    pub prev_par: Option<ParResult>,
+    pub current_par: Option<ParResult>,
+}

Fields§

§prev_par: Option<ParResult>§current_par: Option<ParResult>

Trait Implementations§

source§

impl Clone for MergerParResult

source§

fn clone(&self) -> MergerParResult

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for MergerParResult

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Default for MergerParResult

source§

fn default() -> MergerParResult

Returns the “default value” for a type. Read more
source§

impl Copy for MergerParResult

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
source§

impl<T> CloneToUninit for T
where + T: Copy,

source§

unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_trace_handler/merger/struct.MetApResult.html b/air_trace_handler/merger/struct.MetApResult.html new file mode 100644 index 00000000..a9d980e9 --- /dev/null +++ b/air_trace_handler/merger/struct.MetApResult.html @@ -0,0 +1,30 @@ +MetApResult in air_trace_handler::merger - Rust

Struct air_trace_handler::merger::MetApResult

source ·
pub struct MetApResult {
+    pub generation: GenerationIdx,
+    pub value_source: ValueSource,
+}

Fields§

§generation: GenerationIdx§value_source: ValueSource

Trait Implementations§

source§

impl Clone for MetApResult

source§

fn clone(&self) -> MetApResult

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for MetApResult

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_trace_handler/merger/struct.MetCallResult.html b/air_trace_handler/merger/struct.MetCallResult.html new file mode 100644 index 00000000..3d95702f --- /dev/null +++ b/air_trace_handler/merger/struct.MetCallResult.html @@ -0,0 +1,31 @@ +MetCallResult in air_trace_handler::merger - Rust

Struct air_trace_handler::merger::MetCallResult

source ·
pub struct MetCallResult {
+    pub result: CallResult,
+    pub trace_pos: TracePos,
+    pub source: ValueSource,
+}

Fields§

§result: CallResult§trace_pos: TracePos§source: ValueSource

Implementations§

source§

impl MetCallResult

source

pub fn new(result: CallResult, trace_pos: TracePos, source: ValueSource) -> Self

Trait Implementations§

source§

impl Clone for MetCallResult

source§

fn clone(&self) -> MetCallResult

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for MetCallResult

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_trace_handler/merger/struct.ResolvedFold.html b/air_trace_handler/merger/struct.ResolvedFold.html new file mode 100644 index 00000000..632001ea --- /dev/null +++ b/air_trace_handler/merger/struct.ResolvedFold.html @@ -0,0 +1,35 @@ +ResolvedFold in air_trace_handler::merger - Rust

Struct air_trace_handler::merger::ResolvedFold

source ·
pub struct ResolvedFold {
+    pub lore: HashMap<TracePos, ResolvedSubTraceDescs>,
+    pub fold_states_count: u32,
+}

Fields§

§lore: HashMap<TracePos, ResolvedSubTraceDescs>§fold_states_count: u32

Implementations§

source§

impl ResolvedFold

source

pub fn new( + lore: HashMap<TracePos, ResolvedSubTraceDescs>, + fold_states_count: u32, +) -> Self

Trait Implementations§

source§

impl Clone for ResolvedFold

source§

fn clone(&self) -> ResolvedFold

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for ResolvedFold

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Default for ResolvedFold

source§

fn default() -> ResolvedFold

Returns the “default value” for a type. Read more
source§

impl PartialEq for ResolvedFold

source§

fn eq(&self, other: &ResolvedFold) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl Eq for ResolvedFold

source§

impl StructuralPartialEq for ResolvedFold

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_trace_handler/merger/struct.ResolvedSubTraceDescs.html b/air_trace_handler/merger/struct.ResolvedSubTraceDescs.html new file mode 100644 index 00000000..3facff94 --- /dev/null +++ b/air_trace_handler/merger/struct.ResolvedSubTraceDescs.html @@ -0,0 +1,32 @@ +ResolvedSubTraceDescs in air_trace_handler::merger - Rust

Struct air_trace_handler::merger::ResolvedSubTraceDescs

source ·
pub struct ResolvedSubTraceDescs {
+    pub before_subtrace: SubTraceDesc,
+    pub after_subtrace: SubTraceDesc,
+}

Fields§

§before_subtrace: SubTraceDesc§after_subtrace: SubTraceDesc

Implementations§

source§

impl ResolvedSubTraceDescs

source

pub fn new(before_subtrace: SubTraceDesc, after_subtrace: SubTraceDesc) -> Self

Trait Implementations§

source§

impl Clone for ResolvedSubTraceDescs

source§

fn clone(&self) -> ResolvedSubTraceDescs

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for ResolvedSubTraceDescs

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl PartialEq for ResolvedSubTraceDescs

source§

fn eq(&self, other: &ResolvedSubTraceDescs) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl Eq for ResolvedSubTraceDescs

source§

impl StructuralPartialEq for ResolvedSubTraceDescs

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_trace_handler/sidebar-items.js b/air_trace_handler/sidebar-items.js new file mode 100644 index 00000000..131fecd8 --- /dev/null +++ b/air_trace_handler/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"enum":["GenerationCompactificationError","IntConversionError","KeeperError","StateFSMError","SubgraphType","TraceHandlerError"],"mod":["merger"],"struct":["TraceHandler"],"type":["TraceHandlerResult"]}; \ No newline at end of file diff --git a/air_trace_handler/state_automata/errors/enum.StateFSMError.html b/air_trace_handler/state_automata/errors/enum.StateFSMError.html new file mode 100644 index 00000000..1b300c29 --- /dev/null +++ b/air_trace_handler/state_automata/errors/enum.StateFSMError.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../air_trace_handler/enum.StateFSMError.html...

+ + + \ No newline at end of file diff --git a/air_trace_handler/state_automata/par_fsm/enum.SubgraphType.html b/air_trace_handler/state_automata/par_fsm/enum.SubgraphType.html new file mode 100644 index 00000000..41219215 --- /dev/null +++ b/air_trace_handler/state_automata/par_fsm/enum.SubgraphType.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../air_trace_handler/enum.SubgraphType.html...

+ + + \ No newline at end of file diff --git a/air_trace_handler/struct.TraceHandler.html b/air_trace_handler/struct.TraceHandler.html new file mode 100644 index 00000000..426b9578 --- /dev/null +++ b/air_trace_handler/struct.TraceHandler.html @@ -0,0 +1,44 @@ +TraceHandler in air_trace_handler - Rust

Struct air_trace_handler::TraceHandler

source ·
pub struct TraceHandler { /* private fields */ }

Implementations§

source§

impl TraceHandler

source

pub fn from_trace( + prev_trace: ExecutionTrace, + current_trace: ExecutionTrace, +) -> Self

source

pub fn trace_pos(&self) -> Result<TracePos, IntConversionError>

Returns size of elements inside result trace and intended to provide +a position of next inserted elements.

+
source

pub fn into_result_trace(self) -> ExecutionTrace

source

pub fn as_result_trace(&self) -> &ExecutionTrace

source

pub fn subgraph_sizes(&self) -> (TraceLen, TraceLen)

source

pub fn update_generation( + &mut self, + trace_pos: TracePos, + generation: GenerationIdx, +) -> Result<(), GenerationCompactificationError>

source§

impl TraceHandler

source

pub fn meet_call_start(&mut self) -> TraceHandlerResult<MergerCallResult>

Should be called at the beginning of a call execution.

+
source

pub fn meet_call_end(&mut self, call_result: CallResult)

Should be called when a call instruction was executed successfully. It adds the supplied +state to the result trace.

+
source§

impl TraceHandler

source

pub fn meet_ap_start(&mut self) -> TraceHandlerResult<MergerApResult>

source

pub fn meet_ap_end(&mut self, ap_result: ApResult)

source§

impl TraceHandler

source§

impl TraceHandler

source

pub fn meet_par_start(&mut self) -> TraceHandlerResult<()>

source

pub fn meet_par_subgraph_end( + &mut self, + subgraph_type: SubgraphType, +) -> TraceHandlerResult<()>

source§

impl TraceHandler

source

pub fn meet_fold_start(&mut self, fold_id: u32) -> TraceHandlerResult<()>

source

pub fn meet_iteration_start( + &mut self, + fold_id: u32, + value_pos: TracePos, +) -> TraceHandlerResult<()>

source

pub fn meet_iteration_end(&mut self, fold_id: u32) -> TraceHandlerResult<()>

source

pub fn meet_back_iterator(&mut self, fold_id: u32) -> TraceHandlerResult<()>

source

pub fn meet_generation_end(&mut self, fold_id: u32) -> TraceHandlerResult<()>

source

pub fn meet_fold_end(&mut self, fold_id: u32) -> TraceHandlerResult<()>

Trait Implementations§

source§

impl Debug for TraceHandler

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Default for TraceHandler

source§

fn default() -> TraceHandler

Returns the “default value” for a type. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/air_trace_handler/type.TraceHandlerResult.html b/air_trace_handler/type.TraceHandlerResult.html new file mode 100644 index 00000000..60ee5c47 --- /dev/null +++ b/air_trace_handler/type.TraceHandlerResult.html @@ -0,0 +1,6 @@ +TraceHandlerResult in air_trace_handler - Rust

Type Alias air_trace_handler::TraceHandlerResult

source ·
pub type TraceHandlerResult<T> = Result<T, TraceHandlerError>;

Aliased Type§

enum TraceHandlerResult<T> {
+    Ok(T),
+    Err(TraceHandlerError),
+}

Variants§

§1.0.0

Ok(T)

Contains the success value

+
§1.0.0

Err(TraceHandlerError)

Contains the error value

+
\ No newline at end of file diff --git a/air_utils/all.html b/air_utils/all.html new file mode 100644 index 00000000..22634ef5 --- /dev/null +++ b/air_utils/all.html @@ -0,0 +1 @@ +List of all items in this crate
\ No newline at end of file diff --git a/air_utils/index.html b/air_utils/index.html new file mode 100644 index 00000000..95e41b7d --- /dev/null +++ b/air_utils/index.html @@ -0,0 +1 @@ +air_utils - Rust
\ No newline at end of file diff --git a/air_utils/macro.auto_checked_add!.html b/air_utils/macro.auto_checked_add!.html new file mode 100644 index 00000000..33b56f14 --- /dev/null +++ b/air_utils/macro.auto_checked_add!.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to macro.auto_checked_add.html...

+ + + \ No newline at end of file diff --git a/air_utils/macro.auto_checked_add.html b/air_utils/macro.auto_checked_add.html new file mode 100644 index 00000000..693f13e3 --- /dev/null +++ b/air_utils/macro.auto_checked_add.html @@ -0,0 +1,3 @@ +auto_checked_add in air_utils - Rust

Macro air_utils::auto_checked_add

source ·
macro_rules! auto_checked_add {
+    [$type:ty] => { ... };
+}
\ No newline at end of file diff --git a/air_utils/macro.farewell_if_fail!.html b/air_utils/macro.farewell_if_fail!.html new file mode 100644 index 00000000..51d8e951 --- /dev/null +++ b/air_utils/macro.farewell_if_fail!.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to macro.farewell_if_fail.html...

+ + + \ No newline at end of file diff --git a/air_utils/macro.farewell_if_fail.html b/air_utils/macro.farewell_if_fail.html new file mode 100644 index 00000000..b1cd4755 --- /dev/null +++ b/air_utils/macro.farewell_if_fail.html @@ -0,0 +1,3 @@ +farewell_if_fail in air_utils - Rust

Macro air_utils::farewell_if_fail

source ·
macro_rules! farewell_if_fail {
+    ($cmd:expr, $raw_prev_data:expr, $soft_limits_triggering:expr) => { ... };
+}
\ No newline at end of file diff --git a/air_utils/macro.measure!.html b/air_utils/macro.measure!.html new file mode 100644 index 00000000..b42570df --- /dev/null +++ b/air_utils/macro.measure!.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to macro.measure.html...

+ + + \ No newline at end of file diff --git a/air_utils/macro.measure.html b/air_utils/macro.measure.html new file mode 100644 index 00000000..f91f3980 --- /dev/null +++ b/air_utils/macro.measure.html @@ -0,0 +1,6 @@ +measure in air_utils - Rust

Macro air_utils::measure

source ·
macro_rules! measure {
+    (target: $target:expr, $expr:expr, $span:literal) => { ... };
+    ($expr:expr, $level:expr, $span:literal, $($fields:tt)*) => { ... };
+    ($expr:expr, $level:expr, $span:literal) => { ... };
+    ($expr:expr, $span:literal) => { ... };
+}
\ No newline at end of file diff --git a/air_utils/sidebar-items.js b/air_utils/sidebar-items.js new file mode 100644 index 00000000..27f7c37b --- /dev/null +++ b/air_utils/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"macro":["auto_checked_add","farewell_if_fail","measure"]}; \ No newline at end of file diff --git a/avm_data_store/all.html b/avm_data_store/all.html new file mode 100644 index 00000000..bb3fc7bb --- /dev/null +++ b/avm_data_store/all.html @@ -0,0 +1 @@ +List of all items in this crate

List of all items

Structs

Traits

\ No newline at end of file diff --git a/avm_data_store/index.html b/avm_data_store/index.html new file mode 100644 index 00000000..127f8aac --- /dev/null +++ b/avm_data_store/index.html @@ -0,0 +1 @@ +avm_data_store - Rust

Crate avm_data_store

source ·

Structs§

Traits§

\ No newline at end of file diff --git a/avm_data_store/sidebar-items.js b/avm_data_store/sidebar-items.js new file mode 100644 index 00000000..d051f335 --- /dev/null +++ b/avm_data_store/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"struct":["AnomalyData"],"trait":["DataStore"]}; \ No newline at end of file diff --git a/avm_data_store/struct.AnomalyData.html b/avm_data_store/struct.AnomalyData.html new file mode 100644 index 00000000..6003cd00 --- /dev/null +++ b/avm_data_store/struct.AnomalyData.html @@ -0,0 +1,49 @@ +AnomalyData in avm_data_store - Rust

Struct avm_data_store::AnomalyData

source ·
pub struct AnomalyData<'data> {
+    pub air_script: Cow<'data, str>,
+    pub particle: Cow<'data, [u8]>,
+    pub prev_data: Cow<'data, [u8]>,
+    pub current_data: Cow<'data, [u8]>,
+    pub call_results: Cow<'data, [u8]>,
+    pub avm_outcome: Cow<'data, [u8]>,
+    pub execution_time: Duration,
+    pub memory_delta: usize,
+}

Fields§

§air_script: Cow<'data, str>§particle: Cow<'data, [u8]>§prev_data: Cow<'data, [u8]>§current_data: Cow<'data, [u8]>§call_results: Cow<'data, [u8]>§avm_outcome: Cow<'data, [u8]>§execution_time: Duration§memory_delta: usize

Implementations§

source§

impl<'data> AnomalyData<'data>

source

pub fn new( + air_script: &'data str, + particle: &'data [u8], + prev_data: &'data [u8], + current_data: &'data [u8], + call_results: &'data [u8], + avm_outcome: &'data [u8], + execution_time: Duration, + memory_delta: usize, +) -> Self

Trait Implementations§

source§

impl<'data> Clone for AnomalyData<'data>

source§

fn clone(&self) -> AnomalyData<'data>

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl<'data> Debug for AnomalyData<'data>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'de: 'data, 'data> Deserialize<'de> for AnomalyData<'data>

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl<'data> PartialEq for AnomalyData<'data>

source§

fn eq(&self, other: &AnomalyData<'data>) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl<'data> Serialize for AnomalyData<'data>

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl<'data> Eq for AnomalyData<'data>

source§

impl<'data> StructuralPartialEq for AnomalyData<'data>

Auto Trait Implementations§

§

impl<'data> Freeze for AnomalyData<'data>

§

impl<'data> RefUnwindSafe for AnomalyData<'data>

§

impl<'data> Send for AnomalyData<'data>

§

impl<'data> Sync for AnomalyData<'data>

§

impl<'data> Unpin for AnomalyData<'data>

§

impl<'data> UnwindSafe for AnomalyData<'data>

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/avm_data_store/trait.DataStore.html b/avm_data_store/trait.DataStore.html new file mode 100644 index 00000000..04a01a03 --- /dev/null +++ b/avm_data_store/trait.DataStore.html @@ -0,0 +1,69 @@ +DataStore in avm_data_store - Rust

Trait avm_data_store::DataStore

source ·
pub trait DataStore {
+    type Error;
+
+    // Required methods
+    fn initialize(&mut self) -> Result<(), Self::Error>;
+    fn store_data(
+        &mut self,
+        data: &[u8],
+        particle_id: &str,
+        current_peer_id: &str,
+    ) -> Result<(), Self::Error>;
+    fn read_data(
+        &mut self,
+        particle_id: &str,
+        current_peer_id: &str,
+    ) -> Result<Vec<u8>, Self::Error>;
+    fn cleanup_data(
+        &mut self,
+        particle_id: &str,
+        current_peer_id: &str,
+    ) -> Result<(), Self::Error>;
+    fn detect_anomaly(
+        &self,
+        execution_time: Duration,
+        memory_delta: usize,
+        outcome: &RawAVMOutcome,
+    ) -> bool;
+    fn collect_anomaly_data(
+        &mut self,
+        particle_id: &str,
+        current_peer_id: &str,
+        anomaly_data: AnomalyData<'_>,
+    ) -> Result<(), Self::Error>;
+}
Expand description

This trait is used for

+
    +
  • persisting prev_data between successive calls of an interpreter
  • +
  • logging previous, current, and new data in case of spikes
  • +
+

Required Associated Types§

Required Methods§

source

fn initialize(&mut self) -> Result<(), Self::Error>

source

fn store_data( + &mut self, + data: &[u8], + particle_id: &str, + current_peer_id: &str, +) -> Result<(), Self::Error>

source

fn read_data( + &mut self, + particle_id: &str, + current_peer_id: &str, +) -> Result<Vec<u8>, Self::Error>

source

fn cleanup_data( + &mut self, + particle_id: &str, + current_peer_id: &str, +) -> Result<(), Self::Error>

Cleanup data that become obsolete.

+
source

fn detect_anomaly( + &self, + execution_time: Duration, + memory_delta: usize, + outcome: &RawAVMOutcome, +) -> bool

Returns true if an anomaly happened and it’s necessary to save execution data +for debugging purposes. +execution_time - time taken by the interpreter to execute provided script +memory_delta - count of bytes on which an interpreter heap has been extended +during execution of a particle +outcome - a result of AquaVM invocation

+
source

fn collect_anomaly_data( + &mut self, + particle_id: &str, + current_peer_id: &str, + anomaly_data: AnomalyData<'_>, +) -> Result<(), Self::Error>

Implementors§

\ No newline at end of file diff --git a/avm_interface/all.html b/avm_interface/all.html new file mode 100644 index 00000000..61c3c77d --- /dev/null +++ b/avm_interface/all.html @@ -0,0 +1 @@ +List of all items in this crate
\ No newline at end of file diff --git a/avm_interface/call_request_parameters/struct.CallRequestParams.html b/avm_interface/call_request_parameters/struct.CallRequestParams.html new file mode 100644 index 00000000..bdf66597 --- /dev/null +++ b/avm_interface/call_request_parameters/struct.CallRequestParams.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../avm_interface/struct.CallRequestParams.html...

+ + + \ No newline at end of file diff --git a/avm_interface/call_request_parameters/type.CallRequests.html b/avm_interface/call_request_parameters/type.CallRequests.html new file mode 100644 index 00000000..50255249 --- /dev/null +++ b/avm_interface/call_request_parameters/type.CallRequests.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../avm_interface/type.CallRequests.html...

+ + + \ No newline at end of file diff --git a/avm_interface/call_service_result/constant.CALL_SERVICE_SUCCESS.html b/avm_interface/call_service_result/constant.CALL_SERVICE_SUCCESS.html new file mode 100644 index 00000000..ad635890 --- /dev/null +++ b/avm_interface/call_service_result/constant.CALL_SERVICE_SUCCESS.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../avm_interface/constant.CALL_SERVICE_SUCCESS.html...

+ + + \ No newline at end of file diff --git a/avm_interface/call_service_result/fn.into_raw_result.html b/avm_interface/call_service_result/fn.into_raw_result.html new file mode 100644 index 00000000..b4752424 --- /dev/null +++ b/avm_interface/call_service_result/fn.into_raw_result.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../avm_interface/fn.into_raw_result.html...

+ + + \ No newline at end of file diff --git a/avm_interface/call_service_result/struct.CallServiceResult.html b/avm_interface/call_service_result/struct.CallServiceResult.html new file mode 100644 index 00000000..c378de64 --- /dev/null +++ b/avm_interface/call_service_result/struct.CallServiceResult.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../avm_interface/struct.CallServiceResult.html...

+ + + \ No newline at end of file diff --git a/avm_interface/call_service_result/type.CallResults.html b/avm_interface/call_service_result/type.CallResults.html new file mode 100644 index 00000000..682bf1b6 --- /dev/null +++ b/avm_interface/call_service_result/type.CallResults.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../avm_interface/type.CallResults.html...

+ + + \ No newline at end of file diff --git a/avm_interface/constant.CALL_SERVICE_SUCCESS.html b/avm_interface/constant.CALL_SERVICE_SUCCESS.html new file mode 100644 index 00000000..06f230b3 --- /dev/null +++ b/avm_interface/constant.CALL_SERVICE_SUCCESS.html @@ -0,0 +1 @@ +CALL_SERVICE_SUCCESS in avm_interface - Rust

Constant avm_interface::CALL_SERVICE_SUCCESS

source ·
pub const CALL_SERVICE_SUCCESS: i32 = 0;
\ No newline at end of file diff --git a/avm_interface/enum.CallSeDeErrors.html b/avm_interface/enum.CallSeDeErrors.html new file mode 100644 index 00000000..1c0689c6 --- /dev/null +++ b/avm_interface/enum.CallSeDeErrors.html @@ -0,0 +1,51 @@ +CallSeDeErrors in avm_interface - Rust

Enum avm_interface::CallSeDeErrors

source ·
pub enum CallSeDeErrors {
+    CallResultsSeFailed {
+        call_results: CallResults,
+        se_error: CallResultsSerializeError,
+    },
+    CallRequestsDeError {
+        raw_call_request: SerializedCallRequests,
+        error: CallRequestsDeserializeError,
+    },
+    CallParamsArgsDeFailed {
+        call_params: CallRequestParams,
+        de_error: CallArgumentsDeserializeError,
+    },
+    CallParamsTetrapletsDeFailed {
+        call_params: CallRequestParams,
+        de_error: TetrapletDeserializeError,
+    },
+}

Variants§

§

CallResultsSeFailed

Errors encountered while trying to serialize call results.

+

Fields

§call_results: CallResults
§se_error: CallResultsSerializeError
§

CallRequestsDeError

This error is encountered when deserialization pof call requests failed for some reason.

+

Fields

§raw_call_request: SerializedCallRequests
§error: CallRequestsDeserializeError
§

CallParamsArgsDeFailed

Errors encountered while trying to deserialize arguments from call parameters returned +by the interpreter. In the corresponding struct such arguments are Vec serialized +to a string.

+

Fields

§call_params: CallRequestParams
§de_error: CallArgumentsDeserializeError
§

CallParamsTetrapletsDeFailed

Errors encountered while trying to deserialize tetraplets from call parameters returned +by the interpreter. In the corresponding struct such tetraplets are +Vec<Vec> serialized to a string.

+

Fields

§call_params: CallRequestParams
§de_error: TetrapletDeserializeError

Trait Implementations§

source§

impl Debug for CallSeDeErrors

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Display for CallSeDeErrors

source§

fn fmt(&self, __formatter: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Error for CallSeDeErrors

1.30.0 · source§

fn source(&self) -> Option<&(dyn Error + 'static)>

The lower-level source of this error, if any. Read more
1.0.0 · source§

fn description(&self) -> &str

👎Deprecated since 1.42.0: use the Display impl or to_string()
1.0.0 · source§

fn cause(&self) -> Option<&dyn Error>

👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
source§

fn provide<'a>(&'a self, request: &mut Request<'a>)

🔬This is a nightly-only experimental API. (error_generic_member_access)
Provides type based access to context intended for error reports. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
§

impl<T> Error for T
where + T: Error + 'static,

§

fn as_error(&self) -> &(dyn Error + 'static)

Gets this error as an std::error::Error.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/avm_interface/fn.into_raw_result.html b/avm_interface/fn.into_raw_result.html new file mode 100644 index 00000000..0ff3cc75 --- /dev/null +++ b/avm_interface/fn.into_raw_result.html @@ -0,0 +1 @@ +into_raw_result in avm_interface - Rust

Function avm_interface::into_raw_result

source ·
pub fn into_raw_result(call_results: CallResults) -> CallResults
\ No newline at end of file diff --git a/avm_interface/index.html b/avm_interface/index.html new file mode 100644 index 00000000..42f851b2 --- /dev/null +++ b/avm_interface/index.html @@ -0,0 +1,2 @@ +avm_interface - Rust

Crate avm_interface

source ·

Modules§

Structs§

Enums§

Constants§

Functions§

Type Aliases§

\ No newline at end of file diff --git a/avm_interface/outcome/struct.AVMOutcome.html b/avm_interface/outcome/struct.AVMOutcome.html new file mode 100644 index 00000000..44b58efe --- /dev/null +++ b/avm_interface/outcome/struct.AVMOutcome.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../avm_interface/struct.AVMOutcome.html...

+ + + \ No newline at end of file diff --git a/avm_interface/outcome/struct.ErrorAVMOutcome.html b/avm_interface/outcome/struct.ErrorAVMOutcome.html new file mode 100644 index 00000000..61e1557c --- /dev/null +++ b/avm_interface/outcome/struct.ErrorAVMOutcome.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../avm_interface/struct.ErrorAVMOutcome.html...

+ + + \ No newline at end of file diff --git a/avm_interface/particle_parameters/struct.ParticleParameters.html b/avm_interface/particle_parameters/struct.ParticleParameters.html new file mode 100644 index 00000000..64eed9c1 --- /dev/null +++ b/avm_interface/particle_parameters/struct.ParticleParameters.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../avm_interface/struct.ParticleParameters.html...

+ + + \ No newline at end of file diff --git a/avm_interface/raw_outcome/index.html b/avm_interface/raw_outcome/index.html new file mode 100644 index 00000000..df7fb979 --- /dev/null +++ b/avm_interface/raw_outcome/index.html @@ -0,0 +1 @@ +avm_interface::raw_outcome - Rust

Module avm_interface::raw_outcome

source ·

Structs§

  • This struct is very similar to AVMOutcome, but keeps error_code and error_msg for test purposes.
\ No newline at end of file diff --git a/avm_interface/raw_outcome/sidebar-items.js b/avm_interface/raw_outcome/sidebar-items.js new file mode 100644 index 00000000..8e993c1f --- /dev/null +++ b/avm_interface/raw_outcome/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"struct":["RawAVMOutcome"]}; \ No newline at end of file diff --git a/avm_interface/raw_outcome/struct.RawAVMOutcome.html b/avm_interface/raw_outcome/struct.RawAVMOutcome.html new file mode 100644 index 00000000..768972e9 --- /dev/null +++ b/avm_interface/raw_outcome/struct.RawAVMOutcome.html @@ -0,0 +1,41 @@ +RawAVMOutcome in avm_interface::raw_outcome - Rust

Struct avm_interface::raw_outcome::RawAVMOutcome

source ·
pub struct RawAVMOutcome {
+    pub ret_code: i64,
+    pub error_message: String,
+    pub data: Vec<u8>,
+    pub call_requests: CallRequests,
+    pub next_peer_pks: Vec<String>,
+    pub soft_limits_triggering: SoftLimitsTriggering,
+}
Expand description

This struct is very similar to AVMOutcome, but keeps error_code and error_msg for test purposes.

+

Fields§

§ret_code: i64§error_message: String§data: Vec<u8>§call_requests: CallRequests§next_peer_pks: Vec<String>§soft_limits_triggering: SoftLimitsTriggering

Implementations§

source§

impl RawAVMOutcome

source

pub fn from_interpreter_outcome( + outcome: InterpreterOutcome, +) -> Result<Self, CallSeDeErrors>

Trait Implementations§

source§

impl Clone for RawAVMOutcome

source§

fn clone(&self) -> RawAVMOutcome

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for RawAVMOutcome

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'de> Deserialize<'de> for RawAVMOutcome

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl PartialEq for RawAVMOutcome

source§

fn eq(&self, other: &RawAVMOutcome) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl Serialize for RawAVMOutcome

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Eq for RawAVMOutcome

source§

impl StructuralPartialEq for RawAVMOutcome

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/avm_interface/sidebar-items.js b/avm_interface/sidebar-items.js new file mode 100644 index 00000000..445039ba --- /dev/null +++ b/avm_interface/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"constant":["CALL_SERVICE_SUCCESS"],"enum":["CallSeDeErrors"],"fn":["into_raw_result"],"mod":["raw_outcome"],"struct":["AVMOutcome","CallRequestParams","CallServiceResult","ErrorAVMOutcome","ParticleParameters","SoftLimitsTriggering"],"type":["CallRequests","CallResults"]}; \ No newline at end of file diff --git a/avm_interface/struct.AVMOutcome.html b/avm_interface/struct.AVMOutcome.html new file mode 100644 index 00000000..f58dca45 --- /dev/null +++ b/avm_interface/struct.AVMOutcome.html @@ -0,0 +1,50 @@ +AVMOutcome in avm_interface - Rust

Struct avm_interface::AVMOutcome

source ·
pub struct AVMOutcome {
+    pub data: Vec<u8>,
+    pub call_requests: CallRequests,
+    pub next_peer_pks: Vec<String>,
+    pub memory_delta: usize,
+    pub execution_time: Duration,
+    pub soft_limits_triggering: SoftLimitsTriggering,
+}

Fields§

§data: Vec<u8>

Contains script data that should be preserved in an executor of this interpreter +regardless of ret_code value.

+
§call_requests: CallRequests

Collected parameters of all met call instructions that could be executed on a current peer.

+
§next_peer_pks: Vec<String>

Public keys of peers that should receive data.

+
§memory_delta: usize

Memory in bytes AVM linear heap was extended during execution by.

+
§execution_time: Duration

Time of a particle execution +(it counts only execution time without operations with DataStore and so on)

+
§soft_limits_triggering: SoftLimitsTriggering

To store and convey soft limits triggering flags.

+

Implementations§

source§

impl AVMOutcome

source

pub fn from_raw_outcome( + raw_outcome: RawAVMOutcome, + memory_delta: usize, + execution_time: Duration, +) -> Result<Self, ErrorAVMOutcome>

Trait Implementations§

source§

impl Clone for AVMOutcome

source§

fn clone(&self) -> AVMOutcome

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for AVMOutcome

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'de> Deserialize<'de> for AVMOutcome

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl PartialEq for AVMOutcome

source§

fn eq(&self, other: &AVMOutcome) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl Serialize for AVMOutcome

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Eq for AVMOutcome

source§

impl StructuralPartialEq for AVMOutcome

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/avm_interface/struct.CallRequestParams.html b/avm_interface/struct.CallRequestParams.html new file mode 100644 index 00000000..76290c6b --- /dev/null +++ b/avm_interface/struct.CallRequestParams.html @@ -0,0 +1,47 @@ +CallRequestParams in avm_interface - Rust

Struct avm_interface::CallRequestParams

source ·
pub struct CallRequestParams {
+    pub service_id: String,
+    pub function_name: String,
+    pub arguments: Vec<Value>,
+    pub tetraplets: Vec<Vec<SecurityTetraplet>>,
+}
Expand description

Contains arguments of a call instruction and all other necessary information +required for calling a service.

+

Fields§

§service_id: String

Id of a service that should be called.

+
§function_name: String

Name of a function from service identified by service_id that should be called.

+
§arguments: Vec<Value>

Arguments that should be passed to the function.

+
§tetraplets: Vec<Vec<SecurityTetraplet>>

Tetraplets that should be passed to the service.

+

Implementations§

source§

impl CallRequestParams

source

pub fn new( + service_id: impl Into<String>, + function_name: impl Into<String>, + arguments: Vec<Value>, + tetraplets: Vec<Vec<SecurityTetraplet>>, +) -> Self

Trait Implementations§

source§

impl Clone for CallRequestParams

source§

fn clone(&self) -> CallRequestParams

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for CallRequestParams

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'de> Deserialize<'de> for CallRequestParams

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl PartialEq for CallRequestParams

source§

fn eq(&self, other: &CallRequestParams) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl Serialize for CallRequestParams

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Eq for CallRequestParams

source§

impl StructuralPartialEq for CallRequestParams

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/avm_interface/struct.CallServiceResult.html b/avm_interface/struct.CallServiceResult.html new file mode 100644 index 00000000..e05f6e1d --- /dev/null +++ b/avm_interface/struct.CallServiceResult.html @@ -0,0 +1,38 @@ +CallServiceResult in avm_interface - Rust

Struct avm_interface::CallServiceResult

source ·
pub struct CallServiceResult {
+    pub ret_code: i32,
+    pub result: Value,
+}
Expand description

Represents an executed host function result.

+

Fields§

§ret_code: i32

A error code service or builtin returned, where CALL_SERVICE_SUCCESS represents success.

+
§result: Value

Resulted JValue returned by a service string.

+

Implementations§

source§

impl CallServiceResult

source

pub fn ok(result: Value) -> Self

source

pub fn err(err_code: i32, result: Value) -> Self

source

pub fn into_raw(self) -> CallServiceResult

Trait Implementations§

source§

impl Clone for CallServiceResult

source§

fn clone(&self) -> CallServiceResult

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for CallServiceResult

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Default for CallServiceResult

source§

fn default() -> CallServiceResult

Returns the “default value” for a type. Read more
source§

impl<'de> Deserialize<'de> for CallServiceResult

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl Display for CallServiceResult

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl PartialEq for CallServiceResult

source§

fn eq(&self, other: &CallServiceResult) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl Serialize for CallServiceResult

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Eq for CallServiceResult

source§

impl StructuralPartialEq for CallServiceResult

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/avm_interface/struct.ErrorAVMOutcome.html b/avm_interface/struct.ErrorAVMOutcome.html new file mode 100644 index 00000000..0c15c727 --- /dev/null +++ b/avm_interface/struct.ErrorAVMOutcome.html @@ -0,0 +1,35 @@ +ErrorAVMOutcome in avm_interface - Rust

Struct avm_interface::ErrorAVMOutcome

source ·
pub struct ErrorAVMOutcome {
+    pub error_code: i64,
+    pub error_message: String,
+    pub outcome: AVMOutcome,
+}

Fields§

§error_code: i64§error_message: String§outcome: AVMOutcome

Trait Implementations§

source§

impl Clone for ErrorAVMOutcome

source§

fn clone(&self) -> ErrorAVMOutcome

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for ErrorAVMOutcome

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'de> Deserialize<'de> for ErrorAVMOutcome

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl PartialEq for ErrorAVMOutcome

source§

fn eq(&self, other: &ErrorAVMOutcome) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl Serialize for ErrorAVMOutcome

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Eq for ErrorAVMOutcome

source§

impl StructuralPartialEq for ErrorAVMOutcome

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/avm_interface/struct.ParticleParameters.html b/avm_interface/struct.ParticleParameters.html new file mode 100644 index 00000000..77076a89 --- /dev/null +++ b/avm_interface/struct.ParticleParameters.html @@ -0,0 +1,42 @@ +ParticleParameters in avm_interface - Rust

Struct avm_interface::ParticleParameters

source ·
pub struct ParticleParameters<'ctx> {
+    pub init_peer_id: Cow<'ctx, str>,
+    pub particle_id: Cow<'ctx, str>,
+    pub timestamp: u64,
+    pub ttl: u32,
+    pub current_peer_id: Cow<'ctx, str>,
+}
Expand description

Represents parameters obtained from a particle.

+

Fields§

§init_peer_id: Cow<'ctx, str>§particle_id: Cow<'ctx, str>§timestamp: u64§ttl: u32§current_peer_id: Cow<'ctx, str>

Implementations§

source§

impl<'ctx> ParticleParameters<'ctx>

source

pub fn new( + init_peer_id: Cow<'ctx, str>, + particle_id: Cow<'ctx, str>, + timestamp: u64, + ttl: u32, + current_peer_id: Cow<'ctx, str>, +) -> Self

Trait Implementations§

source§

impl<'ctx> Clone for ParticleParameters<'ctx>

source§

fn clone(&self) -> ParticleParameters<'ctx>

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl<'ctx> Debug for ParticleParameters<'ctx>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'de, 'ctx> Deserialize<'de> for ParticleParameters<'ctx>

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl<'ctx> Serialize for ParticleParameters<'ctx>

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more

Auto Trait Implementations§

§

impl<'ctx> Freeze for ParticleParameters<'ctx>

§

impl<'ctx> RefUnwindSafe for ParticleParameters<'ctx>

§

impl<'ctx> Send for ParticleParameters<'ctx>

§

impl<'ctx> Sync for ParticleParameters<'ctx>

§

impl<'ctx> Unpin for ParticleParameters<'ctx>

§

impl<'ctx> UnwindSafe for ParticleParameters<'ctx>

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/avm_interface/struct.SoftLimitsTriggering.html b/avm_interface/struct.SoftLimitsTriggering.html new file mode 100644 index 00000000..d33849b4 --- /dev/null +++ b/avm_interface/struct.SoftLimitsTriggering.html @@ -0,0 +1,46 @@ +SoftLimitsTriggering in avm_interface - Rust

Struct avm_interface::SoftLimitsTriggering

pub struct SoftLimitsTriggering {
+    pub air_size_limit_exceeded: bool,
+    pub particle_size_limit_exceeded: bool,
+    pub call_result_size_limit_exceeded: bool,
+}
Expand description

This stores soft limits triggering flags.

+

Fields§

§air_size_limit_exceeded: bool§particle_size_limit_exceeded: bool§call_result_size_limit_exceeded: bool

Implementations§

§

impl SoftLimitsTriggering

pub fn new( + air_size_limit_exceeded: bool, + particle_size_limit_exceeded: bool, + call_result_size_limit_exceeded: bool, +) -> SoftLimitsTriggering

pub fn are_limits_exceeded(&self) -> bool

Trait Implementations§

§

impl Clone for SoftLimitsTriggering

§

fn clone(&self) -> SoftLimitsTriggering

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
§

impl Debug for SoftLimitsTriggering

§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
§

impl Default for SoftLimitsTriggering

§

fn default() -> SoftLimitsTriggering

Returns the “default value” for a type. Read more
§

impl<'de> Deserialize<'de> for SoftLimitsTriggering

§

fn deserialize<__D>( + __deserializer: __D, +) -> Result<SoftLimitsTriggering, <__D as Deserializer<'de>>::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
§

impl PartialEq for SoftLimitsTriggering

§

fn eq(&self, other: &SoftLimitsTriggering) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
§

impl Serialize for SoftLimitsTriggering

§

fn serialize<__S>( + &self, + __serializer: __S, +) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
§

impl Copy for SoftLimitsTriggering

§

impl Eq for SoftLimitsTriggering

§

impl StructuralPartialEq for SoftLimitsTriggering

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
source§

impl<T> CloneToUninit for T
where + T: Copy,

source§

unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/avm_interface/type.CallRequests.html b/avm_interface/type.CallRequests.html new file mode 100644 index 00000000..fbd258d8 --- /dev/null +++ b/avm_interface/type.CallRequests.html @@ -0,0 +1 @@ +CallRequests in avm_interface - Rust

Type Alias avm_interface::CallRequests

source ·
pub type CallRequests = HashMap<u32, CallRequestParams>;

Aliased Type§

struct CallRequests { /* private fields */ }
\ No newline at end of file diff --git a/avm_interface/type.CallResults.html b/avm_interface/type.CallResults.html new file mode 100644 index 00000000..d37da0cc --- /dev/null +++ b/avm_interface/type.CallResults.html @@ -0,0 +1 @@ +CallResults in avm_interface - Rust

Type Alias avm_interface::CallResults

source ·
pub type CallResults = HashMap<u32, CallServiceResult>;

Aliased Type§

struct CallResults { /* private fields */ }
\ No newline at end of file diff --git a/avm_server/all.html b/avm_server/all.html new file mode 100644 index 00000000..a3842e13 --- /dev/null +++ b/avm_server/all.html @@ -0,0 +1 @@ +List of all items in this crate
\ No newline at end of file diff --git a/avm_server/avm/struct.AVM.html b/avm_server/avm/struct.AVM.html new file mode 100644 index 00000000..87cc0511 --- /dev/null +++ b/avm_server/avm/struct.AVM.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../avm_server/struct.AVM.html...

+ + + \ No newline at end of file diff --git a/avm_server/avm_runner/index.html b/avm_server/avm_runner/index.html new file mode 100644 index 00000000..8633ebb0 --- /dev/null +++ b/avm_server/avm_runner/index.html @@ -0,0 +1 @@ +avm_server::avm_runner - Rust

Module avm_server::avm_runner

source ·

Structs§

  • This struct is very similar to AVMOutcome, but keeps error_code and error_msg for test purposes.
\ No newline at end of file diff --git a/avm_server/avm_runner/sidebar-items.js b/avm_server/avm_runner/sidebar-items.js new file mode 100644 index 00000000..2ab44d88 --- /dev/null +++ b/avm_server/avm_runner/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"struct":["AVMRunner","RawAVMOutcome"]}; \ No newline at end of file diff --git a/avm_server/avm_runner/struct.AVMRunner.html b/avm_server/avm_runner/struct.AVMRunner.html new file mode 100644 index 00000000..209a0b5f --- /dev/null +++ b/avm_server/avm_runner/struct.AVMRunner.html @@ -0,0 +1,71 @@ +AVMRunner in avm_server::avm_runner - Rust

Struct avm_server::avm_runner::AVMRunner

source ·
pub struct AVMRunner<WB: WasmBackend> { /* private fields */ }

Implementations§

source§

impl<WB: WasmBackend> AVMRunner<WB>

source

pub async fn new( + air_wasm_path: PathBuf, + total_memory_limit: Option<u64>, + avm_runtime_limits: AVMRuntimeLimits, + logging_mask: i32, + wasm_backend: WB, +) -> RunnerResult<Self>

Create AVM with the provided config.

+
source

pub async fn call( + &mut self, + air: impl Into<String>, + prev_data: impl Into<Vec<u8>>, + data: impl Into<Vec<u8>>, + init_peer_id: impl Into<String>, + timestamp: u64, + ttl: u32, + current_peer_id: impl Into<String>, + call_results: CallResults, + keypair: &KeyPair, + particle_id: String, +) -> RunnerResult<RawAVMOutcome>

source

pub async fn call_tracing( + &mut self, + air: impl Into<String>, + prev_data: impl Into<Vec<u8>>, + data: impl Into<Vec<u8>>, + init_peer_id: impl Into<String>, + timestamp: u64, + ttl: u32, + current_peer_id: impl Into<String>, + call_results: CallResults, + tracing_params: String, + tracing_output_mode: u8, + key_format: u8, + secret_key_bytes: Vec<u8>, + particle_id: String, +) -> RunnerResult<RawAVMOutcome>

source

pub async fn to_human_readable_data<'this>( + &'this mut self, + data: Vec<u8>, +) -> RunnerResult<String>

source

pub fn memory_stats(&self) -> AVMMemoryStats

Auto Trait Implementations§

§

impl<WB> !Freeze for AVMRunner<WB>

§

impl<WB> !RefUnwindSafe for AVMRunner<WB>

§

impl<WB> Send for AVMRunner<WB>
where + <WB as WasmBackend>::Instance: Send,

§

impl<WB> !Sync for AVMRunner<WB>

§

impl<WB> Unpin for AVMRunner<WB>
where + WB: Unpin, + <WB as WasmBackend>::Store: Unpin,

§

impl<WB> !UnwindSafe for AVMRunner<WB>

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/avm_server/avm_runner/struct.RawAVMOutcome.html b/avm_server/avm_runner/struct.RawAVMOutcome.html new file mode 100644 index 00000000..e34d9f48 --- /dev/null +++ b/avm_server/avm_runner/struct.RawAVMOutcome.html @@ -0,0 +1,61 @@ +RawAVMOutcome in avm_server::avm_runner - Rust

Struct avm_server::avm_runner::RawAVMOutcome

source ·
pub struct RawAVMOutcome {
+    pub ret_code: i64,
+    pub error_message: String,
+    pub data: Vec<u8>,
+    pub call_requests: HashMap<u32, CallRequestParams>,
+    pub next_peer_pks: Vec<String>,
+    pub soft_limits_triggering: SoftLimitsTriggering,
+}
Expand description

This struct is very similar to AVMOutcome, but keeps error_code and error_msg for test purposes.

+

Fields§

§ret_code: i64§error_message: String§data: Vec<u8>§call_requests: HashMap<u32, CallRequestParams>§next_peer_pks: Vec<String>§soft_limits_triggering: SoftLimitsTriggering

Implementations§

Trait Implementations§

source§

impl Clone for RawAVMOutcome

source§

fn clone(&self) -> RawAVMOutcome

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for RawAVMOutcome

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
source§

impl<'de> Deserialize<'de> for RawAVMOutcome

source§

fn deserialize<__D>( + __deserializer: __D, +) -> Result<RawAVMOutcome, <__D as Deserializer<'de>>::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl PartialEq for RawAVMOutcome

source§

fn eq(&self, other: &RawAVMOutcome) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl Serialize for RawAVMOutcome

source§

fn serialize<__S>( + &self, + __serializer: __S, +) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Eq for RawAVMOutcome

source§

impl StructuralPartialEq for RawAVMOutcome

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/avm_server/config/struct.AVMConfig.html b/avm_server/config/struct.AVMConfig.html new file mode 100644 index 00000000..72f9e29d --- /dev/null +++ b/avm_server/config/struct.AVMConfig.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../avm_server/struct.AVMConfig.html...

+ + + \ No newline at end of file diff --git a/avm_server/constant.CALL_SERVICE_SUCCESS.html b/avm_server/constant.CALL_SERVICE_SUCCESS.html new file mode 100644 index 00000000..6079aec1 --- /dev/null +++ b/avm_server/constant.CALL_SERVICE_SUCCESS.html @@ -0,0 +1 @@ +CALL_SERVICE_SUCCESS in avm_server - Rust

Constant avm_server::CALL_SERVICE_SUCCESS

source ·
pub const CALL_SERVICE_SUCCESS: i32 = 0;
\ No newline at end of file diff --git a/avm_server/enum.AVMError.html b/avm_server/enum.AVMError.html new file mode 100644 index 00000000..eaaa9bec --- /dev/null +++ b/avm_server/enum.AVMError.html @@ -0,0 +1,61 @@ +AVMError in avm_server - Rust

Enum avm_server::AVMError

source ·
pub enum AVMError<E> {
+    InterpreterFailed(ErrorAVMOutcome),
+    RunnerError(RunnerError),
+    DataStoreError(E),
+    AnomalyDataSeError(Error),
+}

Variants§

§

InterpreterFailed(ErrorAVMOutcome)

This error contains interpreter outcome in case when execution failed on the interpreter +side. A host should match on this error type explicitly to save provided data.

+
§

RunnerError(RunnerError)

This errors are encountered from an AVM runner.

+
§

DataStoreError(E)

This errors are encountered from a data store object.

+
§

AnomalyDataSeError(Error)

This errors are encountered from serialization of data tracked during an anomaly.

+

Trait Implementations§

source§

impl<E: Debug> Debug for AVMError<E>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<E> Display for AVMError<E>
where + E: Display,

source§

fn fmt(&self, __formatter: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<E> Error for AVMError<E>
where + E: Error, + Self: Debug + Display,

source§

fn source(&self) -> Option<&(dyn Error + 'static)>

The lower-level source of this error, if any. Read more
1.0.0 · source§

fn description(&self) -> &str

👎Deprecated since 1.42.0: use the Display impl or to_string()
1.0.0 · source§

fn cause(&self) -> Option<&dyn Error>

👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
source§

fn provide<'a>(&'a self, request: &mut Request<'a>)

🔬This is a nightly-only experimental API. (error_generic_member_access)
Provides type based access to context intended for error reports. Read more
source§

impl<E> From<E> for AVMError<E>

source§

fn from(source: E) -> Self

Converts to this type from the input type.

Auto Trait Implementations§

§

impl<E> Freeze for AVMError<E>
where + E: Freeze,

§

impl<E> !RefUnwindSafe for AVMError<E>

§

impl<E> Send for AVMError<E>
where + E: Send,

§

impl<E> Sync for AVMError<E>
where + E: Sync,

§

impl<E> Unpin for AVMError<E>
where + E: Unpin,

§

impl<E> !UnwindSafe for AVMError<E>

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
§

impl<T> Error for T
where + T: Error + 'static,

§

fn as_error(&self) -> &(dyn Error + 'static)

Gets this error as an std::error::Error.
source§

impl<T> From<!> for T

source§

fn from(t: !) -> T

Converts to this type from the input type.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> FromFd for T
where + T: From<OwnedFd>,

§

fn from_fd(owned_fd: OwnedFd) -> T

👎Deprecated since 1.0.0: FromFd::from_fd is replaced by From<OwnedFd>::from
Constructs a new instance of Self from the given file descriptor. Read more
§

fn from_into_fd<Owned>(into_owned: Owned) -> Self
where + Owned: Into<OwnedFd>, + Self: Sized + From<OwnedFd>,

Constructs a new instance of Self from the given file descriptor +converted from into_owned. Read more
§

impl<T> FromFilelike for T
where + T: From<OwnedFd>,

§

fn from_filelike(owned: OwnedFd) -> T

Constructs a new instance of Self from the given filelike object. Read more
§

fn from_into_filelike<Owned>(owned: Owned) -> T
where + Owned: IntoFilelike,

Constructs a new instance of Self from the given filelike object +converted from into_owned. Read more
§

impl<T> FromGrip for T
where + T: From<OwnedFd>,

§

fn from_grip(owned_grip: OwnedFd) -> T

Consume an OwnedGrip and convert into a Self.
§

impl<T> FromSocketlike for T
where + T: From<OwnedFd>,

§

fn from_socketlike(owned: OwnedFd) -> T

Constructs a new instance of Self from the given socketlike object.
§

fn from_into_socketlike<Owned>(owned: Owned) -> T
where + Owned: IntoSocketlike,

Constructs a new instance of Self from the given socketlike object +converted from into_owned.
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/avm_server/enum.CallSeDeErrors.html b/avm_server/enum.CallSeDeErrors.html new file mode 100644 index 00000000..ed64e886 --- /dev/null +++ b/avm_server/enum.CallSeDeErrors.html @@ -0,0 +1,58 @@ +CallSeDeErrors in avm_server - Rust

Enum avm_server::CallSeDeErrors

source ·
pub enum CallSeDeErrors {
+    CallResultsSeFailed {
+        call_results: HashMap<String, CallServiceResult>,
+        se_error: <CallResultsRepr as Representation>::SerializeError,
+    },
+    CallRequestsDeError {
+        raw_call_request: SerializedCallRequests,
+        error: <CallRequestsRepr as Representation>::DeserializeError,
+    },
+    CallParamsArgsDeFailed {
+        call_params: CallRequestParams,
+        de_error: <CallArgumentsRepr as Representation>::DeserializeError,
+    },
+    CallParamsTetrapletsDeFailed {
+        call_params: CallRequestParams,
+        de_error: <TetrapletsRepr as Representation>::DeserializeError,
+    },
+}

Variants§

§

CallResultsSeFailed

Errors encountered while trying to serialize call results.

+
§

CallRequestsDeError

This error is encountered when deserialization pof call requests failed for some reason.

+
§

CallParamsArgsDeFailed

Errors encountered while trying to deserialize arguments from call parameters returned +by the interpreter. In the corresponding struct such arguments are Vec serialized +to a string.

+
§

CallParamsTetrapletsDeFailed

Errors encountered while trying to deserialize tetraplets from call parameters returned +by the interpreter. In the corresponding struct such tetraplets are +Vec<Vec> serialized to a string.

+

Trait Implementations§

source§

impl Debug for CallSeDeErrors

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
source§

impl Display for CallSeDeErrors

source§

fn fmt(&self, __formatter: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
source§

impl Error for CallSeDeErrors

1.30.0 · source§

fn source(&self) -> Option<&(dyn Error + 'static)>

The lower-level source of this error, if any. Read more
1.0.0 · source§

fn description(&self) -> &str

👎Deprecated since 1.42.0: use the Display impl or to_string()
1.0.0 · source§

fn cause(&self) -> Option<&dyn Error>

👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
source§

fn provide<'a>(&'a self, request: &mut Request<'a>)

🔬This is a nightly-only experimental API. (error_generic_member_access)
Provides type based access to context intended for error reports. Read more
source§

impl From<CallSeDeErrors> for RunnerError

source§

fn from(source: CallSeDeErrors) -> Self

Converts to this type from the input type.

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
§

impl<T> Error for T
where + T: Error + 'static,

§

fn as_error(&self) -> &(dyn Error + 'static)

Gets this error as an std::error::Error.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/avm_server/enum.HostImportError.html b/avm_server/enum.HostImportError.html new file mode 100644 index 00000000..4ef864a6 --- /dev/null +++ b/avm_server/enum.HostImportError.html @@ -0,0 +1,44 @@ +HostImportError in avm_server - Rust

Enum avm_server::HostImportError

pub enum HostImportError {
+    MismatchWValues(WType, WValue),
+    MismatchWValuesCount,
+    LifterError(LiError),
+    LowererError(LoError),
+    RecordNotFound(RecordResolvableError),
+    InvalidUTF8String(FromUtf8Error),
+}

Variants§

§

MismatchWValues(WType, WValue)

An error occurred when host functions tries to lift IValues from WValues +and the latter has different type.

+
§

MismatchWValuesCount

An error occurred when a host functions tries to lift IValues from WValues +and the latter is not enough for that.

+
§

LifterError(LiError)

§

LowererError(LoError)

§

RecordNotFound(RecordResolvableError)

§

InvalidUTF8String(FromUtf8Error)

Trait Implementations§

§

impl Debug for HostImportError

§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
§

impl Display for HostImportError

§

fn fmt(&self, __formatter: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
§

impl Error for HostImportError

§

fn source(&self) -> Option<&(dyn Error + 'static)>

The lower-level source of this error, if any. Read more
1.0.0 · source§

fn description(&self) -> &str

👎Deprecated since 1.42.0: use the Display impl or to_string()
1.0.0 · source§

fn cause(&self) -> Option<&dyn Error>

👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
source§

fn provide<'a>(&'a self, request: &mut Request<'a>)

🔬This is a nightly-only experimental API. (error_generic_member_access)
Provides type based access to context intended for error reports. Read more
§

impl From<FromUtf8Error> for HostImportError

§

fn from(source: FromUtf8Error) -> HostImportError

Converts to this type from the input type.
§

impl From<LiError> for HostImportError

§

fn from(source: LiError) -> HostImportError

Converts to this type from the input type.
§

impl From<LoError> for HostImportError

§

fn from(source: LoError) -> HostImportError

Converts to this type from the input type.
§

impl From<RecordResolvableError> for HostImportError

§

fn from(source: RecordResolvableError) -> HostImportError

Converts to this type from the input type.

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
§

impl<T> Error for T
where + T: Error + 'static,

§

fn as_error(&self) -> &(dyn Error + 'static)

Gets this error as an std::error::Error.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/avm_server/enum.IType.html b/avm_server/enum.IType.html new file mode 100644 index 00000000..d2d812bf --- /dev/null +++ b/avm_server/enum.IType.html @@ -0,0 +1,97 @@ +IType in avm_server - Rust

Enum avm_server::IType

pub enum IType {
+
Show 17 variants Boolean, + S8, + S16, + S32, + S64, + U8, + U16, + U32, + U64, + F32, + F64, + String, + ByteArray, + Array(Box<IType>), + I32, + I64, + Record(u64), +
}
Expand description

Represents the types supported by WIT.

+

Variants§

§

Boolean

Boolean.

+
§

S8

A 8-bits signed integer.

+
§

S16

A 16-bits signed integer.

+
§

S32

A 32-bits signed integer.

+
§

S64

A 64-bits signed integer.

+
§

U8

A 8-bits unsigned integer.

+
§

U16

A 16-bits unsigned integer.

+
§

U32

A 32-bits unsigned integer.

+
§

U64

A 64-bits unsigned integer.

+
§

F32

A 32-bits float.

+
§

F64

A 64-bits float.

+
§

String

A string.

+
§

ByteArray

Specialization of arrays for byte vector.

+
§

Array(Box<IType>)

An array of values of the same type.

+
§

I32

A 32-bits integer (as defined in WebAssembly core).

+
§

I64

A 64-bits integer (as defined in WebAssembly core).

+
§

Record(u64)

A record contains record index from interfaces AST.

+

Implementations§

§

impl IType

pub const VARIANT_COUNT: usize = 17usize

Trait Implementations§

§

impl Clone for IType

§

fn clone(&self) -> IType

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
§

impl Debug for IType

§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
§

impl<'de> Deserialize<'de> for IType

§

fn deserialize<__D>( + __deserializer: __D, +) -> Result<IType, <__D as Deserializer<'de>>::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
§

impl Hash for IType

§

fn hash<__H>(&self, state: &mut __H)
where + __H: Hasher,

Feeds this value into the given Hasher. Read more
1.3.0 · source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
§

impl Parse<'_> for IType

§

fn parse(parser: Parser<'_>) -> Result<IType, Error>

Attempts to parse Self from parser, returning an error if it could +not be parsed. Read more
§

impl PartialEq for IType

§

fn eq(&self, other: &IType) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
§

impl Serialize for IType

§

fn serialize<__S>( + &self, + __serializer: __S, +) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
§

impl<W> ToBytes<W> for IType
where + W: Write,

Encode an IType into bytes.

+
§

fn to_bytes(&self, writer: &mut W) -> Result<(), Error>

Converts the given value into &[u8] in the given writer.
§

impl ToString for &IType

Encode an IType into a string.

+
§

fn to_string(&self) -> String

Converts the given value to a String. Read more
§

impl Eq for IType

§

impl StructuralPartialEq for IType

Auto Trait Implementations§

§

impl Freeze for IType

§

impl RefUnwindSafe for IType

§

impl Send for IType

§

impl Sync for IType

§

impl Unpin for IType

§

impl UnwindSafe for IType

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CallHasher for T
where + T: Hash + ?Sized,

§

default fn get_hash<H, B>(value: &H, build_hasher: &B) -> u64
where + H: Hash + ?Sized, + B: BuildHasher,

source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/avm_server/enum.IValue.html b/avm_server/enum.IValue.html new file mode 100644 index 00000000..2b0984cf --- /dev/null +++ b/avm_server/enum.IValue.html @@ -0,0 +1,71 @@ +IValue in avm_server - Rust

Enum avm_server::IValue

pub enum IValue {
+
Show 17 variants Boolean(bool), + S8(i8), + S16(i16), + S32(i32), + S64(i64), + U8(u8), + U16(u16), + U32(u32), + U64(u64), + F32(f32), + F64(f64), + String(String), + ByteArray(Vec<u8>), + Array(Vec<IValue>), + I32(i32), + I64(i64), + Record(NEVec<IValue>), +
}
Expand description

A WIT value.

+

Variants§

§

Boolean(bool)

Boolean value.

+
§

S8(i8)

A 8-bits signed integer.

+
§

S16(i16)

A 16-bits signed integer.

+
§

S32(i32)

A 32-bits signed integer.

+
§

S64(i64)

A 64-bits signed integer.

+
§

U8(u8)

A 8-bits unsigned integer.

+
§

U16(u16)

A 16-bits unsigned integer.

+
§

U32(u32)

A 32-bits unsigned integer.

+
§

U64(u64)

A 64-bits unsigned integer.

+
§

F32(f32)

A 32-bits float.

+
§

F64(f64)

A 64-bits float.

+
§

String(String)

A string.

+
§

ByteArray(Vec<u8>)

Specialization of array type for byte vector.

+
§

Array(Vec<IValue>)

A byte array.

+
§

I32(i32)

A 32-bits integer (as defined in WebAssembly core).

+
§

I64(i64)

A 64-bits integer (as defined in WebAssembly core).

+
§

Record(NEVec<IValue>)

A record.

+

Implementations§

§

impl IValue

pub const VARIANT_COUNT: usize = 17usize

Trait Implementations§

§

impl Clone for IValue

§

fn clone(&self) -> IValue

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
§

impl Debug for IValue

§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
§

impl Default for IValue

§

fn default() -> IValue

Returns the “default value” for a type. Read more
§

impl From<String> for IValue

§

fn from(n: String) -> IValue

Converts to this type from the input type.
§

impl From<Vec<u8>> for IValue

§

fn from(n: Vec<u8>) -> IValue

Converts to this type from the input type.
§

impl From<f32> for IValue

§

fn from(n: f32) -> IValue

Converts to this type from the input type.
§

impl From<f64> for IValue

§

fn from(n: f64) -> IValue

Converts to this type from the input type.
§

impl From<i16> for IValue

§

fn from(n: i16) -> IValue

Converts to this type from the input type.
§

impl From<i32> for IValue

§

fn from(n: i32) -> IValue

Converts to this type from the input type.
§

impl From<i64> for IValue

§

fn from(n: i64) -> IValue

Converts to this type from the input type.
§

impl From<i8> for IValue

§

fn from(n: i8) -> IValue

Converts to this type from the input type.
§

impl From<u16> for IValue

§

fn from(n: u16) -> IValue

Converts to this type from the input type.
§

impl From<u32> for IValue

§

fn from(n: u32) -> IValue

Converts to this type from the input type.
§

impl From<u64> for IValue

§

fn from(n: u64) -> IValue

Converts to this type from the input type.
§

impl From<u8> for IValue

§

fn from(n: u8) -> IValue

Converts to this type from the input type.
§

impl PartialEq for IValue

§

fn eq(&self, other: &IValue) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
§

impl TryFrom<IValue> for Vec<u8>

§

type Error = WasmValueNativeCastError

The type returned in the event of a conversion error.
§

fn try_from(w: IValue) -> Result<Vec<u8>, <Vec<u8> as TryFrom<IValue>>::Error>

Performs the conversion.
§

impl StructuralPartialEq for IValue

Auto Trait Implementations§

§

impl Freeze for IValue

§

impl RefUnwindSafe for IValue

§

impl Send for IValue

§

impl Sync for IValue

§

impl Unpin for IValue

§

impl UnwindSafe for IValue

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/avm_server/enum.RunnerError.html b/avm_server/enum.RunnerError.html new file mode 100644 index 00000000..364d3c5c --- /dev/null +++ b/avm_server/enum.RunnerError.html @@ -0,0 +1,54 @@ +RunnerError in avm_server - Rust

Enum avm_server::RunnerError

source ·
pub enum RunnerError {
+    MarineError(MarineError),
+    InvalidAIRPath {
+        invalid_path: PathBuf,
+        io_error: Option<Error>,
+        reason: &'static str,
+    },
+    InterpreterResultDeError(String),
+    IncorrectInterpreterResult(Vec<IValue>),
+    CallSeDeErrors(CallSeDeErrors),
+    KeyError(Error),
+    Aux(String),
+}

Variants§

§

MarineError(MarineError)

This errors are encountered from FaaS.

+
§

InvalidAIRPath

Specified path to AIR interpreter .wasm file was invalid

+

Fields

§invalid_path: PathBuf
§io_error: Option<Error>
§reason: &'static str
§

InterpreterResultDeError(String)

AIR interpreter result deserialization errors.

+
§

IncorrectInterpreterResult(Vec<IValue>)

Marine call returns Vec to support multi-value in a future, +but actually now it could return empty vec or a vec with one value. +This error is encountered when it returns vec with not a one value.

+
§

CallSeDeErrors(CallSeDeErrors)

This errors are encountered from an call results/params se/de.

+
§

KeyError(Error)

Invalid secret key.

+
§

Aux(String)

Errors from auxiliary calls.

+

Trait Implementations§

source§

impl Debug for RunnerError

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Display for RunnerError

source§

fn fmt(&self, __formatter: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Error for RunnerError

source§

fn source(&self) -> Option<&(dyn Error + 'static)>

The lower-level source of this error, if any. Read more
1.0.0 · source§

fn description(&self) -> &str

👎Deprecated since 1.42.0: use the Display impl or to_string()
1.0.0 · source§

fn cause(&self) -> Option<&dyn Error>

👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
source§

fn provide<'a>(&'a self, request: &mut Request<'a>)

🔬This is a nightly-only experimental API. (error_generic_member_access)
Provides type based access to context intended for error reports. Read more
source§

impl From<CallSeDeErrors> for RunnerError

source§

fn from(source: CallSeDeErrors) -> Self

Converts to this type from the input type.
source§

impl From<MarineError> for RunnerError

source§

fn from(source: MarineError) -> Self

Converts to this type from the input type.

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
§

impl<T> Error for T
where + T: Error + 'static,

§

fn as_error(&self) -> &(dyn Error + 'static)

Gets this error as an std::error::Error.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/avm_server/errors/enum.AVMError.html b/avm_server/errors/enum.AVMError.html new file mode 100644 index 00000000..a6fa996a --- /dev/null +++ b/avm_server/errors/enum.AVMError.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../avm_server/enum.AVMError.html...

+ + + \ No newline at end of file diff --git a/avm_server/errors/enum.CallSeDeErrors.html b/avm_server/errors/enum.CallSeDeErrors.html new file mode 100644 index 00000000..1ded86e5 --- /dev/null +++ b/avm_server/errors/enum.CallSeDeErrors.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../avm_server/enum.CallSeDeErrors.html...

+ + + \ No newline at end of file diff --git a/avm_server/errors/enum.RunnerError.html b/avm_server/errors/enum.RunnerError.html new file mode 100644 index 00000000..42264664 --- /dev/null +++ b/avm_server/errors/enum.RunnerError.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../avm_server/enum.RunnerError.html...

+ + + \ No newline at end of file diff --git a/avm_server/fn.into_raw_result.html b/avm_server/fn.into_raw_result.html new file mode 100644 index 00000000..303d9bee --- /dev/null +++ b/avm_server/fn.into_raw_result.html @@ -0,0 +1,3 @@ +into_raw_result in avm_server - Rust

Function avm_server::into_raw_result

source ·
pub fn into_raw_result(
+    call_results: HashMap<u32, CallServiceResult>,
+) -> HashMap<String, CallServiceResult>
\ No newline at end of file diff --git a/avm_server/index.html b/avm_server/index.html new file mode 100644 index 00000000..7f9e56d6 --- /dev/null +++ b/avm_server/index.html @@ -0,0 +1,2 @@ +avm_server - Rust

Crate avm_server

source ·

Modules§

Structs§

Enums§

Constants§

Traits§

Functions§

Type Aliases§

\ No newline at end of file diff --git a/avm_server/ne_vec/index.html b/avm_server/ne_vec/index.html new file mode 100644 index 00000000..f31742d1 --- /dev/null +++ b/avm_server/ne_vec/index.html @@ -0,0 +1,2 @@ +avm_server::ne_vec - Rust

Module avm_server::ne_vec

Structs§

  • NEVec<T> represents a non-empty Vec<T>. It derefs to Vec<T> +directly.
\ No newline at end of file diff --git a/avm_server/ne_vec/sidebar-items.js b/avm_server/ne_vec/sidebar-items.js new file mode 100644 index 00000000..2a162fde --- /dev/null +++ b/avm_server/ne_vec/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"struct":["NEVec"]}; \ No newline at end of file diff --git a/avm_server/ne_vec/struct.NEVec.html b/avm_server/ne_vec/struct.NEVec.html new file mode 100644 index 00000000..3d9acbb5 --- /dev/null +++ b/avm_server/ne_vec/struct.NEVec.html @@ -0,0 +1,2534 @@ +NEVec in avm_server::ne_vec - Rust

Struct avm_server::ne_vec::NEVec

pub struct NEVec<T>(/* private fields */)
+where
+    T: Debug;
Expand description

NEVec<T> represents a non-empty Vec<T>. It derefs to Vec<T> +directly.

+

Implementations§

§

impl<T> NEVec<T>
where + T: Debug,

pub fn new(items: Vec<T>) -> Result<NEVec<T>, EmptyVec>

Creates a new non-empty vector, based on an inner Vec<T>. If +the inner vector is empty, a EmptyVec error is returned.

+

pub fn into_vec(self) -> Vec<T>

Converts this NEVec into Vec

+

Methods from Deref<Target = Vec<T>>§

1.0.0 · source

pub fn capacity(&self) -> usize

Returns the total number of elements the vector can hold without +reallocating.

+
§Examples
+
let mut vec: Vec<i32> = Vec::with_capacity(10);
+vec.push(42);
+assert!(vec.capacity() >= 10);
+
1.7.0 · source

pub fn as_slice(&self) -> &[T]

Extracts a slice containing the entire vector.

+

Equivalent to &s[..].

+
§Examples
+
use std::io::{self, Write};
+let buffer = vec![1, 2, 3, 5, 8];
+io::sink().write(buffer.as_slice()).unwrap();
+
1.37.0 · source

pub fn as_ptr(&self) -> *const T

Returns a raw pointer to the vector’s buffer, or a dangling raw pointer +valid for zero sized reads if the vector didn’t allocate.

+

The caller must ensure that the vector outlives the pointer this +function returns, or else it will end up pointing to garbage. +Modifying the vector may cause its buffer to be reallocated, +which would also make any pointers to it invalid.

+

The caller must also ensure that the memory the pointer (non-transitively) points to +is never written to (except inside an UnsafeCell) using this pointer or any pointer +derived from it. If you need to mutate the contents of the slice, use as_mut_ptr.

+

This method guarantees that for the purpose of the aliasing model, this method +does not materialize a reference to the underlying slice, and thus the returned pointer +will remain valid when mixed with other calls to as_ptr and as_mut_ptr. +Note that calling other methods that materialize mutable references to the slice, +or mutable references to specific elements you are planning on accessing through this pointer, +as well as writing to those elements, may still invalidate this pointer. +See the second example below for how this guarantee can be used.

+
§Examples
+
let x = vec![1, 2, 4];
+let x_ptr = x.as_ptr();
+
+unsafe {
+    for i in 0..x.len() {
+        assert_eq!(*x_ptr.add(i), 1 << i);
+    }
+}
+

Due to the aliasing guarantee, the following code is legal:

+ +
unsafe {
+    let mut v = vec![0, 1, 2];
+    let ptr1 = v.as_ptr();
+    let _ = ptr1.read();
+    let ptr2 = v.as_mut_ptr().offset(2);
+    ptr2.write(2);
+    // Notably, the write to `ptr2` did *not* invalidate `ptr1`
+    // because it mutated a different element:
+    let _ = ptr1.read();
+}
+
source

pub fn allocator(&self) -> &A

🔬This is a nightly-only experimental API. (allocator_api)

Returns a reference to the underlying allocator.

+
1.0.0 · source

pub fn len(&self) -> usize

Returns the number of elements in the vector, also referred to +as its ‘length’.

+
§Examples
+
let a = vec![1, 2, 3];
+assert_eq!(a.len(), 3);
+
1.0.0 · source

pub fn is_empty(&self) -> bool

Returns true if the vector contains no elements.

+
§Examples
+
let mut v = Vec::new();
+assert!(v.is_empty());
+
+v.push(1);
+assert!(!v.is_empty());
+

Methods from Deref<Target = [T]>§

1.80.0 · source

pub fn as_flattened(&self) -> &[T]

Takes a &[[T; N]], and flattens it to a &[T].

+
§Panics
+

This panics if the length of the resulting slice would overflow a usize.

+

This is only possible when flattening a slice of arrays of zero-sized +types, and thus tends to be irrelevant in practice. If +size_of::<T>() > 0, this will never panic.

+
§Examples
+
assert_eq!([[1, 2, 3], [4, 5, 6]].as_flattened(), &[1, 2, 3, 4, 5, 6]);
+
+assert_eq!(
+    [[1, 2, 3], [4, 5, 6]].as_flattened(),
+    [[1, 2], [3, 4], [5, 6]].as_flattened(),
+);
+
+let slice_of_empty_arrays: &[[i32; 0]] = &[[], [], [], [], []];
+assert!(slice_of_empty_arrays.as_flattened().is_empty());
+
+let empty_slice_of_arrays: &[[u32; 10]] = &[];
+assert!(empty_slice_of_arrays.as_flattened().is_empty());
+
1.80.0 · source

pub fn as_flattened_mut(&mut self) -> &mut [T]

Takes a &mut [[T; N]], and flattens it to a &mut [T].

+
§Panics
+

This panics if the length of the resulting slice would overflow a usize.

+

This is only possible when flattening a slice of arrays of zero-sized +types, and thus tends to be irrelevant in practice. If +size_of::<T>() > 0, this will never panic.

+
§Examples
+
fn add_5_to_all(slice: &mut [i32]) {
+    for i in slice {
+        *i += 5;
+    }
+}
+
+let mut array = [[1, 2, 3], [4, 5, 6], [7, 8, 9]];
+add_5_to_all(array.as_flattened_mut());
+assert_eq!(array, [[6, 7, 8], [9, 10, 11], [12, 13, 14]]);
+
source

pub fn as_str(&self) -> &str

🔬This is a nightly-only experimental API. (ascii_char)

Views this slice of ASCII characters as a UTF-8 str.

+
source

pub fn as_bytes(&self) -> &[u8]

🔬This is a nightly-only experimental API. (ascii_char)

Views this slice of ASCII characters as a slice of u8 bytes.

+
source

pub fn sort_floats(&mut self)

🔬This is a nightly-only experimental API. (sort_floats)

Sorts the slice of floats.

+

This sort is in-place (i.e. does not allocate), O(n * log(n)) worst-case, and uses +the ordering defined by f32::total_cmp.

+
§Current implementation
+

This uses the same sorting algorithm as sort_unstable_by.

+
§Examples
+
#![feature(sort_floats)]
+let mut v = [2.6, -5e-8, f32::NAN, 8.29, f32::INFINITY, -1.0, 0.0, -f32::INFINITY, -0.0];
+
+v.sort_floats();
+let sorted = [-f32::INFINITY, -1.0, -5e-8, -0.0, 0.0, 2.6, 8.29, f32::INFINITY, f32::NAN];
+assert_eq!(&v[..8], &sorted[..8]);
+assert!(v[8].is_nan());
+
1.79.0 · source

pub fn utf8_chunks(&self) -> Utf8Chunks<'_>

Creates an iterator over the contiguous valid UTF-8 ranges of this +slice, and the non-UTF-8 fragments in between.

+
§Examples
+

This function formats arbitrary but mostly-UTF-8 bytes into Rust source +code in the form of a C-string literal (c"...").

+ +
use std::fmt::Write as _;
+
+pub fn cstr_literal(bytes: &[u8]) -> String {
+    let mut repr = String::new();
+    repr.push_str("c\"");
+    for chunk in bytes.utf8_chunks() {
+        for ch in chunk.valid().chars() {
+            // Escapes \0, \t, \r, \n, \\, \', \", and uses \u{...} for non-printable characters.
+            write!(repr, "{}", ch.escape_debug()).unwrap();
+        }
+        for byte in chunk.invalid() {
+            write!(repr, "\\x{:02X}", byte).unwrap();
+        }
+    }
+    repr.push('"');
+    repr
+}
+
+fn main() {
+    let lit = cstr_literal(b"\xferris the \xf0\x9f\xa6\x80\x07");
+    let expected = stringify!(c"\xFErris the 🦀\u{7}");
+    assert_eq!(lit, expected);
+}
+
source

pub fn sort_floats(&mut self)

🔬This is a nightly-only experimental API. (sort_floats)

Sorts the slice of floats.

+

This sort is in-place (i.e. does not allocate), O(n * log(n)) worst-case, and uses +the ordering defined by f64::total_cmp.

+
§Current implementation
+

This uses the same sorting algorithm as sort_unstable_by.

+
§Examples
+
#![feature(sort_floats)]
+let mut v = [2.6, -5e-8, f64::NAN, 8.29, f64::INFINITY, -1.0, 0.0, -f64::INFINITY, -0.0];
+
+v.sort_floats();
+let sorted = [-f64::INFINITY, -1.0, -5e-8, -0.0, 0.0, 2.6, 8.29, f64::INFINITY, f64::NAN];
+assert_eq!(&v[..8], &sorted[..8]);
+assert!(v[8].is_nan());
+
1.23.0 · source

pub fn is_ascii(&self) -> bool

Checks if all bytes in this slice are within the ASCII range.

+
source

pub fn as_ascii(&self) -> Option<&[AsciiChar]>

🔬This is a nightly-only experimental API. (ascii_char)

If this slice is_ascii, returns it as a slice of +ASCII characters, otherwise returns None.

+
source

pub unsafe fn as_ascii_unchecked(&self) -> &[AsciiChar]

🔬This is a nightly-only experimental API. (ascii_char)

Converts this slice of bytes into a slice of ASCII characters, +without checking whether they’re valid.

+
§Safety
+

Every byte in the slice must be in 0..=127, or else this is UB.

+
1.23.0 · source

pub fn eq_ignore_ascii_case(&self, other: &[u8]) -> bool

Checks that two slices are an ASCII case-insensitive match.

+

Same as to_ascii_lowercase(a) == to_ascii_lowercase(b), +but without allocating and copying temporaries.

+
1.23.0 · source

pub fn make_ascii_uppercase(&mut self)

Converts this slice to its ASCII upper case equivalent in-place.

+

ASCII letters ‘a’ to ‘z’ are mapped to ‘A’ to ‘Z’, +but non-ASCII letters are unchanged.

+

To return a new uppercased value without modifying the existing one, use +to_ascii_uppercase.

+
1.23.0 · source

pub fn make_ascii_lowercase(&mut self)

Converts this slice to its ASCII lower case equivalent in-place.

+

ASCII letters ‘A’ to ‘Z’ are mapped to ‘a’ to ‘z’, +but non-ASCII letters are unchanged.

+

To return a new lowercased value without modifying the existing one, use +to_ascii_lowercase.

+
1.60.0 · source

pub fn escape_ascii(&self) -> EscapeAscii<'_>

Returns an iterator that produces an escaped version of this slice, +treating it as an ASCII string.

+
§Examples
+

+let s = b"0\t\r\n'\"\\\x9d";
+let escaped = s.escape_ascii().to_string();
+assert_eq!(escaped, "0\\t\\r\\n\\'\\\"\\\\\\x9d");
+
1.80.0 · source

pub fn trim_ascii_start(&self) -> &[u8]

Returns a byte slice with leading ASCII whitespace bytes removed.

+

‘Whitespace’ refers to the definition used by +u8::is_ascii_whitespace.

+
§Examples
+
assert_eq!(b" \t hello world\n".trim_ascii_start(), b"hello world\n");
+assert_eq!(b"  ".trim_ascii_start(), b"");
+assert_eq!(b"".trim_ascii_start(), b"");
+
1.80.0 · source

pub fn trim_ascii_end(&self) -> &[u8]

Returns a byte slice with trailing ASCII whitespace bytes removed.

+

‘Whitespace’ refers to the definition used by +u8::is_ascii_whitespace.

+
§Examples
+
assert_eq!(b"\r hello world\n ".trim_ascii_end(), b"\r hello world");
+assert_eq!(b"  ".trim_ascii_end(), b"");
+assert_eq!(b"".trim_ascii_end(), b"");
+
1.80.0 · source

pub fn trim_ascii(&self) -> &[u8]

Returns a byte slice with leading and trailing ASCII whitespace bytes +removed.

+

‘Whitespace’ refers to the definition used by +u8::is_ascii_whitespace.

+
§Examples
+
assert_eq!(b"\r hello world\n ".trim_ascii(), b"hello world");
+assert_eq!(b"  ".trim_ascii(), b"");
+assert_eq!(b"".trim_ascii(), b"");
+
1.0.0 · source

pub fn len(&self) -> usize

Returns the number of elements in the slice.

+
§Examples
+
let a = [1, 2, 3];
+assert_eq!(a.len(), 3);
+
1.0.0 · source

pub fn is_empty(&self) -> bool

Returns true if the slice has a length of 0.

+
§Examples
+
let a = [1, 2, 3];
+assert!(!a.is_empty());
+
+let b: &[i32] = &[];
+assert!(b.is_empty());
+
1.0.0 · source

pub fn first(&self) -> Option<&T>

Returns the first element of the slice, or None if it is empty.

+
§Examples
+
let v = [10, 40, 30];
+assert_eq!(Some(&10), v.first());
+
+let w: &[i32] = &[];
+assert_eq!(None, w.first());
+
1.0.0 · source

pub fn first_mut(&mut self) -> Option<&mut T>

Returns a mutable pointer to the first element of the slice, or None if it is empty.

+
§Examples
+
let x = &mut [0, 1, 2];
+
+if let Some(first) = x.first_mut() {
+    *first = 5;
+}
+assert_eq!(x, &[5, 1, 2]);
+
+let y: &mut [i32] = &mut [];
+assert_eq!(None, y.first_mut());
+
1.5.0 · source

pub fn split_first(&self) -> Option<(&T, &[T])>

Returns the first and all the rest of the elements of the slice, or None if it is empty.

+
§Examples
+
let x = &[0, 1, 2];
+
+if let Some((first, elements)) = x.split_first() {
+    assert_eq!(first, &0);
+    assert_eq!(elements, &[1, 2]);
+}
+
1.5.0 · source

pub fn split_first_mut(&mut self) -> Option<(&mut T, &mut [T])>

Returns the first and all the rest of the elements of the slice, or None if it is empty.

+
§Examples
+
let x = &mut [0, 1, 2];
+
+if let Some((first, elements)) = x.split_first_mut() {
+    *first = 3;
+    elements[0] = 4;
+    elements[1] = 5;
+}
+assert_eq!(x, &[3, 4, 5]);
+
1.5.0 · source

pub fn split_last(&self) -> Option<(&T, &[T])>

Returns the last and all the rest of the elements of the slice, or None if it is empty.

+
§Examples
+
let x = &[0, 1, 2];
+
+if let Some((last, elements)) = x.split_last() {
+    assert_eq!(last, &2);
+    assert_eq!(elements, &[0, 1]);
+}
+
1.5.0 · source

pub fn split_last_mut(&mut self) -> Option<(&mut T, &mut [T])>

Returns the last and all the rest of the elements of the slice, or None if it is empty.

+
§Examples
+
let x = &mut [0, 1, 2];
+
+if let Some((last, elements)) = x.split_last_mut() {
+    *last = 3;
+    elements[0] = 4;
+    elements[1] = 5;
+}
+assert_eq!(x, &[4, 5, 3]);
+
1.0.0 · source

pub fn last(&self) -> Option<&T>

Returns the last element of the slice, or None if it is empty.

+
§Examples
+
let v = [10, 40, 30];
+assert_eq!(Some(&30), v.last());
+
+let w: &[i32] = &[];
+assert_eq!(None, w.last());
+
1.0.0 · source

pub fn last_mut(&mut self) -> Option<&mut T>

Returns a mutable reference to the last item in the slice, or None if it is empty.

+
§Examples
+
let x = &mut [0, 1, 2];
+
+if let Some(last) = x.last_mut() {
+    *last = 10;
+}
+assert_eq!(x, &[0, 1, 10]);
+
+let y: &mut [i32] = &mut [];
+assert_eq!(None, y.last_mut());
+
1.77.0 · source

pub fn first_chunk<const N: usize>(&self) -> Option<&[T; N]>

Return an array reference to the first N items in the slice.

+

If the slice is not at least N in length, this will return None.

+
§Examples
+
let u = [10, 40, 30];
+assert_eq!(Some(&[10, 40]), u.first_chunk::<2>());
+
+let v: &[i32] = &[10];
+assert_eq!(None, v.first_chunk::<2>());
+
+let w: &[i32] = &[];
+assert_eq!(Some(&[]), w.first_chunk::<0>());
+
1.77.0 · source

pub fn first_chunk_mut<const N: usize>(&mut self) -> Option<&mut [T; N]>

Return a mutable array reference to the first N items in the slice.

+

If the slice is not at least N in length, this will return None.

+
§Examples
+
let x = &mut [0, 1, 2];
+
+if let Some(first) = x.first_chunk_mut::<2>() {
+    first[0] = 5;
+    first[1] = 4;
+}
+assert_eq!(x, &[5, 4, 2]);
+
+assert_eq!(None, x.first_chunk_mut::<4>());
+
1.77.0 · source

pub fn split_first_chunk<const N: usize>(&self) -> Option<(&[T; N], &[T])>

Return an array reference to the first N items in the slice and the remaining slice.

+

If the slice is not at least N in length, this will return None.

+
§Examples
+
let x = &[0, 1, 2];
+
+if let Some((first, elements)) = x.split_first_chunk::<2>() {
+    assert_eq!(first, &[0, 1]);
+    assert_eq!(elements, &[2]);
+}
+
+assert_eq!(None, x.split_first_chunk::<4>());
+
1.77.0 · source

pub fn split_first_chunk_mut<const N: usize>( + &mut self, +) -> Option<(&mut [T; N], &mut [T])>

Return a mutable array reference to the first N items in the slice and the remaining +slice.

+

If the slice is not at least N in length, this will return None.

+
§Examples
+
let x = &mut [0, 1, 2];
+
+if let Some((first, elements)) = x.split_first_chunk_mut::<2>() {
+    first[0] = 3;
+    first[1] = 4;
+    elements[0] = 5;
+}
+assert_eq!(x, &[3, 4, 5]);
+
+assert_eq!(None, x.split_first_chunk_mut::<4>());
+
1.77.0 · source

pub fn split_last_chunk<const N: usize>(&self) -> Option<(&[T], &[T; N])>

Return an array reference to the last N items in the slice and the remaining slice.

+

If the slice is not at least N in length, this will return None.

+
§Examples
+
let x = &[0, 1, 2];
+
+if let Some((elements, last)) = x.split_last_chunk::<2>() {
+    assert_eq!(elements, &[0]);
+    assert_eq!(last, &[1, 2]);
+}
+
+assert_eq!(None, x.split_last_chunk::<4>());
+
1.77.0 · source

pub fn split_last_chunk_mut<const N: usize>( + &mut self, +) -> Option<(&mut [T], &mut [T; N])>

Return a mutable array reference to the last N items in the slice and the remaining +slice.

+

If the slice is not at least N in length, this will return None.

+
§Examples
+
let x = &mut [0, 1, 2];
+
+if let Some((elements, last)) = x.split_last_chunk_mut::<2>() {
+    last[0] = 3;
+    last[1] = 4;
+    elements[0] = 5;
+}
+assert_eq!(x, &[5, 3, 4]);
+
+assert_eq!(None, x.split_last_chunk_mut::<4>());
+
1.77.0 · source

pub fn last_chunk<const N: usize>(&self) -> Option<&[T; N]>

Return an array reference to the last N items in the slice.

+

If the slice is not at least N in length, this will return None.

+
§Examples
+
let u = [10, 40, 30];
+assert_eq!(Some(&[40, 30]), u.last_chunk::<2>());
+
+let v: &[i32] = &[10];
+assert_eq!(None, v.last_chunk::<2>());
+
+let w: &[i32] = &[];
+assert_eq!(Some(&[]), w.last_chunk::<0>());
+
1.77.0 · source

pub fn last_chunk_mut<const N: usize>(&mut self) -> Option<&mut [T; N]>

Return a mutable array reference to the last N items in the slice.

+

If the slice is not at least N in length, this will return None.

+
§Examples
+
let x = &mut [0, 1, 2];
+
+if let Some(last) = x.last_chunk_mut::<2>() {
+    last[0] = 10;
+    last[1] = 20;
+}
+assert_eq!(x, &[0, 10, 20]);
+
+assert_eq!(None, x.last_chunk_mut::<4>());
+
1.0.0 · source

pub fn get<I>(&self, index: I) -> Option<&<I as SliceIndex<[T]>>::Output>
where + I: SliceIndex<[T]>,

Returns a reference to an element or subslice depending on the type of +index.

+
    +
  • If given a position, returns a reference to the element at that +position or None if out of bounds.
  • +
  • If given a range, returns the subslice corresponding to that range, +or None if out of bounds.
  • +
+
§Examples
+
let v = [10, 40, 30];
+assert_eq!(Some(&40), v.get(1));
+assert_eq!(Some(&[10, 40][..]), v.get(0..2));
+assert_eq!(None, v.get(3));
+assert_eq!(None, v.get(0..4));
+
1.0.0 · source

pub fn get_mut<I>( + &mut self, + index: I, +) -> Option<&mut <I as SliceIndex<[T]>>::Output>
where + I: SliceIndex<[T]>,

Returns a mutable reference to an element or subslice depending on the +type of index (see get) or None if the index is out of bounds.

+
§Examples
+
let x = &mut [0, 1, 2];
+
+if let Some(elem) = x.get_mut(1) {
+    *elem = 42;
+}
+assert_eq!(x, &[0, 42, 2]);
+
1.0.0 · source

pub unsafe fn get_unchecked<I>( + &self, + index: I, +) -> &<I as SliceIndex<[T]>>::Output
where + I: SliceIndex<[T]>,

Returns a reference to an element or subslice, without doing bounds +checking.

+

For a safe alternative see get.

+
§Safety
+

Calling this method with an out-of-bounds index is undefined behavior +even if the resulting reference is not used.

+

You can think of this like .get(index).unwrap_unchecked(). It’s UB +to call .get_unchecked(len), even if you immediately convert to a +pointer. And it’s UB to call .get_unchecked(..len + 1), +.get_unchecked(..=len), or similar.

+
§Examples
+
let x = &[1, 2, 4];
+
+unsafe {
+    assert_eq!(x.get_unchecked(1), &2);
+}
+
1.0.0 · source

pub unsafe fn get_unchecked_mut<I>( + &mut self, + index: I, +) -> &mut <I as SliceIndex<[T]>>::Output
where + I: SliceIndex<[T]>,

Returns a mutable reference to an element or subslice, without doing +bounds checking.

+

For a safe alternative see get_mut.

+
§Safety
+

Calling this method with an out-of-bounds index is undefined behavior +even if the resulting reference is not used.

+

You can think of this like .get_mut(index).unwrap_unchecked(). It’s +UB to call .get_unchecked_mut(len), even if you immediately convert +to a pointer. And it’s UB to call .get_unchecked_mut(..len + 1), +.get_unchecked_mut(..=len), or similar.

+
§Examples
+
let x = &mut [1, 2, 4];
+
+unsafe {
+    let elem = x.get_unchecked_mut(1);
+    *elem = 13;
+}
+assert_eq!(x, &[1, 13, 4]);
+
1.0.0 · source

pub fn as_ptr(&self) -> *const T

Returns a raw pointer to the slice’s buffer.

+

The caller must ensure that the slice outlives the pointer this +function returns, or else it will end up pointing to garbage.

+

The caller must also ensure that the memory the pointer (non-transitively) points to +is never written to (except inside an UnsafeCell) using this pointer or any pointer +derived from it. If you need to mutate the contents of the slice, use as_mut_ptr.

+

Modifying the container referenced by this slice may cause its buffer +to be reallocated, which would also make any pointers to it invalid.

+
§Examples
+
let x = &[1, 2, 4];
+let x_ptr = x.as_ptr();
+
+unsafe {
+    for i in 0..x.len() {
+        assert_eq!(x.get_unchecked(i), &*x_ptr.add(i));
+    }
+}
+
1.0.0 · source

pub fn as_mut_ptr(&mut self) -> *mut T

Returns an unsafe mutable pointer to the slice’s buffer.

+

The caller must ensure that the slice outlives the pointer this +function returns, or else it will end up pointing to garbage.

+

Modifying the container referenced by this slice may cause its buffer +to be reallocated, which would also make any pointers to it invalid.

+
§Examples
+
let x = &mut [1, 2, 4];
+let x_ptr = x.as_mut_ptr();
+
+unsafe {
+    for i in 0..x.len() {
+        *x_ptr.add(i) += 2;
+    }
+}
+assert_eq!(x, &[3, 4, 6]);
+
1.48.0 · source

pub fn as_ptr_range(&self) -> Range<*const T>

Returns the two raw pointers spanning the slice.

+

The returned range is half-open, which means that the end pointer +points one past the last element of the slice. This way, an empty +slice is represented by two equal pointers, and the difference between +the two pointers represents the size of the slice.

+

See as_ptr for warnings on using these pointers. The end pointer +requires extra caution, as it does not point to a valid element in the +slice.

+

This function is useful for interacting with foreign interfaces which +use two pointers to refer to a range of elements in memory, as is +common in C++.

+

It can also be useful to check if a pointer to an element refers to an +element of this slice:

+ +
let a = [1, 2, 3];
+let x = &a[1] as *const _;
+let y = &5 as *const _;
+
+assert!(a.as_ptr_range().contains(&x));
+assert!(!a.as_ptr_range().contains(&y));
+
1.48.0 · source

pub fn as_mut_ptr_range(&mut self) -> Range<*mut T>

Returns the two unsafe mutable pointers spanning the slice.

+

The returned range is half-open, which means that the end pointer +points one past the last element of the slice. This way, an empty +slice is represented by two equal pointers, and the difference between +the two pointers represents the size of the slice.

+

See as_mut_ptr for warnings on using these pointers. The end +pointer requires extra caution, as it does not point to a valid element +in the slice.

+

This function is useful for interacting with foreign interfaces which +use two pointers to refer to a range of elements in memory, as is +common in C++.

+
1.0.0 · source

pub fn swap(&mut self, a: usize, b: usize)

Swaps two elements in the slice.

+

If a equals to b, it’s guaranteed that elements won’t change value.

+
§Arguments
+
    +
  • a - The index of the first element
  • +
  • b - The index of the second element
  • +
+
§Panics
+

Panics if a or b are out of bounds.

+
§Examples
+
let mut v = ["a", "b", "c", "d", "e"];
+v.swap(2, 4);
+assert!(v == ["a", "b", "e", "d", "c"]);
+
source

pub unsafe fn swap_unchecked(&mut self, a: usize, b: usize)

🔬This is a nightly-only experimental API. (slice_swap_unchecked)

Swaps two elements in the slice, without doing bounds checking.

+

For a safe alternative see swap.

+
§Arguments
+
    +
  • a - The index of the first element
  • +
  • b - The index of the second element
  • +
+
§Safety
+

Calling this method with an out-of-bounds index is undefined behavior. +The caller has to ensure that a < self.len() and b < self.len().

+
§Examples
+
#![feature(slice_swap_unchecked)]
+
+let mut v = ["a", "b", "c", "d"];
+// SAFETY: we know that 1 and 3 are both indices of the slice
+unsafe { v.swap_unchecked(1, 3) };
+assert!(v == ["a", "d", "c", "b"]);
+
1.0.0 · source

pub fn reverse(&mut self)

Reverses the order of elements in the slice, in place.

+
§Examples
+
let mut v = [1, 2, 3];
+v.reverse();
+assert!(v == [3, 2, 1]);
+
1.0.0 · source

pub fn iter(&self) -> Iter<'_, T>

Returns an iterator over the slice.

+

The iterator yields all items from start to end.

+
§Examples
+
let x = &[1, 2, 4];
+let mut iterator = x.iter();
+
+assert_eq!(iterator.next(), Some(&1));
+assert_eq!(iterator.next(), Some(&2));
+assert_eq!(iterator.next(), Some(&4));
+assert_eq!(iterator.next(), None);
+
1.0.0 · source

pub fn iter_mut(&mut self) -> IterMut<'_, T>

Returns an iterator that allows modifying each value.

+

The iterator yields all items from start to end.

+
§Examples
+
let x = &mut [1, 2, 4];
+for elem in x.iter_mut() {
+    *elem += 2;
+}
+assert_eq!(x, &[3, 4, 6]);
+
1.0.0 · source

pub fn windows(&self, size: usize) -> Windows<'_, T>

Returns an iterator over all contiguous windows of length +size. The windows overlap. If the slice is shorter than +size, the iterator returns no values.

+
§Panics
+

Panics if size is 0.

+
§Examples
+
let slice = ['l', 'o', 'r', 'e', 'm'];
+let mut iter = slice.windows(3);
+assert_eq!(iter.next().unwrap(), &['l', 'o', 'r']);
+assert_eq!(iter.next().unwrap(), &['o', 'r', 'e']);
+assert_eq!(iter.next().unwrap(), &['r', 'e', 'm']);
+assert!(iter.next().is_none());
+

If the slice is shorter than size:

+ +
let slice = ['f', 'o', 'o'];
+let mut iter = slice.windows(4);
+assert!(iter.next().is_none());
+

There’s no windows_mut, as that existing would let safe code violate the +“only one &mut at a time to the same thing” rule. However, you can sometimes +use Cell::as_slice_of_cells in +conjunction with windows to accomplish something similar:

+ +
use std::cell::Cell;
+
+let mut array = ['R', 'u', 's', 't', ' ', '2', '0', '1', '5'];
+let slice = &mut array[..];
+let slice_of_cells: &[Cell<char>] = Cell::from_mut(slice).as_slice_of_cells();
+for w in slice_of_cells.windows(3) {
+    Cell::swap(&w[0], &w[2]);
+}
+assert_eq!(array, ['s', 't', ' ', '2', '0', '1', '5', 'u', 'R']);
+
1.0.0 · source

pub fn chunks(&self, chunk_size: usize) -> Chunks<'_, T>

Returns an iterator over chunk_size elements of the slice at a time, starting at the +beginning of the slice.

+

The chunks are slices and do not overlap. If chunk_size does not divide the length of the +slice, then the last chunk will not have length chunk_size.

+

See chunks_exact for a variant of this iterator that returns chunks of always exactly +chunk_size elements, and rchunks for the same iterator but starting at the end of the +slice.

+
§Panics
+

Panics if chunk_size is 0.

+
§Examples
+
let slice = ['l', 'o', 'r', 'e', 'm'];
+let mut iter = slice.chunks(2);
+assert_eq!(iter.next().unwrap(), &['l', 'o']);
+assert_eq!(iter.next().unwrap(), &['r', 'e']);
+assert_eq!(iter.next().unwrap(), &['m']);
+assert!(iter.next().is_none());
+
1.0.0 · source

pub fn chunks_mut(&mut self, chunk_size: usize) -> ChunksMut<'_, T>

Returns an iterator over chunk_size elements of the slice at a time, starting at the +beginning of the slice.

+

The chunks are mutable slices, and do not overlap. If chunk_size does not divide the +length of the slice, then the last chunk will not have length chunk_size.

+

See chunks_exact_mut for a variant of this iterator that returns chunks of always +exactly chunk_size elements, and rchunks_mut for the same iterator but starting at +the end of the slice.

+
§Panics
+

Panics if chunk_size is 0.

+
§Examples
+
let v = &mut [0, 0, 0, 0, 0];
+let mut count = 1;
+
+for chunk in v.chunks_mut(2) {
+    for elem in chunk.iter_mut() {
+        *elem += count;
+    }
+    count += 1;
+}
+assert_eq!(v, &[1, 1, 2, 2, 3]);
+
1.31.0 · source

pub fn chunks_exact(&self, chunk_size: usize) -> ChunksExact<'_, T>

Returns an iterator over chunk_size elements of the slice at a time, starting at the +beginning of the slice.

+

The chunks are slices and do not overlap. If chunk_size does not divide the length of the +slice, then the last up to chunk_size-1 elements will be omitted and can be retrieved +from the remainder function of the iterator.

+

Due to each chunk having exactly chunk_size elements, the compiler can often optimize the +resulting code better than in the case of chunks.

+

See chunks for a variant of this iterator that also returns the remainder as a smaller +chunk, and rchunks_exact for the same iterator but starting at the end of the slice.

+
§Panics
+

Panics if chunk_size is 0.

+
§Examples
+
let slice = ['l', 'o', 'r', 'e', 'm'];
+let mut iter = slice.chunks_exact(2);
+assert_eq!(iter.next().unwrap(), &['l', 'o']);
+assert_eq!(iter.next().unwrap(), &['r', 'e']);
+assert!(iter.next().is_none());
+assert_eq!(iter.remainder(), &['m']);
+
1.31.0 · source

pub fn chunks_exact_mut(&mut self, chunk_size: usize) -> ChunksExactMut<'_, T>

Returns an iterator over chunk_size elements of the slice at a time, starting at the +beginning of the slice.

+

The chunks are mutable slices, and do not overlap. If chunk_size does not divide the +length of the slice, then the last up to chunk_size-1 elements will be omitted and can be +retrieved from the into_remainder function of the iterator.

+

Due to each chunk having exactly chunk_size elements, the compiler can often optimize the +resulting code better than in the case of chunks_mut.

+

See chunks_mut for a variant of this iterator that also returns the remainder as a +smaller chunk, and rchunks_exact_mut for the same iterator but starting at the end of +the slice.

+
§Panics
+

Panics if chunk_size is 0.

+
§Examples
+
let v = &mut [0, 0, 0, 0, 0];
+let mut count = 1;
+
+for chunk in v.chunks_exact_mut(2) {
+    for elem in chunk.iter_mut() {
+        *elem += count;
+    }
+    count += 1;
+}
+assert_eq!(v, &[1, 1, 2, 2, 0]);
+
source

pub unsafe fn as_chunks_unchecked<const N: usize>(&self) -> &[[T; N]]

🔬This is a nightly-only experimental API. (slice_as_chunks)

Splits the slice into a slice of N-element arrays, +assuming that there’s no remainder.

+
§Safety
+

This may only be called when

+
    +
  • The slice splits exactly into N-element chunks (aka self.len() % N == 0).
  • +
  • N != 0.
  • +
+
§Examples
+
#![feature(slice_as_chunks)]
+let slice: &[char] = &['l', 'o', 'r', 'e', 'm', '!'];
+let chunks: &[[char; 1]] =
+    // SAFETY: 1-element chunks never have remainder
+    unsafe { slice.as_chunks_unchecked() };
+assert_eq!(chunks, &[['l'], ['o'], ['r'], ['e'], ['m'], ['!']]);
+let chunks: &[[char; 3]] =
+    // SAFETY: The slice length (6) is a multiple of 3
+    unsafe { slice.as_chunks_unchecked() };
+assert_eq!(chunks, &[['l', 'o', 'r'], ['e', 'm', '!']]);
+
+// These would be unsound:
+// let chunks: &[[_; 5]] = slice.as_chunks_unchecked() // The slice length is not a multiple of 5
+// let chunks: &[[_; 0]] = slice.as_chunks_unchecked() // Zero-length chunks are never allowed
+
source

pub fn as_chunks<const N: usize>(&self) -> (&[[T; N]], &[T])

🔬This is a nightly-only experimental API. (slice_as_chunks)

Splits the slice into a slice of N-element arrays, +starting at the beginning of the slice, +and a remainder slice with length strictly less than N.

+
§Panics
+

Panics if N is 0. This check will most probably get changed to a compile time +error before this method gets stabilized.

+
§Examples
+
#![feature(slice_as_chunks)]
+let slice = ['l', 'o', 'r', 'e', 'm'];
+let (chunks, remainder) = slice.as_chunks();
+assert_eq!(chunks, &[['l', 'o'], ['r', 'e']]);
+assert_eq!(remainder, &['m']);
+

If you expect the slice to be an exact multiple, you can combine +let-else with an empty slice pattern:

+ +
#![feature(slice_as_chunks)]
+let slice = ['R', 'u', 's', 't'];
+let (chunks, []) = slice.as_chunks::<2>() else {
+    panic!("slice didn't have even length")
+};
+assert_eq!(chunks, &[['R', 'u'], ['s', 't']]);
+
source

pub fn as_rchunks<const N: usize>(&self) -> (&[T], &[[T; N]])

🔬This is a nightly-only experimental API. (slice_as_chunks)

Splits the slice into a slice of N-element arrays, +starting at the end of the slice, +and a remainder slice with length strictly less than N.

+
§Panics
+

Panics if N is 0. This check will most probably get changed to a compile time +error before this method gets stabilized.

+
§Examples
+
#![feature(slice_as_chunks)]
+let slice = ['l', 'o', 'r', 'e', 'm'];
+let (remainder, chunks) = slice.as_rchunks();
+assert_eq!(remainder, &['l']);
+assert_eq!(chunks, &[['o', 'r'], ['e', 'm']]);
+
source

pub fn array_chunks<const N: usize>(&self) -> ArrayChunks<'_, T, N>

🔬This is a nightly-only experimental API. (array_chunks)

Returns an iterator over N elements of the slice at a time, starting at the +beginning of the slice.

+

The chunks are array references and do not overlap. If N does not divide the +length of the slice, then the last up to N-1 elements will be omitted and can be +retrieved from the remainder function of the iterator.

+

This method is the const generic equivalent of chunks_exact.

+
§Panics
+

Panics if N is 0. This check will most probably get changed to a compile time +error before this method gets stabilized.

+
§Examples
+
#![feature(array_chunks)]
+let slice = ['l', 'o', 'r', 'e', 'm'];
+let mut iter = slice.array_chunks();
+assert_eq!(iter.next().unwrap(), &['l', 'o']);
+assert_eq!(iter.next().unwrap(), &['r', 'e']);
+assert!(iter.next().is_none());
+assert_eq!(iter.remainder(), &['m']);
+
source

pub unsafe fn as_chunks_unchecked_mut<const N: usize>( + &mut self, +) -> &mut [[T; N]]

🔬This is a nightly-only experimental API. (slice_as_chunks)

Splits the slice into a slice of N-element arrays, +assuming that there’s no remainder.

+
§Safety
+

This may only be called when

+
    +
  • The slice splits exactly into N-element chunks (aka self.len() % N == 0).
  • +
  • N != 0.
  • +
+
§Examples
+
#![feature(slice_as_chunks)]
+let slice: &mut [char] = &mut ['l', 'o', 'r', 'e', 'm', '!'];
+let chunks: &mut [[char; 1]] =
+    // SAFETY: 1-element chunks never have remainder
+    unsafe { slice.as_chunks_unchecked_mut() };
+chunks[0] = ['L'];
+assert_eq!(chunks, &[['L'], ['o'], ['r'], ['e'], ['m'], ['!']]);
+let chunks: &mut [[char; 3]] =
+    // SAFETY: The slice length (6) is a multiple of 3
+    unsafe { slice.as_chunks_unchecked_mut() };
+chunks[1] = ['a', 'x', '?'];
+assert_eq!(slice, &['L', 'o', 'r', 'a', 'x', '?']);
+
+// These would be unsound:
+// let chunks: &[[_; 5]] = slice.as_chunks_unchecked_mut() // The slice length is not a multiple of 5
+// let chunks: &[[_; 0]] = slice.as_chunks_unchecked_mut() // Zero-length chunks are never allowed
+
source

pub fn as_chunks_mut<const N: usize>(&mut self) -> (&mut [[T; N]], &mut [T])

🔬This is a nightly-only experimental API. (slice_as_chunks)

Splits the slice into a slice of N-element arrays, +starting at the beginning of the slice, +and a remainder slice with length strictly less than N.

+
§Panics
+

Panics if N is 0. This check will most probably get changed to a compile time +error before this method gets stabilized.

+
§Examples
+
#![feature(slice_as_chunks)]
+let v = &mut [0, 0, 0, 0, 0];
+let mut count = 1;
+
+let (chunks, remainder) = v.as_chunks_mut();
+remainder[0] = 9;
+for chunk in chunks {
+    *chunk = [count; 2];
+    count += 1;
+}
+assert_eq!(v, &[1, 1, 2, 2, 9]);
+
source

pub fn as_rchunks_mut<const N: usize>(&mut self) -> (&mut [T], &mut [[T; N]])

🔬This is a nightly-only experimental API. (slice_as_chunks)

Splits the slice into a slice of N-element arrays, +starting at the end of the slice, +and a remainder slice with length strictly less than N.

+
§Panics
+

Panics if N is 0. This check will most probably get changed to a compile time +error before this method gets stabilized.

+
§Examples
+
#![feature(slice_as_chunks)]
+let v = &mut [0, 0, 0, 0, 0];
+let mut count = 1;
+
+let (remainder, chunks) = v.as_rchunks_mut();
+remainder[0] = 9;
+for chunk in chunks {
+    *chunk = [count; 2];
+    count += 1;
+}
+assert_eq!(v, &[9, 1, 1, 2, 2]);
+
source

pub fn array_chunks_mut<const N: usize>(&mut self) -> ArrayChunksMut<'_, T, N>

🔬This is a nightly-only experimental API. (array_chunks)

Returns an iterator over N elements of the slice at a time, starting at the +beginning of the slice.

+

The chunks are mutable array references and do not overlap. If N does not divide +the length of the slice, then the last up to N-1 elements will be omitted and +can be retrieved from the into_remainder function of the iterator.

+

This method is the const generic equivalent of chunks_exact_mut.

+
§Panics
+

Panics if N is 0. This check will most probably get changed to a compile time +error before this method gets stabilized.

+
§Examples
+
#![feature(array_chunks)]
+let v = &mut [0, 0, 0, 0, 0];
+let mut count = 1;
+
+for chunk in v.array_chunks_mut() {
+    *chunk = [count; 2];
+    count += 1;
+}
+assert_eq!(v, &[1, 1, 2, 2, 0]);
+
source

pub fn array_windows<const N: usize>(&self) -> ArrayWindows<'_, T, N>

🔬This is a nightly-only experimental API. (array_windows)

Returns an iterator over overlapping windows of N elements of a slice, +starting at the beginning of the slice.

+

This is the const generic equivalent of windows.

+

If N is greater than the size of the slice, it will return no windows.

+
§Panics
+

Panics if N is 0. This check will most probably get changed to a compile time +error before this method gets stabilized.

+
§Examples
+
#![feature(array_windows)]
+let slice = [0, 1, 2, 3];
+let mut iter = slice.array_windows();
+assert_eq!(iter.next().unwrap(), &[0, 1]);
+assert_eq!(iter.next().unwrap(), &[1, 2]);
+assert_eq!(iter.next().unwrap(), &[2, 3]);
+assert!(iter.next().is_none());
+
1.31.0 · source

pub fn rchunks(&self, chunk_size: usize) -> RChunks<'_, T>

Returns an iterator over chunk_size elements of the slice at a time, starting at the end +of the slice.

+

The chunks are slices and do not overlap. If chunk_size does not divide the length of the +slice, then the last chunk will not have length chunk_size.

+

See rchunks_exact for a variant of this iterator that returns chunks of always exactly +chunk_size elements, and chunks for the same iterator but starting at the beginning +of the slice.

+
§Panics
+

Panics if chunk_size is 0.

+
§Examples
+
let slice = ['l', 'o', 'r', 'e', 'm'];
+let mut iter = slice.rchunks(2);
+assert_eq!(iter.next().unwrap(), &['e', 'm']);
+assert_eq!(iter.next().unwrap(), &['o', 'r']);
+assert_eq!(iter.next().unwrap(), &['l']);
+assert!(iter.next().is_none());
+
1.31.0 · source

pub fn rchunks_mut(&mut self, chunk_size: usize) -> RChunksMut<'_, T>

Returns an iterator over chunk_size elements of the slice at a time, starting at the end +of the slice.

+

The chunks are mutable slices, and do not overlap. If chunk_size does not divide the +length of the slice, then the last chunk will not have length chunk_size.

+

See rchunks_exact_mut for a variant of this iterator that returns chunks of always +exactly chunk_size elements, and chunks_mut for the same iterator but starting at the +beginning of the slice.

+
§Panics
+

Panics if chunk_size is 0.

+
§Examples
+
let v = &mut [0, 0, 0, 0, 0];
+let mut count = 1;
+
+for chunk in v.rchunks_mut(2) {
+    for elem in chunk.iter_mut() {
+        *elem += count;
+    }
+    count += 1;
+}
+assert_eq!(v, &[3, 2, 2, 1, 1]);
+
1.31.0 · source

pub fn rchunks_exact(&self, chunk_size: usize) -> RChunksExact<'_, T>

Returns an iterator over chunk_size elements of the slice at a time, starting at the +end of the slice.

+

The chunks are slices and do not overlap. If chunk_size does not divide the length of the +slice, then the last up to chunk_size-1 elements will be omitted and can be retrieved +from the remainder function of the iterator.

+

Due to each chunk having exactly chunk_size elements, the compiler can often optimize the +resulting code better than in the case of rchunks.

+

See rchunks for a variant of this iterator that also returns the remainder as a smaller +chunk, and chunks_exact for the same iterator but starting at the beginning of the +slice.

+
§Panics
+

Panics if chunk_size is 0.

+
§Examples
+
let slice = ['l', 'o', 'r', 'e', 'm'];
+let mut iter = slice.rchunks_exact(2);
+assert_eq!(iter.next().unwrap(), &['e', 'm']);
+assert_eq!(iter.next().unwrap(), &['o', 'r']);
+assert!(iter.next().is_none());
+assert_eq!(iter.remainder(), &['l']);
+
1.31.0 · source

pub fn rchunks_exact_mut(&mut self, chunk_size: usize) -> RChunksExactMut<'_, T>

Returns an iterator over chunk_size elements of the slice at a time, starting at the end +of the slice.

+

The chunks are mutable slices, and do not overlap. If chunk_size does not divide the +length of the slice, then the last up to chunk_size-1 elements will be omitted and can be +retrieved from the into_remainder function of the iterator.

+

Due to each chunk having exactly chunk_size elements, the compiler can often optimize the +resulting code better than in the case of chunks_mut.

+

See rchunks_mut for a variant of this iterator that also returns the remainder as a +smaller chunk, and chunks_exact_mut for the same iterator but starting at the beginning +of the slice.

+
§Panics
+

Panics if chunk_size is 0.

+
§Examples
+
let v = &mut [0, 0, 0, 0, 0];
+let mut count = 1;
+
+for chunk in v.rchunks_exact_mut(2) {
+    for elem in chunk.iter_mut() {
+        *elem += count;
+    }
+    count += 1;
+}
+assert_eq!(v, &[0, 2, 2, 1, 1]);
+
1.77.0 · source

pub fn chunk_by<F>(&self, pred: F) -> ChunkBy<'_, T, F>
where + F: FnMut(&T, &T) -> bool,

Returns an iterator over the slice producing non-overlapping runs +of elements using the predicate to separate them.

+

The predicate is called for every pair of consecutive elements, +meaning that it is called on slice[0] and slice[1], +followed by slice[1] and slice[2], and so on.

+
§Examples
+
let slice = &[1, 1, 1, 3, 3, 2, 2, 2];
+
+let mut iter = slice.chunk_by(|a, b| a == b);
+
+assert_eq!(iter.next(), Some(&[1, 1, 1][..]));
+assert_eq!(iter.next(), Some(&[3, 3][..]));
+assert_eq!(iter.next(), Some(&[2, 2, 2][..]));
+assert_eq!(iter.next(), None);
+

This method can be used to extract the sorted subslices:

+ +
let slice = &[1, 1, 2, 3, 2, 3, 2, 3, 4];
+
+let mut iter = slice.chunk_by(|a, b| a <= b);
+
+assert_eq!(iter.next(), Some(&[1, 1, 2, 3][..]));
+assert_eq!(iter.next(), Some(&[2, 3][..]));
+assert_eq!(iter.next(), Some(&[2, 3, 4][..]));
+assert_eq!(iter.next(), None);
+
1.77.0 · source

pub fn chunk_by_mut<F>(&mut self, pred: F) -> ChunkByMut<'_, T, F>
where + F: FnMut(&T, &T) -> bool,

Returns an iterator over the slice producing non-overlapping mutable +runs of elements using the predicate to separate them.

+

The predicate is called for every pair of consecutive elements, +meaning that it is called on slice[0] and slice[1], +followed by slice[1] and slice[2], and so on.

+
§Examples
+
let slice = &mut [1, 1, 1, 3, 3, 2, 2, 2];
+
+let mut iter = slice.chunk_by_mut(|a, b| a == b);
+
+assert_eq!(iter.next(), Some(&mut [1, 1, 1][..]));
+assert_eq!(iter.next(), Some(&mut [3, 3][..]));
+assert_eq!(iter.next(), Some(&mut [2, 2, 2][..]));
+assert_eq!(iter.next(), None);
+

This method can be used to extract the sorted subslices:

+ +
let slice = &mut [1, 1, 2, 3, 2, 3, 2, 3, 4];
+
+let mut iter = slice.chunk_by_mut(|a, b| a <= b);
+
+assert_eq!(iter.next(), Some(&mut [1, 1, 2, 3][..]));
+assert_eq!(iter.next(), Some(&mut [2, 3][..]));
+assert_eq!(iter.next(), Some(&mut [2, 3, 4][..]));
+assert_eq!(iter.next(), None);
+
1.0.0 · source

pub fn split_at(&self, mid: usize) -> (&[T], &[T])

Divides one slice into two at an index.

+

The first will contain all indices from [0, mid) (excluding +the index mid itself) and the second will contain all +indices from [mid, len) (excluding the index len itself).

+
§Panics
+

Panics if mid > len. For a non-panicking alternative see +split_at_checked.

+
§Examples
+
let v = [1, 2, 3, 4, 5, 6];
+
+{
+   let (left, right) = v.split_at(0);
+   assert_eq!(left, []);
+   assert_eq!(right, [1, 2, 3, 4, 5, 6]);
+}
+
+{
+    let (left, right) = v.split_at(2);
+    assert_eq!(left, [1, 2]);
+    assert_eq!(right, [3, 4, 5, 6]);
+}
+
+{
+    let (left, right) = v.split_at(6);
+    assert_eq!(left, [1, 2, 3, 4, 5, 6]);
+    assert_eq!(right, []);
+}
+
1.0.0 · source

pub fn split_at_mut(&mut self, mid: usize) -> (&mut [T], &mut [T])

Divides one mutable slice into two at an index.

+

The first will contain all indices from [0, mid) (excluding +the index mid itself) and the second will contain all +indices from [mid, len) (excluding the index len itself).

+
§Panics
+

Panics if mid > len. For a non-panicking alternative see +split_at_mut_checked.

+
§Examples
+
let mut v = [1, 0, 3, 0, 5, 6];
+let (left, right) = v.split_at_mut(2);
+assert_eq!(left, [1, 0]);
+assert_eq!(right, [3, 0, 5, 6]);
+left[1] = 2;
+right[1] = 4;
+assert_eq!(v, [1, 2, 3, 4, 5, 6]);
+
1.79.0 · source

pub unsafe fn split_at_unchecked(&self, mid: usize) -> (&[T], &[T])

Divides one slice into two at an index, without doing bounds checking.

+

The first will contain all indices from [0, mid) (excluding +the index mid itself) and the second will contain all +indices from [mid, len) (excluding the index len itself).

+

For a safe alternative see split_at.

+
§Safety
+

Calling this method with an out-of-bounds index is undefined behavior +even if the resulting reference is not used. The caller has to ensure that +0 <= mid <= self.len().

+
§Examples
+
let v = [1, 2, 3, 4, 5, 6];
+
+unsafe {
+   let (left, right) = v.split_at_unchecked(0);
+   assert_eq!(left, []);
+   assert_eq!(right, [1, 2, 3, 4, 5, 6]);
+}
+
+unsafe {
+    let (left, right) = v.split_at_unchecked(2);
+    assert_eq!(left, [1, 2]);
+    assert_eq!(right, [3, 4, 5, 6]);
+}
+
+unsafe {
+    let (left, right) = v.split_at_unchecked(6);
+    assert_eq!(left, [1, 2, 3, 4, 5, 6]);
+    assert_eq!(right, []);
+}
+
1.79.0 · source

pub unsafe fn split_at_mut_unchecked( + &mut self, + mid: usize, +) -> (&mut [T], &mut [T])

Divides one mutable slice into two at an index, without doing bounds checking.

+

The first will contain all indices from [0, mid) (excluding +the index mid itself) and the second will contain all +indices from [mid, len) (excluding the index len itself).

+

For a safe alternative see split_at_mut.

+
§Safety
+

Calling this method with an out-of-bounds index is undefined behavior +even if the resulting reference is not used. The caller has to ensure that +0 <= mid <= self.len().

+
§Examples
+
let mut v = [1, 0, 3, 0, 5, 6];
+// scoped to restrict the lifetime of the borrows
+unsafe {
+    let (left, right) = v.split_at_mut_unchecked(2);
+    assert_eq!(left, [1, 0]);
+    assert_eq!(right, [3, 0, 5, 6]);
+    left[1] = 2;
+    right[1] = 4;
+}
+assert_eq!(v, [1, 2, 3, 4, 5, 6]);
+
1.80.0 · source

pub fn split_at_checked(&self, mid: usize) -> Option<(&[T], &[T])>

Divides one slice into two at an index, returning None if the slice is +too short.

+

If mid ≤ len returns a pair of slices where the first will contain all +indices from [0, mid) (excluding the index mid itself) and the +second will contain all indices from [mid, len) (excluding the index +len itself).

+

Otherwise, if mid > len, returns None.

+
§Examples
+
let v = [1, -2, 3, -4, 5, -6];
+
+{
+   let (left, right) = v.split_at_checked(0).unwrap();
+   assert_eq!(left, []);
+   assert_eq!(right, [1, -2, 3, -4, 5, -6]);
+}
+
+{
+    let (left, right) = v.split_at_checked(2).unwrap();
+    assert_eq!(left, [1, -2]);
+    assert_eq!(right, [3, -4, 5, -6]);
+}
+
+{
+    let (left, right) = v.split_at_checked(6).unwrap();
+    assert_eq!(left, [1, -2, 3, -4, 5, -6]);
+    assert_eq!(right, []);
+}
+
+assert_eq!(None, v.split_at_checked(7));
+
1.80.0 · source

pub fn split_at_mut_checked( + &mut self, + mid: usize, +) -> Option<(&mut [T], &mut [T])>

Divides one mutable slice into two at an index, returning None if the +slice is too short.

+

If mid ≤ len returns a pair of slices where the first will contain all +indices from [0, mid) (excluding the index mid itself) and the +second will contain all indices from [mid, len) (excluding the index +len itself).

+

Otherwise, if mid > len, returns None.

+
§Examples
+
let mut v = [1, 0, 3, 0, 5, 6];
+
+if let Some((left, right)) = v.split_at_mut_checked(2) {
+    assert_eq!(left, [1, 0]);
+    assert_eq!(right, [3, 0, 5, 6]);
+    left[1] = 2;
+    right[1] = 4;
+}
+assert_eq!(v, [1, 2, 3, 4, 5, 6]);
+
+assert_eq!(None, v.split_at_mut_checked(7));
+
1.0.0 · source

pub fn split<F>(&self, pred: F) -> Split<'_, T, F>
where + F: FnMut(&T) -> bool,

Returns an iterator over subslices separated by elements that match +pred. The matched element is not contained in the subslices.

+
§Examples
+
let slice = [10, 40, 33, 20];
+let mut iter = slice.split(|num| num % 3 == 0);
+
+assert_eq!(iter.next().unwrap(), &[10, 40]);
+assert_eq!(iter.next().unwrap(), &[20]);
+assert!(iter.next().is_none());
+

If the first element is matched, an empty slice will be the first item +returned by the iterator. Similarly, if the last element in the slice +is matched, an empty slice will be the last item returned by the +iterator:

+ +
let slice = [10, 40, 33];
+let mut iter = slice.split(|num| num % 3 == 0);
+
+assert_eq!(iter.next().unwrap(), &[10, 40]);
+assert_eq!(iter.next().unwrap(), &[]);
+assert!(iter.next().is_none());
+

If two matched elements are directly adjacent, an empty slice will be +present between them:

+ +
let slice = [10, 6, 33, 20];
+let mut iter = slice.split(|num| num % 3 == 0);
+
+assert_eq!(iter.next().unwrap(), &[10]);
+assert_eq!(iter.next().unwrap(), &[]);
+assert_eq!(iter.next().unwrap(), &[20]);
+assert!(iter.next().is_none());
+
1.0.0 · source

pub fn split_mut<F>(&mut self, pred: F) -> SplitMut<'_, T, F>
where + F: FnMut(&T) -> bool,

Returns an iterator over mutable subslices separated by elements that +match pred. The matched element is not contained in the subslices.

+
§Examples
+
let mut v = [10, 40, 30, 20, 60, 50];
+
+for group in v.split_mut(|num| *num % 3 == 0) {
+    group[0] = 1;
+}
+assert_eq!(v, [1, 40, 30, 1, 60, 1]);
+
1.51.0 · source

pub fn split_inclusive<F>(&self, pred: F) -> SplitInclusive<'_, T, F>
where + F: FnMut(&T) -> bool,

Returns an iterator over subslices separated by elements that match +pred. The matched element is contained in the end of the previous +subslice as a terminator.

+
§Examples
+
let slice = [10, 40, 33, 20];
+let mut iter = slice.split_inclusive(|num| num % 3 == 0);
+
+assert_eq!(iter.next().unwrap(), &[10, 40, 33]);
+assert_eq!(iter.next().unwrap(), &[20]);
+assert!(iter.next().is_none());
+

If the last element of the slice is matched, +that element will be considered the terminator of the preceding slice. +That slice will be the last item returned by the iterator.

+ +
let slice = [3, 10, 40, 33];
+let mut iter = slice.split_inclusive(|num| num % 3 == 0);
+
+assert_eq!(iter.next().unwrap(), &[3]);
+assert_eq!(iter.next().unwrap(), &[10, 40, 33]);
+assert!(iter.next().is_none());
+
1.51.0 · source

pub fn split_inclusive_mut<F>(&mut self, pred: F) -> SplitInclusiveMut<'_, T, F>
where + F: FnMut(&T) -> bool,

Returns an iterator over mutable subslices separated by elements that +match pred. The matched element is contained in the previous +subslice as a terminator.

+
§Examples
+
let mut v = [10, 40, 30, 20, 60, 50];
+
+for group in v.split_inclusive_mut(|num| *num % 3 == 0) {
+    let terminator_idx = group.len()-1;
+    group[terminator_idx] = 1;
+}
+assert_eq!(v, [10, 40, 1, 20, 1, 1]);
+
1.27.0 · source

pub fn rsplit<F>(&self, pred: F) -> RSplit<'_, T, F>
where + F: FnMut(&T) -> bool,

Returns an iterator over subslices separated by elements that match +pred, starting at the end of the slice and working backwards. +The matched element is not contained in the subslices.

+
§Examples
+
let slice = [11, 22, 33, 0, 44, 55];
+let mut iter = slice.rsplit(|num| *num == 0);
+
+assert_eq!(iter.next().unwrap(), &[44, 55]);
+assert_eq!(iter.next().unwrap(), &[11, 22, 33]);
+assert_eq!(iter.next(), None);
+

As with split(), if the first or last element is matched, an empty +slice will be the first (or last) item returned by the iterator.

+ +
let v = &[0, 1, 1, 2, 3, 5, 8];
+let mut it = v.rsplit(|n| *n % 2 == 0);
+assert_eq!(it.next().unwrap(), &[]);
+assert_eq!(it.next().unwrap(), &[3, 5]);
+assert_eq!(it.next().unwrap(), &[1, 1]);
+assert_eq!(it.next().unwrap(), &[]);
+assert_eq!(it.next(), None);
+
1.27.0 · source

pub fn rsplit_mut<F>(&mut self, pred: F) -> RSplitMut<'_, T, F>
where + F: FnMut(&T) -> bool,

Returns an iterator over mutable subslices separated by elements that +match pred, starting at the end of the slice and working +backwards. The matched element is not contained in the subslices.

+
§Examples
+
let mut v = [100, 400, 300, 200, 600, 500];
+
+let mut count = 0;
+for group in v.rsplit_mut(|num| *num % 3 == 0) {
+    count += 1;
+    group[0] = count;
+}
+assert_eq!(v, [3, 400, 300, 2, 600, 1]);
+
1.0.0 · source

pub fn splitn<F>(&self, n: usize, pred: F) -> SplitN<'_, T, F>
where + F: FnMut(&T) -> bool,

Returns an iterator over subslices separated by elements that match +pred, limited to returning at most n items. The matched element is +not contained in the subslices.

+

The last element returned, if any, will contain the remainder of the +slice.

+
§Examples
+

Print the slice split once by numbers divisible by 3 (i.e., [10, 40], +[20, 60, 50]):

+ +
let v = [10, 40, 30, 20, 60, 50];
+
+for group in v.splitn(2, |num| *num % 3 == 0) {
+    println!("{group:?}");
+}
+
1.0.0 · source

pub fn splitn_mut<F>(&mut self, n: usize, pred: F) -> SplitNMut<'_, T, F>
where + F: FnMut(&T) -> bool,

Returns an iterator over mutable subslices separated by elements that match +pred, limited to returning at most n items. The matched element is +not contained in the subslices.

+

The last element returned, if any, will contain the remainder of the +slice.

+
§Examples
+
let mut v = [10, 40, 30, 20, 60, 50];
+
+for group in v.splitn_mut(2, |num| *num % 3 == 0) {
+    group[0] = 1;
+}
+assert_eq!(v, [1, 40, 30, 1, 60, 50]);
+
1.0.0 · source

pub fn rsplitn<F>(&self, n: usize, pred: F) -> RSplitN<'_, T, F>
where + F: FnMut(&T) -> bool,

Returns an iterator over subslices separated by elements that match +pred limited to returning at most n items. This starts at the end of +the slice and works backwards. The matched element is not contained in +the subslices.

+

The last element returned, if any, will contain the remainder of the +slice.

+
§Examples
+

Print the slice split once, starting from the end, by numbers divisible +by 3 (i.e., [50], [10, 40, 30, 20]):

+ +
let v = [10, 40, 30, 20, 60, 50];
+
+for group in v.rsplitn(2, |num| *num % 3 == 0) {
+    println!("{group:?}");
+}
+
1.0.0 · source

pub fn rsplitn_mut<F>(&mut self, n: usize, pred: F) -> RSplitNMut<'_, T, F>
where + F: FnMut(&T) -> bool,

Returns an iterator over subslices separated by elements that match +pred limited to returning at most n items. This starts at the end of +the slice and works backwards. The matched element is not contained in +the subslices.

+

The last element returned, if any, will contain the remainder of the +slice.

+
§Examples
+
let mut s = [10, 40, 30, 20, 60, 50];
+
+for group in s.rsplitn_mut(2, |num| *num % 3 == 0) {
+    group[0] = 1;
+}
+assert_eq!(s, [1, 40, 30, 20, 60, 1]);
+
source

pub fn split_once<F>(&self, pred: F) -> Option<(&[T], &[T])>
where + F: FnMut(&T) -> bool,

🔬This is a nightly-only experimental API. (slice_split_once)

Splits the slice on the first element that matches the specified +predicate.

+

If any matching elements are present in the slice, returns the prefix +before the match and suffix after. The matching element itself is not +included. If no elements match, returns None.

+
§Examples
+
#![feature(slice_split_once)]
+let s = [1, 2, 3, 2, 4];
+assert_eq!(s.split_once(|&x| x == 2), Some((
+    &[1][..],
+    &[3, 2, 4][..]
+)));
+assert_eq!(s.split_once(|&x| x == 0), None);
+
source

pub fn rsplit_once<F>(&self, pred: F) -> Option<(&[T], &[T])>
where + F: FnMut(&T) -> bool,

🔬This is a nightly-only experimental API. (slice_split_once)

Splits the slice on the last element that matches the specified +predicate.

+

If any matching elements are present in the slice, returns the prefix +before the match and suffix after. The matching element itself is not +included. If no elements match, returns None.

+
§Examples
+
#![feature(slice_split_once)]
+let s = [1, 2, 3, 2, 4];
+assert_eq!(s.rsplit_once(|&x| x == 2), Some((
+    &[1, 2, 3][..],
+    &[4][..]
+)));
+assert_eq!(s.rsplit_once(|&x| x == 0), None);
+
1.0.0 · source

pub fn contains(&self, x: &T) -> bool
where + T: PartialEq,

Returns true if the slice contains an element with the given value.

+

This operation is O(n).

+

Note that if you have a sorted slice, binary_search may be faster.

+
§Examples
+
let v = [10, 40, 30];
+assert!(v.contains(&30));
+assert!(!v.contains(&50));
+

If you do not have a &T, but some other value that you can compare +with one (for example, String implements PartialEq<str>), you can +use iter().any:

+ +
let v = [String::from("hello"), String::from("world")]; // slice of `String`
+assert!(v.iter().any(|e| e == "hello")); // search with `&str`
+assert!(!v.iter().any(|e| e == "hi"));
+
1.0.0 · source

pub fn starts_with(&self, needle: &[T]) -> bool
where + T: PartialEq,

Returns true if needle is a prefix of the slice or equal to the slice.

+
§Examples
+
let v = [10, 40, 30];
+assert!(v.starts_with(&[10]));
+assert!(v.starts_with(&[10, 40]));
+assert!(v.starts_with(&v));
+assert!(!v.starts_with(&[50]));
+assert!(!v.starts_with(&[10, 50]));
+

Always returns true if needle is an empty slice:

+ +
let v = &[10, 40, 30];
+assert!(v.starts_with(&[]));
+let v: &[u8] = &[];
+assert!(v.starts_with(&[]));
+
1.0.0 · source

pub fn ends_with(&self, needle: &[T]) -> bool
where + T: PartialEq,

Returns true if needle is a suffix of the slice or equal to the slice.

+
§Examples
+
let v = [10, 40, 30];
+assert!(v.ends_with(&[30]));
+assert!(v.ends_with(&[40, 30]));
+assert!(v.ends_with(&v));
+assert!(!v.ends_with(&[50]));
+assert!(!v.ends_with(&[50, 30]));
+

Always returns true if needle is an empty slice:

+ +
let v = &[10, 40, 30];
+assert!(v.ends_with(&[]));
+let v: &[u8] = &[];
+assert!(v.ends_with(&[]));
+
1.51.0 · source

pub fn strip_prefix<P>(&self, prefix: &P) -> Option<&[T]>
where + P: SlicePattern<Item = T> + ?Sized, + T: PartialEq,

Returns a subslice with the prefix removed.

+

If the slice starts with prefix, returns the subslice after the prefix, wrapped in Some. +If prefix is empty, simply returns the original slice. If prefix is equal to the +original slice, returns an empty slice.

+

If the slice does not start with prefix, returns None.

+
§Examples
+
let v = &[10, 40, 30];
+assert_eq!(v.strip_prefix(&[10]), Some(&[40, 30][..]));
+assert_eq!(v.strip_prefix(&[10, 40]), Some(&[30][..]));
+assert_eq!(v.strip_prefix(&[10, 40, 30]), Some(&[][..]));
+assert_eq!(v.strip_prefix(&[50]), None);
+assert_eq!(v.strip_prefix(&[10, 50]), None);
+
+let prefix : &str = "he";
+assert_eq!(b"hello".strip_prefix(prefix.as_bytes()),
+           Some(b"llo".as_ref()));
+
1.51.0 · source

pub fn strip_suffix<P>(&self, suffix: &P) -> Option<&[T]>
where + P: SlicePattern<Item = T> + ?Sized, + T: PartialEq,

Returns a subslice with the suffix removed.

+

If the slice ends with suffix, returns the subslice before the suffix, wrapped in Some. +If suffix is empty, simply returns the original slice. If suffix is equal to the +original slice, returns an empty slice.

+

If the slice does not end with suffix, returns None.

+
§Examples
+
let v = &[10, 40, 30];
+assert_eq!(v.strip_suffix(&[30]), Some(&[10, 40][..]));
+assert_eq!(v.strip_suffix(&[40, 30]), Some(&[10][..]));
+assert_eq!(v.strip_suffix(&[10, 40, 30]), Some(&[][..]));
+assert_eq!(v.strip_suffix(&[50]), None);
+assert_eq!(v.strip_suffix(&[50, 30]), None);
+

Binary searches this slice for a given element. +If the slice is not sorted, the returned result is unspecified and +meaningless.

+

If the value is found then Result::Ok is returned, containing the +index of the matching element. If there are multiple matches, then any +one of the matches could be returned. The index is chosen +deterministically, but is subject to change in future versions of Rust. +If the value is not found then Result::Err is returned, containing +the index where a matching element could be inserted while maintaining +sorted order.

+

See also binary_search_by, binary_search_by_key, and partition_point.

+
§Examples
+

Looks up a series of four elements. The first is found, with a +uniquely determined position; the second and third are not +found; the fourth could match any position in [1, 4].

+ +
let s = [0, 1, 1, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55];
+
+assert_eq!(s.binary_search(&13),  Ok(9));
+assert_eq!(s.binary_search(&4),   Err(7));
+assert_eq!(s.binary_search(&100), Err(13));
+let r = s.binary_search(&1);
+assert!(match r { Ok(1..=4) => true, _ => false, });
+

If you want to find that whole range of matching items, rather than +an arbitrary matching one, that can be done using partition_point:

+ +
let s = [0, 1, 1, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55];
+
+let low = s.partition_point(|x| x < &1);
+assert_eq!(low, 1);
+let high = s.partition_point(|x| x <= &1);
+assert_eq!(high, 5);
+let r = s.binary_search(&1);
+assert!((low..high).contains(&r.unwrap()));
+
+assert!(s[..low].iter().all(|&x| x < 1));
+assert!(s[low..high].iter().all(|&x| x == 1));
+assert!(s[high..].iter().all(|&x| x > 1));
+
+// For something not found, the "range" of equal items is empty
+assert_eq!(s.partition_point(|x| x < &11), 9);
+assert_eq!(s.partition_point(|x| x <= &11), 9);
+assert_eq!(s.binary_search(&11), Err(9));
+

If you want to insert an item to a sorted vector, while maintaining +sort order, consider using partition_point:

+ +
let mut s = vec![0, 1, 1, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55];
+let num = 42;
+let idx = s.partition_point(|&x| x <= num);
+// If `num` is unique, `s.partition_point(|&x| x < num)` (with `<`) is equivalent to
+// `s.binary_search(&num).unwrap_or_else(|x| x)`, but using `<=` will allow `insert`
+// to shift less elements.
+s.insert(idx, num);
+assert_eq!(s, [0, 1, 1, 1, 1, 2, 3, 5, 8, 13, 21, 34, 42, 55]);
+
1.0.0 · source

pub fn binary_search_by<'a, F>(&'a self, f: F) -> Result<usize, usize>
where + F: FnMut(&'a T) -> Ordering,

Binary searches this slice with a comparator function.

+

The comparator function should return an order code that indicates +whether its argument is Less, Equal or Greater the desired +target. +If the slice is not sorted or if the comparator function does not +implement an order consistent with the sort order of the underlying +slice, the returned result is unspecified and meaningless.

+

If the value is found then Result::Ok is returned, containing the +index of the matching element. If there are multiple matches, then any +one of the matches could be returned. The index is chosen +deterministically, but is subject to change in future versions of Rust. +If the value is not found then Result::Err is returned, containing +the index where a matching element could be inserted while maintaining +sorted order.

+

See also binary_search, binary_search_by_key, and partition_point.

+
§Examples
+

Looks up a series of four elements. The first is found, with a +uniquely determined position; the second and third are not +found; the fourth could match any position in [1, 4].

+ +
let s = [0, 1, 1, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55];
+
+let seek = 13;
+assert_eq!(s.binary_search_by(|probe| probe.cmp(&seek)), Ok(9));
+let seek = 4;
+assert_eq!(s.binary_search_by(|probe| probe.cmp(&seek)), Err(7));
+let seek = 100;
+assert_eq!(s.binary_search_by(|probe| probe.cmp(&seek)), Err(13));
+let seek = 1;
+let r = s.binary_search_by(|probe| probe.cmp(&seek));
+assert!(match r { Ok(1..=4) => true, _ => false, });
+
1.10.0 · source

pub fn binary_search_by_key<'a, B, F>( + &'a self, + b: &B, + f: F, +) -> Result<usize, usize>
where + F: FnMut(&'a T) -> B, + B: Ord,

Binary searches this slice with a key extraction function.

+

Assumes that the slice is sorted by the key, for instance with +sort_by_key using the same key extraction function. +If the slice is not sorted by the key, the returned result is +unspecified and meaningless.

+

If the value is found then Result::Ok is returned, containing the +index of the matching element. If there are multiple matches, then any +one of the matches could be returned. The index is chosen +deterministically, but is subject to change in future versions of Rust. +If the value is not found then Result::Err is returned, containing +the index where a matching element could be inserted while maintaining +sorted order.

+

See also binary_search, binary_search_by, and partition_point.

+
§Examples
+

Looks up a series of four elements in a slice of pairs sorted by +their second elements. The first is found, with a uniquely +determined position; the second and third are not found; the +fourth could match any position in [1, 4].

+ +
let s = [(0, 0), (2, 1), (4, 1), (5, 1), (3, 1),
+         (1, 2), (2, 3), (4, 5), (5, 8), (3, 13),
+         (1, 21), (2, 34), (4, 55)];
+
+assert_eq!(s.binary_search_by_key(&13, |&(a, b)| b),  Ok(9));
+assert_eq!(s.binary_search_by_key(&4, |&(a, b)| b),   Err(7));
+assert_eq!(s.binary_search_by_key(&100, |&(a, b)| b), Err(13));
+let r = s.binary_search_by_key(&1, |&(a, b)| b);
+assert!(match r { Ok(1..=4) => true, _ => false, });
+
1.20.0 · source

pub fn sort_unstable(&mut self)
where + T: Ord,

Sorts the slice without preserving the initial order of equal elements.

+

This sort is unstable (i.e., may reorder equal elements), in-place (i.e., does not +allocate), and O(n * log(n)) worst-case.

+

If T: Ord does not implement a total order the resulting order is unspecified. All +original elements will remain in the slice and any possible modifications via interior +mutability are observed in the input. Same is true if T: Ord panics.

+
§Current implementation
+

The current implementation is based on ipnsort by Lukas Bergdoll and Orson Peters, which +combines the fast average case of quicksort with the fast worst case of heapsort, achieving +linear time on fully sorted and reversed inputs. On inputs with k distinct elements, the +expected time to sort the data is O(n * log(k)).

+

It is typically faster than stable sorting, except in a few special cases, e.g., when the +slice is partially sorted.

+

If T: Ord does not implement a total order, the implementation may panic.

+
§Examples
+
let mut v = [-5, 4, 1, -3, 2];
+
+v.sort_unstable();
+assert!(v == [-5, -3, 1, 2, 4]);
+
1.20.0 · source

pub fn sort_unstable_by<F>(&mut self, compare: F)
where + F: FnMut(&T, &T) -> Ordering,

Sorts the slice with a comparator function, without preserving the initial order of +equal elements.

+

This sort is unstable (i.e., may reorder equal elements), in-place (i.e., does not +allocate), and O(n * log(n)) worst-case.

+

The comparator function should define a total ordering for the elements in the slice. If the +ordering is not total, the order of the elements is unspecified.

+

If the comparator function does not implement a total order the resulting order is +unspecified. All original elements will remain in the slice and any possible modifications +via interior mutability are observed in the input. Same is true if the comparator function +panics. A total order (for all a, b and c):

+
    +
  • total and antisymmetric: exactly one of a < b, a == b or a > b is true, and
  • +
  • transitive, a < b and b < c implies a < c. The same must hold for both == and >.
  • +
+

For example, while f64 doesn’t implement Ord because NaN != NaN, we can use +partial_cmp as our sort function when we know the slice doesn’t contain a NaN.

+ +
let mut floats = [5f64, 4.0, 1.0, 3.0, 2.0];
+floats.sort_unstable_by(|a, b| a.partial_cmp(b).unwrap());
+assert_eq!(floats, [1.0, 2.0, 3.0, 4.0, 5.0]);
+
§Current implementation
+

The current implementation is based on ipnsort by Lukas Bergdoll and Orson Peters, which +combines the fast average case of quicksort with the fast worst case of heapsort, achieving +linear time on fully sorted and reversed inputs. On inputs with k distinct elements, the +expected time to sort the data is O(n * log(k)).

+

It is typically faster than stable sorting, except in a few special cases, e.g., when the +slice is partially sorted.

+

If T: Ord does not implement a total order, the implementation may panic.

+
§Examples
+
let mut v = [5, 4, 1, 3, 2];
+v.sort_unstable_by(|a, b| a.cmp(b));
+assert!(v == [1, 2, 3, 4, 5]);
+
+// reverse sorting
+v.sort_unstable_by(|a, b| b.cmp(a));
+assert!(v == [5, 4, 3, 2, 1]);
+
1.20.0 · source

pub fn sort_unstable_by_key<K, F>(&mut self, f: F)
where + F: FnMut(&T) -> K, + K: Ord,

Sorts the slice with a key extraction function, without preserving the initial order of +equal elements.

+

This sort is unstable (i.e., may reorder equal elements), in-place (i.e., does not +allocate), and O(n * log(n)) worst-case.

+

If K: Ord does not implement a total order the resulting order is unspecified. +All original elements will remain in the slice and any possible modifications via interior +mutability are observed in the input. Same is true if K: Ord panics.

+
§Current implementation
+

The current implementation is based on ipnsort by Lukas Bergdoll and Orson Peters, which +combines the fast average case of quicksort with the fast worst case of heapsort, achieving +linear time on fully sorted and reversed inputs. On inputs with k distinct elements, the +expected time to sort the data is O(n * log(k)).

+

It is typically faster than stable sorting, except in a few special cases, e.g., when the +slice is partially sorted.

+

If K: Ord does not implement a total order, the implementation may panic.

+
§Examples
+
let mut v = [-5i32, 4, 1, -3, 2];
+
+v.sort_unstable_by_key(|k| k.abs());
+assert!(v == [1, 2, -3, 4, -5]);
+
1.49.0 · source

pub fn select_nth_unstable( + &mut self, + index: usize, +) -> (&mut [T], &mut T, &mut [T])
where + T: Ord,

Reorder the slice such that the element at index after the reordering is at its final +sorted position.

+

This reordering has the additional property that any value at position i < index will be +less than or equal to any value at a position j > index. Additionally, this reordering is +unstable (i.e. any number of equal elements may end up at position index), in-place (i.e. +does not allocate), and runs in O(n) time. This function is also known as “kth element” +in other libraries.

+

It returns a triplet of the following from the reordered slice: the subslice prior to +index, the element at index, and the subslice after index; accordingly, the values in +those two subslices will respectively all be less-than-or-equal-to and +greater-than-or-equal-to the value of the element at index.

+
§Current implementation
+

The current algorithm is an introselect implementation based on ipnsort by Lukas Bergdoll +and Orson Peters, which is also the basis for sort_unstable. The fallback algorithm is +Median of Medians using Tukey’s Ninther for pivot selection, which guarantees linear runtime +for all inputs.

+

It is typically faster than stable sorting, except in a few special cases, e.g., when the +slice is nearly fully sorted, where slice::sort may be faster.

+
§Panics
+

Panics when index >= len(), meaning it always panics on empty slices.

+
§Examples
+
let mut v = [-5i32, 4, 2, -3, 1];
+
+// Find the items less than or equal to the median, the median, and greater than or equal to
+// the median.
+let (lesser, median, greater) = v.select_nth_unstable(2);
+
+assert!(lesser == [-3, -5] || lesser == [-5, -3]);
+assert_eq!(median, &mut 1);
+assert!(greater == [4, 2] || greater == [2, 4]);
+
+// We are only guaranteed the slice will be one of the following, based on the way we sort
+// about the specified index.
+assert!(v == [-3, -5, 1, 2, 4] ||
+        v == [-5, -3, 1, 2, 4] ||
+        v == [-3, -5, 1, 4, 2] ||
+        v == [-5, -3, 1, 4, 2]);
+
1.49.0 · source

pub fn select_nth_unstable_by<F>( + &mut self, + index: usize, + compare: F, +) -> (&mut [T], &mut T, &mut [T])
where + F: FnMut(&T, &T) -> Ordering,

Reorder the slice with a comparator function such that the element at index after the +reordering is at its final sorted position.

+

This reordering has the additional property that any value at position i < index will be +less than or equal to any value at a position j > index using the comparator function. +Additionally, this reordering is unstable (i.e. any number of equal elements may end up at +position index), in-place (i.e. does not allocate), and runs in O(n) time. This +function is also known as “kth element” in other libraries.

+

It returns a triplet of the following from the slice reordered according to the provided +comparator function: the subslice prior to index, the element at index, and the subslice +after index; accordingly, the values in those two subslices will respectively all be +less-than-or-equal-to and greater-than-or-equal-to the value of the element at index.

+
§Current implementation
+

The current algorithm is an introselect implementation based on ipnsort by Lukas Bergdoll +and Orson Peters, which is also the basis for sort_unstable. The fallback algorithm is +Median of Medians using Tukey’s Ninther for pivot selection, which guarantees linear runtime +for all inputs.

+

It is typically faster than stable sorting, except in a few special cases, e.g., when the +slice is nearly fully sorted, where slice::sort may be faster.

+
§Panics
+

Panics when index >= len(), meaning it always panics on empty slices.

+
§Examples
+
let mut v = [-5i32, 4, 2, -3, 1];
+
+// Find the items less than or equal to the median, the median, and greater than or equal to
+// the median as if the slice were sorted in descending order.
+let (lesser, median, greater) = v.select_nth_unstable_by(2, |a, b| b.cmp(a));
+
+assert!(lesser == [4, 2] || lesser == [2, 4]);
+assert_eq!(median, &mut 1);
+assert!(greater == [-3, -5] || greater == [-5, -3]);
+
+// We are only guaranteed the slice will be one of the following, based on the way we sort
+// about the specified index.
+assert!(v == [2, 4, 1, -5, -3] ||
+        v == [2, 4, 1, -3, -5] ||
+        v == [4, 2, 1, -5, -3] ||
+        v == [4, 2, 1, -3, -5]);
+
1.49.0 · source

pub fn select_nth_unstable_by_key<K, F>( + &mut self, + index: usize, + f: F, +) -> (&mut [T], &mut T, &mut [T])
where + F: FnMut(&T) -> K, + K: Ord,

Reorder the slice with a key extraction function such that the element at index after the +reordering is at its final sorted position.

+

This reordering has the additional property that any value at position i < index will be +less than or equal to any value at a position j > index using the key extraction function. +Additionally, this reordering is unstable (i.e. any number of equal elements may end up at +position index), in-place (i.e. does not allocate), and runs in O(n) time. This +function is also known as “kth element” in other libraries.

+

It returns a triplet of the following from the slice reordered according to the provided key +extraction function: the subslice prior to index, the element at index, and the subslice +after index; accordingly, the values in those two subslices will respectively all be +less-than-or-equal-to and greater-than-or-equal-to the value of the element at index.

+
§Current implementation
+

The current algorithm is an introselect implementation based on ipnsort by Lukas Bergdoll +and Orson Peters, which is also the basis for sort_unstable. The fallback algorithm is +Median of Medians using Tukey’s Ninther for pivot selection, which guarantees linear runtime +for all inputs.

+

It is typically faster than stable sorting, except in a few special cases, e.g., when the +slice is nearly fully sorted, where slice::sort may be faster.

+
§Panics
+

Panics when index >= len(), meaning it always panics on empty slices.

+
§Examples
+
let mut v = [-5i32, 4, 1, -3, 2];
+
+// Find the items less than or equal to the median, the median, and greater than or equal to
+// the median as if the slice were sorted according to absolute value.
+let (lesser, median, greater) = v.select_nth_unstable_by_key(2, |a| a.abs());
+
+assert!(lesser == [1, 2] || lesser == [2, 1]);
+assert_eq!(median, &mut -3);
+assert!(greater == [4, -5] || greater == [-5, 4]);
+
+// We are only guaranteed the slice will be one of the following, based on the way we sort
+// about the specified index.
+assert!(v == [1, 2, -3, 4, -5] ||
+        v == [1, 2, -3, -5, 4] ||
+        v == [2, 1, -3, 4, -5] ||
+        v == [2, 1, -3, -5, 4]);
+
source

pub fn partition_dedup(&mut self) -> (&mut [T], &mut [T])
where + T: PartialEq,

🔬This is a nightly-only experimental API. (slice_partition_dedup)

Moves all consecutive repeated elements to the end of the slice according to the +PartialEq trait implementation.

+

Returns two slices. The first contains no consecutive repeated elements. +The second contains all the duplicates in no specified order.

+

If the slice is sorted, the first returned slice contains no duplicates.

+
§Examples
+
#![feature(slice_partition_dedup)]
+
+let mut slice = [1, 2, 2, 3, 3, 2, 1, 1];
+
+let (dedup, duplicates) = slice.partition_dedup();
+
+assert_eq!(dedup, [1, 2, 3, 2, 1]);
+assert_eq!(duplicates, [2, 3, 1]);
+
source

pub fn partition_dedup_by<F>(&mut self, same_bucket: F) -> (&mut [T], &mut [T])
where + F: FnMut(&mut T, &mut T) -> bool,

🔬This is a nightly-only experimental API. (slice_partition_dedup)

Moves all but the first of consecutive elements to the end of the slice satisfying +a given equality relation.

+

Returns two slices. The first contains no consecutive repeated elements. +The second contains all the duplicates in no specified order.

+

The same_bucket function is passed references to two elements from the slice and +must determine if the elements compare equal. The elements are passed in opposite order +from their order in the slice, so if same_bucket(a, b) returns true, a is moved +at the end of the slice.

+

If the slice is sorted, the first returned slice contains no duplicates.

+
§Examples
+
#![feature(slice_partition_dedup)]
+
+let mut slice = ["foo", "Foo", "BAZ", "Bar", "bar", "baz", "BAZ"];
+
+let (dedup, duplicates) = slice.partition_dedup_by(|a, b| a.eq_ignore_ascii_case(b));
+
+assert_eq!(dedup, ["foo", "BAZ", "Bar", "baz"]);
+assert_eq!(duplicates, ["bar", "Foo", "BAZ"]);
+
source

pub fn partition_dedup_by_key<K, F>(&mut self, key: F) -> (&mut [T], &mut [T])
where + F: FnMut(&mut T) -> K, + K: PartialEq,

🔬This is a nightly-only experimental API. (slice_partition_dedup)

Moves all but the first of consecutive elements to the end of the slice that resolve +to the same key.

+

Returns two slices. The first contains no consecutive repeated elements. +The second contains all the duplicates in no specified order.

+

If the slice is sorted, the first returned slice contains no duplicates.

+
§Examples
+
#![feature(slice_partition_dedup)]
+
+let mut slice = [10, 20, 21, 30, 30, 20, 11, 13];
+
+let (dedup, duplicates) = slice.partition_dedup_by_key(|i| *i / 10);
+
+assert_eq!(dedup, [10, 20, 30, 20, 11]);
+assert_eq!(duplicates, [21, 30, 13]);
+
1.26.0 · source

pub fn rotate_left(&mut self, mid: usize)

Rotates the slice in-place such that the first mid elements of the +slice move to the end while the last self.len() - mid elements move to +the front. After calling rotate_left, the element previously at index +mid will become the first element in the slice.

+
§Panics
+

This function will panic if mid is greater than the length of the +slice. Note that mid == self.len() does not panic and is a no-op +rotation.

+
§Complexity
+

Takes linear (in self.len()) time.

+
§Examples
+
let mut a = ['a', 'b', 'c', 'd', 'e', 'f'];
+a.rotate_left(2);
+assert_eq!(a, ['c', 'd', 'e', 'f', 'a', 'b']);
+

Rotating a subslice:

+ +
let mut a = ['a', 'b', 'c', 'd', 'e', 'f'];
+a[1..5].rotate_left(1);
+assert_eq!(a, ['a', 'c', 'd', 'e', 'b', 'f']);
+
1.26.0 · source

pub fn rotate_right(&mut self, k: usize)

Rotates the slice in-place such that the first self.len() - k +elements of the slice move to the end while the last k elements move +to the front. After calling rotate_right, the element previously at +index self.len() - k will become the first element in the slice.

+
§Panics
+

This function will panic if k is greater than the length of the +slice. Note that k == self.len() does not panic and is a no-op +rotation.

+
§Complexity
+

Takes linear (in self.len()) time.

+
§Examples
+
let mut a = ['a', 'b', 'c', 'd', 'e', 'f'];
+a.rotate_right(2);
+assert_eq!(a, ['e', 'f', 'a', 'b', 'c', 'd']);
+

Rotating a subslice:

+ +
let mut a = ['a', 'b', 'c', 'd', 'e', 'f'];
+a[1..5].rotate_right(1);
+assert_eq!(a, ['a', 'e', 'b', 'c', 'd', 'f']);
+
1.50.0 · source

pub fn fill(&mut self, value: T)
where + T: Clone,

Fills self with elements by cloning value.

+
§Examples
+
let mut buf = vec![0; 10];
+buf.fill(1);
+assert_eq!(buf, vec![1; 10]);
+
1.51.0 · source

pub fn fill_with<F>(&mut self, f: F)
where + F: FnMut() -> T,

Fills self with elements returned by calling a closure repeatedly.

+

This method uses a closure to create new values. If you’d rather +Clone a given value, use fill. If you want to use the Default +trait to generate values, you can pass Default::default as the +argument.

+
§Examples
+
let mut buf = vec![1; 10];
+buf.fill_with(Default::default);
+assert_eq!(buf, vec![0; 10]);
+
1.7.0 · source

pub fn clone_from_slice(&mut self, src: &[T])
where + T: Clone,

Copies the elements from src into self.

+

The length of src must be the same as self.

+
§Panics
+

This function will panic if the two slices have different lengths.

+
§Examples
+

Cloning two elements from a slice into another:

+ +
let src = [1, 2, 3, 4];
+let mut dst = [0, 0];
+
+// Because the slices have to be the same length,
+// we slice the source slice from four elements
+// to two. It will panic if we don't do this.
+dst.clone_from_slice(&src[2..]);
+
+assert_eq!(src, [1, 2, 3, 4]);
+assert_eq!(dst, [3, 4]);
+

Rust enforces that there can only be one mutable reference with no +immutable references to a particular piece of data in a particular +scope. Because of this, attempting to use clone_from_slice on a +single slice will result in a compile failure:

+ +
let mut slice = [1, 2, 3, 4, 5];
+
+slice[..2].clone_from_slice(&slice[3..]); // compile fail!
+

To work around this, we can use split_at_mut to create two distinct +sub-slices from a slice:

+ +
let mut slice = [1, 2, 3, 4, 5];
+
+{
+    let (left, right) = slice.split_at_mut(2);
+    left.clone_from_slice(&right[1..]);
+}
+
+assert_eq!(slice, [4, 5, 3, 4, 5]);
+
1.9.0 · source

pub fn copy_from_slice(&mut self, src: &[T])
where + T: Copy,

Copies all elements from src into self, using a memcpy.

+

The length of src must be the same as self.

+

If T does not implement Copy, use clone_from_slice.

+
§Panics
+

This function will panic if the two slices have different lengths.

+
§Examples
+

Copying two elements from a slice into another:

+ +
let src = [1, 2, 3, 4];
+let mut dst = [0, 0];
+
+// Because the slices have to be the same length,
+// we slice the source slice from four elements
+// to two. It will panic if we don't do this.
+dst.copy_from_slice(&src[2..]);
+
+assert_eq!(src, [1, 2, 3, 4]);
+assert_eq!(dst, [3, 4]);
+

Rust enforces that there can only be one mutable reference with no +immutable references to a particular piece of data in a particular +scope. Because of this, attempting to use copy_from_slice on a +single slice will result in a compile failure:

+ +
let mut slice = [1, 2, 3, 4, 5];
+
+slice[..2].copy_from_slice(&slice[3..]); // compile fail!
+

To work around this, we can use split_at_mut to create two distinct +sub-slices from a slice:

+ +
let mut slice = [1, 2, 3, 4, 5];
+
+{
+    let (left, right) = slice.split_at_mut(2);
+    left.copy_from_slice(&right[1..]);
+}
+
+assert_eq!(slice, [4, 5, 3, 4, 5]);
+
1.37.0 · source

pub fn copy_within<R>(&mut self, src: R, dest: usize)
where + R: RangeBounds<usize>, + T: Copy,

Copies elements from one part of the slice to another part of itself, +using a memmove.

+

src is the range within self to copy from. dest is the starting +index of the range within self to copy to, which will have the same +length as src. The two ranges may overlap. The ends of the two ranges +must be less than or equal to self.len().

+
§Panics
+

This function will panic if either range exceeds the end of the slice, +or if the end of src is before the start.

+
§Examples
+

Copying four bytes within a slice:

+ +
let mut bytes = *b"Hello, World!";
+
+bytes.copy_within(1..5, 8);
+
+assert_eq!(&bytes, b"Hello, Wello!");
+
1.27.0 · source

pub fn swap_with_slice(&mut self, other: &mut [T])

Swaps all elements in self with those in other.

+

The length of other must be the same as self.

+
§Panics
+

This function will panic if the two slices have different lengths.

+
§Example
+

Swapping two elements across slices:

+ +
let mut slice1 = [0, 0];
+let mut slice2 = [1, 2, 3, 4];
+
+slice1.swap_with_slice(&mut slice2[2..]);
+
+assert_eq!(slice1, [3, 4]);
+assert_eq!(slice2, [1, 2, 0, 0]);
+

Rust enforces that there can only be one mutable reference to a +particular piece of data in a particular scope. Because of this, +attempting to use swap_with_slice on a single slice will result in +a compile failure:

+ +
let mut slice = [1, 2, 3, 4, 5];
+slice[..2].swap_with_slice(&mut slice[3..]); // compile fail!
+

To work around this, we can use split_at_mut to create two distinct +mutable sub-slices from a slice:

+ +
let mut slice = [1, 2, 3, 4, 5];
+
+{
+    let (left, right) = slice.split_at_mut(2);
+    left.swap_with_slice(&mut right[1..]);
+}
+
+assert_eq!(slice, [4, 5, 3, 1, 2]);
+
1.30.0 · source

pub unsafe fn align_to<U>(&self) -> (&[T], &[U], &[T])

Transmute the slice to a slice of another type, ensuring alignment of the types is +maintained.

+

This method splits the slice into three distinct slices: prefix, correctly aligned middle +slice of a new type, and the suffix slice. The middle part will be as big as possible under +the given alignment constraint and element size.

+

This method has no purpose when either input element T or output element U are +zero-sized and will return the original slice without splitting anything.

+
§Safety
+

This method is essentially a transmute with respect to the elements in the returned +middle slice, so all the usual caveats pertaining to transmute::<T, U> also apply here.

+
§Examples
+

Basic usage:

+ +
unsafe {
+    let bytes: [u8; 7] = [1, 2, 3, 4, 5, 6, 7];
+    let (prefix, shorts, suffix) = bytes.align_to::<u16>();
+    // less_efficient_algorithm_for_bytes(prefix);
+    // more_efficient_algorithm_for_aligned_shorts(shorts);
+    // less_efficient_algorithm_for_bytes(suffix);
+}
+
1.30.0 · source

pub unsafe fn align_to_mut<U>(&mut self) -> (&mut [T], &mut [U], &mut [T])

Transmute the mutable slice to a mutable slice of another type, ensuring alignment of the +types is maintained.

+

This method splits the slice into three distinct slices: prefix, correctly aligned middle +slice of a new type, and the suffix slice. The middle part will be as big as possible under +the given alignment constraint and element size.

+

This method has no purpose when either input element T or output element U are +zero-sized and will return the original slice without splitting anything.

+
§Safety
+

This method is essentially a transmute with respect to the elements in the returned +middle slice, so all the usual caveats pertaining to transmute::<T, U> also apply here.

+
§Examples
+

Basic usage:

+ +
unsafe {
+    let mut bytes: [u8; 7] = [1, 2, 3, 4, 5, 6, 7];
+    let (prefix, shorts, suffix) = bytes.align_to_mut::<u16>();
+    // less_efficient_algorithm_for_bytes(prefix);
+    // more_efficient_algorithm_for_aligned_shorts(shorts);
+    // less_efficient_algorithm_for_bytes(suffix);
+}
+
source

pub fn as_simd<const LANES: usize>(&self) -> (&[T], &[Simd<T, LANES>], &[T])
where + Simd<T, LANES>: AsRef<[T; LANES]>, + T: SimdElement, + LaneCount<LANES>: SupportedLaneCount,

🔬This is a nightly-only experimental API. (portable_simd)

Split a slice into a prefix, a middle of aligned SIMD types, and a suffix.

+

This is a safe wrapper around slice::align_to, so inherits the same +guarantees as that method.

+
§Panics
+

This will panic if the size of the SIMD type is different from +LANES times that of the scalar.

+

At the time of writing, the trait restrictions on Simd<T, LANES> keeps +that from ever happening, as only power-of-two numbers of lanes are +supported. It’s possible that, in the future, those restrictions might +be lifted in a way that would make it possible to see panics from this +method for something like LANES == 3.

+
§Examples
+
#![feature(portable_simd)]
+use core::simd::prelude::*;
+
+let short = &[1, 2, 3];
+let (prefix, middle, suffix) = short.as_simd::<4>();
+assert_eq!(middle, []); // Not enough elements for anything in the middle
+
+// They might be split in any possible way between prefix and suffix
+let it = prefix.iter().chain(suffix).copied();
+assert_eq!(it.collect::<Vec<_>>(), vec![1, 2, 3]);
+
+fn basic_simd_sum(x: &[f32]) -> f32 {
+    use std::ops::Add;
+    let (prefix, middle, suffix) = x.as_simd();
+    let sums = f32x4::from_array([
+        prefix.iter().copied().sum(),
+        0.0,
+        0.0,
+        suffix.iter().copied().sum(),
+    ]);
+    let sums = middle.iter().copied().fold(sums, f32x4::add);
+    sums.reduce_sum()
+}
+
+let numbers: Vec<f32> = (1..101).map(|x| x as _).collect();
+assert_eq!(basic_simd_sum(&numbers[1..99]), 4949.0);
+
source

pub fn as_simd_mut<const LANES: usize>( + &mut self, +) -> (&mut [T], &mut [Simd<T, LANES>], &mut [T])
where + Simd<T, LANES>: AsMut<[T; LANES]>, + T: SimdElement, + LaneCount<LANES>: SupportedLaneCount,

🔬This is a nightly-only experimental API. (portable_simd)

Split a mutable slice into a mutable prefix, a middle of aligned SIMD types, +and a mutable suffix.

+

This is a safe wrapper around slice::align_to_mut, so inherits the same +guarantees as that method.

+

This is the mutable version of slice::as_simd; see that for examples.

+
§Panics
+

This will panic if the size of the SIMD type is different from +LANES times that of the scalar.

+

At the time of writing, the trait restrictions on Simd<T, LANES> keeps +that from ever happening, as only power-of-two numbers of lanes are +supported. It’s possible that, in the future, those restrictions might +be lifted in a way that would make it possible to see panics from this +method for something like LANES == 3.

+
source

pub fn is_sorted(&self) -> bool
where + T: PartialOrd,

🔬This is a nightly-only experimental API. (is_sorted)

Checks if the elements of this slice are sorted.

+

That is, for each element a and its following element b, a <= b must hold. If the +slice yields exactly zero or one element, true is returned.

+

Note that if Self::Item is only PartialOrd, but not Ord, the above definition +implies that this function returns false if any two consecutive items are not +comparable.

+
§Examples
+
#![feature(is_sorted)]
+let empty: [i32; 0] = [];
+
+assert!([1, 2, 2, 9].is_sorted());
+assert!(![1, 3, 2, 4].is_sorted());
+assert!([0].is_sorted());
+assert!(empty.is_sorted());
+assert!(![0.0, 1.0, f32::NAN].is_sorted());
+
source

pub fn is_sorted_by<'a, F>(&'a self, compare: F) -> bool
where + F: FnMut(&'a T, &'a T) -> bool,

🔬This is a nightly-only experimental API. (is_sorted)

Checks if the elements of this slice are sorted using the given comparator function.

+

Instead of using PartialOrd::partial_cmp, this function uses the given compare +function to determine whether two elements are to be considered in sorted order.

+
§Examples
+
#![feature(is_sorted)]
+
+assert!([1, 2, 2, 9].is_sorted_by(|a, b| a <= b));
+assert!(![1, 2, 2, 9].is_sorted_by(|a, b| a < b));
+
+assert!([0].is_sorted_by(|a, b| true));
+assert!([0].is_sorted_by(|a, b| false));
+
+let empty: [i32; 0] = [];
+assert!(empty.is_sorted_by(|a, b| false));
+assert!(empty.is_sorted_by(|a, b| true));
+
source

pub fn is_sorted_by_key<'a, F, K>(&'a self, f: F) -> bool
where + F: FnMut(&'a T) -> K, + K: PartialOrd,

🔬This is a nightly-only experimental API. (is_sorted)

Checks if the elements of this slice are sorted using the given key extraction function.

+

Instead of comparing the slice’s elements directly, this function compares the keys of the +elements, as determined by f. Apart from that, it’s equivalent to is_sorted; see its +documentation for more information.

+
§Examples
+
#![feature(is_sorted)]
+
+assert!(["c", "bb", "aaa"].is_sorted_by_key(|s| s.len()));
+assert!(![-2i32, -1, 0, 3].is_sorted_by_key(|n| n.abs()));
+
1.52.0 · source

pub fn partition_point<P>(&self, pred: P) -> usize
where + P: FnMut(&T) -> bool,

Returns the index of the partition point according to the given predicate +(the index of the first element of the second partition).

+

The slice is assumed to be partitioned according to the given predicate. +This means that all elements for which the predicate returns true are at the start of the slice +and all elements for which the predicate returns false are at the end. +For example, [7, 15, 3, 5, 4, 12, 6] is partitioned under the predicate x % 2 != 0 +(all odd numbers are at the start, all even at the end).

+

If this slice is not partitioned, the returned result is unspecified and meaningless, +as this method performs a kind of binary search.

+

See also binary_search, binary_search_by, and binary_search_by_key.

+
§Examples
+
let v = [1, 2, 3, 3, 5, 6, 7];
+let i = v.partition_point(|&x| x < 5);
+
+assert_eq!(i, 4);
+assert!(v[..i].iter().all(|&x| x < 5));
+assert!(v[i..].iter().all(|&x| !(x < 5)));
+

If all elements of the slice match the predicate, including if the slice +is empty, then the length of the slice will be returned:

+ +
let a = [2, 4, 8];
+assert_eq!(a.partition_point(|x| x < &100), a.len());
+let a: [i32; 0] = [];
+assert_eq!(a.partition_point(|x| x < &100), 0);
+

If you want to insert an item to a sorted vector, while maintaining +sort order:

+ +
let mut s = vec![0, 1, 1, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55];
+let num = 42;
+let idx = s.partition_point(|&x| x <= num);
+s.insert(idx, num);
+assert_eq!(s, [0, 1, 1, 1, 1, 2, 3, 5, 8, 13, 21, 34, 42, 55]);
+
source

pub fn take<'a, R>(self: &mut &'a [T], range: R) -> Option<&'a [T]>
where + R: OneSidedRange<usize>,

🔬This is a nightly-only experimental API. (slice_take)

Removes the subslice corresponding to the given range +and returns a reference to it.

+

Returns None and does not modify the slice if the given +range is out of bounds.

+

Note that this method only accepts one-sided ranges such as +2.. or ..6, but not 2..6.

+
§Examples
+

Taking the first three elements of a slice:

+ +
#![feature(slice_take)]
+
+let mut slice: &[_] = &['a', 'b', 'c', 'd'];
+let mut first_three = slice.take(..3).unwrap();
+
+assert_eq!(slice, &['d']);
+assert_eq!(first_three, &['a', 'b', 'c']);
+

Taking the last two elements of a slice:

+ +
#![feature(slice_take)]
+
+let mut slice: &[_] = &['a', 'b', 'c', 'd'];
+let mut tail = slice.take(2..).unwrap();
+
+assert_eq!(slice, &['a', 'b']);
+assert_eq!(tail, &['c', 'd']);
+

Getting None when range is out of bounds:

+ +
#![feature(slice_take)]
+
+let mut slice: &[_] = &['a', 'b', 'c', 'd'];
+
+assert_eq!(None, slice.take(5..));
+assert_eq!(None, slice.take(..5));
+assert_eq!(None, slice.take(..=4));
+let expected: &[char] = &['a', 'b', 'c', 'd'];
+assert_eq!(Some(expected), slice.take(..4));
+
source

pub fn take_mut<'a, R>(self: &mut &'a mut [T], range: R) -> Option<&'a mut [T]>
where + R: OneSidedRange<usize>,

🔬This is a nightly-only experimental API. (slice_take)

Removes the subslice corresponding to the given range +and returns a mutable reference to it.

+

Returns None and does not modify the slice if the given +range is out of bounds.

+

Note that this method only accepts one-sided ranges such as +2.. or ..6, but not 2..6.

+
§Examples
+

Taking the first three elements of a slice:

+ +
#![feature(slice_take)]
+
+let mut slice: &mut [_] = &mut ['a', 'b', 'c', 'd'];
+let mut first_three = slice.take_mut(..3).unwrap();
+
+assert_eq!(slice, &mut ['d']);
+assert_eq!(first_three, &mut ['a', 'b', 'c']);
+

Taking the last two elements of a slice:

+ +
#![feature(slice_take)]
+
+let mut slice: &mut [_] = &mut ['a', 'b', 'c', 'd'];
+let mut tail = slice.take_mut(2..).unwrap();
+
+assert_eq!(slice, &mut ['a', 'b']);
+assert_eq!(tail, &mut ['c', 'd']);
+

Getting None when range is out of bounds:

+ +
#![feature(slice_take)]
+
+let mut slice: &mut [_] = &mut ['a', 'b', 'c', 'd'];
+
+assert_eq!(None, slice.take_mut(5..));
+assert_eq!(None, slice.take_mut(..5));
+assert_eq!(None, slice.take_mut(..=4));
+let expected: &mut [_] = &mut ['a', 'b', 'c', 'd'];
+assert_eq!(Some(expected), slice.take_mut(..4));
+
source

pub fn take_first<'a>(self: &mut &'a [T]) -> Option<&'a T>

🔬This is a nightly-only experimental API. (slice_take)

Removes the first element of the slice and returns a reference +to it.

+

Returns None if the slice is empty.

+
§Examples
+
#![feature(slice_take)]
+
+let mut slice: &[_] = &['a', 'b', 'c'];
+let first = slice.take_first().unwrap();
+
+assert_eq!(slice, &['b', 'c']);
+assert_eq!(first, &'a');
+
source

pub fn take_first_mut<'a>(self: &mut &'a mut [T]) -> Option<&'a mut T>

🔬This is a nightly-only experimental API. (slice_take)

Removes the first element of the slice and returns a mutable +reference to it.

+

Returns None if the slice is empty.

+
§Examples
+
#![feature(slice_take)]
+
+let mut slice: &mut [_] = &mut ['a', 'b', 'c'];
+let first = slice.take_first_mut().unwrap();
+*first = 'd';
+
+assert_eq!(slice, &['b', 'c']);
+assert_eq!(first, &'d');
+
source

pub fn take_last<'a>(self: &mut &'a [T]) -> Option<&'a T>

🔬This is a nightly-only experimental API. (slice_take)

Removes the last element of the slice and returns a reference +to it.

+

Returns None if the slice is empty.

+
§Examples
+
#![feature(slice_take)]
+
+let mut slice: &[_] = &['a', 'b', 'c'];
+let last = slice.take_last().unwrap();
+
+assert_eq!(slice, &['a', 'b']);
+assert_eq!(last, &'c');
+
source

pub fn take_last_mut<'a>(self: &mut &'a mut [T]) -> Option<&'a mut T>

🔬This is a nightly-only experimental API. (slice_take)

Removes the last element of the slice and returns a mutable +reference to it.

+

Returns None if the slice is empty.

+
§Examples
+
#![feature(slice_take)]
+
+let mut slice: &mut [_] = &mut ['a', 'b', 'c'];
+let last = slice.take_last_mut().unwrap();
+*last = 'd';
+
+assert_eq!(slice, &['a', 'b']);
+assert_eq!(last, &'d');
+
source

pub unsafe fn get_many_unchecked_mut<const N: usize>( + &mut self, + indices: [usize; N], +) -> [&mut T; N]

🔬This is a nightly-only experimental API. (get_many_mut)

Returns mutable references to many indices at once, without doing any checks.

+

For a safe alternative see get_many_mut.

+
§Safety
+

Calling this method with overlapping or out-of-bounds indices is undefined behavior +even if the resulting references are not used.

+
§Examples
+
#![feature(get_many_mut)]
+
+let x = &mut [1, 2, 4];
+
+unsafe {
+    let [a, b] = x.get_many_unchecked_mut([0, 2]);
+    *a *= 10;
+    *b *= 100;
+}
+assert_eq!(x, &[10, 2, 400]);
+
source

pub fn get_many_mut<const N: usize>( + &mut self, + indices: [usize; N], +) -> Result<[&mut T; N], GetManyMutError<N>>

🔬This is a nightly-only experimental API. (get_many_mut)

Returns mutable references to many indices at once.

+

Returns an error if any index is out-of-bounds, or if the same index was +passed more than once.

+
§Examples
+
#![feature(get_many_mut)]
+
+let v = &mut [1, 2, 3];
+if let Ok([a, b]) = v.get_many_mut([0, 2]) {
+    *a = 413;
+    *b = 612;
+}
+assert_eq!(v, &[413, 2, 612]);
+
1.23.0 · source

pub fn to_ascii_uppercase(&self) -> Vec<u8>

Returns a vector containing a copy of this slice where each byte +is mapped to its ASCII upper case equivalent.

+

ASCII letters ‘a’ to ‘z’ are mapped to ‘A’ to ‘Z’, +but non-ASCII letters are unchanged.

+

To uppercase the value in-place, use make_ascii_uppercase.

+
1.23.0 · source

pub fn to_ascii_lowercase(&self) -> Vec<u8>

Returns a vector containing a copy of this slice where each byte +is mapped to its ASCII lower case equivalent.

+

ASCII letters ‘A’ to ‘Z’ are mapped to ‘a’ to ‘z’, +but non-ASCII letters are unchanged.

+

To lowercase the value in-place, use make_ascii_lowercase.

+
1.0.0 · source

pub fn sort(&mut self)
where + T: Ord,

Sorts the slice, preserving initial order of equal elements.

+

This sort is stable (i.e., does not reorder equal elements) and O(n * log(n)) +worst-case.

+

If T: Ord does not implement a total order the resulting order is unspecified. All +original elements will remain in the slice and any possible modifications via interior +mutability are observed in the input. Same is true if T: Ord panics.

+

When applicable, unstable sorting is preferred because it is generally faster than stable +sorting and it doesn’t allocate auxiliary memory. See +sort_unstable. The exception are partially sorted slices, which +may be better served with slice::sort.

+
§Current implementation
+

The current implementation is based on driftsort by Orson Peters and Lukas Bergdoll, which +combines the fast average case of quicksort with the fast worst case and partial run +detection of mergesort, achieving linear time on fully sorted and reversed inputs. On inputs +with k distinct elements, the expected time to sort the data is O(n * log(k)).

+

The auxiliary memory allocation behavior depends on the input length. Short slices are +handled without allocation, medium sized slices allocate self.len() and beyond that it +clamps at self.len() / 2.

+

If T: Ord does not implement a total order, the implementation may panic.

+
§Examples
+
let mut v = [-5, 4, 1, -3, 2];
+
+v.sort();
+assert!(v == [-5, -3, 1, 2, 4]);
+
1.0.0 · source

pub fn sort_by<F>(&mut self, compare: F)
where + F: FnMut(&T, &T) -> Ordering,

Sorts the slice with a comparator function, preserving initial order of equal elements.

+

This sort is stable (i.e., does not reorder equal elements) and O(n * log(n)) +worst-case.

+

The comparator function should define a total ordering for the elements in the slice. If the +ordering is not total, the order of the elements is unspecified.

+

If the comparator function does not implement a total order the resulting order is +unspecified. All original elements will remain in the slice and any possible modifications +via interior mutability are observed in the input. Same is true if the comparator function +panics. A total order (for all a, b and c):

+
    +
  • total and antisymmetric: exactly one of a < b, a == b or a > b is true, and
  • +
  • transitive, a < b and b < c implies a < c. The same must hold for both == and >.
  • +
+

For example, while f64 doesn’t implement Ord because NaN != NaN, we can use +partial_cmp as our sort function when we know the slice doesn’t contain a NaN.

+ +
let mut floats = [5f64, 4.0, 1.0, 3.0, 2.0];
+floats.sort_unstable_by(|a, b| a.partial_cmp(b).unwrap());
+assert_eq!(floats, [1.0, 2.0, 3.0, 4.0, 5.0]);
+
§Current implementation
+

The current implementation is based on driftsort by Orson Peters and Lukas Bergdoll, which +combines the fast average case of quicksort with the fast worst case and partial run +detection of mergesort, achieving linear time on fully sorted and reversed inputs. On inputs +with k distinct elements, the expected time to sort the data is O(n * log(k)).

+

The auxiliary memory allocation behavior depends on the input length. Short slices are +handled without allocation, medium sized slices allocate self.len() and beyond that it +clamps at self.len() / 2.

+

If T: Ord does not implement a total order, the implementation may panic.

+
§Examples
+
let mut v = [5, 4, 1, 3, 2];
+v.sort_by(|a, b| a.cmp(b));
+assert!(v == [1, 2, 3, 4, 5]);
+
+// reverse sorting
+v.sort_by(|a, b| b.cmp(a));
+assert!(v == [5, 4, 3, 2, 1]);
+
1.7.0 · source

pub fn sort_by_key<K, F>(&mut self, f: F)
where + F: FnMut(&T) -> K, + K: Ord,

Sorts the slice with a key extraction function, preserving initial order of equal elements.

+

This sort is stable (i.e., does not reorder equal elements) and O(m * n * log(n)) +worst-case, where the key function is O(m).

+

If K: Ord does not implement a total order the resulting order is unspecified. +All original elements will remain in the slice and any possible modifications via interior +mutability are observed in the input. Same is true if K: Ord panics.

+
§Current implementation
+

The current implementation is based on driftsort by Orson Peters and Lukas Bergdoll, which +combines the fast average case of quicksort with the fast worst case and partial run +detection of mergesort, achieving linear time on fully sorted and reversed inputs. On inputs +with k distinct elements, the expected time to sort the data is O(n * log(k)).

+

The auxiliary memory allocation behavior depends on the input length. Short slices are +handled without allocation, medium sized slices allocate self.len() and beyond that it +clamps at self.len() / 2.

+

If K: Ord does not implement a total order, the implementation may panic.

+
§Examples
+
let mut v = [-5i32, 4, 1, -3, 2];
+
+v.sort_by_key(|k| k.abs());
+assert!(v == [1, 2, -3, 4, -5]);
+
1.34.0 · source

pub fn sort_by_cached_key<K, F>(&mut self, f: F)
where + F: FnMut(&T) -> K, + K: Ord,

Sorts the slice with a key extraction function, preserving initial order of equal elements.

+

This sort is stable (i.e., does not reorder equal elements) and O(m * n + n * +log(n)) worst-case, where the key function is O(m).

+

During sorting, the key function is called at most once per element, by using temporary +storage to remember the results of key evaluation. The order of calls to the key function is +unspecified and may change in future versions of the standard library.

+

If K: Ord does not implement a total order the resulting order is unspecified. +All original elements will remain in the slice and any possible modifications via interior +mutability are observed in the input. Same is true if K: Ord panics.

+

For simple key functions (e.g., functions that are property accesses or basic operations), +sort_by_key is likely to be faster.

+
§Current implementation
+

The current implementation is based on instruction-parallel-network sort by Lukas +Bergdoll, which combines the fast average case of randomized quicksort with the fast worst +case of heapsort, while achieving linear time on fully sorted and reversed inputs. And +O(k * log(n)) where k is the number of distinct elements in the input. It leverages +superscalar out-of-order execution capabilities commonly found in CPUs, to efficiently +perform the operation.

+

In the worst case, the algorithm allocates temporary storage in a Vec<(K, usize)> the +length of the slice.

+
§Examples
+
let mut v = [-5i32, 4, 32, -3, 2];
+
+v.sort_by_cached_key(|k| k.to_string());
+assert!(v == [-3, -5, 2, 32, 4]);
+
1.0.0 · source

pub fn to_vec(&self) -> Vec<T>
where + T: Clone,

Copies self into a new Vec.

+
§Examples
+
let s = [10, 40, 30];
+let x = s.to_vec();
+// Here, `s` and `x` can be modified independently.
+
source

pub fn to_vec_in<A>(&self, alloc: A) -> Vec<T, A>
where + A: Allocator, + T: Clone,

🔬This is a nightly-only experimental API. (allocator_api)

Copies self into a new Vec with an allocator.

+
§Examples
+
#![feature(allocator_api)]
+
+use std::alloc::System;
+
+let s = [10, 40, 30];
+let x = s.to_vec_in(System);
+// Here, `s` and `x` can be modified independently.
+
1.40.0 · source

pub fn repeat(&self, n: usize) -> Vec<T>
where + T: Copy,

Creates a vector by copying a slice n times.

+
§Panics
+

This function will panic if the capacity would overflow.

+
§Examples
+

Basic usage:

+ +
assert_eq!([1, 2].repeat(3), vec![1, 2, 1, 2, 1, 2]);
+

A panic upon overflow:

+ +
// this will panic at runtime
+b"0123456789abcdef".repeat(usize::MAX);
+
1.0.0 · source

pub fn concat<Item>(&self) -> <[T] as Concat<Item>>::Output
where + [T]: Concat<Item>, + Item: ?Sized,

Flattens a slice of T into a single value Self::Output.

+
§Examples
+
assert_eq!(["hello", "world"].concat(), "helloworld");
+assert_eq!([[1, 2], [3, 4]].concat(), [1, 2, 3, 4]);
+
1.3.0 · source

pub fn join<Separator>( + &self, + sep: Separator, +) -> <[T] as Join<Separator>>::Output
where + [T]: Join<Separator>,

Flattens a slice of T into a single value Self::Output, placing a +given separator between each.

+
§Examples
+
assert_eq!(["hello", "world"].join(" "), "hello world");
+assert_eq!([[1, 2], [3, 4]].join(&0), [1, 2, 0, 3, 4]);
+assert_eq!([[1, 2], [3, 4]].join(&[0, 0][..]), [1, 2, 0, 0, 3, 4]);
+
1.0.0 · source

pub fn connect<Separator>( + &self, + sep: Separator, +) -> <[T] as Join<Separator>>::Output
where + [T]: Join<Separator>,

👎Deprecated since 1.3.0: renamed to join

Flattens a slice of T into a single value Self::Output, placing a +given separator between each.

+
§Examples
+
assert_eq!(["hello", "world"].connect(" "), "hello world");
+assert_eq!([[1, 2], [3, 4]].connect(&0), [1, 2, 0, 3, 4]);
+

Trait Implementations§

§

impl<T> Clone for NEVec<T>
where + T: Clone + Debug,

§

fn clone(&self) -> NEVec<T>

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
§

impl<T> Debug for NEVec<T>
where + T: Debug,

§

fn fmt(&self, formatter: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
§

impl<T> Default for NEVec<T>
where + T: Default + Debug,

§

fn default() -> NEVec<T>

Returns the “default value” for a type. Read more
§

impl<T> Deref for NEVec<T>
where + T: Debug,

§

type Target = Vec<T>

The resulting type after dereferencing.
§

fn deref(&self) -> &<NEVec<T> as Deref>::Target

Dereferences the value.
§

impl<'de, T> Deserialize<'de> for NEVec<T>
where + T: Debug + Deserialize<'de>,

§

fn deserialize<__D>( + __deserializer: __D, +) -> Result<NEVec<T>, <__D as Deserializer<'de>>::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
§

impl<T> Hash for NEVec<T>
where + T: Hash + Debug,

§

fn hash<__H>(&self, state: &mut __H)
where + __H: Hasher,

Feeds this value into the given Hasher. Read more
1.3.0 · source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
§

impl<T> PartialEq for NEVec<T>
where + T: PartialEq + Debug,

§

fn eq(&self, other: &NEVec<T>) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
§

impl<T> Serialize for NEVec<T>
where + T: Debug + Serialize,

§

fn serialize<__S>( + &self, + __serializer: __S, +) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
§

impl<T> Eq for NEVec<T>
where + T: Eq + Debug,

§

impl<T> StructuralPartialEq for NEVec<T>
where + T: Debug,

Auto Trait Implementations§

§

impl<T> Freeze for NEVec<T>

§

impl<T> RefUnwindSafe for NEVec<T>
where + T: RefUnwindSafe,

§

impl<T> Send for NEVec<T>
where + T: Send,

§

impl<T> Sync for NEVec<T>
where + T: Sync,

§

impl<T> Unpin for NEVec<T>
where + T: Unpin,

§

impl<T> UnwindSafe for NEVec<T>
where + T: UnwindSafe,

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CallHasher for T
where + T: Hash + ?Sized,

§

default fn get_hash<H, B>(value: &H, build_hasher: &B) -> u64
where + H: Hash + ?Sized, + B: BuildHasher,

source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/avm_server/raw_outcome/index.html b/avm_server/raw_outcome/index.html new file mode 100644 index 00000000..77c202e3 --- /dev/null +++ b/avm_server/raw_outcome/index.html @@ -0,0 +1 @@ +avm_server::raw_outcome - Rust

Module avm_server::raw_outcome

source ·

Structs§

  • This struct is very similar to AVMOutcome, but keeps error_code and error_msg for test purposes.
\ No newline at end of file diff --git a/avm_server/raw_outcome/sidebar-items.js b/avm_server/raw_outcome/sidebar-items.js new file mode 100644 index 00000000..8e993c1f --- /dev/null +++ b/avm_server/raw_outcome/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"struct":["RawAVMOutcome"]}; \ No newline at end of file diff --git a/avm_server/raw_outcome/struct.RawAVMOutcome.html b/avm_server/raw_outcome/struct.RawAVMOutcome.html new file mode 100644 index 00000000..b6f74bc1 --- /dev/null +++ b/avm_server/raw_outcome/struct.RawAVMOutcome.html @@ -0,0 +1,61 @@ +RawAVMOutcome in avm_server::raw_outcome - Rust

Struct avm_server::raw_outcome::RawAVMOutcome

source ·
pub struct RawAVMOutcome {
+    pub ret_code: i64,
+    pub error_message: String,
+    pub data: Vec<u8>,
+    pub call_requests: HashMap<u32, CallRequestParams>,
+    pub next_peer_pks: Vec<String>,
+    pub soft_limits_triggering: SoftLimitsTriggering,
+}
Expand description

This struct is very similar to AVMOutcome, but keeps error_code and error_msg for test purposes.

+

Fields§

§ret_code: i64§error_message: String§data: Vec<u8>§call_requests: HashMap<u32, CallRequestParams>§next_peer_pks: Vec<String>§soft_limits_triggering: SoftLimitsTriggering

Implementations§

Trait Implementations§

source§

impl Clone for RawAVMOutcome

source§

fn clone(&self) -> RawAVMOutcome

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for RawAVMOutcome

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
source§

impl<'de> Deserialize<'de> for RawAVMOutcome

source§

fn deserialize<__D>( + __deserializer: __D, +) -> Result<RawAVMOutcome, <__D as Deserializer<'de>>::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl PartialEq for RawAVMOutcome

source§

fn eq(&self, other: &RawAVMOutcome) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl Serialize for RawAVMOutcome

source§

fn serialize<__S>( + &self, + __serializer: __S, +) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Eq for RawAVMOutcome

source§

impl StructuralPartialEq for RawAVMOutcome

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/avm_server/runner/struct.AVMMemoryStats.html b/avm_server/runner/struct.AVMMemoryStats.html new file mode 100644 index 00000000..2a317494 --- /dev/null +++ b/avm_server/runner/struct.AVMMemoryStats.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../avm_server/struct.AVMMemoryStats.html...

+ + + \ No newline at end of file diff --git a/avm_server/runner/struct.AVMRunner.html b/avm_server/runner/struct.AVMRunner.html new file mode 100644 index 00000000..ffed4b2c --- /dev/null +++ b/avm_server/runner/struct.AVMRunner.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../avm_server/avm_runner/struct.AVMRunner.html...

+ + + \ No newline at end of file diff --git a/avm_server/runner/struct.AVMRuntimeLimits.html b/avm_server/runner/struct.AVMRuntimeLimits.html new file mode 100644 index 00000000..132f6f97 --- /dev/null +++ b/avm_server/runner/struct.AVMRuntimeLimits.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../avm_server/struct.AVMRuntimeLimits.html...

+ + + \ No newline at end of file diff --git a/avm_server/runner/struct.AquaVMRuntimeLimits.html b/avm_server/runner/struct.AquaVMRuntimeLimits.html new file mode 100644 index 00000000..b6a16375 --- /dev/null +++ b/avm_server/runner/struct.AquaVMRuntimeLimits.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../avm_server/struct.AquaVMRuntimeLimits.html...

+ + + \ No newline at end of file diff --git a/avm_server/sidebar-items.js b/avm_server/sidebar-items.js new file mode 100644 index 00000000..1bd70d94 --- /dev/null +++ b/avm_server/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"constant":["CALL_SERVICE_SUCCESS"],"enum":["AVMError","CallSeDeErrors","HostImportError","IType","IValue","RunnerError"],"fn":["into_raw_result"],"mod":["avm_runner","ne_vec","raw_outcome"],"struct":["AVM","AVMConfig","AVMMemoryStats","AVMOutcome","AVMRuntimeLimits","AnomalyData","AquaVMRuntimeLimits","CallRequestParams","CallServiceResult","ErrorAVMOutcome","ParticleParameters","SecurityTetraplet","SoftLimitsTriggering"],"trait":["DataStore"],"type":["AVMDataStore","AVMResult","CallRequests","CallResults","HostExportedFunc","HostImportDescriptor","RunnerResult"]}; \ No newline at end of file diff --git a/avm_server/struct.AVM.html b/avm_server/struct.AVM.html new file mode 100644 index 00000000..bdebfc77 --- /dev/null +++ b/avm_server/struct.AVM.html @@ -0,0 +1,47 @@ +AVM in avm_server - Rust

Struct avm_server::AVM

source ·
pub struct AVM<E, WB: WasmBackend> { /* private fields */ }

Implementations§

source§

impl<E, WB: WasmBackend> AVM<E, WB>

source

pub async fn new(config: AVMConfig<E>, wasm_backend: WB) -> AVMResult<Self, E>

Create AVM with provided config.

+
source

pub async fn call( + &mut self, + air: impl Into<String>, + data: impl Into<Vec<u8>>, + particle_parameters: ParticleParameters<'_>, + call_results: CallResults, + keypair: &KeyPair, +) -> AVMResult<AVMOutcome, E>

source

pub fn cleanup_data( + &mut self, + particle_id: &str, + current_peer_id: &str, +) -> AVMResult<(), E>

Cleanup data that become obsolete.

+
source

pub fn memory_stats(&self) -> AVMMemoryStats

Return memory stat of an interpreter heap.

+

Auto Trait Implementations§

§

impl<E, WB> !Freeze for AVM<E, WB>

§

impl<E, WB> !RefUnwindSafe for AVM<E, WB>

§

impl<E, WB> Send for AVM<E, WB>

§

impl<E, WB> !Sync for AVM<E, WB>

§

impl<E, WB> Unpin for AVM<E, WB>
where + WB: Unpin, + <WB as WasmBackend>::Store: Unpin,

§

impl<E, WB> !UnwindSafe for AVM<E, WB>

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/avm_server/struct.AVMConfig.html b/avm_server/struct.AVMConfig.html new file mode 100644 index 00000000..f5b70e16 --- /dev/null +++ b/avm_server/struct.AVMConfig.html @@ -0,0 +1,40 @@ +AVMConfig in avm_server - Rust

Struct avm_server::AVMConfig

source ·
pub struct AVMConfig<E> {
+    pub air_wasm_path: PathBuf,
+    pub max_heap_size: Option<u64>,
+    pub logging_mask: i32,
+    pub data_store: AVMDataStore<E>,
+}
Expand description

Describes behaviour of the AVM.

+

Fields§

§air_wasm_path: PathBuf

Path to a AIR interpreter Wasm file.

+
§max_heap_size: Option<u64>

Maximum heap size in bytes available for the interpreter.

+
§logging_mask: i32

Mask used to filter logs, for details see log_utf8_string in fluence-faas.

+
§data_store: AVMDataStore<E>

Auto Trait Implementations§

§

impl<E> Freeze for AVMConfig<E>

§

impl<E> !RefUnwindSafe for AVMConfig<E>

§

impl<E> Send for AVMConfig<E>

§

impl<E> Sync for AVMConfig<E>

§

impl<E> Unpin for AVMConfig<E>

§

impl<E> !UnwindSafe for AVMConfig<E>

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/avm_server/struct.AVMMemoryStats.html b/avm_server/struct.AVMMemoryStats.html new file mode 100644 index 00000000..b6702eaa --- /dev/null +++ b/avm_server/struct.AVMMemoryStats.html @@ -0,0 +1,41 @@ +AVMMemoryStats in avm_server - Rust

Struct avm_server::AVMMemoryStats

source ·
pub struct AVMMemoryStats {
+    pub memory_size: usize,
+    pub total_memory_limit: Option<u64>,
+    pub allocation_rejects: Option<u32>,
+}
Expand description

Return statistic of AVM server Wasm module heap footprint.

+

Fields§

§memory_size: usize

Size of currently used linear memory in bytes. +Please note that linear memory contains not only heap, but globals, shadow stack and so on.

+
§total_memory_limit: Option<u64>

Possibly set max memory size for AVM server.

+
§allocation_rejects: Option<u32>

Number of allocations rejected due to memory limit. +May be not recorded by some backends in Marine.

+

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/avm_server/struct.AVMOutcome.html b/avm_server/struct.AVMOutcome.html new file mode 100644 index 00000000..c86ad6a2 --- /dev/null +++ b/avm_server/struct.AVMOutcome.html @@ -0,0 +1,70 @@ +AVMOutcome in avm_server - Rust

Struct avm_server::AVMOutcome

source ·
pub struct AVMOutcome {
+    pub data: Vec<u8>,
+    pub call_requests: HashMap<u32, CallRequestParams>,
+    pub next_peer_pks: Vec<String>,
+    pub memory_delta: usize,
+    pub execution_time: Duration,
+    pub soft_limits_triggering: SoftLimitsTriggering,
+}

Fields§

§data: Vec<u8>

Contains script data that should be preserved in an executor of this interpreter +regardless of ret_code value.

+
§call_requests: HashMap<u32, CallRequestParams>

Collected parameters of all met call instructions that could be executed on a current peer.

+
§next_peer_pks: Vec<String>

Public keys of peers that should receive data.

+
§memory_delta: usize

Memory in bytes AVM linear heap was extended during execution by.

+
§execution_time: Duration

Time of a particle execution +(it counts only execution time without operations with DataStore and so on)

+
§soft_limits_triggering: SoftLimitsTriggering

To store and convey soft limits triggering flags.

+

Implementations§

source§

impl AVMOutcome

source

pub fn from_raw_outcome( + raw_outcome: RawAVMOutcome, + memory_delta: usize, + execution_time: Duration, +) -> Result<AVMOutcome, ErrorAVMOutcome>

Trait Implementations§

source§

impl Clone for AVMOutcome

source§

fn clone(&self) -> AVMOutcome

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for AVMOutcome

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
source§

impl<'de> Deserialize<'de> for AVMOutcome

source§

fn deserialize<__D>( + __deserializer: __D, +) -> Result<AVMOutcome, <__D as Deserializer<'de>>::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl PartialEq for AVMOutcome

source§

fn eq(&self, other: &AVMOutcome) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl Serialize for AVMOutcome

source§

fn serialize<__S>( + &self, + __serializer: __S, +) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Eq for AVMOutcome

source§

impl StructuralPartialEq for AVMOutcome

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/avm_server/struct.AVMRuntimeLimits.html b/avm_server/struct.AVMRuntimeLimits.html new file mode 100644 index 00000000..4435e583 --- /dev/null +++ b/avm_server/struct.AVMRuntimeLimits.html @@ -0,0 +1,44 @@ +AVMRuntimeLimits in avm_server - Rust

Struct avm_server::AVMRuntimeLimits

source ·
pub struct AVMRuntimeLimits {
+    pub air_size_limit: Option<u64>,
+    pub particle_size_limit: Option<u64>,
+    pub call_result_size_limit: Option<u64>,
+    pub hard_limit_enabled: bool,
+}

Fields§

§air_size_limit: Option<u64>§particle_size_limit: Option<u64>

The particle data size limit.

+
§call_result_size_limit: Option<u64>

This is the limit for the size of service call result.

+
§hard_limit_enabled: bool

This knob controls hard RAM limits behavior for AVMRunner.

+

Implementations§

source§

impl AVMRuntimeLimits

source

pub fn new( + air_size_limit: Option<u64>, + particle_size_limit: Option<u64>, + call_result_size_limit: Option<u64>, + hard_limit_enabled: bool, +) -> Self

Trait Implementations§

source§

impl Default for AVMRuntimeLimits

source§

fn default() -> AVMRuntimeLimits

Returns the “default value” for a type. Read more
source§

impl From<AVMRuntimeLimits> for AquaVMRuntimeLimits

source§

fn from(value: AVMRuntimeLimits) -> Self

Converts to this type from the input type.

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/avm_server/struct.AnomalyData.html b/avm_server/struct.AnomalyData.html new file mode 100644 index 00000000..e3a7ff99 --- /dev/null +++ b/avm_server/struct.AnomalyData.html @@ -0,0 +1,70 @@ +AnomalyData in avm_server - Rust

Struct avm_server::AnomalyData

source ·
pub struct AnomalyData<'data> {
+    pub air_script: Cow<'data, str>,
+    pub particle: Cow<'data, [u8]>,
+    pub prev_data: Cow<'data, [u8]>,
+    pub current_data: Cow<'data, [u8]>,
+    pub call_results: Cow<'data, [u8]>,
+    pub avm_outcome: Cow<'data, [u8]>,
+    pub execution_time: Duration,
+    pub memory_delta: usize,
+}

Fields§

§air_script: Cow<'data, str>§particle: Cow<'data, [u8]>§prev_data: Cow<'data, [u8]>§current_data: Cow<'data, [u8]>§call_results: Cow<'data, [u8]>§avm_outcome: Cow<'data, [u8]>§execution_time: Duration§memory_delta: usize

Implementations§

source§

impl<'data> AnomalyData<'data>

source

pub fn new( + air_script: &'data str, + particle: &'data [u8], + prev_data: &'data [u8], + current_data: &'data [u8], + call_results: &'data [u8], + avm_outcome: &'data [u8], + execution_time: Duration, + memory_delta: usize, +) -> AnomalyData<'data>

Trait Implementations§

source§

impl<'data> Clone for AnomalyData<'data>

source§

fn clone(&self) -> AnomalyData<'data>

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl<'data> Debug for AnomalyData<'data>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
source§

impl<'de, 'data> Deserialize<'de> for AnomalyData<'data>
where + 'de: 'data,

source§

fn deserialize<__D>( + __deserializer: __D, +) -> Result<AnomalyData<'data>, <__D as Deserializer<'de>>::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl<'data> PartialEq for AnomalyData<'data>

source§

fn eq(&self, other: &AnomalyData<'data>) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl<'data> Serialize for AnomalyData<'data>

source§

fn serialize<__S>( + &self, + __serializer: __S, +) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl<'data> Eq for AnomalyData<'data>

source§

impl<'data> StructuralPartialEq for AnomalyData<'data>

Auto Trait Implementations§

§

impl<'data> Freeze for AnomalyData<'data>

§

impl<'data> RefUnwindSafe for AnomalyData<'data>

§

impl<'data> Send for AnomalyData<'data>

§

impl<'data> Sync for AnomalyData<'data>

§

impl<'data> Unpin for AnomalyData<'data>

§

impl<'data> UnwindSafe for AnomalyData<'data>

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/avm_server/struct.AquaVMRuntimeLimits.html b/avm_server/struct.AquaVMRuntimeLimits.html new file mode 100644 index 00000000..3cace76e --- /dev/null +++ b/avm_server/struct.AquaVMRuntimeLimits.html @@ -0,0 +1,47 @@ +AquaVMRuntimeLimits in avm_server - Rust

Struct avm_server::AquaVMRuntimeLimits

source ·
pub struct AquaVMRuntimeLimits {
+    pub air_size_limit: u64,
+    pub particle_size_limit: u64,
+    pub call_result_size_limit: u64,
+    pub hard_limit_enabled: bool,
+}

Fields§

§air_size_limit: u64§particle_size_limit: u64

The particle data size limit.

+
§call_result_size_limit: u64

This is the limit for the size of service call result.

+
§hard_limit_enabled: bool

This knob controls hard RAM limits behavior for AVMRunner.

+

Implementations§

source§

impl AquaVMRuntimeLimits

source

pub fn new( + air_size_limit: u64, + particle_size_limit: u64, + call_result_size_limit: u64, + hard_limit_enabled: bool, +) -> Self

Trait Implementations§

source§

impl Clone for AquaVMRuntimeLimits

source§

fn clone(&self) -> AquaVMRuntimeLimits

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for AquaVMRuntimeLimits

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl From<AVMRuntimeLimits> for AquaVMRuntimeLimits

source§

fn from(value: AVMRuntimeLimits) -> Self

Converts to this type from the input type.
source§

impl Copy for AquaVMRuntimeLimits

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
source§

impl<T> CloneToUninit for T
where + T: Copy,

source§

unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
\ No newline at end of file diff --git a/avm_server/struct.CallRequestParams.html b/avm_server/struct.CallRequestParams.html new file mode 100644 index 00000000..f9a14952 --- /dev/null +++ b/avm_server/struct.CallRequestParams.html @@ -0,0 +1,67 @@ +CallRequestParams in avm_server - Rust

Struct avm_server::CallRequestParams

source ·
pub struct CallRequestParams {
+    pub service_id: String,
+    pub function_name: String,
+    pub arguments: Vec<Value>,
+    pub tetraplets: Vec<Vec<SecurityTetraplet>>,
+}
Expand description

Contains arguments of a call instruction and all other necessary information +required for calling a service.

+

Fields§

§service_id: String

Id of a service that should be called.

+
§function_name: String

Name of a function from service identified by service_id that should be called.

+
§arguments: Vec<Value>

Arguments that should be passed to the function.

+
§tetraplets: Vec<Vec<SecurityTetraplet>>

Tetraplets that should be passed to the service.

+

Implementations§

source§

impl CallRequestParams

source

pub fn new( + service_id: impl Into<String>, + function_name: impl Into<String>, + arguments: Vec<Value>, + tetraplets: Vec<Vec<SecurityTetraplet>>, +) -> CallRequestParams

Trait Implementations§

source§

impl Clone for CallRequestParams

source§

fn clone(&self) -> CallRequestParams

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for CallRequestParams

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
source§

impl<'de> Deserialize<'de> for CallRequestParams

source§

fn deserialize<__D>( + __deserializer: __D, +) -> Result<CallRequestParams, <__D as Deserializer<'de>>::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl PartialEq for CallRequestParams

source§

fn eq(&self, other: &CallRequestParams) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl Serialize for CallRequestParams

source§

fn serialize<__S>( + &self, + __serializer: __S, +) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Eq for CallRequestParams

source§

impl StructuralPartialEq for CallRequestParams

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/avm_server/struct.CallServiceResult.html b/avm_server/struct.CallServiceResult.html new file mode 100644 index 00000000..aaaa7a14 --- /dev/null +++ b/avm_server/struct.CallServiceResult.html @@ -0,0 +1,58 @@ +CallServiceResult in avm_server - Rust

Struct avm_server::CallServiceResult

source ·
pub struct CallServiceResult {
+    pub ret_code: i32,
+    pub result: Value,
+}
Expand description

Represents an executed host function result.

+

Fields§

§ret_code: i32

A error code service or builtin returned, where CALL_SERVICE_SUCCESS represents success.

+
§result: Value

Resulted JValue returned by a service string.

+

Implementations§

Trait Implementations§

source§

impl Clone for CallServiceResult

source§

fn clone(&self) -> CallServiceResult

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for CallServiceResult

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
source§

impl Default for CallServiceResult

source§

fn default() -> CallServiceResult

Returns the “default value” for a type. Read more
source§

impl<'de> Deserialize<'de> for CallServiceResult

source§

fn deserialize<__D>( + __deserializer: __D, +) -> Result<CallServiceResult, <__D as Deserializer<'de>>::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl Display for CallServiceResult

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
source§

impl PartialEq for CallServiceResult

source§

fn eq(&self, other: &CallServiceResult) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl Serialize for CallServiceResult

source§

fn serialize<__S>( + &self, + __serializer: __S, +) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Eq for CallServiceResult

source§

impl StructuralPartialEq for CallServiceResult

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/avm_server/struct.ErrorAVMOutcome.html b/avm_server/struct.ErrorAVMOutcome.html new file mode 100644 index 00000000..5f7c20a9 --- /dev/null +++ b/avm_server/struct.ErrorAVMOutcome.html @@ -0,0 +1,55 @@ +ErrorAVMOutcome in avm_server - Rust

Struct avm_server::ErrorAVMOutcome

source ·
pub struct ErrorAVMOutcome {
+    pub error_code: i64,
+    pub error_message: String,
+    pub outcome: AVMOutcome,
+}

Fields§

§error_code: i64§error_message: String§outcome: AVMOutcome

Trait Implementations§

source§

impl Clone for ErrorAVMOutcome

source§

fn clone(&self) -> ErrorAVMOutcome

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for ErrorAVMOutcome

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
source§

impl<'de> Deserialize<'de> for ErrorAVMOutcome

source§

fn deserialize<__D>( + __deserializer: __D, +) -> Result<ErrorAVMOutcome, <__D as Deserializer<'de>>::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl PartialEq for ErrorAVMOutcome

source§

fn eq(&self, other: &ErrorAVMOutcome) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl Serialize for ErrorAVMOutcome

source§

fn serialize<__S>( + &self, + __serializer: __S, +) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Eq for ErrorAVMOutcome

source§

impl StructuralPartialEq for ErrorAVMOutcome

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/avm_server/struct.ParticleParameters.html b/avm_server/struct.ParticleParameters.html new file mode 100644 index 00000000..a978da51 --- /dev/null +++ b/avm_server/struct.ParticleParameters.html @@ -0,0 +1,54 @@ +ParticleParameters in avm_server - Rust

Struct avm_server::ParticleParameters

source ·
pub struct ParticleParameters<'ctx> {
+    pub init_peer_id: Cow<'ctx, str>,
+    pub particle_id: Cow<'ctx, str>,
+    pub timestamp: u64,
+    pub ttl: u32,
+    pub current_peer_id: Cow<'ctx, str>,
+}
Expand description

Represents parameters obtained from a particle.

+

Fields§

§init_peer_id: Cow<'ctx, str>§particle_id: Cow<'ctx, str>§timestamp: u64§ttl: u32§current_peer_id: Cow<'ctx, str>

Implementations§

source§

impl<'ctx> ParticleParameters<'ctx>

source

pub fn new( + init_peer_id: Cow<'ctx, str>, + particle_id: Cow<'ctx, str>, + timestamp: u64, + ttl: u32, + current_peer_id: Cow<'ctx, str>, +) -> ParticleParameters<'ctx>

Trait Implementations§

source§

impl<'ctx> Clone for ParticleParameters<'ctx>

source§

fn clone(&self) -> ParticleParameters<'ctx>

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl<'ctx> Debug for ParticleParameters<'ctx>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
source§

impl<'de, 'ctx> Deserialize<'de> for ParticleParameters<'ctx>

source§

fn deserialize<__D>( + __deserializer: __D, +) -> Result<ParticleParameters<'ctx>, <__D as Deserializer<'de>>::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl<'ctx> Serialize for ParticleParameters<'ctx>

source§

fn serialize<__S>( + &self, + __serializer: __S, +) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more

Auto Trait Implementations§

§

impl<'ctx> Freeze for ParticleParameters<'ctx>

§

impl<'ctx> RefUnwindSafe for ParticleParameters<'ctx>

§

impl<'ctx> Send for ParticleParameters<'ctx>

§

impl<'ctx> Sync for ParticleParameters<'ctx>

§

impl<'ctx> Unpin for ParticleParameters<'ctx>

§

impl<'ctx> UnwindSafe for ParticleParameters<'ctx>

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/avm_server/struct.SecurityTetraplet.html b/avm_server/struct.SecurityTetraplet.html new file mode 100644 index 00000000..c50d757a --- /dev/null +++ b/avm_server/struct.SecurityTetraplet.html @@ -0,0 +1,114 @@ +SecurityTetraplet in avm_server - Rust

Struct avm_server::SecurityTetraplet

pub struct SecurityTetraplet {
+    pub peer_pk: String,
+    pub service_id: String,
+    pub function_name: String,
+    pub lens: String,
+}
Expand description

Describes an origin that set corresponding value.

+

Fields§

§peer_pk: String

Id of a peer where corresponding value was set.

+
§service_id: String

Id of a service that set corresponding value.

+
§function_name: String

Name of a function that returned corresponding value.

+
§lens: String

Value was produced by applying this lens to the output from call_service.

+

Implementations§

§

impl SecurityTetraplet

pub fn new( + peer_pk: impl Into<String>, + service_id: impl Into<String>, + function_name: impl Into<String>, + lens: impl Into<String>, +) -> SecurityTetraplet

pub fn literal_tetraplet(init_peer_id: impl Into<String>) -> SecurityTetraplet

Create a tetraplet for string literals defined in the script +such as variable here (call ("" "") "" ["variable_1"]).

+

pub fn add_lens(&mut self, lens: &str)

Trait Implementations§

§

impl Archive for SecurityTetraplet
where + String: Archive,

§

type Archived = ArchivedSecurityTetraplet

The archived representation of this type. Read more
§

type Resolver = SecurityTetrapletResolver

The resolver for this type. It must contain all the additional information from serializing +needed to make the archived type from the normal type.
§

unsafe fn resolve( + &self, + pos: usize, + resolver: <SecurityTetraplet as Archive>::Resolver, + out: *mut <SecurityTetraplet as Archive>::Archived, +)

Creates the archived version of this value at the given position and writes it to the given +output. Read more
§

impl Clone for SecurityTetraplet

§

fn clone(&self) -> SecurityTetraplet

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
§

impl Debug for SecurityTetraplet

§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
§

impl Default for SecurityTetraplet

§

fn default() -> SecurityTetraplet

Returns the “default value” for a type. Read more
§

impl<'de> Deserialize<'de> for SecurityTetraplet

§

fn deserialize<__D>( + __deserializer: __D, +) -> Result<SecurityTetraplet, <__D as Deserializer<'de>>::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
§

impl<__D> Deserialize<SecurityTetraplet, __D> for <SecurityTetraplet as Archive>::Archived
where + __D: Fallible + ?Sized, + String: Archive, + <String as Archive>::Archived: Deserialize<String, __D>,

§

fn deserialize( + &self, + deserializer: &mut __D, +) -> Result<SecurityTetraplet, <__D as Fallible>::Error>

Deserializes using the given deserializer
§

impl Display for SecurityTetraplet

§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
source§

impl From<ResolvedTriplet> for SecurityTetraplet

source§

fn from(triplet: ResolvedTriplet) -> SecurityTetraplet

Converts to this type from the input type.
§

impl Hash for SecurityTetraplet

§

fn hash<__H>(&self, state: &mut __H)
where + __H: Hasher,

Feeds this value into the given Hasher. Read more
1.3.0 · source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
§

impl PartialEq for SecurityTetraplet

§

fn eq(&self, other: &SecurityTetraplet) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
§

impl<__S> Serialize<__S> for SecurityTetraplet
where + __S: Fallible + ?Sized, + String: Serialize<__S>,

§

fn serialize( + &self, + serializer: &mut __S, +) -> Result<<SecurityTetraplet as Archive>::Resolver, <__S as Fallible>::Error>

Writes the dependencies for the object and returns a resolver that can create the archived +type.
§

impl Serialize for SecurityTetraplet

§

fn serialize<__S>( + &self, + __serializer: __S, +) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
§

impl Eq for SecurityTetraplet

§

impl StructuralPartialEq for SecurityTetraplet

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
§

impl<T> ArchiveUnsized for T
where + T: Archive,

§

type Archived = <T as Archive>::Archived

The archived counterpart of this type. Unlike Archive, it may be unsized. Read more
§

type MetadataResolver = ()

The resolver for the metadata of this type. Read more
§

unsafe fn resolve_metadata( + &self, + _: usize, + _: <T as ArchiveUnsized>::MetadataResolver, + _: *mut <<T as ArchiveUnsized>::Archived as ArchivePointee>::ArchivedMetadata, +)

Creates the archived version of the metadata for this value at the given position and writes +it to the given output. Read more
§

unsafe fn resolve_unsized( + &self, + from: usize, + to: usize, + resolver: Self::MetadataResolver, + out: *mut RelPtr<Self::Archived, <isize as Archive>::Archived>, +)

Resolves a relative pointer to this value with the given from and to and writes it to +the given output. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CallHasher for T
where + T: Hash + ?Sized,

§

default fn get_hash<H, B>(value: &H, build_hasher: &B) -> u64
where + H: Hash + ?Sized, + B: BuildHasher,

source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
§

impl<T, S> SerializeUnsized<S> for T
where + T: Serialize<S>, + S: Serializer + ?Sized,

§

fn serialize_unsized( + &self, + serializer: &mut S, +) -> Result<usize, <S as Fallible>::Error>

Writes the object and returns the position of the archived type.
§

fn serialize_metadata(&self, _: &mut S) -> Result<(), <S as Fallible>::Error>

Serializes the metadata for the given type.
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/avm_server/struct.SoftLimitsTriggering.html b/avm_server/struct.SoftLimitsTriggering.html new file mode 100644 index 00000000..94bbf9bc --- /dev/null +++ b/avm_server/struct.SoftLimitsTriggering.html @@ -0,0 +1,61 @@ +SoftLimitsTriggering in avm_server - Rust

Struct avm_server::SoftLimitsTriggering

source ·
pub struct SoftLimitsTriggering {
+    pub air_size_limit_exceeded: bool,
+    pub particle_size_limit_exceeded: bool,
+    pub call_result_size_limit_exceeded: bool,
+}
Expand description

This stores soft limits triggering flags.

+

Fields§

§air_size_limit_exceeded: bool§particle_size_limit_exceeded: bool§call_result_size_limit_exceeded: bool

Implementations§

source§

impl SoftLimitsTriggering

source

pub fn new( + air_size_limit_exceeded: bool, + particle_size_limit_exceeded: bool, + call_result_size_limit_exceeded: bool, +) -> SoftLimitsTriggering

source

pub fn are_limits_exceeded(&self) -> bool

Trait Implementations§

source§

impl Clone for SoftLimitsTriggering

source§

fn clone(&self) -> SoftLimitsTriggering

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for SoftLimitsTriggering

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
source§

impl Default for SoftLimitsTriggering

source§

fn default() -> SoftLimitsTriggering

Returns the “default value” for a type. Read more
source§

impl<'de> Deserialize<'de> for SoftLimitsTriggering

source§

fn deserialize<__D>( + __deserializer: __D, +) -> Result<SoftLimitsTriggering, <__D as Deserializer<'de>>::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl PartialEq for SoftLimitsTriggering

source§

fn eq(&self, other: &SoftLimitsTriggering) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl Serialize for SoftLimitsTriggering

source§

fn serialize<__S>( + &self, + __serializer: __S, +) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Copy for SoftLimitsTriggering

source§

impl Eq for SoftLimitsTriggering

source§

impl StructuralPartialEq for SoftLimitsTriggering

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
source§

impl<T> CloneToUninit for T
where + T: Copy,

source§

unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where + T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where + T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where + T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an +Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( + pointer: <T as Pointee>::Pointer, + f: &mut Formatter<'_>, +) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/avm_server/trait.DataStore.html b/avm_server/trait.DataStore.html new file mode 100644 index 00000000..42007a1f --- /dev/null +++ b/avm_server/trait.DataStore.html @@ -0,0 +1,69 @@ +DataStore in avm_server - Rust

Trait avm_server::DataStore

source ·
pub trait DataStore {
+    type Error;
+
+    // Required methods
+    fn initialize(&mut self) -> Result<(), Self::Error>;
+    fn store_data(
+        &mut self,
+        data: &[u8],
+        particle_id: &str,
+        current_peer_id: &str,
+    ) -> Result<(), Self::Error>;
+    fn read_data(
+        &mut self,
+        particle_id: &str,
+        current_peer_id: &str,
+    ) -> Result<Vec<u8>, Self::Error>;
+    fn cleanup_data(
+        &mut self,
+        particle_id: &str,
+        current_peer_id: &str,
+    ) -> Result<(), Self::Error>;
+    fn detect_anomaly(
+        &self,
+        execution_time: Duration,
+        memory_delta: usize,
+        outcome: &RawAVMOutcome,
+    ) -> bool;
+    fn collect_anomaly_data(
+        &mut self,
+        particle_id: &str,
+        current_peer_id: &str,
+        anomaly_data: AnomalyData<'_>,
+    ) -> Result<(), Self::Error>;
+}
Expand description

This trait is used for

+
    +
  • persisting prev_data between successive calls of an interpreter
  • +
  • logging previous, current, and new data in case of spikes
  • +
+

Required Associated Types§

Required Methods§

source

fn initialize(&mut self) -> Result<(), Self::Error>

source

fn store_data( + &mut self, + data: &[u8], + particle_id: &str, + current_peer_id: &str, +) -> Result<(), Self::Error>

source

fn read_data( + &mut self, + particle_id: &str, + current_peer_id: &str, +) -> Result<Vec<u8>, Self::Error>

source

fn cleanup_data( + &mut self, + particle_id: &str, + current_peer_id: &str, +) -> Result<(), Self::Error>

Cleanup data that become obsolete.

+
source

fn detect_anomaly( + &self, + execution_time: Duration, + memory_delta: usize, + outcome: &RawAVMOutcome, +) -> bool

Returns true if an anomaly happened and it’s necessary to save execution data +for debugging purposes. +execution_time - time taken by the interpreter to execute provided script +memory_delta - count of bytes on which an interpreter heap has been extended +during execution of a particle +outcome - a result of AquaVM invocation

+
source

fn collect_anomaly_data( + &mut self, + particle_id: &str, + current_peer_id: &str, + anomaly_data: AnomalyData<'_>, +) -> Result<(), Self::Error>

Implementors§

\ No newline at end of file diff --git a/avm_server/type.AVMDataStore.html b/avm_server/type.AVMDataStore.html new file mode 100644 index 00000000..d7778d6d --- /dev/null +++ b/avm_server/type.AVMDataStore.html @@ -0,0 +1 @@ +AVMDataStore in avm_server - Rust

Type Alias avm_server::AVMDataStore

source ·
pub type AVMDataStore<E> = Box<dyn DataStore<Error = E> + Send + Sync + 'static>;

Aliased Type§

struct AVMDataStore<E>(/* private fields */);
\ No newline at end of file diff --git a/avm_server/type.AVMResult.html b/avm_server/type.AVMResult.html new file mode 100644 index 00000000..07e34926 --- /dev/null +++ b/avm_server/type.AVMResult.html @@ -0,0 +1,6 @@ +AVMResult in avm_server - Rust

Type Alias avm_server::AVMResult

source ·
pub type AVMResult<T, E> = Result<T, AVMError<E>>;

Aliased Type§

enum AVMResult<T, E> {
+    Ok(T),
+    Err(AVMError<E>),
+}

Variants§

§1.0.0

Ok(T)

Contains the success value

+
§1.0.0

Err(AVMError<E>)

Contains the error value

+
\ No newline at end of file diff --git a/avm_server/type.CallRequests.html b/avm_server/type.CallRequests.html new file mode 100644 index 00000000..e5991376 --- /dev/null +++ b/avm_server/type.CallRequests.html @@ -0,0 +1 @@ +CallRequests in avm_server - Rust

Type Alias avm_server::CallRequests

source ·
pub type CallRequests = HashMap<u32, CallRequestParams>;

Aliased Type§

struct CallRequests { /* private fields */ }
\ No newline at end of file diff --git a/avm_server/type.CallResults.html b/avm_server/type.CallResults.html new file mode 100644 index 00000000..b4569084 --- /dev/null +++ b/avm_server/type.CallResults.html @@ -0,0 +1 @@ +CallResults in avm_server - Rust

Type Alias avm_server::CallResults

source ·
pub type CallResults = HashMap<u32, CallServiceResult>;

Aliased Type§

struct CallResults { /* private fields */ }
\ No newline at end of file diff --git a/avm_server/type.HostExportedFunc.html b/avm_server/type.HostExportedFunc.html new file mode 100644 index 00000000..8cc37bc7 --- /dev/null +++ b/avm_server/type.HostExportedFunc.html @@ -0,0 +1 @@ +HostExportedFunc in avm_server - Rust

Type Alias avm_server::HostExportedFunc

pub type HostExportedFunc = Box<dyn for<'c> Fn(&mut <WasmtimeWasmBackend as WasmBackend>::ImportCallContext<'c>, Vec<IValue>) -> Option<IValue> + Sync + Send>;

Aliased Type§

struct HostExportedFunc(/* private fields */);
\ No newline at end of file diff --git a/avm_server/type.HostImportDescriptor.html b/avm_server/type.HostImportDescriptor.html new file mode 100644 index 00000000..ed7534fa --- /dev/null +++ b/avm_server/type.HostImportDescriptor.html @@ -0,0 +1,11 @@ +HostImportDescriptor in avm_server - Rust

Type Alias avm_server::HostImportDescriptor

pub type HostImportDescriptor = HostImportDescriptor<WasmtimeWasmBackend>;

Aliased Type§

struct HostImportDescriptor {
+    pub host_exported_func: Box<dyn for<'c> Fn(&mut WasmtimeImportCallContext<'c>, Vec<IValue>) -> Option<IValue> + Sync + Send>,
+    pub argument_types: Vec<IType>,
+    pub output_type: Option<IType>,
+    pub error_handler: Option<Box<dyn Fn(&HostImportError) -> Option<IValue> + Sync + Send>>,
+}

Fields§

§host_exported_func: Box<dyn for<'c> Fn(&mut WasmtimeImportCallContext<'c>, Vec<IValue>) -> Option<IValue> + Sync + Send>

This closure will be invoked for corresponding import.

+
§argument_types: Vec<IType>

Type of the closure arguments.

+
§output_type: Option<IType>

Types of output of the closure.

+
§error_handler: Option<Box<dyn Fn(&HostImportError) -> Option<IValue> + Sync + Send>>

If Some, this closure is called with error when errors is encountered while lifting. +If None, panic will occur.

+
\ No newline at end of file diff --git a/avm_server/type.RunnerResult.html b/avm_server/type.RunnerResult.html new file mode 100644 index 00000000..31453ca6 --- /dev/null +++ b/avm_server/type.RunnerResult.html @@ -0,0 +1,6 @@ +RunnerResult in avm_server - Rust

Type Alias avm_server::RunnerResult

source ·
pub type RunnerResult<T> = Result<T, RunnerError>;

Aliased Type§

enum RunnerResult<T> {
+    Ok(T),
+    Err(RunnerError),
+}

Variants§

§1.0.0

Ok(T)

Contains the success value

+
§1.0.0

Err(RunnerError)

Contains the error value

+
\ No newline at end of file diff --git a/crates.js b/crates.js new file mode 100644 index 00000000..98261103 --- /dev/null +++ b/crates.js @@ -0,0 +1 @@ +window.ALL_CRATES = ["air","air_beautifier","air_beautify_wasm","air_execution_info_collector","air_interpreter_cid","air_interpreter_client","air_interpreter_data","air_interpreter_interface","air_interpreter_sede","air_interpreter_server","air_interpreter_signatures","air_interpreter_value","air_lambda_ast","air_lambda_parser","air_log_targets","air_parser","air_test_framework","air_test_utils","air_trace_handler","air_utils","avm_data_store","avm_interface","avm_server","polyplets"]; \ No newline at end of file diff --git a/help.html b/help.html new file mode 100644 index 00000000..ed0bee50 --- /dev/null +++ b/help.html @@ -0,0 +1 @@ +Help

Rustdoc help

Back
\ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 00000000..b219c56b --- /dev/null +++ b/index.html @@ -0,0 +1 @@ +Index of crates
\ No newline at end of file diff --git a/polyplets/all.html b/polyplets/all.html new file mode 100644 index 00000000..9b8c1571 --- /dev/null +++ b/polyplets/all.html @@ -0,0 +1 @@ +List of all items in this crate

List of all items

Structs

\ No newline at end of file diff --git a/polyplets/index.html b/polyplets/index.html new file mode 100644 index 00000000..5d292c0e --- /dev/null +++ b/polyplets/index.html @@ -0,0 +1,4 @@ +polyplets - Rust

Crate polyplets

source ·

Structs§

  • ResolvedTriplet represents peer network location with all +variables, literals and etc resolved into final string. +This structure contains a subset of values that +SecurityTetraplet consists of.
  • Describes an origin that set corresponding value.
\ No newline at end of file diff --git a/polyplets/sidebar-items.js b/polyplets/sidebar-items.js new file mode 100644 index 00000000..b26c7adf --- /dev/null +++ b/polyplets/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"struct":["ResolvedTriplet","SecurityTetraplet"]}; \ No newline at end of file diff --git a/polyplets/struct.ResolvedTriplet.html b/polyplets/struct.ResolvedTriplet.html new file mode 100644 index 00000000..bac4c3ad --- /dev/null +++ b/polyplets/struct.ResolvedTriplet.html @@ -0,0 +1,39 @@ +ResolvedTriplet in polyplets - Rust

Struct polyplets::ResolvedTriplet

source ·
pub struct ResolvedTriplet {
+    pub peer_pk: String,
+    pub service_id: String,
+    pub function_name: String,
+}
Expand description

ResolvedTriplet represents peer network location with all +variables, literals and etc resolved into final string. +This structure contains a subset of values that +SecurityTetraplet consists of.

+

Fields§

§peer_pk: String§service_id: String§function_name: String

Trait Implementations§

source§

impl Clone for ResolvedTriplet

source§

fn clone(&self) -> ResolvedTriplet

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for ResolvedTriplet

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Default for ResolvedTriplet

source§

fn default() -> ResolvedTriplet

Returns the “default value” for a type. Read more
source§

impl<'de> Deserialize<'de> for ResolvedTriplet

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl From<ResolvedTriplet> for SecurityTetraplet

source§

fn from(triplet: ResolvedTriplet) -> Self

Converts to this type from the input type.
source§

impl Hash for ResolvedTriplet

source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
source§

impl PartialEq for ResolvedTriplet

source§

fn eq(&self, other: &ResolvedTriplet) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl Serialize for ResolvedTriplet

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Eq for ResolvedTriplet

source§

impl StructuralPartialEq for ResolvedTriplet

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CallHasher for T
where + T: Hash + ?Sized,

§

default fn get_hash<H, B>(value: &H, build_hasher: &B) -> u64
where + H: Hash + ?Sized, + B: BuildHasher,

source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/polyplets/struct.SecurityTetraplet.html b/polyplets/struct.SecurityTetraplet.html new file mode 100644 index 00000000..acfd78c7 --- /dev/null +++ b/polyplets/struct.SecurityTetraplet.html @@ -0,0 +1,94 @@ +SecurityTetraplet in polyplets - Rust

Struct polyplets::SecurityTetraplet

pub struct SecurityTetraplet {
+    pub peer_pk: String,
+    pub service_id: String,
+    pub function_name: String,
+    pub lens: String,
+}
Expand description

Describes an origin that set corresponding value.

+

Fields§

§peer_pk: String

Id of a peer where corresponding value was set.

+
§service_id: String

Id of a service that set corresponding value.

+
§function_name: String

Name of a function that returned corresponding value.

+
§lens: String

Value was produced by applying this lens to the output from call_service.

+

Implementations§

§

impl SecurityTetraplet

pub fn new( + peer_pk: impl Into<String>, + service_id: impl Into<String>, + function_name: impl Into<String>, + lens: impl Into<String>, +) -> SecurityTetraplet

pub fn literal_tetraplet(init_peer_id: impl Into<String>) -> SecurityTetraplet

Create a tetraplet for string literals defined in the script +such as variable here (call ("" "") "" ["variable_1"]).

+

pub fn add_lens(&mut self, lens: &str)

Trait Implementations§

§

impl Archive for SecurityTetraplet
where + String: Archive,

§

type Archived = ArchivedSecurityTetraplet

The archived representation of this type. Read more
§

type Resolver = SecurityTetrapletResolver

The resolver for this type. It must contain all the additional information from serializing +needed to make the archived type from the normal type.
§

unsafe fn resolve( + &self, + pos: usize, + resolver: <SecurityTetraplet as Archive>::Resolver, + out: *mut <SecurityTetraplet as Archive>::Archived, +)

Creates the archived version of this value at the given position and writes it to the given +output. Read more
§

impl Clone for SecurityTetraplet

§

fn clone(&self) -> SecurityTetraplet

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
§

impl Debug for SecurityTetraplet

§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
§

impl Default for SecurityTetraplet

§

fn default() -> SecurityTetraplet

Returns the “default value” for a type. Read more
§

impl<'de> Deserialize<'de> for SecurityTetraplet

§

fn deserialize<__D>( + __deserializer: __D, +) -> Result<SecurityTetraplet, <__D as Deserializer<'de>>::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
§

impl<__D> Deserialize<SecurityTetraplet, __D> for <SecurityTetraplet as Archive>::Archived
where + __D: Fallible + ?Sized, + String: Archive, + <String as Archive>::Archived: Deserialize<String, __D>,

§

fn deserialize( + &self, + deserializer: &mut __D, +) -> Result<SecurityTetraplet, <__D as Fallible>::Error>

Deserializes using the given deserializer
§

impl Display for SecurityTetraplet

§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
source§

impl From<ResolvedTriplet> for SecurityTetraplet

source§

fn from(triplet: ResolvedTriplet) -> Self

Converts to this type from the input type.
§

impl Hash for SecurityTetraplet

§

fn hash<__H>(&self, state: &mut __H)
where + __H: Hasher,

Feeds this value into the given Hasher. Read more
1.3.0 · source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
§

impl PartialEq for SecurityTetraplet

§

fn eq(&self, other: &SecurityTetraplet) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
§

impl<__S> Serialize<__S> for SecurityTetraplet
where + __S: Fallible + ?Sized, + String: Serialize<__S>,

§

fn serialize( + &self, + serializer: &mut __S, +) -> Result<<SecurityTetraplet as Archive>::Resolver, <__S as Fallible>::Error>

Writes the dependencies for the object and returns a resolver that can create the archived +type.
§

impl Serialize for SecurityTetraplet

§

fn serialize<__S>( + &self, + __serializer: __S, +) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
§

impl Eq for SecurityTetraplet

§

impl StructuralPartialEq for SecurityTetraplet

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( + _: &<T as ArchivePointee>::ArchivedMetadata, +) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
§

impl<T> ArchiveUnsized for T
where + T: Archive,

§

type Archived = <T as Archive>::Archived

The archived counterpart of this type. Unlike Archive, it may be unsized. Read more
§

type MetadataResolver = ()

The resolver for the metadata of this type. Read more
§

unsafe fn resolve_metadata( + &self, + _: usize, + _: <T as ArchiveUnsized>::MetadataResolver, + _: *mut <<T as ArchiveUnsized>::Archived as ArchivePointee>::ArchivedMetadata, +)

Creates the archived version of the metadata for this value at the given position and writes +it to the given output. Read more
§

unsafe fn resolve_unsized( + &self, + from: usize, + to: usize, + resolver: Self::MetadataResolver, + out: *mut RelPtr<Self::Archived, <isize as Archive>::Archived>, +)

Resolves a relative pointer to this value with the given from and to and writes it to +the given output. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CallHasher for T
where + T: Hash + ?Sized,

§

default fn get_hash<H, B>(value: &H, build_hasher: &B) -> u64
where + H: Hash + ?Sized, + B: BuildHasher,

source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where + W: DeserializeWith<F, T, D>, + D: Fallible + ?Sized, + F: ?Sized,

§

fn deserialize( + &self, + deserializer: &mut D, +) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
source§

impl<T, U> Into<U> for T
where + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T, S> SerializeUnsized<S> for T
where + T: Serialize<S>, + S: Serializer + ?Sized,

§

fn serialize_unsized( + &self, + serializer: &mut S, +) -> Result<usize, <S as Fallible>::Error>

Writes the object and returns the position of the archived type.
§

fn serialize_metadata(&self, _: &mut S) -> Result<(), <S as Fallible>::Error>

Serializes the metadata for the given type.
source§

impl<T> ToOwned for T
where + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T> ToString for T
where + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/polyplets/triplet/struct.ResolvedTriplet.html b/polyplets/triplet/struct.ResolvedTriplet.html new file mode 100644 index 00000000..c1d8d370 --- /dev/null +++ b/polyplets/triplet/struct.ResolvedTriplet.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../polyplets/struct.ResolvedTriplet.html...

+ + + \ No newline at end of file diff --git a/search-index.js b/search-index.js new file mode 100644 index 00000000..c443fc83 --- /dev/null +++ b/search-index.js @@ -0,0 +1,28 @@ +var searchIndex = new Map(JSON.parse('[\ +["air",{"t":"PFPPPGNNNNCNNNNNNCNNNNNNNNNNNNNNNNNNNNNNNNNNHNNNNNNOCNNNNNNNNNNNNFNNHNNHNNNNNNNNNNNNONONNNOONHNNNNNNNFGFPPONNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNHONNNNNNOONNNNNNNNNHNNNNNNNNNNNNNNNNNOCCCPFFGFPPGPOONNNNNNNNNNNNNNNNNNONNNNNNHCNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNHNNNNNOONNNNNHHHOOCONNNNNONNNNNOHOHCONNNNNONONNNNNNNNNNNNNNNNNNNNNNNNNNNNCOFOCNNONNNNNNNNNNNOCNONONNNNFONNNNNNNNNNNNNNNNNNNNHNNNNNNNNNSFOONNNNOOONNNNNNNNNNNONONNHNOONOHHNONNONNNNFONNNHNNNNNNNNNNNNNNNNNNKKFONNOMNNNNNNNNNNNNONNNNNNONNMNNNNNFNNNHNNNNNNNNNNNNNNNNNNFNNNNNNNNNNNNNNNNNNNCNNOHHCNOHONNNNNNPFPFFFGPFONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOONNNNNNNNNNNNNNNNNNNOOOOOOOONNNNNNNNNNNNNNNNNNNNNONNNNNNFNNNONNNNNNNNNNNNNNNNNNNNHH","n":["Beautify","Cli","Data","Run","Stats","Subcommand","augment_args","augment_args_for_update","augment_subcommands","augment_subcommands_for_update","beautify","borrow","borrow","borrow_mut","borrow_mut","command","command_for_update","data","debug","debug","deref","deref","deref_mut","deref_mut","deserialize","deserialize","drop","drop","from","from","from_arg_matches","from_arg_matches","from_arg_matches_mut","from_arg_matches_mut","get_fd_flags","get_fd_flags","group_id","has_subcommand","init","init","into","into","layout_raw","layout_raw","main","new_set_fd_flags","new_set_fd_flags","pointer_metadata","pointer_metadata","set_fd_flags","set_fd_flags","subcommand","trace","try_from","try_from","try_into","try_into","type_id","type_id","update_from_arg_matches","update_from_arg_matches","update_from_arg_matches_mut","update_from_arg_matches_mut","vzip","vzip","Args","augment_args","augment_args_for_update","beautify","borrow","borrow_mut","build_output","command","command_for_update","debug","deref","deref_mut","deserialize","drop","from","from_arg_matches","from_arg_matches_mut","get_fd_flags","group_id","indent_step","init","input","into","layout_raw","new_set_fd_flags","output","patterns","pointer_metadata","read_script","set_fd_flags","try_from","try_into","type_id","update_from_arg_matches","update_from_arg_matches_mut","vzip","Args","Mode","ModeArgs","Native","Wasm","air_interpreter_path","augment_args","augment_args","augment_args_for_update","augment_args_for_update","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","clone","clone_into","clone_to_uninit","clone_to_uninit","command","command_for_update","create_runner","debug","debug","debug","deref","deref","deref","deref_mut","deref_mut","deref_mut","deserialize","deserialize","deserialize","drop","drop","drop","fmt","from","from","from","from_arg_matches","from_arg_matches","from_arg_matches_mut","from_arg_matches_mut","get_fd_flags","get_fd_flags","get_fd_flags","group_id","group_id","init","init","init","init_tracing","input","into","into","into","layout_raw","layout_raw","layout_raw","mode","native","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","pointer_metadata","pointer_metadata","pointer_metadata","set_fd_flags","set_fd_flags","set_fd_flags","to_human_readable_data","to_owned","try_from","try_from","try_from","try_into","try_into","try_into","type_id","type_id","type_id","update_from_arg_matches","update_from_arg_matches","update_from_arg_matches_mut","update_from_arg_matches_mut","vzip","vzip","vzip","wasm","run","stats","utils","Anomaly","Args","Keys","Mode","ModeArgs","Native","PlainData","Source","Wasm","air_interpreter_path","air_near_contract_path","augment_args","augment_args","augment_args","augment_args_for_update","augment_args_for_update","augment_args_for_update","augment_subcommands","augment_subcommands_for_update","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","call_results_path","clone","clone_into","clone_to_uninit","clone_to_uninit","command","command_for_update","create_runner","data","debug","debug","debug","debug","debug","deref","deref","deref","deref","deref","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deserialize","deserialize","deserialize","deserialize","deserialize","drop","drop","drop","drop","drop","ed25519_key","fmt","fmt","fmt","fmt","from","from","from","from","from","from_arg_matches","from_arg_matches","from_arg_matches","from_arg_matches","from_arg_matches_mut","from_arg_matches_mut","from_arg_matches_mut","from_arg_matches_mut","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_keypair","group_id","group_id","group_id","has_subcommand","init","init","init","init","init","init_tracing","into","into","into","into","into","json","keys","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","load_data","load_data_or_default","load_keypair_ed25519","max_heap_size","mode","native","native","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","no_fail","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","random_key","read_call_results","repeat","run","runner","runner_tracing_params","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","source","to_owned","tracing_params","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","update_from_arg_matches","update_from_arg_matches","update_from_arg_matches","update_from_arg_matches","update_from_arg_matches_mut","update_from_arg_matches_mut","update_from_arg_matches_mut","update_from_arg_matches_mut","vzip","vzip","vzip","vzip","vzip","wasm","wasm","ExecutionData","air_script","anomaly","borrow","borrow_mut","current_data","debug","deref","deref_mut","deserialize","drop","from","get_fd_flags","init","into","layout_raw","new_set_fd_flags","particle","plain","pointer_metadata","prev_data","set_fd_flags","test_init_parameters","try_from","try_into","type_id","vzip","AnomalyDataArgs","anomaly_data_path","augment_args","augment_args_for_update","borrow","borrow_mut","command","command_for_update","debug","deref","deref_mut","deserialize","drop","fmt","from","from_arg_matches","from_arg_matches_mut","get_fd_flags","group_id","init","into","layout_raw","load","new_set_fd_flags","pointer_metadata","set_fd_flags","try_from","try_into","type_id","update_from_arg_matches","update_from_arg_matches_mut","vzip","DEFAULT_DATA","PlainDataArgs","air_script_path","air_size_limit","augment_args","augment_args_for_update","borrow","borrow_mut","call_result_size_limit","current_data_path","current_peer_id","debug","deref","deref_mut","deserialize","drop","fmt","from","from_arg_matches","from_arg_matches_mut","get_fd_flags","group_id","hard_limit_enabled","init","init_peer_id","into","layout_raw","load","new_set_fd_flags","particle_id","particle_size_limit","pointer_metadata","prev_data_path","print_air_prompt","read_air_with_prompt","set_fd_flags","timestamp","try_from","try_into","ttl","type_id","update_from_arg_matches","update_from_arg_matches_mut","vzip","NativeAvmRunner","aquavm_runtime_limits","borrow","borrow_mut","call_tracing","create_native_avm_runner","debug","deref","deref_mut","deserialize","drop","from","get_fd_flags","init","into","layout_raw","new_set_fd_flags","pointer_metadata","set_fd_flags","to_human_readable","try_from","try_into","type_id","vzip","AirRunner","DataToHumanReadable","TestInitParameters","air_size_limit","borrow","borrow_mut","call_result_size_limit","call_tracing","clone","clone_into","clone_to_uninit","debug","default","deref","deref_mut","deserialize","drop","fmt","from","get_fd_flags","hard_limit_enabled","init","into","layout_raw","new","new_set_fd_flags","no_limits","particle_size_limit","pointer_metadata","set_fd_flags","to_human_readable","to_owned","try_from","try_into","type_id","vzip","WasmAvmRunner","borrow","borrow_mut","call_tracing","create_wasm_avm_runner","debug","deref","deref_mut","deserialize","drop","from","get_fd_flags","init","into","layout_raw","new_set_fd_flags","pointer_metadata","set_fd_flags","to_human_readable","try_from","try_into","type_id","vzip","Args","augment_args","augment_args_for_update","borrow","borrow_mut","command","command_for_update","debug","deref","deref_mut","deserialize","drop","from","from_arg_matches","from_arg_matches_mut","get_fd_flags","group_id","init","into","layout_raw","log_data","new_set_fd_flags","pointer_metadata","pretty","print_log_record","read_logs","report","set_fd_flags","sort_stats_by_duration","stats","stats","try_from","try_into","type_id","update_from_arg_matches","update_from_arg_matches_mut","vzip","Close","CloseMessage","Enter","LogKey","LogRecord","LogValue","Message","New","Span","args","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","cmp","compare","debug","debug","debug","debug","debug","debug","deref","deref","deref","deref","deref","deref","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","drop","drop","drop","drop","drop","drop","eq","equivalent","equivalent","equivalent","equivalent","equivalent","fields","fmt","fmt","fmt","fmt","fmt","fmt","format_argument","from","from","from","from","from","from","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_hash","get_key","hash","init","init","init","init","init","init","into","into","into","into","into","into","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","level","name","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","partial_cmp","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","span","span_name","spans","target","target","time_busy","time_idle","timestamp","to_string","to_string","to_string","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","value","vzip","vzip","vzip","vzip","vzip","vzip","StatsReport","borrow","borrow_mut","consider","data","debug","default","deref","deref_mut","deserialize","drop","from","get_fd_flags","init","into","layout_raw","new","new_set_fd_flags","pointer_metadata","report","set_fd_flags","try_from","try_into","type_id","vzip","parse_tracing_duration","unix_timestamp_now"],"q":[[0,"air"],[65,"air::beautify"],[101,"air::data"],[193,"air::trace"],[196,"air::trace::run"],[367,"air::trace::run::data"],[394,"air::trace::run::data::anomaly"],[426,"air::trace::run::data::plain"],[470,"air::trace::run::native"],[494,"air::trace::run::runner"],[530,"air::trace::run::wasm"],[553,"air::trace::stats"],[590,"air::trace::stats::log_data"],[753,"air::trace::stats::report"],[778,"air::trace::utils"],[780,"clap_builder::builder::command"],[781,"core::fmt"],[782,"core::result"],[783,"rkyv::with"],[784,"clap_builder::parser::matches::arg_matches"],[785,"clap_builder"],[786,"system_interface::fs::fd_flags"],[787,"std::io::error"],[788,"clap_builder::util::id"],[789,"core::option"],[790,"core::alloc::layout"],[791,"core::error"],[792,"alloc::boxed"],[793,"io_lifetimes::portability"],[794,"core::any"],[795,"eyre"],[796,"std::io"],[797,"alloc::string"],[798,"std::path"],[799,"fluence_keypair::key_pair"],[800,"alloc::vec"],[801,"core::convert"],[802,"avm_interface::call_service_result"],[803,"avm_interface::raw_outcome"],[804,"futures_core::future"],[805,"core::iter::traits::iterator"],[806,"core::cmp"],[807,"serde::de"],[808,"serde_json::value"],[809,"core::hash"],[810,"core::marker"],[811,"core::time"]],"i":[13,0,13,13,13,0,11,11,13,13,0,11,13,11,13,11,11,0,11,13,11,13,11,13,11,13,11,13,11,13,11,13,11,13,11,13,11,13,11,13,11,13,11,13,0,11,13,11,13,11,13,11,0,11,13,11,13,11,13,11,13,11,13,11,13,0,27,27,0,27,27,0,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,0,27,27,27,27,27,27,27,0,0,0,32,32,37,31,37,31,37,32,31,37,32,31,37,31,31,31,31,37,37,0,32,31,37,32,31,37,32,31,37,32,31,37,32,31,37,31,32,31,37,31,37,31,37,32,31,37,31,37,32,31,37,0,37,32,31,37,32,31,37,37,31,32,31,37,32,31,37,32,31,37,0,31,32,31,37,32,31,37,32,31,37,31,37,31,37,32,31,37,31,0,0,0,43,0,0,0,0,39,43,0,39,42,42,42,44,38,42,44,38,43,43,39,42,43,44,38,39,42,43,44,38,42,38,38,38,38,42,42,0,0,39,42,43,44,38,39,42,43,44,38,39,42,43,44,38,39,42,43,44,38,39,42,43,44,38,44,42,43,44,38,39,42,43,44,38,42,43,44,38,42,43,44,38,39,42,43,44,38,44,42,44,38,43,39,42,43,44,38,0,39,42,43,44,38,42,42,39,42,43,44,38,0,0,0,42,42,0,38,39,42,43,44,38,42,39,42,43,44,38,44,0,42,0,0,42,39,42,43,44,38,42,38,42,39,42,43,44,38,39,42,43,44,38,39,42,43,44,38,42,43,44,38,42,43,44,38,39,42,43,44,38,0,38,0,54,0,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,0,54,54,54,54,54,54,54,54,0,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,0,53,53,53,53,53,53,53,53,53,0,0,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,0,55,55,55,55,55,0,0,55,55,55,55,55,55,55,55,55,0,56,56,56,56,0,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,0,0,0,34,34,34,34,41,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,35,34,34,34,34,34,0,60,60,60,0,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,0,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,0,61,61,61,0,0,0,61,61,0,61,61,61,61,61,61,61,72,0,72,0,0,0,0,72,0,70,62,70,67,71,72,73,62,70,67,71,72,73,67,67,62,70,67,71,72,73,62,70,67,71,72,73,62,70,67,71,72,73,62,62,70,70,67,71,71,72,72,73,73,62,70,67,71,72,73,67,67,67,67,67,67,71,70,70,72,72,73,73,0,62,70,67,71,72,73,62,70,67,71,72,73,67,62,67,62,70,67,71,72,73,62,70,67,71,72,73,62,70,67,71,72,73,71,70,62,70,67,71,72,73,67,62,70,67,71,72,73,62,70,67,71,72,73,62,67,71,62,67,73,73,71,70,72,73,62,70,67,71,72,73,62,70,67,71,72,73,62,70,67,71,72,73,62,62,70,67,71,72,73,0,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,0,0],"f":"``````{bb}000`{{{d{c}}}{{d{e}}}{}{}}0{{{d{fc}}}{{d{fe}}}{}{}}0{{}b}0`{{{d{fh}}}{{n{jl}}}}0{A`{{d{c}}}{}}0{A`{{d{fc}}}{}}0{{{d{c}}{d{fe}}}{{n{{Ab{gi}}}}}{}{}{}{}}0{A`j}0{cc{}}0{{{d{Ad}}}{{n{AfAh}}}}{{{d{Ad}}}{{n{AjAh}}}}{{{d{fAd}}}{{n{AfAh}}}}{{{d{fAd}}}{{n{AjAh}}}}{{{d{c}}}{{n{AlAn}}}{}}0{{}{{Bb{B`}}}}{{{d{Bd}}}Bf}{{}A`}0{ce{}{}}0{{}{{n{BhBj}}}}0{{}{{n{j{Bn{Bl}}}}}}{{{d{c}}Al}{{n{{C`{e}}An}}}{}Cb}0{d}0{{{d{fc}}{C`{e}}}{{n{jAn}}}{}Cb}0``{c{{n{e}}}{}{}}000{{{d{c}}}Cd{}}0{{{d{fAf}}{d{Ad}}}{{n{jAh}}}}{{{d{fAj}}{d{Ad}}}{{n{jAh}}}}{{{d{fAf}}{d{fAd}}}{{n{jAh}}}}{{{d{fAj}}{d{fAd}}}{{n{jAh}}}};;`{bb}0{Cf{{Ch{j}}}}{{{d{c}}}{{d{e}}}{}{}}{{{d{fc}}}{{d{fe}}}{}{}}{{{d{Cf}}}{{Ch{{Bn{Cj}}}}}}{{}b}0{{{d{fh}}}{{n{jl}}}}{A`{{d{c}}}{}}{A`{{d{fc}}}{}}{{{d{c}}{d{fe}}}{{n{{Ab{gi}}}}}{}{}{}{}}{A`j}{cc{}}{{{d{Ad}}}{{n{CfAh}}}}{{{d{fAd}}}{{n{CfAh}}}}{{{d{c}}}{{n{AlAn}}}{}}{{}{{Bb{B`}}}}`{{}A`}`{ce{}{}}{{}{{n{BhBj}}}}{{{d{c}}Al}{{n{{C`{e}}An}}}{}Cb}``{d}{{{d{Cf}}}{{Ch{Cl}}}}{{{d{fc}}{C`{e}}}{{n{jAn}}}{}Cb}{c{{n{e}}}{}{}}0{{{d{c}}}Cd{}}{{{d{fCf}}{d{Ad}}}{{n{jAh}}}}{{{d{fCf}}{d{fAd}}}{{n{jAh}}}}9``````{bb}000{{{d{c}}}{{d{e}}}{}{}}00{{{d{fc}}}{{d{fe}}}{}{}}00{{{d{Cn}}}Cn}{{{d{c}}{d{fe}}}j{}{}}{{{d{c}}}j{}}0{{}b}0{{{Bb{D`}}{d{Db}}Dd}{{Ch{{Bn{Df}}}}}}{{{d{fh}}}{{n{jl}}}}00{A`{{d{c}}}{}}00{A`{{d{fc}}}{}}00{{{d{c}}{d{fe}}}{{n{{Ab{gi}}}}}{}{}{}{}}00{A`j}00{{{d{Cn}}{d{fh}}}Dh}{cc{}}00{{{d{Ad}}}{{n{CnAh}}}}{{{d{Ad}}}{{n{DjAh}}}}{{{d{fAd}}}{{n{CnAh}}}}{{{d{fAd}}}{{n{DjAh}}}}{{{d{c}}}{{n{AlAn}}}{}}00{{}{{Bb{B`}}}}0{{}A`}00{{{d{Bd}}}j}`{ce{}{}}00{{}{{n{BhBj}}}}00``{{{d{c}}Al}{{n{{C`{e}}An}}}{}Cb}00{d}00{{{d{fc}}{C`{e}}}{{n{jAn}}}{}Cb}00{Dj{{n{j{Bn{Bl}}}}}}{{{d{c}}}e{}{}}{c{{n{e}}}{}{}}00000{{{d{c}}}Cd{}}00{{{d{fCn}}{d{Ad}}}{{n{jAh}}}}{{{d{fDj}}{d{Ad}}}{{n{jAh}}}}{{{d{fCn}}{d{fAd}}}{{n{jAh}}}}{{{d{fDj}}{d{fAd}}}{{n{jAh}}}}<<<```````````````{bb}0000000{{{d{c}}}{{d{e}}}{}{}}0000{{{d{fc}}}{{d{fe}}}{}{}}0000`{{{d{Dl}}}Dl}{{{d{c}}{d{fe}}}j{}{}}{{{d{c}}}j{}}0{{}b}0{{{Bb{Dn}}{d{Db}}{d{Db}}{Bb{E`}}Dd}{{Ch{{Bn{Eb}}}}}}`{{{d{fh}}}{{n{jl}}}}0000{A`{{d{c}}}{}}0000{A`{{d{fc}}}{}}0000{{{d{c}}{d{fe}}}{{n{{Ab{gi}}}}}{}{}{}{}}0000{A`j}0000`{{{d{Ed}}{d{fh}}}Dh}{{{d{Ef}}{d{fh}}}Dh}{{{d{Eh}}{d{fh}}}Dh}{{{d{Dl}}{d{fh}}}Dh}{cc{}}0000{{{d{Ad}}}{{n{EdAh}}}}{{{d{Ad}}}{{n{EfAh}}}}{{{d{Ad}}}{{n{EhAh}}}}{{{d{Ad}}}{{n{DlAh}}}}{{{d{fAd}}}{{n{EdAh}}}}{{{d{fAd}}}{{n{EfAh}}}}{{{d{fAd}}}{{n{EhAh}}}}{{{d{fAd}}}{{n{DlAh}}}}{{{d{c}}}{{n{AlAn}}}{}}0000{{{d{Eh}}}{{Ch{Ej}}}}{{}{{Bb{B`}}}}00{{{d{Bd}}}Bf}{{}A`}0000{{ClEl}j}{ce{}{}}0000``{{}{{n{BhBj}}}}0000{{{d{Db}}}{{Ch{{En{El}}}}}}{{{Bb{c}}{d{{F`{El}}}}}{{Ch{{En{El}}}}}{{Fb{Db}}}}{{{d{Fd}}}{{n{EjFf}}}}````{{{d{c}}Al}{{n{{C`{e}}An}}}{}Cb}0000`{d}0000`{{{Bb{{d{Db}}}}}{{Ch{Fh}}}}`{Ed{{Ch{j}}}}``{{{d{fc}}{C`{e}}}{{n{jAn}}}{}Cb}0000`{{{d{c}}}e{}{}}`{c{{n{e}}}{}{}}000000000{{{d{c}}}Cd{}}0000{{{d{fEd}}{d{Ad}}}{{n{jAh}}}}{{{d{fEf}}{d{Ad}}}{{n{jAh}}}}{{{d{fEh}}{d{Ad}}}{{n{jAh}}}}{{{d{fDl}}{d{Ad}}}{{n{jAh}}}}{{{d{fEd}}{d{fAd}}}{{n{jAh}}}}{{{d{fEf}}{d{fAd}}}{{n{jAh}}}}{{{d{fEh}}{d{fAd}}}{{n{jAh}}}}{{{d{fDl}}{d{fAd}}}{{n{jAh}}}}{ce{}{}}0000`````{{{d{c}}}{{d{e}}}{}{}}{{{d{fc}}}{{d{fe}}}{}{}}`{{{d{fh}}}{{n{jl}}}}{A`{{d{c}}}{}}{A`{{d{fc}}}{}}{{{d{c}}{d{fe}}}{{n{{Ab{gi}}}}}{}{}{}{}}{A`j}{cc{}}{{{d{c}}}{{n{AlAn}}}{}}{{}A`}:{{}{{n{BhBj}}}}{{{d{c}}Al}{{n{{C`{e}}An}}}{}Cb}``{d}`{{{d{fc}}{C`{e}}}{{n{jAn}}}{}Cb}`{c{{n{e}}}{}{}}0{{{d{c}}}Cd{}}{ce{}{}}``{bb}0{{{d{c}}}{{d{e}}}{}{}}{{{d{fc}}}{{d{fe}}}{}{}}{{}b}0{{{d{fh}}}{{n{jl}}}}{A`{{d{c}}}{}}{A`{{d{fc}}}{}}{{{d{c}}{d{fe}}}{{n{{Ab{gi}}}}}{}{}{}{}}{A`j}{{{d{Fj}}{d{fh}}}Dh}{cc{}}{{{d{Ad}}}{{n{FjAh}}}}{{{d{fAd}}}{{n{FjAh}}}}{{{d{c}}}{{n{AlAn}}}{}}{{}{{Bb{B`}}}}{{}A`}{ce{}{}}{{}{{n{BhBj}}}}{{{d{Fj}}}{{Ch{Fl}}}}{{{d{c}}Al}{{n{{C`{e}}An}}}{}Cb}{d}{{{d{fc}}{C`{e}}}{{n{jAn}}}{}Cb}{c{{n{e}}}{}{}}0{{{d{c}}}Cd{}}{{{d{fFj}}{d{Ad}}}{{n{jAh}}}}{{{d{fFj}}{d{fAd}}}{{n{jAh}}}}9````{bb}0{{{d{c}}}{{d{e}}}{}{}}{{{d{fc}}}{{d{fe}}}{}{}}```{{{d{fh}}}{{n{jl}}}}{A`{{d{c}}}{}}{A`{{d{fc}}}{}}{{{d{c}}{d{fe}}}{{n{{Ab{gi}}}}}{}{}{}{}}{A`j}{{{d{Fn}}{d{fh}}}Dh}{cc{}}{{{d{Ad}}}{{n{FnAh}}}}{{{d{fAd}}}{{n{FnAh}}}}{{{d{c}}}{{n{AlAn}}}{}}{{}{{Bb{B`}}}}`{{}A`}`{ce{}{}}{{}{{n{BhBj}}}}{{{d{Fn}}}{{Ch{Fl}}}}{{{d{c}}Al}{{n{{C`{e}}An}}}{}Cb}``{d}`{{}j}{{{Bb{{d{Db}}}}}{{Ch{Cl}}}}{{{d{fc}}{C`{e}}}{{n{jAn}}}{}Cb}`{c{{n{e}}}{}{}}0`{{{d{c}}}Cd{}}{{{d{fFn}}{d{Ad}}}{{n{jAh}}}}{{{d{fFn}}{d{fAd}}}{{n{jAh}}}};``{{{d{c}}}{{d{e}}}{}{}}{{{d{fc}}}{{d{fe}}}{}{}}{{{d{fG`}}Cl{En{El}}{En{El}}ClE`GbClFhClEl{d{Ej}}Cl}{{Gf{{Ch{Gd}}}}}}{Dd{{Ch{{Bn{G`}}}}}}{{{d{fh}}}{{n{jl}}}}{A`{{d{c}}}{}}{A`{{d{fc}}}{}}{{{d{c}}{d{fe}}}{{n{{Ab{gi}}}}}{}{}{}{}}{A`j}{cc{}}{{{d{c}}}{{n{AlAn}}}{}}{{}A`}{ce{}{}}{{}{{n{BhBj}}}}{{{d{c}}Al}{{n{{C`{e}}An}}}{}Cb}{d}{{{d{fc}}{C`{e}}}{{n{jAn}}}{}Cb}{{{d{fG`}}{En{El}}}{{Gf{{n{Cl{Bn{Bl}}}}}}}}{c{{n{e}}}{}{}}0{{{d{c}}}Cd{}}7````{{{d{c}}}{{d{e}}}{}{}}{{{d{fc}}}{{d{fe}}}{}{}}`{{{d{fEb}}Cl{En{El}}{En{El}}ClE`GbClFhClEl{d{Ej}}Cl}{{Gf{{Ch{Gd}}}}}}{{{d{Dd}}}Dd}{{{d{c}}{d{fe}}}j{}{}}{{{d{c}}}j{}}{{{d{fh}}}{{n{jl}}}}{{}Dd}{A`{{d{c}}}{}}{A`{{d{fc}}}{}}{{{d{c}}{d{fe}}}{{n{{Ab{gi}}}}}{}{}{}{}}{A`j}{{{d{Dd}}{d{fh}}}Dh}{cc{}}{{{d{c}}}{{n{AlAn}}}{}}`{{}A`}{ce{}{}}{{}{{n{BhBj}}}}{{{Bb{E`}}{Bb{E`}}{Bb{E`}}Bf}Dd}{{{d{c}}Al}{{n{{C`{e}}An}}}{}Cb}<`{d}{{{d{fc}}{C`{e}}}{{n{jAn}}}{}Cb}{{{d{fDf}}{En{El}}}{{Gf{{n{Cl{Bn{Bl}}}}}}}}{{{d{c}}}e{}{}}{c{{n{e}}}{}{}}0{{{d{c}}}Cd{}}9`{{{d{c}}}{{d{e}}}{}{}}{{{d{fc}}}{{d{fe}}}{}{}}{{{d{fGh}}Cl{En{El}}{En{El}}ClE`GbClFhClEl{d{Ej}}Cl}{{Gf{{Ch{Gd}}}}}}{{{d{Db}}{Bb{E`}}Dd}{{Ch{{Bn{Gh}}}}}}{{{d{fh}}}{{n{jl}}}}{A`{{d{c}}}{}}{A`{{d{fc}}}{}}{{{d{c}}{d{fe}}}{{n{{Ab{gi}}}}}{}{}{}{}}{A`j}{cc{}}{{{d{c}}}{{n{AlAn}}}{}}{{}A`}{ce{}{}}{{}{{n{BhBj}}}}{{{d{c}}Al}{{n{{C`{e}}An}}}{}Cb}{d}{{{d{fc}}{C`{e}}}{{n{jAn}}}{}Cb}{{{d{fGh}}{En{El}}}{{Gf{{n{Cl{Bn{Bl}}}}}}}}{c{{n{e}}}{}{}}0{{{d{c}}}Cd{}}7`{bb}0{{{d{c}}}{{d{e}}}{}{}}{{{d{fc}}}{{d{fe}}}{}{}}{{}b}0{{{d{fh}}}{{n{jl}}}}{A`{{d{c}}}{}}{A`{{d{fc}}}{}}{{{d{c}}{d{fe}}}{{n{{Ab{gi}}}}}{}{}{}{}}{A`j}{cc{}}{{{d{Ad}}}{{n{GjAh}}}}{{{d{fAd}}}{{n{GjAh}}}}{{{d{c}}}{{n{AlAn}}}{}}{{}{{Bb{B`}}}}{{}A`}{ce{}{}}{{}{{n{BhBj}}}}`{{{d{c}}Al}{{n{{C`{e}}An}}}{}Cb}{d}`{{c{d{Gl}}}{{Gn{j}}}Cj}{c{{`{{Hb{}{{H`{{Ch{Gl}}}}}}}}}Hd}`{{{d{fc}}{C`{e}}}{{n{jAn}}}{}Cb}`{Gj{{Ch{j}}}}`{c{{n{e}}}{}{}}0{{{d{c}}}Cd{}}{{{d{fGj}}{d{Ad}}}{{n{jAh}}}}{{{d{fGj}}{d{fAd}}}{{n{jAh}}}};``````````{{{d{c}}}{{d{e}}}{}{}}00000{{{d{fc}}}{{d{fe}}}{}{}}00000{{{d{Hf}}{d{Hf}}}Hh}{{{d{c}}{d{e}}}Hh{}{}}{{{d{fh}}}{{n{jl}}}}00000{A`{{d{c}}}{}}00000{A`{{d{fc}}}{}}00000{c{{n{Gl}}}Hj}{{{d{c}}{d{fe}}}{{n{{Ab{gi}}}}}{}{}{}{}}0{c{{n{Hl}}}Hj}1{c{{n{Hn}}}Hj}22{c{{n{I`}}}Hj}3{c{{n{Ib}}}Hj}{A`j}00000{{{d{Hf}}{d{Hf}}}Bf}{{{d{c}}{d{e}}}Bf{}{}}0000`{{{d{Hl}}{d{fh}}}Dh}0{{{d{I`}}{d{fh}}}Dh}0{{{d{Ib}}{d{fh}}}Dh}0{{{d{Id}}}Cl}{cc{}}00000{{{d{c}}}{{n{AlAn}}}{}}00000{{{d{c}}{d{e}}}E`{IfIh}Ij}{{{d{Gl}}}Hf}{{{d{Hf}}{d{fc}}}jIl}{{}A`}00000{ce{}{}}00000{{}{{n{BhBj}}}}00000``{{{d{c}}Al}{{n{{C`{e}}An}}}{}Cb}00000{{{d{Hf}}{d{Hf}}}{{Bb{Hh}}}}{d}00000{{{d{fc}}{C`{e}}}{{n{jAn}}}{}Cb}00000````````{{{d{c}}}Cl{}}00{c{{n{e}}}{}{}}00000000000{{{d{c}}}Cd{}}00000`888888`{{{d{c}}}{{d{e}}}{}{}}{{{d{fc}}}{{d{fe}}}{}{}}{{{d{fIn}}Gl}{{Ch{j}}}}`{{{d{fh}}}{{n{jl}}}}{{}In}{A`{{d{c}}}{}}{A`{{d{fc}}}{}}{{{d{c}}{d{fe}}}{{n{{Ab{gi}}}}}{}{}{}{}}{A`j}{cc{}}{{{d{c}}}{{n{AlAn}}}{}}{{}A`}{ce{}{}}{{}{{n{BhBj}}}}9{{{d{c}}Al}{{n{{C`{e}}An}}}{}Cb}{d}{{IncBf}{{Gn{j}}}Cj}{{{d{fc}}{C`{e}}}{{n{jAn}}}{}Cb}{c{{n{e}}}{}{}}0{{{d{c}}}Cd{}}7{{{d{Bd}}}{{n{J`Ff}}}}{{}E`}","D":"Ff","p":[[5,"Command",780],[1,"reference"],[0,"mut"],[5,"Formatter",781],[1,"unit"],[5,"Error",781],[6,"Result",782],[1,"usize"],[5,"With",783],[5,"ArgMatches",784],[5,"Cli",0],[8,"Error",785],[6,"Subcommand",0],[5,"FdFlags",786],[5,"Error",787],[5,"Id",788],[6,"Option",789],[1,"str"],[1,"bool"],[5,"Layout",790],[5,"LayoutError",790],[10,"Error",791],[5,"Box",792],[5,"SetFdFlags",786],[10,"AsFilelike",793],[5,"TypeId",794],[5,"Args",65],[8,"Result",795],[10,"Write",796],[5,"String",797],[5,"ModeArgs",101],[6,"Mode",101],[5,"Path",798],[5,"TestInitParameters",494],[10,"DataToHumanReadable",494],[8,"Result",781],[5,"Args",101],[5,"ModeArgs",196],[6,"Mode",196],[1,"u64"],[10,"AirRunner",494],[5,"Args",196],[6,"Source",196],[5,"Keys",196],[6,"KeyPair",799],[1,"u8"],[5,"Vec",800],[1,"slice"],[10,"AsRef",801],[5,"PathBuf",798],[5,"Report",795],[8,"CallResults",802],[5,"AnomalyDataArgs",394],[5,"ExecutionData",367],[5,"PlainDataArgs",426],[5,"NativeAvmRunner",470],[1,"u32"],[5,"RawAVMOutcome",803],[8,"LocalBoxFuture",804],[5,"WasmAvmRunner",530],[5,"Args",553],[5,"LogRecord",590],[8,"Result",787],[17,"Item"],[10,"Iterator",805],[10,"BufRead",796],[5,"LogKey",590],[6,"Ordering",806],[10,"Deserializer",807],[5,"Span",590],[5,"LogValue",590],[6,"Message",590],[5,"CloseMessage",590],[6,"Value",808],[10,"Hash",809],[10,"Sized",810],[10,"BuildHasher",809],[10,"Hasher",809],[5,"StatsReport",753],[5,"Duration",811]],"r":[],"b":[[656,"impl-Display-for-Span"],[657,"impl-Debug-for-Span"],[658,"impl-Debug-for-Message"],[659,"impl-Display-for-Message"],[660,"impl-Display-for-CloseMessage"],[661,"impl-Debug-for-CloseMessage"]],"c":"OjAAAAAAAAA=","e":"OzAAAAEAANkCHAAAABwAHwAJACsAJABRAAYAWQAzAJAADQChAGcADgEXACsBTwB8AQEAfwEZAJoBBACgARsAvQEGAMUBHADjAQEA5gEKAPIBDgACAgIABgIWAB4CAQAhAhQANwIEAD0CWgCeAg4AswJJAP4CAQABAwsA"}],\ +["air_beautifier",{"t":"FGSPPHNNHNNNNNNNNNNNNNNNNNNNNNNNN","n":["Beautifier","BeautifyError","DEFAULT_INDENT_STEP","Io","Parse","beautify","beautify","beautify_ast","beautify_to_string","borrow","borrow","borrow_mut","borrow_mut","enable_all_patterns","enable_try_hopon","fmt","fmt","from","from","from","into","into","into_inner","new","new_with_indent","source","to_string","try_from","try_from","try_into","try_into","type_id","type_id"],"q":[[0,"air_beautifier"],[33,"air_beautifier::beautifier"],[34,"core::result"],[35,"std::io"],[36,"air_parser::ast::instructions"],[37,"alloc::string"],[38,"core::fmt"],[39,"std::io::error"],[40,"core::error"],[41,"core::option"],[42,"core::any"]],"i":[0,0,0,6,6,0,9,9,0,9,6,9,6,9,9,6,6,9,6,6,9,6,9,9,9,6,6,9,6,9,6,9,6],"f":"`````{{{d{b}}{d{fc}}h}{{n{jl}}}A`}{{{d{f{Ab{c}}}}{d{b}}}{{n{jl}}}A`}{{{d{f{Ab{c}}}}{d{Ad}}}{{n{jl}}}A`}{{{d{b}}}{{n{AfAf}}}}{{{d{c}}}{{d{e}}}{}{}}0{{{d{fc}}}{{d{fe}}}{}{}}0{{{Ab{c}}}{{Ab{c}}}A`}0{{{d{l}}{d{fAh}}}Aj}0{cc{}}0{All}{ce{}{}}0{{{Ab{c}}}cA`}{c{{Ab{c}}}A`}{{cAn}{{Ab{c}}}A`}{{{d{l}}}{{Bb{{d{B`}}}}}}{{{d{c}}}Af{}}{c{{n{e}}}{}{}}000{{{d{c}}}Bd{}}0","D":"Al","p":[[1,"str"],[1,"reference"],[0,"mut"],[1,"bool"],[1,"unit"],[6,"BeautifyError",0,33],[6,"Result",34],[10,"Write",35],[5,"Beautifier",0,33],[6,"Instruction",36],[5,"String",37],[5,"Formatter",38],[8,"Result",38],[5,"Error",39],[1,"usize"],[10,"Error",40],[6,"Option",41],[5,"TypeId",42]],"r":[[0,33],[1,33],[2,33]],"b":[[15,"impl-Debug-for-BeautifyError"],[16,"impl-Display-for-BeautifyError"]],"c":"OjAAAAAAAAA=","e":"OzAAAAEAABMABgAAAAAAAwACAAoAAwAPAAIAFAAAABoABwA="}],\ +["air_beautify_wasm",{"t":"HH","n":["beautify","beautify_raw"],"q":[[0,"air_beautify_wasm"],[2,"alloc::string"],[3,"wasm_bindgen"],[4,"core::result"]],"i":[0,0],"f":"{b{{f{bd}}}}0","D":"`","p":[[5,"String",2],[5,"JsError",3],[6,"Result",4]],"r":[],"b":[],"c":"OjAAAAAAAAA=","e":"OjAAAAEAAAAAAAIAEAAAAAAAAQACAA=="}],\ +["air_execution_info_collector",{"t":"FFFFFFONNNNNNNNNNNNONNNNNNNNNNNNOOOONNNNNNONNNNNNNNNNNNNONNNNNNNNNNNNNNNOOOOOOOOOOONNNNNNNNNNNNNNNNNNO","n":["ApTracker","CallTracker","FoldTracker","InstructionTracker","NewTracker","ParTracker","ap","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","call","default","default","default","default","default","default","eq","eq","eq","eq","eq","eq","executed_count","executed_count","executed_count","executed_count","fmt","fmt","fmt","fmt","fmt","fmt","fold","from","from","from","from","from","from","get_iteration","into","into","into","into","into","into","match_count","meet_ap","meet_call","meet_executed_ap","meet_executed_call","meet_executed_par","meet_fold_scalar","meet_fold_stream","meet_match","meet_mismatch","meet_new","meet_next","meet_null","meet_par","meet_seq","meet_xor","mismatch_count","new_tracker","next_count","null_count","par","seen_count","seen_count","seen_count","seen_scalar_count","seen_stream_count","seq_count","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","xor_count"],"q":[[0,"air_execution_info_collector"],[102,"air_execution_info_collector::instructions_tracker"],[103,"core::fmt"],[104,"air_parser::parser::lexer::text_pos"],[105,"core::result"],[106,"core::any"]],"i":[0,0,0,0,0,0,3,3,4,5,6,7,8,3,4,5,6,7,8,3,3,4,5,6,7,8,3,4,5,6,7,8,4,5,7,8,3,4,5,6,7,8,3,3,4,5,6,7,8,8,3,4,5,6,7,8,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,5,7,6,6,3,3,4,5,6,7,8,3,4,5,6,7,8,3,4,5,6,7,8,3],"f":"```````{{{b{c}}}{{b{e}}}{}{}}00000{{{b{dc}}}{{b{de}}}{}{}}00000`{{}f}{{}h}{{}j}{{}l}{{}n}{{}A`}{{{b{f}}{b{f}}}Ab}{{{b{h}}{b{h}}}Ab}{{{b{j}}{b{j}}}Ab}{{{b{l}}{b{l}}}Ab}{{{b{n}}{b{n}}}Ab}{{{b{A`}}{b{A`}}}Ab}````{{{b{f}}{b{dAd}}}Af}{{{b{h}}{b{dAd}}}Af}{{{b{j}}{b{dAd}}}Af}{{{b{l}}{b{dAd}}}Af}{{{b{n}}{b{dAd}}}Af}{{{b{A`}}{b{dAd}}}Af}`{cc{}}00000{{{b{A`}}Ah}Aj}{ce{}{}}00000`{{{b{df}}}Al}00000{{{b{df}}}Aj}11{{{b{df}}Ah}Al}22222```````````{c{{An{e}}}{}{}}00000000000{{{b{c}}}B`{}}00000`","D":"Al","p":[[1,"reference"],[0,"mut"],[5,"InstructionTracker",0,102],[5,"ApTracker",0,102],[5,"CallTracker",0,102],[5,"FoldTracker",0,102],[5,"ParTracker",0,102],[5,"NewTracker",0,102],[1,"bool"],[5,"Formatter",103],[8,"Result",103],[5,"AirPos",104],[1,"u32"],[1,"unit"],[6,"Result",105],[5,"TypeId",106]],"r":[[0,102],[1,102],[2,102],[3,102],[4,102],[5,102]],"b":[],"c":"OjAAAAAAAAA=","e":"OzAAAAEAAFgABQAAAAMABQAeACUABgAyAAAAOQAtAA=="}],\ +["air_interpreter_cid",{"t":"FFFGIGPPPPPPNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNNNNNNHHHOO","n":["ArchivedCID","CID","CIDResolver","CidCalculationError","CidRef","CidVerificationError","InvalidJson","InvalidJson","MalformedCid","UnsupportedCidCodec","UnsupportedHashCode","ValueMismatch","as_error","as_error","as_ref","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","check_bytes","clone","clone_into","clone_to_uninit","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","eq","equivalent","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","get_hash","get_inner","hash","into","into","into","into","into","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","new","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","raw_value_to_json_cid","resolve","resolve_metadata","serialize","serialize","serialize_metadata","serialize_unsized","source","source","to_owned","to_string","to_string","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","value_to_json_cid","verify_raw_value","verify_value","cid_repr","type_name"],"q":[[0,"air_interpreter_cid"],[100,"air_interpreter_cid::CidVerificationError"],[102,"core::error"],[103,"core::marker"],[104,"bytecheck"],[105,"core::result"],[106,"rkyv::with"],[107,"serde::de"],[108,"air_interpreter_cid::verify"],[109,"core::fmt"],[110,"cid::error"],[111,"serde_json::error"],[112,"core::hash"],[113,"alloc::rc"],[114,"core::alloc::layout"],[115,"core::convert"],[116,"serde::ser"],[117,"rkyv"],[118,"core::option"],[119,"alloc::string"],[120,"core::any"]],"i":[0,0,0,0,0,0,14,17,14,14,14,14,14,17,3,14,38,7,3,3,17,14,38,7,3,17,7,3,3,3,14,38,7,3,3,17,3,3,14,14,3,17,17,14,14,14,38,7,3,17,17,3,3,3,14,38,7,3,17,14,38,7,3,17,3,14,38,7,3,17,0,3,3,3,3,3,3,14,17,3,14,17,14,38,7,3,17,14,38,7,3,17,14,38,7,3,17,0,0,0,39,39],"f":"````````````{{{b{c}}}{{b{d}}}{}}0{{{b{{f{c}}}}}{{b{h}}}j}{{{b{c}}}{{b{e}}}{}{}}00100{{{b{lc}}}{{b{le}}}{}{}}0000{{{b{lc}}}{{Ab{{b{{n{e}}}}A`}}}jj}{{{b{{f{c}}}}}{{f{c}}}j}{{{b{c}}{b{le}}}Ad{}{}}{{{b{c}}}Ad{}}{{{b{c}}{b{le}}}{{Ab{{Af{gi}}}}}{}{}{}{}}000{c{{Ab{{f{e}}}}}Ahj}1{{{b{{f{c}}}}{b{{f{c}}}}}Aj{}}{{{b{c}}{b{e}}}Aj{}{}}{{{b{Al}}{b{lAn}}}B`}0{{{b{{f{c}}}}{b{lAn}}}B`j}{{{b{Bb}}{b{lAn}}}B`}0{BdAl}{BfAl}{cc{}}000{BfBb}1{{{b{c}}{b{e}}}Bh{Bjj}Bl}{{{b{{f{c}}}}}{{Bn{h}}}j}{{{b{{f{c}}}}{b{le}}}Ad{}C`}{ce{}{}}0000{{}{{Ab{CbCd}}}}0000{c{{f{e}}}{{Cf{{Bn{h}}}}}j}{b}0000{c{{f{e}}}{{Cl{{Cj{Ch}}}}}{}}{{{b{{f{c}}}}Cneg}Adj{}{}}{{{b{c}}Cn}Ad{}}{{{b{{f{c}}}}e}AbjD`}{{{b{{f{c}}}}{b{le}}}{{Ab{g}}}j{Dbj}{}}{{{b{c}}{b{le}}}{{Ab{Ad}}}{}{}}{{{b{c}}{b{le}}}{{Ab{Cn}}}{}{}}{{{b{Al}}}{{Dd{{b{d}}}}}}{{{b{Bb}}}{{Dd{{b{d}}}}}}{{{b{c}}}e{}{}}{{{b{c}}}Df{}}0{c{{Ab{e}}}{}{}}000000000{{{b{c}}}Dh{}}0000{{{b{c}}}{{Ab{{f{c}}Bb}}}{Djj}}{{{b{{f{c}}}}e}{{Ab{AdAl}}}{}{{Cl{{Cj{Ch}}}}}}{{{b{{f{c}}}}{b{c}}}{{Ab{AdAl}}}Dj}``","D":"Al","p":[[1,"reference"],[10,"Error",102],[5,"CID",0],[8,"CidRef",0],[10,"Sized",103],[0,"mut"],[5,"ArchivedCID",0],[5,"TupleStructCheckError",104],[6,"Result",105],[1,"unit"],[5,"With",106],[10,"Deserializer",107],[1,"bool"],[6,"CidVerificationError",0,108],[5,"Formatter",109],[8,"Result",109],[6,"CidCalculationError",0],[6,"Error",110],[5,"Error",111],[1,"u64"],[10,"Hash",112],[10,"BuildHasher",112],[5,"Rc",113],[10,"Hasher",112],[5,"Layout",114],[5,"LayoutError",114],[10,"Into",115],[1,"u8"],[1,"slice"],[10,"AsRef",115],[1,"usize"],[10,"Serializer",116],[10,"Fallible",117],[6,"Option",118],[5,"String",119],[5,"TypeId",120],[10,"Serialize",116],[5,"CIDResolver",0],[15,"ValueMismatch",100]],"r":[[5,108],[98,108],[99,108]],"b":[[38,"impl-Debug-for-CidVerificationError"],[39,"impl-Display-for-CidVerificationError"],[41,"impl-Display-for-CidCalculationError"],[42,"impl-Debug-for-CidCalculationError"],[43,"impl-From%3CError%3E-for-CidVerificationError"],[44,"impl-From%3CError%3E-for-CidVerificationError"],[73,"impl-Serialize-for-CID%3CT%3E"],[74,"impl-Serialize%3C__S%3E-for-CID%3CT%3E"]],"c":"OjAAAAAAAAA=","e":"OzAAAAEAAFgACAAAAAAAAgAAAAQAAAAGACcAMgAAADQAAgA8ACUAYwADAA=="}],\ +["air_interpreter_client",{"t":"SHHH","n":["DEFAULT_LOG_LEVEL","ast","invoke","main"],"q":[[0,"air_interpreter_client"],[4,"alloc::string"],[5,"alloc::vec"]],"i":[0,0,0,0],"f":"`{bb}{{b{f{d}}{f{d}}{f{d}}{f{d}}{j{h}}}b}{{}l}","D":"`","p":[[5,"String",4],[1,"u8"],[5,"Vec",5],[1,"str"],[1,"reference"],[1,"unit"]],"r":[],"b":[],"c":"OjAAAAAAAAA=","e":"OjAAAAEAAAAAAAQAEAAAAAAAAQACAAMABAA="}],\ +["air_interpreter_data",{"t":"PPPFFFGFFGFFFGFFFFFFGFGFFFGPPPGGFFPPPPPPFFGFFGFFFFGFPPGPPPPPPPGGFFPPPPPPIFFFFFFFFIFFPPPPPPPFFPPPPPPIGGFFPPPPPPPPPGGPPPFFPPPFFIFFPPPGGFNNNNOONNOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOONNNNNNNNNNNNNNNNNNNNNNNNNNOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNHONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOONNOOOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOONNOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOONNNNNNOOOOOOOOOOOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOCNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOFGPPPPPNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOO","n":["Ap","Ap","Ap","ApResult","ApResultResolver","ArchivedApResult","ArchivedCallResult","ArchivedCallServiceFailed","ArchivedCanonCidAggregate","ArchivedCanonResult","ArchivedCanonResultCidAggregate","ArchivedCidInfo","ArchivedCidStore","ArchivedExecutedState","ArchivedExecutionTrace","ArchivedFoldResult","ArchivedFoldSubTraceLore","ArchivedGenerationIdx","ArchivedInterpreterData","ArchivedParResult","ArchivedProvenance","ArchivedRawValue","ArchivedSender","ArchivedServiceResultCidAggregate","ArchivedSubTraceDesc","ArchivedTracePos","ArchivedValueRef","Call","Call","Call","CallResult","CallResultResolver","CallServiceFailed","CallServiceFailedResolver","Canon","Canon","Canon","Canon","Canon","Canon","CanonCidAggregate","CanonCidAggregateResolver","CanonResult","CanonResultCidAggregate","CanonResultCidAggregateResolver","CanonResultResolver","CidInfo","CidInfoResolver","CidStore","CidStoreResolver","CidStoreVerificationError","CidTracker","CidVerificationError","Data","DataDeserializationError","Envelope","Executed","Executed","Executed","Executed","Executed","Executed","ExecutedState","ExecutedStateResolver","ExecutionTrace","ExecutionTraceResolver","Failed","Failed","Failed","Fold","Fold","Fold","FoldLore","FoldResult","FoldResultResolver","FoldSubTraceLore","FoldSubTraceLoreResolver","GenerationIdx","GenerationIdxResolver","InterpreterData","InterpreterDataEnvelope","InterpreterDataEnvelopeFormat","InterpreterDataEnvelopeRepr","InterpreterDataResolver","Literal","Literal","Literal","MissingReference","Par","Par","Par","ParResult","ParResultResolver","PeerId","PeerId","PeerId","PeerIdWithCallId","PeerIdWithCallId","PeerIdWithCallId","PosType","Provenance","ProvenanceResolver","RawValue","RawValueResolver","RequestSentBy","RequestSentBy","RequestSentBy","RequestSentBy","RequestSentBy","RequestSentBy","Scalar","Scalar","Scalar","Sender","SenderResolver","ServiceResult","ServiceResult","ServiceResult","ServiceResultCidAggregate","ServiceResultCidAggregateResolver","Stream","Stream","Stream","SubTraceDesc","SubTraceDescResolver","TraceLen","TracePos","TracePosResolver","Unused","Unused","Unused","ValueRef","ValueRefResolver","Versions","add","add","add_assign","add_assign","argument_hash","argument_hash","as_error","as_error","begin_pos","begin_pos","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","canon","canon_element_store","canon_element_store","canon_result_store","canon_result_store","check_bytes","check_bytes","check_bytes","check_bytes","check_bytes","check_bytes","check_bytes","check_bytes","check_bytes","check_bytes","check_bytes","check_bytes","check_bytes","check_bytes","check_bytes","check_bytes","check_bytes","check_bytes","check_bytes","check_bytes","check_bytes","check_bytes","check_reference","checked_add","checked_add","checked_sub","cid_info","cid_info","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","cmp","cmp","data_version","data_version","default","default","default","default","default","default","default","default","default","default","default","default","default","deref","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","executed","executed_scalar","executed_service_result","executed_stream_stub","executed_unused","failed","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from_cid_stores","from_execution_result","from_value","get","get","get","get_cid","get_format","get_hash","get_hash","get_mut","get_value","hash","hash","index","index_mut","inner_data","interpreter_version","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into_iter","into_iter","is_empty","iter","last_call_request_id","last_call_request_id","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","left_size","left_size","len","literal","lore","lore","message","message","new","new","new","new","new","new","new","new","new","new","new","next","par","partial_cmp","partial_cmp","partial_cmp","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pop","prev","provenance","provenance","push","request_sent_by","res_generations","res_generations","resolve","resolve","resolve","resolve","resolve","resolve","resolve","resolve","resolve","resolve","resolve","resolve","resolve","resolve","resolve","resolve","resolve","resolve","resolve","resolve","resolve","resolve","resolve_metadata","resolve_metadata","resolve_metadata","resolve_metadata","resolve_metadata","resolve_metadata","resolve_metadata","resolve_metadata","resolve_metadata","resolve_metadata","resolve_metadata","resolve_metadata","resolve_metadata","resolve_metadata","resolve_metadata","resolve_metadata","resolve_metadata","resolve_metadata","resolve_metadata","resolve_metadata","resolve_metadata","resolve_metadata","ret_code","ret_code","right_size","right_size","sent_peer_id","sent_peer_id_with_call_id","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize_metadata","serialize_metadata","serialize_metadata","serialize_metadata","serialize_metadata","serialize_metadata","serialize_metadata","serialize_metadata","serialize_metadata","serialize_metadata","serialize_metadata","serialize_metadata","serialize_metadata","serialize_metadata","serialize_metadata","serialize_metadata","serialize_metadata","serialize_metadata","serialize_metadata","serialize_metadata","serialize_metadata","serialize_metadata","serialize_unsized","serialize_unsized","serialize_unsized","serialize_unsized","serialize_unsized","serialize_unsized","serialize_unsized","serialize_unsized","serialize_unsized","serialize_unsized","serialize_unsized","serialize_unsized","serialize_unsized","serialize_unsized","serialize_unsized","serialize_unsized","serialize_unsized","serialize_unsized","serialize_unsized","serialize_unsized","serialize_unsized","serialize_unsized","service_result","service_result_store","service_result_store","signatures","signatures","size","source","stub","stub","sub","sub","subtrace_len","subtrace_len","subtraces_desc","subtraces_desc","tetraplet","tetraplet","tetraplet","tetraplet","tetraplet_cid","tetraplet_cid","tetraplet_store","tetraplet_store","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_value","trace","trace","trace_states_count","track_raw_value","track_value","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from_slice","try_from_slice","try_get_versions","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","value","value","value_cid","value_cid","value_pos","value_pos","value_store","value_store","values","values","verification","verify","verify","verify_raw_value","versions","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","cid","cid","call_id","peer_id","cid","generation","source_type_name","target_cid_repr","target_type_name","cid","cid","cid","cid","call_id","peer_id","call_id","peer_id","cid","generation","cid","generation","DataVerifier","DataVerifierError","MalformedKey","MalformedSignature","MergeMismatch","PeerIdNotFound","SignatureMismatch","as_error","borrow","borrow","borrow_mut","borrow_mut","deserialize","deserialize","fmt","fmt","from","from","into","into","layout_raw","layout_raw","merge","new","pointer_metadata","pointer_metadata","source","to_string","try_from","try_from","try_into","try_into","type_id","type_id","verify","vzip","vzip","cids","error","error","key","larger_cids","peer_id","peer_id","smaller_cids"],"q":[[0,"air_interpreter_data"],[1459,"air_interpreter_data::ArchivedProvenance"],[1461,"air_interpreter_data::ArchivedSender"],[1463,"air_interpreter_data::ArchivedValueRef"],[1465,"air_interpreter_data::CidStoreVerificationError"],[1468,"air_interpreter_data::Provenance"],[1470,"air_interpreter_data::ProvenanceResolver"],[1472,"air_interpreter_data::Sender"],[1474,"air_interpreter_data::SenderResolver"],[1476,"air_interpreter_data::ValueRef"],[1478,"air_interpreter_data::ValueRefResolver"],[1480,"air_interpreter_data::verification"],[1517,"air_interpreter_data::verification::DataVerifierError"],[1525,"air_interpreter_data::trace_pos"],[1526,"core::error"],[1527,"air_interpreter_data::executed_state"],[1528,"air_interpreter_cid"],[1529,"air_interpreter_data::cid_info"],[1530,"bytecheck"],[1531,"core::result"],[1532,"core::marker"],[1533,"air_interpreter_data::cid_store"],[1534,"air_interpreter_data::generation_idx"],[1535,"air_interpreter_data::interpreter_data"],[1536,"air_interpreter_data::raw_value"],[1537,"air_interpreter_data::trace"],[1538,"core::option"],[1539,"core::clone"],[1540,"core::cmp"],[1541,"semver"],[1542,"air_interpreter_data::interpreter_data::repr"],[1543,"rkyv::with"],[1544,"serde::de"],[1545,"alloc::vec"],[1546,"air_interpreter_value::value"],[1547,"core::fmt"],[1548,"air_interpreter_cid::verify"],[1549,"air_interpreter_signatures::stores"],[1550,"core::convert"],[1551,"alloc::rc"],[1552,"core::hash"],[1553,"core::iter::traits::iterator"],[1554,"core::alloc::layout"],[1555,"alloc::string"],[1556,"marine_call_parameters"],[1557,"rkyv"],[1558,"serde::ser"],[1559,"rkyv::ser::serializers::alloc"],[1560,"rkyv::ser::serializers"],[1561,"core::any"],[1562,"air_interpreter_data::interpreter_data::errors"],[1563,"air_interpreter_data::interpreter_data::verification"]],"i":[110,32,57,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,110,32,57,0,0,0,0,111,31,9,110,32,57,0,0,0,0,0,0,0,0,0,0,0,0,39,78,0,78,112,20,47,113,28,55,0,0,0,0,112,20,47,110,32,57,0,0,0,0,0,0,0,0,0,0,0,0,111,31,9,39,110,32,57,0,0,114,17,46,114,17,46,0,0,0,0,0,112,20,47,113,28,55,115,21,48,0,0,111,31,9,0,0,115,21,48,0,0,0,0,0,115,21,48,0,0,0,1,1,1,1,23,50,39,78,25,52,116,10,42,117,14,38,39,44,118,16,45,114,17,46,112,20,47,115,21,48,119,22,49,120,23,50,121,24,51,122,25,52,123,26,53,124,27,54,113,28,55,125,29,7,126,30,56,111,31,9,110,32,57,127,33,40,65,78,58,128,34,59,60,129,35,61,130,36,62,131,37,1,116,10,42,117,14,38,39,44,118,16,45,114,17,46,112,20,47,115,21,48,119,22,49,120,23,50,121,24,51,122,25,52,123,26,53,124,27,54,113,28,55,125,29,7,126,30,56,111,31,9,110,32,57,127,33,40,65,78,58,128,34,59,60,129,35,61,130,36,62,131,37,1,9,10,42,10,42,10,14,16,17,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,40,1,40,34,59,42,38,44,45,46,47,48,49,50,51,52,53,54,55,7,56,9,57,40,58,59,60,61,62,1,42,38,44,45,46,47,48,49,50,51,52,53,54,55,7,56,9,57,40,58,59,60,61,62,1,42,38,44,45,45,46,47,48,49,50,51,52,52,53,54,55,7,56,9,57,40,40,58,59,60,61,62,1,1,40,1,0,60,42,38,44,45,51,52,53,54,40,65,59,62,1,62,116,10,42,42,117,14,38,38,39,44,118,16,45,114,17,46,46,112,20,47,47,115,21,48,48,119,22,49,49,120,23,50,50,121,24,51,51,122,25,52,52,123,26,53,53,124,27,54,54,113,28,55,55,125,29,7,7,126,30,56,56,111,31,9,9,110,32,57,57,127,33,40,40,65,65,78,58,58,128,34,59,59,60,60,129,35,61,61,130,36,62,62,131,37,1,1,42,38,45,46,47,48,49,50,51,52,53,54,55,7,56,9,57,40,40,61,62,62,1,42,38,45,46,47,48,49,50,51,52,53,54,55,7,56,9,57,40,61,62,1,55,47,47,47,47,47,42,38,39,39,44,45,46,46,47,48,48,49,50,51,52,53,54,55,7,56,9,57,57,40,40,65,78,78,58,59,60,61,62,1,1,2,116,10,42,117,14,38,38,39,39,44,118,16,45,114,17,46,112,20,47,115,21,48,119,22,49,120,23,50,121,24,51,122,25,52,123,26,53,124,27,54,113,28,55,125,29,7,126,30,56,111,31,9,110,32,57,127,33,40,40,65,78,58,128,34,59,60,129,35,61,61,130,36,62,62,131,37,1,1,44,58,61,38,44,62,47,65,40,1,62,61,40,1,62,62,58,60,116,10,42,117,14,38,39,44,118,16,45,114,17,46,112,20,47,115,21,48,119,22,49,120,23,50,121,24,51,122,25,52,123,26,53,124,27,54,113,28,55,125,29,7,126,30,56,111,31,9,110,32,57,127,33,40,65,78,58,128,34,59,60,129,35,61,130,36,62,131,37,1,38,62,38,38,34,59,116,10,42,117,14,38,39,44,118,16,45,114,17,46,112,20,47,115,21,48,119,22,49,120,23,50,121,24,51,122,25,52,123,26,53,124,27,54,113,28,55,125,29,7,126,30,56,111,31,9,110,32,57,127,33,40,65,78,58,128,34,59,60,129,35,61,130,36,62,131,37,1,16,45,38,9,26,53,22,49,38,44,45,49,50,52,54,7,56,58,60,40,57,40,40,1,116,10,42,117,14,38,39,44,118,16,45,114,17,46,112,20,47,115,21,48,119,22,49,120,23,50,121,24,51,122,25,52,123,26,53,124,27,54,113,28,55,125,29,7,126,30,56,111,31,9,110,32,57,127,33,40,65,78,58,128,34,59,60,129,35,61,130,36,62,131,37,1,62,40,30,56,62,55,27,54,42,38,45,46,47,48,49,50,51,52,53,54,55,7,56,9,57,40,59,61,62,1,42,38,45,46,47,48,49,50,51,52,53,54,55,7,56,9,57,40,59,61,62,1,22,49,16,45,47,47,42,42,38,38,45,46,46,47,47,48,48,49,49,50,50,51,51,52,52,53,53,54,54,55,55,7,7,56,56,9,9,57,57,40,40,58,58,59,59,59,60,61,61,62,62,1,1,42,38,45,46,47,48,49,50,51,52,53,54,55,7,56,9,57,40,59,61,62,1,42,38,45,46,47,48,49,50,51,52,53,54,55,7,56,9,57,40,59,61,62,1,9,10,42,34,59,45,39,54,40,1,1,25,52,24,51,29,7,30,56,23,50,10,42,42,38,44,45,46,47,48,49,50,51,52,53,54,55,7,56,9,57,40,58,59,60,61,62,1,39,46,48,57,40,78,1,49,34,59,62,44,44,116,10,42,117,14,38,39,44,118,16,45,114,17,46,112,20,47,115,21,48,119,22,49,120,23,50,121,24,51,122,25,52,123,26,53,124,27,54,113,28,55,125,29,7,126,30,56,111,31,9,110,32,57,127,33,40,65,78,58,128,34,59,60,129,35,61,130,36,62,131,37,1,1,58,59,58,116,10,42,117,14,38,39,44,118,16,45,114,17,46,112,20,47,115,21,48,119,22,49,120,23,50,121,24,51,122,25,52,123,26,53,124,27,54,113,28,55,125,29,7,126,30,56,111,31,9,110,32,57,127,33,40,65,78,58,128,34,59,60,129,35,61,130,36,62,131,37,1,116,10,42,117,14,38,39,44,118,16,45,114,17,46,112,20,47,115,21,48,119,22,49,120,23,50,121,24,51,122,25,52,123,26,53,124,27,54,113,28,55,125,29,7,126,30,56,111,31,9,110,32,57,127,33,40,65,78,58,128,34,59,60,129,35,61,130,36,62,131,37,1,30,56,23,50,24,51,10,42,29,7,0,42,38,38,58,116,10,42,117,14,38,39,44,118,16,45,114,17,46,112,20,47,115,21,48,119,22,49,120,23,50,121,24,51,122,25,52,123,26,53,124,27,54,113,28,55,125,29,7,126,30,56,111,31,9,110,32,57,127,33,40,65,78,58,128,34,59,60,129,35,61,130,36,62,131,37,1,132,133,134,134,135,135,136,136,136,137,138,139,140,141,141,142,142,143,143,144,144,0,0,108,108,108,108,108,108,109,108,109,108,109,108,108,108,109,108,109,108,109,108,109,109,109,108,108,108,109,108,109,108,109,108,109,109,108,145,146,145,146,147,145,147,147],"f":"``````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````{{bb}b}{{bd}b}{{{h{fb}}b}j}{{{h{fb}}d}j}``{{{h{c}}}{{h{l}}}{}}0``{{{h{c}}}{{h{e}}}{}{}}00000000000000000000000000000000000000000000000000000000000000000000000{{{h{fc}}}{{h{fe}}}{}{}}00000000000000000000000000000000000000000000000000000000000000000000000{{{A`{n}}}Ab}````{{{h{fc}}}{{Ah{{h{Ad}}Af}}}Aj}{{{h{fc}}}{{Ah{{h{{Al{e}}}}An}}}Aj{}}{{{h{fc}}}{{Ah{{h{B`}}Af}}}Aj}{{{h{fc}}}{{Ah{{h{Bb}}{Bf{Bd}}}}}Aj}{{{h{fc}}}{{Ah{{h{Bh}}{Bf{Bd}}}}}Aj}{{{h{fc}}}{{Ah{{h{Bj}}{Bf{Bd}}}}}Aj}{{{h{fc}}}{{Ah{{h{Bl}}Af}}}Aj}{{{h{fc}}}{{Ah{{h{Bn}}Af}}}Aj}{{{h{fc}}}{{Ah{{h{C`}}Af}}}Aj}{{{h{fc}}}{{Ah{{h{Cb}}Af}}}Aj}{{{h{fc}}}{{Ah{{h{Cd}}Af}}}Aj}{{{h{fc}}}{{Ah{{h{Cf}}Af}}}Aj}{{{h{fc}}}{{Ah{{h{Ch}}{Bf{Bd}}}}}Aj}{{{h{fc}}}{{Ah{{h{Cj}}Af}}}Aj}{{{h{fc}}}{{Ah{{h{Cl}}Af}}}Aj}{{{h{fc}}}{{Ah{{h{Cn}}{Bf{Bd}}}}}Aj}{{{h{fc}}}{{Ah{{h{D`}}{Bf{Bd}}}}}Aj}{{{h{fc}}}{{Ah{{h{Db}}An}}}Aj}{{{h{fc}}}{{Ah{{h{Dd}}Af}}}Aj}{{{h{fc}}}{{Ah{{h{Df}}Af}}}Aj}{{{h{fc}}}{{Ah{{h{Dh}}An}}}Aj}{{{h{fc}}}{{Ah{{h{Dj}}An}}}Aj}{{{h{{Dl{c}}}}{h{{A`{e}}}}{h{{A`{c}}}}}{{Ah{jDn}}}{}{}}{{E`E`}{{Eb{E`}}}}{{{h{b}}{h{b}}}{{Eb{b}}}}1``{{{h{Ed}}}Ed}{{{h{{Dl{c}}}}}{{Dl{c}}}Ef}{{{h{{Eh{c}}}}}{{Eh{c}}}Ef}{{{h{Ej}}}Ej}{{{h{El}}}El}{{{h{En}}}En}{{{h{F`}}}F`}{{{h{Fb}}}Fb}{{{h{Fd}}}Fd}{{{h{Ff}}}Ff}{{{h{Fh}}}Fh}{{{h{Fj}}}Fj}{{{h{Fl}}}Fl}{{{h{Fn}}}Fn}{{{h{n}}}n}{{{h{G`}}}G`}{{{h{Ab}}}Ab}{{{h{Gb}}}Gb}{{{h{E`}}}E`}{{{h{Gd}}}Gd}{{{h{Gf}}}Gf}{{{h{Gh}}}Gh}{{{h{Gj}}}Gj}{{{h{Gl}}}Gl}{{{h{b}}}b}{{{h{c}}{h{fe}}}j{}{}}000000000000000000000000{{{h{c}}}j{}}0000000000000000000000000000{{{h{E`}}{h{E`}}}Gn}{{{h{b}}{h{b}}}Gn}{{}{{h{H`}}}}`{{}Ed}{{}{{Dl{c}}}{}}{{}{{Eh{c}}}{}}{{}Ej}{{}Ff}{{}Fh}{{}Fj}{{}Fl}{{}E`}{{}Hb}{{}Gf}{{}Gl}{{}b}{{{h{Gl}}}{{h{{Hd{Gb}}}}}}{{{h{c}}{h{fe}}}{{Ah{{Hf{gi}}}}}{}{}{}{}}0{c{{Ah{Ed}}}Hh}1111{c{{Ah{{Dl{e}}}}}HhHj}22222222{c{{Ah{El}}}Hh}333{c{{Ah{En}}}Hh}44{c{{Ah{F`}}}Hh}5555{c{{Ah{Fb}}}Hh}666{c{{Ah{Fd}}}Hh}77{c{{Ah{Ff}}}Hh}8888{c{{Ah{Fh}}}Hh}99{c{{Ah{Fj}}}Hh}::::{c{{Ah{Fl}}}Hh};;;{c{{Ah{Fn}}}Hh}<<<{c{{Ah{n}}}Hh}==={c{{Ah{G`}}}Hh}>>>{c{{Ah{Ab}}}Hh}???{c{{Ah{Gb}}}Hh}{{{h{c}}{h{fe}}}{{Ah{{Hf{gi}}}}}{}{}{}{}}0{c{{Ah{E`}}}Hh}11{{{h{Hb}}{h{{Hd{Bd}}}}}{{Ah{Ghc}}}{}}2{c{{Ah{Gd}}}Hh}3333{c{{Ah{Gf}}}Hh}{c{{Ah{Gh}}}Hh}555{c{{Ah{Gj}}}Hh}666{c{{Ah{Gl}}}Hh}7777{c{{Ah{b}}}Hh}{{{h{Ed}}{h{Ed}}}Hl}{{{h{{Dl{c}}}}{h{{Dl{c}}}}}HlHn}{{{h{Ej}}{h{Ej}}}Hl}{{{h{El}}{h{El}}}Hl}{{{h{En}}{h{En}}}Hl}{{{h{F`}}{h{F`}}}Hl}{{{h{Fb}}{h{Fb}}}Hl}{{{h{Fd}}{h{Fd}}}Hl}{{{h{Ff}}{h{Ff}}}Hl}{{{h{Fh}}{h{Fh}}}Hl}{{{h{Fj}}{h{Fj}}}Hl}{{{h{Fl}}{h{Fl}}}Hl}{{{h{Fn}}{h{Fn}}}Hl}{{{h{n}}{h{n}}}Hl}{{{h{G`}}{h{G`}}}Hl}{{{h{Ab}}{h{Ab}}}Hl}{{{h{Gb}}{h{Gb}}}Hl}{{{h{E`}}{h{I`}}}Hl}{{{h{E`}}{h{E`}}}Hl}{{{h{Gj}}{h{Gj}}}Hl}{{{h{Gl}}{h{{Ib{Gb}}}}}Hl}{{{h{Gl}}{h{Gl}}}Hl}{{{h{b}}{h{b}}}Hl}{{{h{c}}{h{e}}}Hl{}{}}00000000000000000000{{{A`{n}}}Fn}{{{A`{Fd}}}En}{F`En}1{{{A`{Id}}}En}2{{{h{Ed}}{h{fIf}}}Ih}{{{h{{Dl{c}}}}{h{fIf}}}IhIj}{{{h{Dn}}{h{fIf}}}Ih}0{{{h{{Eh{c}}}}{h{fIf}}}IhIj}{{{h{Ej}}{h{fIf}}}Ih}{{{h{El}}{h{fIf}}}Ih}0{{{h{En}}{h{fIf}}}Ih}{{{h{F`}}{h{fIf}}}Ih}0{{{h{Fb}}{h{fIf}}}Ih}{{{h{Fd}}{h{fIf}}}Ih}{{{h{Ff}}{h{fIf}}}Ih}{{{h{Fh}}{h{fIf}}}Ih}{{{h{Fj}}{h{fIf}}}Ih}{{{h{Fl}}{h{fIf}}}Ih}{{{h{Fn}}{h{fIf}}}Ih}{{{h{n}}{h{fIf}}}Ih}{{{h{G`}}{h{fIf}}}Ih}{{{h{Ab}}{h{fIf}}}Ih}{{{h{Gb}}{h{fIf}}}Ih}0{{{h{E`}}{h{fIf}}}Ih}0{{{h{Hb}}{h{fIf}}}Ih}{{{h{Il}}{h{fIf}}}Ih}0{{{h{Gd}}{h{fIf}}}Ih}{{{h{Gf}}{h{fIf}}}Ih}{{{h{Gh}}{h{fIf}}}Ih}{{{h{Gj}}{h{fIf}}}Ih}{{{h{Gl}}{h{fIf}}}Ih}{{{h{b}}{h{fIf}}}Ih}0{bd}{cc{}}0000{{{Eh{c}}}{{Dl{c}}}{}}1{InDn}2222222222222222222222222222222222222222222222222{I`E`}3333333333{IdGj}444{{{Ib{Gb}}}Gl}5555{db}{{{Dl{c}}{Dl{c}}}{{Eh{c}}}{}}{{GlEdJ`JbH`}Gd}{cGj{{Jd{Id}}}}{{{h{{Dl{c}}}}{h{{A`{c}}}}}{{Eb{{Jf{c}}}}}{}}{{{h{{Eh{c}}}}{h{{A`{c}}}}}{{Eb{{Jf{c}}}}}{}}{{{h{Gl}}b}{{Eb{{h{Gb}}}}}}{{{h{En}}}{{Eb{{h{{A`{Fd}}}}}}}}{{{h{Hb}}}Jh}{{{h{c}}{h{e}}}Jj{JlAj}Jn}0{{{h{fGl}}b}{{Eb{{h{fGb}}}}}}{{{h{Gj}}}Id}{{{h{E`}}{h{fc}}}jK`}{{{h{b}}{h{fc}}}jK`}{{{h{Gl}}b}{{h{c}}}{}}{{{h{fGl}}b}{{h{fc}}}{}}``{ce{}{}}00000000000000000000000000000000000000000000000000000000000000000000000{{{Dl{c}}}e{}{}}{{{h{Gl}}}c{}}{{{h{{Dl{c}}}}}Hl{}}{{{h{{Dl{c}}}}}{{`{{Kf{}{{Kb{{Kd{{h{{A`{c}}}}{h{{Jf{c}}}}}}}}}}}}}{}}``{{}{{Ah{KhKj}}}}00000000000000000000000000000000000000000000000000000000000000000000000``{{{h{{Dl{c}}}}}I`{}}{{}Ab}````{{}{{Dl{c}}}{}}{{}{{Eh{c}}}{}}{{JbJb}Ej}{{Kl{Jf{Kn}}}Fb}{{{A`{Gj}}{Jf{L`}}{A`{Lb}}}Fd}{{bI`}Fh}{E`Fl}{{{A`{Lb}}{Ib{{A`{G`}}}}}n}{{{A`{Gj}}{A`{Lb}}Ab}G`}{H`Gd}{H`Gh}{E`E`}{{I`I`}Gb}{{{h{E`}}{h{I`}}}{{Eb{Gn}}}}{{{h{E`}}{h{E`}}}{{Eb{Gn}}}}{{{h{b}}{h{b}}}{{Eb{Gn}}}}{h}00000000000000000000000000000000000000000000000000000000000000000000000{{{h{fGl}}}{{Eb{Gb}}}}6``{{{h{fGl}}Gb}j}{{{Jf{Kn}}}Fn}``{{{h{Ed}}I`ce}j{}{}}{{{h{{Dl{c}}}}I`eg}j{}{}{}}{{{h{Ej}}I`ce}j{}{}}{{{h{El}}I`ce}j{}{}}{{{h{En}}I`ce}j{}{}}{{{h{F`}}I`ce}j{}{}}{{{h{Fb}}I`ce}j{}{}}{{{h{Fd}}I`ce}j{}{}}{{{h{Ff}}I`ce}j{}{}}{{{h{Fh}}I`ce}j{}{}}{{{h{Fj}}I`ce}j{}{}}{{{h{Fl}}I`ce}j{}{}}{{{h{Fn}}I`ce}j{}{}}{{{h{n}}I`ce}j{}{}}{{{h{G`}}I`ce}j{}{}}{{{h{Ab}}I`ce}j{}{}}{{{h{Gb}}I`ce}j{}{}}{{{h{E`}}I`ce}j{}{}}{{{h{Gf}}I`ce}j{}{}}{{{h{Gj}}I`ce}j{}{}}{{{h{Gl}}I`ce}j{}{}}{{{h{b}}I`ce}j{}{}}{{{h{c}}I`}j{}}000000000000000000000````{{{Jf{Kn}}}En}{{{Jf{Kn}}Jb}En}{{{h{Ed}}{h{fc}}}{{Ah{e}}}{LdAj}{}}{{{h{Ed}}c}AhLf}{{{h{{Dl{c}}}}e}AhLhLf}{{{h{{Dl{c}}}}{h{fe}}}{{Ah{g}}}{}{LdAj}{}}{{{h{Ej}}{h{fc}}}{{Ah{e}}}{LdAj}{}}{{{h{El}}{h{fc}}}{{Ah{e}}}{LdAj}{}}{{{h{El}}c}AhLf}{{{h{En}}c}AhLf}{{{h{En}}{h{fc}}}{{Ah{e}}}{LdAj}{}}{{{h{F`}}{h{fc}}}{{Ah{e}}}{LdAj}{}}{{{h{F`}}c}AhLf}{{{h{Fb}}c}AhLf}{{{h{Fb}}{h{fc}}}{{Ah{e}}}{LdAj}{}}{{{h{Fd}}{h{fc}}}{{Ah{e}}}{LdAj}{}}{{{h{Fd}}c}AhLf}{{{h{Ff}}{h{fc}}}{{Ah{e}}}{LdAj}{}}{{{h{Ff}}c}AhLf}{{{h{Fh}}c}AhLf}{{{h{Fh}}{h{fc}}}{{Ah{e}}}{LdAj}{}}{{{h{Fj}}c}AhLf}{{{h{Fj}}{h{fc}}}{{Ah{e}}}{LdAj}{}}{{{h{Fl}}c}AhLf}{{{h{Fl}}{h{fc}}}{{Ah{e}}}{LdAj}{}}{{{h{Fn}}{h{fc}}}{{Ah{e}}}{LdAj}{}}{{{h{Fn}}c}AhLf}{{{h{n}}c}AhLf}{{{h{n}}{h{fc}}}{{Ah{e}}}{LdAj}{}}{{{h{G`}}{h{fc}}}{{Ah{e}}}{LdAj}{}}{{{h{G`}}c}AhLf}{{{h{Ab}}{h{fc}}}{{Ah{e}}}{LdAj}{}}{{{h{Ab}}c}AhLf}{{{h{Gb}}c}AhLf}{{{h{Gb}}{h{fc}}}{{Ah{e}}}{LdAj}{}}{{{h{E`}}c}AhLf}{{{h{E`}}{h{fc}}}{{Ah{e}}}{LdAj}{}}{{{h{Gd}}}{{Ah{{Ib{Bd}}}}}}{{{h{Gd}}c}AhLf}{{{h{Gf}}}{{Ah{{Ib{Bd}}{M`{LjLlLn}}}}}}{{{h{Gf}}c}AhLf}{{{h{Gf}}{h{fc}}}{{Ah{e}}}{LdAj}{}}{{{h{Gh}}c}AhLf}{{{h{Gj}}{h{fc}}}{{Ah{e}}}{LdAj}{}}{{{h{Gj}}c}AhLf}{{{h{Gl}}c}AhLf}{{{h{Gl}}{h{fc}}}{{Ah{e}}}{LdAj}{}}{{{h{b}}{h{fc}}}{{Ah{e}}}{LdAj}{}}{{{h{b}}c}AhLf}{{{h{c}}{h{fe}}}{{Ah{j}}}{}{}}000000000000000000000{{{h{c}}{h{fe}}}{{Ah{I`}}}{}{}}000000000000000000000{{{A`{Fd}}}Ab}````{{{h{Ej}}}{{Eb{Jb}}}}{{{h{Dn}}}{{Eb{{h{l}}}}}}{{}Fl}{{}E`}{{bb}b}{{bd}b}````````````{{{h{c}}}e{}{}}000000000000000000000000{{{h{c}}}Kn{}}000000{{{h{Fb}}}Id}``{{{h{Gl}}}Mb}{{{h{f{Eh{Gj}}}}c}{{A`{Gj}}}{{Jd{{Jf{Gj}}}}}}{{{h{f{Eh{c}}}}e}{{Ah{{A`{c}}Md}}}Lh{{Jd{{Jf{c}}}}}}{c{{Ah{e}}}{}{}}0000000000000000000000000000000000000000000000000000000000000000000000{I`{{Ah{bc}}}{}}1{{{h{{Hd{Bd}}}}}{{Ah{GdIl}}}}{{{h{{Hd{Bd}}}}}{{Ah{GfIl}}}}{{{h{{Hd{Bd}}}}}{{Ah{GhIl}}}}444444444444444444444444444444444444444444444444444444444444444444444444{{{h{c}}}Mf{}}00000000000000000000000000000000000000000000000000000000000000000000000```````````{{{h{Ed}}}{{Ah{jDn}}}}{{{h{{Dl{c}}}}}{{Ah{jDn}}}Lh}{{{h{{Dl{Gj}}}}}{{Ah{jDn}}}}`{ce{}{}}00000000000000000000000000000000000000000000000000000000000000000000000````````````````````````````{{{h{c}}}{{h{l}}}{}}{{{h{c}}}{{h{e}}}{}{}}0{{{h{fc}}}{{h{fe}}}{}{}}0{{{h{c}}{h{fe}}}{{Ah{{Hf{gi}}}}}{}{}{}{}}0{{{h{Mh}}{h{fIf}}}Ih}0{cc{}}066{{}{{Ah{KhKj}}}}0{{MjMj}{{Ah{J`Mh}}}}{{{h{Gf}}{h{L`}}}{{Ah{MjMh}}}}{h}0{{{h{Mh}}}{{Eb{{h{l}}}}}}{{{h{c}}}Kn{}}{c{{Ah{e}}}{}{}}000{{{h{c}}}Mf{}}0{{{h{Mj}}}{{Ah{jMh}}}}??````````","D":"BFh","p":[[5,"TracePos",0,1525],[8,"PosType",0,1525],[0,"mut"],[1,"reference"],[1,"unit"],[10,"Error",1526],[5,"CanonResultCidAggregate",0,1527],[5,"CID",1528],[6,"Provenance",0,1527],[5,"ArchivedCidInfo",0,1529],[5,"StructCheckError",1530],[6,"Result",1531],[10,"Sized",1532],[5,"ArchivedCidStore",0,1533],[5,"TupleStructCheckError",1530],[5,"ArchivedParResult",0,1527],[6,"ArchivedSender",0,1527],[1,"u8"],[6,"EnumCheckError",1530],[6,"ArchivedCallResult",0,1527],[6,"ArchivedValueRef",0,1527],[5,"ArchivedCallServiceFailed",0,1527],[5,"ArchivedServiceResultCidAggregate",0,1527],[5,"ArchivedFoldSubTraceLore",0,1527],[5,"ArchivedSubTraceDesc",0,1527],[5,"ArchivedFoldResult",0,1527],[5,"ArchivedApResult",0,1527],[6,"ArchivedCanonResult",0,1527],[5,"ArchivedCanonResultCidAggregate",0,1527],[5,"ArchivedCanonCidAggregate",0,1527],[6,"ArchivedProvenance",0,1527],[6,"ArchivedExecutedState",0,1527],[5,"ArchivedGenerationIdx",0,1534],[5,"ArchivedInterpreterData",0,1535],[5,"ArchivedRawValue",0,1536],[5,"ArchivedExecutionTrace",0,1537],[5,"ArchivedTracePos",0,1525],[5,"CidStore",0,1533],[6,"CidStoreVerificationError",0,1533],[5,"GenerationIdx",0,1534],[6,"Option",1538],[5,"CidInfo",0,1529],[10,"Clone",1539],[5,"CidTracker",0,1533],[5,"ParResult",0,1527],[6,"Sender",0,1527],[6,"CallResult",0,1527],[6,"ValueRef",0,1527],[5,"CallServiceFailed",0,1527],[5,"ServiceResultCidAggregate",0,1527],[5,"FoldSubTraceLore",0,1527],[5,"SubTraceDesc",0,1527],[5,"FoldResult",0,1527],[5,"ApResult",0,1527],[6,"CanonResult",0,1527],[5,"CanonCidAggregate",0,1527],[6,"ExecutedState",0,1527],[5,"InterpreterDataEnvelope",0,1535],[5,"InterpreterData",0,1535],[5,"Versions",0,1535],[5,"RawValue",0,1536],[5,"ExecutionTrace",0,1537],[6,"Ordering",1540],[5,"Version",1541],[5,"InterpreterDataEnvelopeRepr",0,1542],[1,"slice"],[5,"With",1543],[10,"Deserializer",1544],[10,"Deserialize",1544],[1,"bool"],[10,"PartialEq",1540],[1,"usize"],[5,"Vec",1545],[6,"JValue",1546],[5,"Formatter",1547],[8,"Result",1547],[10,"Debug",1547],[6,"DataDeserializationError",0,1535],[6,"CidVerificationError",1548],[5,"SignatureStore",1549],[1,"u32"],[10,"Into",1550],[5,"Rc",1551],[8,"InterpreterDataEnvelopeFormat",0,1542],[1,"u64"],[10,"Hash",1552],[10,"BuildHasher",1552],[10,"Hasher",1552],[17,"Item"],[1,"tuple"],[10,"Iterator",1553],[5,"Layout",1554],[5,"LayoutError",1554],[1,"i32"],[5,"String",1555],[1,"str"],[5,"SecurityTetraplet",1556],[10,"Fallible",1557],[10,"Serializer",1558],[10,"Serialize",1558],[6,"Infallible",1550],[6,"AllocScratchError",1559],[6,"SharedSerializeMapError",1559],[6,"CompositeSerializerError",1560],[8,"TraceLen",0,1537],[6,"CidCalculationError",1528],[5,"TypeId",1561],[6,"DataVerifierError",1480,1562],[5,"DataVerifier",1480,1563],[6,"ExecutedStateResolver",0],[6,"ProvenanceResolver",0],[6,"CallResultResolver",0],[6,"CanonResultResolver",0],[6,"SenderResolver",0],[6,"ValueRefResolver",0],[5,"CidInfoResolver",0],[5,"CidStoreResolver",0],[5,"ParResultResolver",0],[5,"CallServiceFailedResolver",0],[5,"ServiceResultCidAggregateResolver",0],[5,"FoldSubTraceLoreResolver",0],[5,"SubTraceDescResolver",0],[5,"FoldResultResolver",0],[5,"ApResultResolver",0],[5,"CanonResultCidAggregateResolver",0],[5,"CanonCidAggregateResolver",0],[5,"GenerationIdxResolver",0],[5,"InterpreterDataResolver",0],[5,"RawValueResolver",0],[5,"ExecutionTraceResolver",0],[5,"TracePosResolver",0],[15,"ServiceResult",1459],[15,"Canon",1459],[15,"PeerIdWithCallId",1461],[15,"Stream",1463],[15,"MissingReference",1465],[15,"ServiceResult",1468],[15,"Canon",1468],[15,"ServiceResult",1470],[15,"Canon",1470],[15,"PeerIdWithCallId",1472],[15,"PeerIdWithCallId",1474],[15,"Stream",1476],[15,"Stream",1478],[15,"SignatureMismatch",1517],[15,"MalformedKey",1517],[15,"MergeMismatch",1517]],"r":[[3,1527],[4,1527],[5,1527],[6,1527],[7,1527],[8,1527],[9,1527],[10,1527],[11,1529],[12,1533],[13,1527],[14,1537],[15,1527],[16,1527],[17,1534],[18,1535],[19,1527],[20,1527],[21,1536],[22,1527],[23,1527],[24,1527],[25,1525],[26,1527],[30,1527],[31,1527],[32,1527],[33,1527],[40,1527],[41,1527],[42,1527],[43,1527],[44,1527],[45,1527],[46,1529],[47,1529],[48,1533],[49,1533],[50,1533],[51,1533],[54,1535],[62,1527],[63,1527],[64,1537],[65,1537],[72,1527],[73,1527],[74,1527],[75,1527],[76,1527],[77,1534],[78,1534],[79,1535],[80,1535],[81,1542],[82,1542],[83,1535],[91,1527],[92,1527],[99,1525],[100,1527],[101,1527],[102,1536],[103,1536],[113,1527],[114,1527],[118,1527],[119,1527],[123,1527],[124,1527],[125,1537],[126,1525],[127,1525],[131,1527],[132,1527],[133,1535],[1382,1535],[1480,1563],[1481,1562]],"b":[[134,"impl-Add-for-TracePos"],[135,"impl-Add%3Cu32%3E-for-TracePos"],[136,"impl-AddAssign-for-TracePos"],[137,"impl-AddAssign%3Cu32%3E-for-TracePos"],[531,"impl-PartialEq%3Cusize%3E-for-GenerationIdx"],[532,"impl-PartialEq-for-GenerationIdx"],[534,"impl-PartialEq%3CVec%3CExecutedState%3E%3E-for-ExecutionTrace"],[535,"impl-PartialEq-for-ExecutionTrace"],[566,"impl-Debug-for-CidStoreVerificationError"],[567,"impl-Display-for-CidStoreVerificationError"],[570,"impl-Debug-for-Sender"],[571,"impl-Display-for-Sender"],[573,"impl-Debug-for-ValueRef"],[574,"impl-Display-for-ValueRef"],[585,"impl-Display-for-ExecutedState"],[586,"impl-Debug-for-ExecutedState"],[587,"impl-Display-for-GenerationIdx"],[588,"impl-Debug-for-GenerationIdx"],[590,"impl-Debug-for-DataDeserializationError"],[591,"impl-Display-for-DataDeserializationError"],[597,"impl-Debug-for-TracePos"],[598,"impl-Display-for-TracePos"],[867,"impl-PartialOrd%3Cusize%3E-for-GenerationIdx"],[868,"impl-PartialOrd-for-GenerationIdx"],[1000,"impl-Serialize%3C__S%3E-for-CidInfo"],[1001,"impl-Serialize-for-CidInfo"],[1002,"impl-Serialize-for-CidStore%3CVal%3E"],[1003,"impl-Serialize%3C__S%3E-for-CidStore%3CVal%3E"],[1005,"impl-Serialize%3C__S%3E-for-Sender"],[1006,"impl-Serialize-for-Sender"],[1007,"impl-Serialize-for-CallResult"],[1008,"impl-Serialize%3C__S%3E-for-CallResult"],[1009,"impl-Serialize%3C__S%3E-for-ValueRef"],[1010,"impl-Serialize-for-ValueRef"],[1011,"impl-Serialize-for-CallServiceFailed"],[1012,"impl-Serialize%3C__S%3E-for-CallServiceFailed"],[1013,"impl-Serialize%3C__S%3E-for-ServiceResultCidAggregate"],[1014,"impl-Serialize-for-ServiceResultCidAggregate"],[1015,"impl-Serialize%3C__S%3E-for-FoldSubTraceLore"],[1016,"impl-Serialize-for-FoldSubTraceLore"],[1017,"impl-Serialize-for-SubTraceDesc"],[1018,"impl-Serialize%3C__S%3E-for-SubTraceDesc"],[1019,"impl-Serialize-for-FoldResult"],[1020,"impl-Serialize%3C__S%3E-for-FoldResult"],[1021,"impl-Serialize-for-ApResult"],[1022,"impl-Serialize%3C__S%3E-for-ApResult"],[1023,"impl-Serialize%3C__S%3E-for-CanonResult"],[1024,"impl-Serialize-for-CanonResult"],[1025,"impl-Serialize-for-CanonResultCidAggregate"],[1026,"impl-Serialize%3C__S%3E-for-CanonResultCidAggregate"],[1027,"impl-Serialize%3C__S%3E-for-CanonCidAggregate"],[1028,"impl-Serialize-for-CanonCidAggregate"],[1029,"impl-Serialize%3C__S%3E-for-Provenance"],[1030,"impl-Serialize-for-Provenance"],[1031,"impl-Serialize-for-ExecutedState"],[1032,"impl-Serialize%3C__S%3E-for-ExecutedState"],[1033,"impl-Serialize-for-GenerationIdx"],[1034,"impl-Serialize%3C__S%3E-for-GenerationIdx"],[1035,"impl-InterpreterDataEnvelope%3C\'_%3E"],[1036,"impl-Serialize-for-InterpreterDataEnvelope%3C\'a%3E"],[1037,"impl-InterpreterData"],[1038,"impl-Serialize-for-InterpreterData"],[1039,"impl-Serialize%3C__S%3E-for-InterpreterData"],[1041,"impl-Serialize%3C__S%3E-for-RawValue"],[1042,"impl-Serialize-for-RawValue"],[1043,"impl-Serialize-for-ExecutionTrace"],[1044,"impl-Serialize%3C__S%3E-for-ExecutionTrace"],[1045,"impl-Serialize%3C__S%3E-for-TracePos"],[1046,"impl-Serialize-for-TracePos"],[1100,"impl-Sub-for-TracePos"],[1101,"impl-Sub%3Cu32%3E-for-TracePos"],[1494,"impl-Debug-for-DataVerifierError"],[1495,"impl-Display-for-DataVerifierError"]],"c":"OjAAAAAAAAA=","e":"OzAAAAEAAMEEPgAAAAAAAwAAAB4AAQAhAAAAJQAAACgAAAAsAAAALwAAADMABQA+AAEAQQAAAEgAAABKAAAATgAAAFIAAQBXAAEAWwABAGAAAABjAAIAZwAAAHIAAAB2AAAAfgABAIQAAACGAAQAjQABAJEAkAAmARkAQgFRAJUBwwBeAgAAYAIAAJICAACdAgAAoQIAAKYCEQABAwMABwNHAFADAgBUAwAAVwNZALIDAgC2AywA5AMAAOYDXgBKBAQAVAQAAFYEAABbBCAAfgRNAM0EjwBeBQAAYAUAAGYFBABsBUcAugUEAMEFAQDFBQEAygUOAN0FAQDgBQoA7AUJAA=="}],\ +["air_interpreter_interface",{"t":"SIIFFIIIFIIIFIFSFJJJFFFFFFIIFOOONONNNNNNNNNNNNNNNNNNNNNNNNNNOOOONNNNNNNNNNNNNNNNNNNNNNNNNNNNOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNONNNNONNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNONOOOONNNNNNNNNNNNNOOOONNNNNNNNNNNNNOOONNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNN","n":["CALL_SERVICE_SUCCESS","CallArgumentsDeserializeError","CallArgumentsFormat","CallArgumentsRepr","CallRequestParams","CallRequests","CallRequestsDeserializeError","CallRequestsFormat","CallRequestsRepr","CallResults","CallResultsDeserializeError","CallResultsFormat","CallResultsRepr","CallResultsSerializeError","CallServiceResult","INTERPRETER_SUCCESS","InterpreterOutcome","MAX_AIR_SIZE","MAX_CALL_RESULT_SIZE","MAX_PARTICLE_SIZE","RunParameters","SerializedCallArguments","SerializedCallRequests","SerializedCallResults","SerializedTetraplets","SoftLimitsTriggering","TetrapletDeserializeError","TetrapletsFormat","TetrapletsRepr","air_size_limit","air_size_limit_exceeded","air_size_limit_exceeded","are_limits_exceeded","arguments","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","call_requests","call_result_size_limit","call_result_size_limit_exceeded","call_result_size_limit_exceeded","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","current_peer_id","data","default","default","default","default","default","default","default","default","default","default","deref","deref","deref","deref","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","eq","eq","eq","eq","eq","eq","eq","eq","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","err","error_message","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from_ivalue","function_name","get_format","get_format","get_format","get_format","get_hash","get_hash","get_hash","get_hash","hard_limit_enabled","hash","hash","hash","hash","init_peer_id","into","into","into","into","into","into","into","into","into","into","into","into","into","into_ivalue","key_format","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","new","new","new","new","next_peer_pks","ok","particle_id","particle_size_limit","particle_size_limit_exceeded","particle_size_limit_exceeded","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","result","ret_code","ret_code","secret_key_bytes","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","service_id","tetraplets","timestamp","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_string","to_writer","to_writer","to_writer","to_writer","try_as_string","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","ttl","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id"],"q":[[0,"air_interpreter_interface"],[323,"air_interpreter_interface::interpreter_outcome"],[324,"air_interpreter_interface::call_request_parameters"],[325,"air_interpreter_interface::call_service_result"],[326,"air_interpreter_interface::run_parameters"],[327,"core::result"],[328,"serde::de"],[329,"rkyv::with"],[330,"air_interpreter_value::value"],[331,"alloc::vec"],[332,"serde_json::value"],[333,"marine_call_parameters"],[334,"alloc::rc"],[335,"core::fmt"],[336,"fluence_it_types::values"],[337,"alloc::string"],[338,"core::hash"],[339,"core::marker"],[340,"core::alloc::layout"],[341,"serde::ser"],[342,"std::io"],[343,"core::any"],[344,"air_interpreter_interface::run_args_memory_limits"]],"i":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,1,11,1,8,5,6,7,14,15,16,8,9,17,10,1,11,12,5,6,7,14,15,16,8,9,17,10,1,11,12,11,12,1,11,5,6,7,8,9,10,1,11,12,5,6,7,8,9,10,1,11,12,5,6,7,8,9,10,1,1,11,12,12,11,5,6,7,14,15,16,9,17,10,1,5,6,7,9,5,5,6,6,7,7,14,14,14,15,15,15,16,16,8,8,9,9,17,17,10,10,1,1,11,11,12,12,5,6,7,8,9,1,11,12,5,6,7,8,9,1,11,12,10,11,5,6,7,8,9,10,10,1,11,12,5,5,6,6,7,7,14,15,16,8,9,9,17,10,1,11,12,11,8,14,15,16,17,5,6,7,9,12,5,6,7,9,12,5,6,7,14,15,16,8,9,17,10,1,11,12,12,12,5,6,7,14,15,16,8,9,17,10,1,11,12,8,1,11,12,11,10,12,12,1,11,5,6,7,14,15,16,8,9,17,10,1,11,12,10,10,11,12,5,6,7,14,15,16,8,9,17,10,1,11,12,8,8,12,5,6,7,8,9,10,1,11,12,10,14,15,16,17,0,5,6,7,14,15,16,8,9,17,10,1,11,12,5,6,7,14,15,16,8,9,17,10,1,11,12,12,5,6,7,14,15,16,8,9,17,10,1,11,12],"f":"````````````````````````````````{{{d{b}}}f}`{{{d{c}}}{{d{e}}}{}{}}000000000000{{{d{hc}}}{{d{he}}}{}{}}000000000000````{{{d{j}}}j}{{{d{l}}}l}{{{d{n}}}n}{{{d{A`}}}A`}{{{d{Ab}}}Ab}{{{d{Ad}}}Ad}{{{d{b}}}b}{{{d{Af}}}Af}{{{d{Ah}}}Ah}{{{d{c}}{d{he}}}Aj{}{}}00000000{{{d{c}}}Aj{}}000000000``{{}j}{{}l}{{}n}{{}Al}{{}An}{{}B`}{{}Ab}{{}Bb}{{}Ad}{{}b}{{{d{j}}}{{d{c}}}{}}{{{d{l}}}{{d{c}}}{}}{{{d{n}}}{{d{c}}}{}}{{{d{Ab}}}{{d{c}}}{}}{c{{Bd{j}}}Bf}{{{d{c}}{d{he}}}{{Bd{{Bh{gi}}}}}{}{}{}{}}{c{{Bd{l}}}Bf}1{c{{Bd{n}}}Bf}22{{{d{Al}}{d{{Bl{Bj}}}}}{{Bd{{C`{Bn}}c}}}{}}{{{d{Al}}{d{{Bl{Bj}}}}}{{Bd{{C`{Cb}}c}}}{}}{{{d{An}}{d{{Bl{Bj}}}}}{{Bd{{C`{{C`{{Cf{Cd}}}}}}c}}}{}}5{{{d{An}}{d{{Bl{Bj}}}}}{{Bd{{C`{{C`{Cd}}}}c}}}{}}{{{d{B`}}{d{{Bl{Bj}}}}}{{Bd{Chc}}}{}}77{c{{Bd{A`}}}Bf}8{c{{Bd{Ab}}}Bf}{{{d{Bb}}{d{{Bl{Bj}}}}}{{Bd{Cjc}}}{}}:{c{{Bd{Ad}}}Bf};;{c{{Bd{b}}}Bf}{c{{Bd{Af}}}Bf}=={c{{Bd{Ah}}}Bf}{{{d{j}}{d{j}}}f}{{{d{l}}{d{l}}}f}{{{d{n}}{d{n}}}f}{{{d{A`}}{d{A`}}}f}{{{d{Ab}}{d{Ab}}}f}{{{d{b}}{d{b}}}f}{{{d{Af}}{d{Af}}}f}{{{d{Ah}}{d{Ah}}}f}{{{d{c}}{d{e}}}f{}{}}0000000{{Cl{d{Cb}}}Ad}`{{{d{j}}{d{hCn}}}D`}{{{d{l}}{d{hCn}}}D`}{{{d{n}}{d{hCn}}}D`}{{{d{A`}}{d{hCn}}}D`}{{{d{Ab}}{d{hCn}}}D`}{{{d{Ad}}{d{hCn}}}D`}0{{{d{b}}{d{hCn}}}D`}{{{d{Af}}{d{hCn}}}D`}{{{d{Ah}}{d{hCn}}}D`}{{{C`{Bj}}}j}{cc{}}0{{{C`{Bj}}}l}{{{C`{Bj}}}n}222222{{{C`{Bj}}}Ab}33333{Db{{Bd{AfDd}}}}`{{{d{Al}}}c{}}{{{d{An}}}c{}}{{{d{B`}}}c{}}{{{d{Bb}}}c{}}{{{d{c}}{d{e}}}Df{DhDj}Dl}000`{{{d{j}}{d{hc}}}AjDn}{{{d{l}}{d{hc}}}AjDn}{{{d{n}}{d{hc}}}AjDn}{{{d{Ab}}{d{hc}}}AjDn}`{ce{}{}}000000000000{AhDb}`{{}{{Bd{E`Eb}}}}000000000000{{DdDdjl}A`}{{fff}b}{{EdDd{C`{Bj}}{C`{Dd}}nb}Af}{{DdDdDfEfBj{C`{Bj}}DdDfDfDff}Ah}`{{{d{Cb}}}Ad}````{d}000000000000````{{{d{j}}c}BdEh}{{{d{l}}c}BdEh}{{{d{n}}c}BdEh}{{{d{Al}}{d{{C`{Bn}}}}}{{Bd{jc}}}{}}{{{d{An}}{d{{C`{{C`{{Cf{Cd}}}}}}}}}{{Bd{lc}}}{}}{{{d{B`}}{d{Ch}}}{{Bd{nc}}}{}}{{{d{A`}}c}BdEh}{{{d{Ab}}c}BdEh}{{{d{Bb}}{d{Cj}}}{{Bd{Abc}}}{}}{{{d{Ad}}c}BdEh}{{{d{b}}c}BdEh}{{{d{Af}}c}BdEh}{{{d{Ah}}c}BdEh}```{{{d{c}}}e{}{}}00000000{{{d{c}}}Dd{}}{{{d{Al}}{d{{C`{Bn}}}}{d{hc}}}{{Bd{Aje}}}Ej{}}{{{d{An}}{d{{C`{{C`{{Cf{Cd}}}}}}}}{d{hc}}}{{Bd{Aje}}}Ej{}}{{{d{B`}}{d{Ch}}{d{hc}}}{{Bd{Aje}}}Ej{}}{{{d{Bb}}{d{Cj}}{d{hc}}}{{Bd{Aje}}}Ej{}}{{Db{d{El}}}{{Bd{DdDd}}}}{c{{Bd{e}}}{}{}}0000000000000000000000000`{{{d{c}}}En{}}000000000000","D":"Gd","p":[[5,"SoftLimitsTriggering",0,323],[1,"reference"],[1,"bool"],[0,"mut"],[5,"SerializedCallArguments",0,324],[5,"SerializedTetraplets",0,324],[5,"SerializedCallRequests",0,324],[5,"CallRequestParams",0,324],[5,"SerializedCallResults",0,325],[5,"CallServiceResult",0,325],[5,"InterpreterOutcome",0,323],[5,"RunParameters",0,326],[1,"unit"],[5,"CallArgumentsRepr",0,324],[5,"TetrapletsRepr",0,324],[5,"CallRequestsRepr",0,324],[5,"CallResultsRepr",0,325],[6,"Result",327],[10,"Deserializer",328],[5,"With",329],[1,"u8"],[1,"slice"],[6,"JValue",330],[5,"Vec",331],[6,"Value",332],[5,"SecurityTetraplet",333],[5,"Rc",334],[8,"CallRequests",0,324],[8,"CallResults",0,325],[1,"i32"],[5,"Formatter",335],[8,"Result",335],[6,"IValue",336],[5,"String",337],[1,"u64"],[10,"Hash",338],[10,"Sized",339],[10,"BuildHasher",338],[10,"Hasher",338],[5,"Layout",340],[5,"LayoutError",340],[1,"i64"],[1,"u32"],[10,"Serializer",341],[10,"Write",342],[1,"str"],[5,"TypeId",343]],"r":[[0,325],[1,324],[2,324],[3,324],[4,324],[5,324],[6,324],[7,324],[8,324],[9,325],[10,325],[11,325],[12,325],[13,325],[14,325],[15,323],[16,323],[17,344],[18,344],[19,344],[20,326],[21,324],[22,324],[23,325],[24,324],[25,323],[26,324],[27,324],[28,324],[282,323]],"b":[[115,"impl-FromSerialized%3CVec%3CJValue%3E%3E-for-CallArgumentsRepr"],[116,"impl-FromSerialized%3CVec%3CValue%3E%3E-for-CallArgumentsRepr"],[117,"impl-FromSerialized%3CVec%3CVec%3CRc%3CSecurityTetraplet%3E%3E%3E%3E-for-TetrapletsRepr"],[119,"impl-FromSerialized%3CVec%3CVec%3CSecurityTetraplet%3E%3E%3E-for-TetrapletsRepr"],[159,"impl-Debug-for-CallServiceResult"],[160,"impl-Display-for-CallServiceResult"]],"c":"OjAAAAAAAAA=","e":"OzAAAAEAAAkBGwAAAAQABgADAAsAAwAQAAAAEwABABYAAwAbAAIAHwAAACEAAAAjABkAPwAAAEEAGwBfADoAmwAKAKgAAQCwAAAAtgAAALgABwDBAAMA0wAAANUAEADnAAAA6gAAAOwADAD9AAwADQEoADcBDAA="}],\ +["air_interpreter_sede",{"t":"RRKRKKFFKFFRRRKKRRNNNNNNNNNNNNNNQQMMNNMNNMNNCMNNMNNMMNNNNNNNNPGGPPPIPNNNNHHNNNNNNNNNNHNNNNNNNNNNH","n":["DeserializationError","DeserializeError","Format","Format","FromSerialiedBorrow","FromSerialized","MsgPackFormat","MsgPackMultiformat","Representation","RmpSerdeFormat","RmpSerdeMultiformat","SerializationError","SerializeError","SerializedValue","ToSerialized","ToWriter","WriteError","WriteError","borrow","borrow","borrow_mut","borrow_mut","clone","clone","clone_into","clone_into","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","default","default","define_simple_representation","derive_serialized_type","deserialize","deserialize_borrow","from","from","from_slice","from_slice","from_slice","get_format","into","into","multiformat","serialize","to_owned","to_owned","to_vec","to_vec","to_vec","to_writer","to_writer","to_writer","to_writer","try_from","try_from","try_into","try_into","type_id","type_id","Codec","DecodeError","EncodeError","Format","Format","Io","SerializationCodec","VarInt","borrow","borrow","borrow_mut","borrow_mut","decode_multiformat","encode_multiformat","fmt","fmt","fmt","fmt","from","from","from","from","into","into","parse_multiformat_bytes","source","source","to_string","to_string","try_from","try_from","try_into","try_into","type_id","type_id","write_multiformat"],"q":[[0,"air_interpreter_sede"],[61,"air_interpreter_sede::multiformat"],[97,"air_interpreter_sede::rmp_serde"],[98,"air_interpreter_sede::representation"],[99,"core::result"],[100,"air_interpreter_sede::format"],[101,"core::fmt"],[102,"serde::ser"],[103,"serde::de"],[104,"core::ops::deref"],[105,"alloc::vec"],[106,"std::io"],[107,"core::any"],[108,"unsigned_varint::decode"],[109,"std::io::error"],[110,"core::error"],[111,"core::option"],[112,"alloc::string"]],"i":[14,22,0,22,0,0,0,0,0,0,0,14,22,22,0,0,14,22,3,4,3,4,3,4,3,4,3,3,4,4,3,4,0,0,6,10,3,4,14,3,4,22,3,4,0,25,3,4,14,3,4,14,28,3,4,3,4,3,4,3,4,31,0,0,31,32,32,0,31,31,32,31,32,0,0,31,31,32,32,31,31,32,32,31,32,0,31,32,31,32,31,32,31,32,31,32,0],"f":"``````````````````{{{b{c}}}{{b{e}}}{}{}}0{{{b{dc}}}{{b{de}}}{}{}}0{{{b{f}}}f}{{{b{h}}}h}{{{b{c}}{b{de}}}j{}{}}0{{{b{c}}}j{}}000{{}f}{{}h}``{{{b{l}}{b{{A`{n}}}}}{{Ab{ce}}}{}{}}{{{b{Ad}}{b{{A`{n}}}}}{{Ab{ce}}}{}{}}{cc{}}0{{{b{{Al{}{{Af{c}}{Ah{e}}{Aj{g}}}}}}{b{{A`{n}}}}}{{Ab{ie}}}AnAnAn{}}{{{b{f}}{b{{A`{n}}}}}{{Ab{ce}}}{B`Bb}{}}{{{b{h}}{b{{A`{n}}}}}{{Ab{ce}}}{B`Bb}{}}{{{b{{Bl{}{{Bd{c}}{Bf{e}}{Aj{g}}{Bh{i}}{Bj{k}}}}}}}i{}{}{}{}{{C`{}{{Bn{{A`{n}}}}}}}}{ce{}{}}0`{{{b{Cb}}{b{c}}}{{Ab{eg}}}{}{}{}}{{{b{c}}}e{}{}}0{{{b{{Al{}{{Af{c}}{Ah{e}}{Aj{g}}}}}}{b{i}}}{{Ab{{Cd{n}}c}}}AnAnAn{}}{{{b{f}}{b{c}}}{{Ab{{Cd{n}}e}}}{B`Bb}{}}{{{b{h}}{b{c}}}{{Ab{{Cd{n}}e}}}{B`Bb}{}}{{{b{{Al{}{{Af{c}}{Ah{e}}{Aj{g}}}}}}{b{i}}{b{dk}}}{{Ab{jg}}}AnAnAn{}Cf}{{{b{Ch}}{b{c}}{b{de}}}{{Ab{jg}}}{}Cf{}}{{{b{f}}{b{c}}{b{de}}}{{Ab{jg}}}{B`Bb}Cf{}}{{{b{h}}{b{c}}{b{de}}}{{Ab{jg}}}{B`Bb}Cf{}}{c{{Ab{e}}}{}{}}000{{{b{c}}}Cj{}}0````````{{{b{c}}}{{b{e}}}{}{}}0{{{b{dc}}}{{b{de}}}{}{}}0{{{b{{A`{n}}}}Cl{b{e}}}{{Ab{cCn}}}{}{{Al{c}}}}{{{b{c}}Cl{b{e}}}{{Ab{{Cd{n}}D`}}}{}{{Al{c}}}}{{{b{{Cn{c}}}}{b{dDb}}}DdAn}{{{b{{Cn{c}}}}{b{dDb}}}DdDf}{{{b{{D`{c}}}}{b{dDb}}}DdDf}{{{b{{D`{c}}}}{b{dDb}}}DdAn}{cc{}}{Dh{{Cn{c}}}{}}1{Dj{{D`{c}}}{}}{ce{}{}}0{{{b{{A`{n}}}}}{{Ab{{Dl{Cl{b{{A`{n}}}}}}Dh}}}}{{{b{{Cn{c}}}}}{{E`{{b{Dn}}}}}Dn}{{{b{{D`{c}}}}}{{E`{{b{Dn}}}}}Dn}{{{b{c}}}Eb{}}0{c{{Ab{e}}}{}{}}000{{{b{c}}}Cj{}}0{{{b{c}}Cl{b{e}}{b{dg}}}{{Ab{jD`}}}{}{{Al{c}}}Cf}","D":"Aj","p":[[1,"reference"],[0,"mut"],[5,"RmpSerdeFormat",0,97],[5,"RmpSerdeMultiformat",0,97],[1,"unit"],[10,"FromSerialized",0,98],[1,"u8"],[1,"slice"],[6,"Result",99],[10,"FromSerialiedBorrow",0,98],[17,"SerializationError"],[17,"DeserializationError"],[17,"WriteError"],[10,"Format",0,100],[10,"Debug",101],[10,"Serialize",102],[10,"DeserializeOwned",103],[17,"SerializeError"],[17,"DeserializeError"],[17,"Format"],[17,"SerializedValue"],[10,"Representation",0,98],[17,"Target"],[10,"Deref",104],[10,"ToSerialized",0,98],[5,"Vec",105],[10,"Write",106],[10,"ToWriter",0,98],[5,"TypeId",107],[8,"SerializationCodec",61],[6,"DecodeError",61],[6,"EncodeError",61],[5,"Formatter",101],[8,"Result",101],[10,"Display",101],[6,"Error",108],[5,"Error",109],[1,"tuple"],[10,"Error",110],[6,"Option",111],[5,"String",112]],"r":[[2,100],[4,98],[5,98],[8,98],[9,97],[10,97],[14,98],[15,98]],"b":[[75,"impl-Debug-for-DecodeError%3CFormatError%3E"],[76,"impl-Display-for-DecodeError%3CFormatError%3E"],[77,"impl-Display-for-EncodeError%3CFormatError%3E"],[78,"impl-Debug-for-EncodeError%3CFormatError%3E"]],"c":"OjAAAAAAAAA=","e":"OzAAAAEAAFQACQAAAAQABwABAAoABAARABMAJwADAC0AIgBRAAAAUwAAAFYACwA="}],\ +["air_interpreter_server",{"t":"CHHHCHHHHH","n":["ast","ast","invoke","invoke_tracing","logger","main","to_human_readable_data","ast","init_logger","json_output_mode"],"q":[[0,"air_interpreter_server"],[7,"air_interpreter_server::ast"],[8,"air_interpreter_server::logger"],[10,"alloc::string"],[11,"alloc::vec"],[12,"air_interpreter_interface::run_parameters"],[13,"air_interpreter_interface::interpreter_outcome"],[14,"log"],[15,"core::option"]],"i":[0,0,0,0,0,0,0,0,0,0],"f":"`{bb}{{b{f{d}}{f{d}}h{f{d}}}j}{{b{f{d}}{f{d}}h{f{d}}bd}j}`{{}l}{{{f{d}}}b}4{{{A`{n}}}l}{dAb}","D":"d","p":[[5,"String",10],[1,"u8"],[5,"Vec",11],[5,"RunParameters",12],[5,"InterpreterOutcome",13],[1,"unit"],[6,"LevelFilter",14],[6,"Option",15],[1,"bool"]],"r":[],"b":[],"c":"OjAAAAAAAAA=","e":"OzAAAAEAAAgAAgAAAAYACQABAA=="}],\ +["air_interpreter_signatures",{"t":"PFFFPPPPGGFFFFPPFFFFPGNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN","n":["AlgorithmNotWhitelisted","ArchivedPublicKey","ArchivedSignature","ArchivedSignatureStore","Ed25519","InvalidKey","InvalidKeyData","InvalidSignature","KeyError","KeyFormat","KeyPair","PeerCidTracker","PublicKey","PublicKeyResolver","Rsa","Secp256k1","Signature","SignatureResolver","SignatureStore","SignatureStoreResolver","Verification","VerificationError","as_error","as_error","as_inner","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","check_bytes","check_bytes","check_bytes","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","default","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","eq","eq","eq","eq","equivalent","equivalent","equivalent","equivalent","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from_secret_key","from_str","gen_signature","get","get_hash","get_hash","hash","hash","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into_inner","is_empty","iter","key_format","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","len","new","new","new","new","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","public","put","register","resolve","resolve","resolve","resolve_metadata","resolve_metadata","resolve_metadata","secret","serialize","serialize","serialize","serialize","serialize","serialize","serialize_metadata","serialize_metadata","serialize_metadata","serialize_unsized","serialize_unsized","serialize_unsized","sign","sign_cids","source","source","to_owned","to_owned","to_owned","to_owned","to_owned","to_peer_id","to_string","to_string","to_string","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","validate","verify","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip"],"q":[[0,"air_interpreter_signatures"],[278,"core::error"],[279,"fluence_keypair::key_pair"],[280,"air_interpreter_signatures::stores"],[281,"bytecheck"],[282,"core::result"],[283,"core::marker"],[284,"core::hash"],[285,"core::cmp"],[286,"core::clone"],[287,"rkyv::with"],[288,"serde::de"],[289,"core::fmt"],[290,"air_interpreter_signatures::trackers"],[291,"fluence_keypair::error"],[292,"fluence_keypair::signature"],[293,"alloc::vec"],[294,"core::option"],[295,"core::borrow"],[296,"core::alloc::layout"],[297,"alloc::string"],[298,"alloc::rc"],[299,"core::convert"],[300,"fluence_keypair::public_key"],[301,"air_interpreter_cid"],[302,"serde::ser"],[303,"rkyv"],[304,"core::any"],[305,"borsh::ser"]],"i":[28,0,0,0,18,29,28,29,0,0,0,0,0,0,18,18,0,0,0,0,29,0,28,29,3,58,6,14,27,28,29,59,12,16,3,60,13,17,18,58,6,14,27,28,29,59,12,16,3,60,13,17,18,6,12,13,14,16,3,17,18,14,16,3,17,18,14,16,3,17,18,18,14,58,6,14,14,27,28,29,59,12,16,16,3,60,13,17,17,18,12,16,17,18,12,16,17,18,14,27,28,28,29,29,16,17,18,58,6,14,27,28,28,29,29,59,12,16,3,60,13,17,17,18,3,18,27,14,12,16,12,16,58,6,14,27,28,29,59,12,16,3,60,13,17,18,3,14,14,3,58,6,14,27,28,29,59,12,16,3,60,13,17,18,14,14,27,16,3,58,6,14,27,28,29,59,12,16,3,60,13,17,18,3,14,27,14,16,17,14,16,17,3,14,14,16,16,17,17,14,16,17,14,16,17,3,0,28,29,14,16,3,17,18,16,28,29,16,58,6,14,27,28,29,59,12,16,3,3,60,13,17,18,18,58,6,14,27,28,29,59,12,16,3,60,13,17,18,58,6,14,27,28,29,59,12,16,3,60,13,17,18,16,16,58,6,14,27,28,29,59,12,16,3,60,13,17,18],"f":"``````````````````````{{{b{c}}}{{b{d}}}{}}0{{{b{f}}}{{b{h}}}}{{{b{c}}}{{b{e}}}{}{}}0000000000000{{{b{jc}}}{{b{je}}}{}{}}0000000000000{{{b{jc}}}{{A`{{b{{l{eg}}}}n}}}Ab{AdAf}{}}{{{b{jc}}}{{A`{{b{Ah}}n}}}Ab}{{{b{jc}}}{{A`{{b{Aj}}n}}}Ab}{{{b{{Al{ce}}}}}{{Al{ce}}}{AnAdAf}An}{{{b{B`}}}B`}{{{b{f}}}f}{{{b{Bb}}}Bb}{{{b{Bd}}}Bd}{{{b{c}}{b{je}}}Bf{}{}}0000{{{b{c}}}Bf{}}00000{{}{{Al{ce}}}{AdAf}{}}{{{b{c}}{b{je}}}{{A`{{Bh{gi}}}}}{}{}{}{}}0{c{{A`{{Al{eg}}}}}Bj{BlAdAf}Bl}1111111{c{{A`{B`}}}Bj}2222{c{{A`{Bb}}}Bj}3{{{b{Ah}}{b{Ah}}}Bn}{{{b{B`}}{b{B`}}}Bn}{{{b{Bb}}{b{Bb}}}Bn}{{{b{Bd}}{b{Bd}}}Bn}{{{b{c}}{b{e}}}Bn{}{}}000{{{b{{Al{ce}}}}{b{jC`}}}Cb{CdAdAf}Cd}{{{b{Cf}}{b{jC`}}}Cb}{{{b{Ch}}{b{jC`}}}Cb}0{{{b{Cj}}{b{jC`}}}Cb}0{{{b{B`}}{b{jC`}}}Cb}{{{b{Bb}}{b{jC`}}}Cb}{{{b{Bd}}{b{jC`}}}{{A`{BfCl}}}}{cc{}}0000{CnCh}1{D`Cj}2222222{DbBb}3{{{Df{Dd}}Bd}{{A`{fCh}}}}{{{b{Dh}}}{{A`{Bd}}}}{{{b{Cf}}{b{Dh}}{b{f}}}{{A`{BbDj}}}}{{{b{{Al{eg}}}}{b{c}}}{{Dl{{b{g}}}}}{AdAfAb}{{Dn{c}}AdAf}{}}{{{b{c}}{b{e}}}E`{AdAb}Eb}0{{{b{Ah}}{b{jc}}}BfEd}{{{b{B`}}{b{jc}}}BfEd}{ce{}{}}0000000000000{fh}{{{b{{Al{ce}}}}}Bn{AdAf}{}}{{{b{{Al{ce}}}}}{}{AdAf}{}}{{{b{f}}}Bd}{{}{{A`{EfEh}}}}0000000000000{{{b{{Al{ce}}}}}Ej{AdAf}{}}{{}{{Al{ce}}}{AdAf}{}}{cCf{{F`{{En{El}}}}}}{FbB`}{h{{A`{fCh}}}}{b}0000000000000{{{b{f}}}B`}{{{b{j{Al{ce}}}}ce}Bf{AdAf}{}}{{{b{jCf}}{b{Dh}}{b{{Fd{c}}}}}Bf{}}{{{b{{Al{ce}}}}Ejgi}Bf{AdAf}{}{}{}}{{{b{B`}}Ejce}Bf{}{}}{{{b{Bb}}Ejce}Bf{}{}}{{{b{c}}Ej}Bf{}}00{{{b{f}}}{{Df{Dd}}}}{{{b{{Al{ce}}}}g}A`{FfAdAf}FfFh}{{{b{{Al{ce}}}}{b{jg}}}{{A`{i}}}{AdAf}{}{FjAb}{}}{{{b{B`}}c}A`Fh}{{{b{B`}}{b{jc}}}{{A`{e}}}{FjAb}{}}{{{b{Bb}}c}A`Fh}{{{b{Bb}}{b{jc}}}{{A`{e}}}{FjAb}{}}{{{b{c}}{b{je}}}{{A`{Bf}}}{}{}}00{{{b{c}}{b{je}}}{{A`{Ej}}}{}{}}00{{{b{f}}{b{{Fl{Dd}}}}}{{A`{BbDj}}}}{{{Df{{En{Fn}}}}{b{Dh}}{b{h}}}{{A`{DbDj}}}}{{{b{Ch}}}{{Dl{{b{d}}}}}}{{{b{Cj}}}{{Dl{{b{d}}}}}}{{{b{c}}}e{}{}}0000{{{b{B`}}}{{A`{ElCh}}}}{{{b{c}}}El{}}0{{{b{B`}}}El}{c{{A`{e}}}{}{}}00000000{h{{A`{fc}}}{}}1111{Dd{{A`{Bd}}}}222222222222222{{{b{c}}}G`{}}0000000000000{{{b{B`}}}{{A`{BfCh}}}}{{{b{B`}}{b{c}}{b{Dh}}{b{Bb}}}{{A`{BfCj}}}{GbAb}}{ce{}{}}0000000000000","D":"Dn","p":[[1,"reference"],[10,"Error",278],[5,"KeyPair",0],[6,"KeyPair",279],[0,"mut"],[5,"ArchivedSignatureStore",0,280],[5,"TupleStructCheckError",281],[6,"Result",282],[10,"Sized",283],[10,"Hash",284],[10,"Eq",285],[5,"ArchivedPublicKey",0],[5,"ArchivedSignature",0],[5,"SignatureStore",0,280],[10,"Clone",286],[5,"PublicKey",0],[5,"Signature",0],[6,"KeyFormat",0,279],[1,"unit"],[5,"With",287],[10,"Deserializer",288],[10,"Deserialize",288],[1,"bool"],[5,"Formatter",289],[8,"Result",289],[10,"Debug",289],[5,"PeerCidTracker",0,290],[6,"KeyError",0],[6,"VerificationError",0],[5,"Error",289],[6,"DecodingError",291],[6,"VerificationError",291],[6,"Signature",292],[1,"u8"],[5,"Vec",293],[1,"str"],[6,"SigningError",291],[6,"Option",294],[10,"Borrow",295],[1,"u64"],[10,"BuildHasher",284],[10,"Hasher",284],[5,"Layout",296],[5,"LayoutError",296],[1,"usize"],[5,"String",297],[5,"Rc",298],[10,"Into",299],[6,"PublicKey",300],[5,"CID",301],[10,"Serialize",302],[10,"Serializer",302],[10,"Fallible",303],[1,"slice"],[8,"CidRef",301],[5,"TypeId",304],[10,"BorshSerialize",305],[5,"SignatureStoreResolver",0],[5,"PublicKeyResolver",0],[5,"SignatureResolver",0]],"r":[[3,280],[9,279],[11,290],[18,280],[19,280],[206,290]],"b":[[100,"impl-Debug-for-KeyError"],[101,"impl-Display-for-KeyError"],[102,"impl-Debug-for-VerificationError"],[103,"impl-Display-for-VerificationError"],[193,"impl-Serialize-for-SignatureStore%3CKey,+Sign%3E"],[194,"impl-Serialize%3C__S%3E-for-SignatureStore%3CKey,+Sign%3E"],[195,"impl-Serialize-for-PublicKey"],[196,"impl-Serialize%3C__S%3E-for-PublicKey"],[197,"impl-Serialize-for-Signature"],[198,"impl-Serialize%3C__S%3E-for-Signature"]],"c":"OjAAAAAAAAA=","e":"OzAAAAEAAO8ACgAAAAEABQAEAAsAAAAPAAEAFQBWAHEAAABzAAAAewAAAH0ABwCTAIMA"}],\ +["air_interpreter_value",{"t":"PPGIIPPPPNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN","n":["Array","Bool","JValue","JsonString","Map","Null","Number","Object","String","array","array_from_iter","as_array","as_bool","as_f64","as_i64","as_null","as_number","as_object","as_str","as_u64","borrow","borrow_mut","clone","clone_into","clone_to_uninit","default","deserialize","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","fmt","fmt","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from_iter","from_iter","get","index","into","is_array","is_boolean","is_f64","is_i64","is_null","is_number","is_object","is_string","is_u64","object","object_from_pairs","pointer","serialize","string","take","to_owned","to_string","try_from","try_into","type_id"],"q":[[0,"air_interpreter_value"],[111,"air_interpreter_value::value"],[112,"alloc::rc"],[113,"core::convert"],[114,"core::iter::traits::collect"],[115,"core::option"],[116,"serde_json::number"],[117,"core::result"],[118,"serde::de"],[119,"alloc::string"],[120,"core::fmt"],[121,"std::collections::hash::map"],[122,"core::clone"],[123,"serde_json::value"],[124,"alloc::borrow"],[125,"alloc::vec"],[126,"serde::ser"],[127,"core::any"]],"i":[1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],"f":"`````````{cb{{h{{f{{d{b}}}}}}}}{eb{{h{b}}}{{l{}{{j{c}}}}}}{{{n{b}}}{{A`{{n{{d{b}}}}}}}}{{{n{b}}}{{A`{Ab}}}}{{{n{b}}}{{A`{Ad}}}}{{{n{b}}}{{A`{Af}}}}{{{n{b}}}{{A`{Ah}}}}{{{n{b}}}{{A`{{n{Aj}}}}}}{{{n{b}}}{{A`{{n{{An{Alb}}}}}}}}{{{n{b}}}{{A`{{n{Al}}}}}}{{{n{b}}}{{A`{B`}}}}{{{n{c}}}{{n{e}}}{}{}}{{{n{Bbc}}}{{n{Bbe}}}{}{}}{{{n{b}}}b}{{{n{c}}{n{Bbe}}}Ah{}{}}{{{n{c}}}Ah{}}{{}b}{c{{Bd{b}}}Bf}{{{n{{n{b}}}}{n{Ad}}}Ab}{{{n{b}}{n{Bh}}}Ab}{{{n{b}}{n{Af}}}Ab}{{{n{b}}{n{Bj}}}Ab}{{{n{b}}{n{b}}}Ab}{{{n{{n{b}}}}{n{Bl}}}Ab}{{{n{b}}{n{Bn}}}Ab}{{{n{b}}{n{C`}}}Ab}{{{n{b}}{n{Cb}}}Ab}{{{n{b}}{n{{n{C`}}}}}Ab}{{{n{b}}{n{Cd}}}Ab}{{{n{b}}{n{B`}}}Ab}{{{n{{n{b}}}}{n{Cf}}}Ab}{{{n{b}}{n{Ch}}}Ab}{{{n{{n{b}}}}{n{Bj}}}Ab}{{{n{{n{b}}}}{n{Ab}}}Ab}{{{n{{n{b}}}}{n{Ch}}}Ab}{{{n{b}}{n{Cf}}}Ab}{{{n{b}}{n{Bl}}}Ab}{{{n{b}}{n{Ad}}}Ab}{{{n{{n{b}}}}{n{Cj}}}Ab}{{{n{{n{b}}}}{n{Cb}}}Ab}{{{n{{n{b}}}}{n{Cd}}}Ab}{{{n{{n{b}}}}{n{Bn}}}Ab}{{{n{{n{b}}}}{n{Af}}}Ab}{{{n{{n{b}}}}{n{B`}}}Ab}{{{n{b}}{n{Cl}}}Ab}{{{n{{n{b}}}}{n{Cl}}}Ab}{{{n{b}}{n{Cj}}}Ab}{{{n{b}}{n{Ab}}}Ab}{{{n{b}}{n{BbCn}}}D`}0{cc{}}{{{An{Alb}}}b}{Cbb}{Bjb}{Ajb}{Bhb}{Chb}{Bnb}{{{A`{c}}}b{{h{b}}}}{{{Db{ce}}}b{{h{Al}}}{{h{b}}}}{Abb}{Cdb}{Afb}{{{n{{d{c}}}}}b{Dd{h{b}}}}{Dfb}{{{n{Df}}}b}{{{Dh{C`}}}b}{Cfb}{Adb}{{{Dj{c}}}b{{h{b}}}}{Clb}{Blb}{Cjb}{B`b}{{{n{C`}}}b}{Ahb}{Alb}{gb{{h{Al}}}{{h{b}}}{{l{}{{j{{Dl{ce}}}}}}}}{eb{{h{b}}}{{l{}{{j{c}}}}}}{{{n{b}}c}{{A`{{n{b}}}}}`}{{{n{b}}c}{{n{b}}}`}{ce{}{}}{{{n{b}}}Ab}00000000{cb{{h{{An{Alb}}}}}}6{{{n{b}}{n{C`}}}{{A`{{n{b}}}}}}{{{n{b}}c}BdDn}{cb{{h{{f{C`}}}}}}{{{n{Bbb}}}b}{{{n{c}}}e{}{}}{{{n{c}}}Bh{}}{c{{Bd{e}}}{}{}}0{{{n{c}}}E`{}}","D":"En","p":[[6,"JValue",0,111],[1,"slice"],[5,"Rc",112],[10,"Into",113],[17,"Item"],[10,"IntoIterator",114],[1,"reference"],[6,"Option",115],[1,"bool"],[1,"f64"],[1,"i64"],[1,"unit"],[5,"Number",116],[8,"JsonString",0],[8,"Map",0],[1,"u64"],[0,"mut"],[6,"Result",117],[10,"Deserializer",118],[5,"String",119],[1,"u8"],[1,"i8"],[1,"isize"],[1,"str"],[1,"i32"],[1,"i16"],[1,"u32"],[1,"u16"],[1,"usize"],[1,"f32"],[5,"Formatter",120],[8,"Result",120],[5,"HashMap",121],[10,"Clone",122],[6,"Value",123],[6,"Cow",124],[5,"Vec",125],[1,"tuple"],[10,"Serializer",126],[5,"TypeId",127]],"r":[[2,111]],"b":[[27,"impl-PartialEq%3Cf64%3E-for-%26JValue"],[28,"impl-PartialEq%3CString%3E-for-JValue"],[29,"impl-PartialEq%3Ci64%3E-for-JValue"],[30,"impl-PartialEq%3Cu8%3E-for-JValue"],[31,"impl-PartialEq-for-JValue"],[32,"impl-PartialEq%3Ci8%3E-for-%26JValue"],[33,"impl-PartialEq%3Cisize%3E-for-JValue"],[34,"impl-PartialEq%3Cstr%3E-for-JValue"],[35,"impl-PartialEq%3Ci32%3E-for-JValue"],[36,"impl-PartialEq%3C%26str%3E-for-JValue"],[37,"impl-PartialEq%3Ci16%3E-for-JValue"],[38,"impl-PartialEq%3Cu64%3E-for-JValue"],[39,"impl-PartialEq%3Cu32%3E-for-%26JValue"],[40,"impl-PartialEq%3Cu16%3E-for-JValue"],[41,"impl-PartialEq%3Cu8%3E-for-%26JValue"],[42,"impl-PartialEq%3Cbool%3E-for-%26JValue"],[43,"impl-PartialEq%3Cu16%3E-for-%26JValue"],[44,"impl-PartialEq%3Cu32%3E-for-JValue"],[45,"impl-PartialEq%3Ci8%3E-for-JValue"],[46,"impl-PartialEq%3Cf64%3E-for-JValue"],[47,"impl-PartialEq%3Cusize%3E-for-%26JValue"],[48,"impl-PartialEq%3Ci32%3E-for-%26JValue"],[49,"impl-PartialEq%3Ci16%3E-for-%26JValue"],[50,"impl-PartialEq%3Cisize%3E-for-%26JValue"],[51,"impl-PartialEq%3Ci64%3E-for-%26JValue"],[52,"impl-PartialEq%3Cu64%3E-for-%26JValue"],[53,"impl-PartialEq%3Cf32%3E-for-JValue"],[54,"impl-PartialEq%3Cf32%3E-for-%26JValue"],[55,"impl-PartialEq%3Cusize%3E-for-JValue"],[56,"impl-PartialEq%3Cbool%3E-for-JValue"],[57,"impl-Display-for-JValue"],[58,"impl-Debug-for-JValue"],[60,"impl-From%3CBTreeMap%3CRc%3Cstr%3E,+JValue%3E%3E-for-JValue"],[61,"impl-From%3Ci32%3E-for-JValue"],[62,"impl-From%3Cu8%3E-for-JValue"],[63,"impl-From%3CNumber%3E-for-JValue"],[64,"impl-From%3CString%3E-for-JValue"],[65,"impl-From%3Cu16%3E-for-JValue"],[66,"impl-From%3Cisize%3E-for-JValue"],[67,"impl-From%3COption%3CT%3E%3E-for-JValue"],[68,"impl-From%3CHashMap%3CK,+V%3E%3E-for-JValue"],[69,"impl-From%3Cbool%3E-for-JValue"],[70,"impl-From%3Ci16%3E-for-JValue"],[71,"impl-From%3Ci64%3E-for-JValue"],[72,"impl-From%3C%26%5BT%5D%3E-for-JValue"],[73,"impl-From%3CValue%3E-for-JValue"],[74,"impl-From%3C%26Value%3E-for-JValue"],[75,"impl-From%3CCow%3C\'a,+str%3E%3E-for-JValue"],[76,"impl-From%3Cu32%3E-for-JValue"],[77,"impl-From%3Cf64%3E-for-JValue"],[78,"impl-From%3CVec%3CT%3E%3E-for-JValue"],[79,"impl-From%3Cf32%3E-for-JValue"],[80,"impl-From%3Ci8%3E-for-JValue"],[81,"impl-From%3Cusize%3E-for-JValue"],[82,"impl-From%3Cu64%3E-for-JValue"],[83,"impl-From%3C%26str%3E-for-JValue"],[84,"impl-From%3C()%3E-for-JValue"],[85,"impl-From%3CRc%3Cstr%3E%3E-for-JValue"],[86,"impl-FromIterator%3C(K,+V)%3E-for-JValue"],[87,"impl-FromIterator%3CT%3E-for-JValue"]],"c":"OjAAAAAAAAA=","e":"OzAAAAEAAEAADgAAAAAABAABAAoAAQAVACQAOwAAAD4AAQBCAAIARwABAEoAAQBNAAAAUQACAGUAAQBoAAEAawAEAA=="}],\ +["air_lambda_ast",{"t":"PPPPGPGPGPNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOO","n":["ArrayAccess","Error","FieldAccessByName","FieldAccessByScalar","Functor","Functor","LambdaAST","Length","ValueAccessor","ValuePath","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","clone","clone","clone","clone_into","clone_into","clone_into","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","deserialize","deserialize","deserialize","eq","eq","eq","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from_functor","into","into","into","serialize","serialize","serialize","to_owned","to_owned","to_owned","to_string","to_string","to_string","try_from","try_from","try_from","try_from_accessors","try_into","try_into","try_into","type_id","type_id","type_id","field_name","idx","scalar_name"],"q":[[0,"air_lambda_ast"],[65,"air_lambda_ast::ValueAccessor"],[68,"air_lambda_ast::ast"],[69,"core::result"],[70,"serde::de"],[71,"core::fmt"],[72,"serde::ser"],[73,"alloc::string"],[74,"alloc::vec"],[75,"non_empty_vec"],[76,"core::any"]],"i":[4,4,4,4,0,3,0,5,0,3,3,4,5,3,4,5,3,4,5,3,4,5,3,4,4,5,5,3,4,5,3,4,5,3,3,4,4,5,5,3,4,5,3,3,4,5,3,4,5,3,4,5,3,4,5,3,4,5,3,3,4,5,3,4,5,17,18,19],"f":"``````````{{{b{c}}}{{b{e}}}{}{}}00{{{b{dc}}}{{b{de}}}{}{}}00{{{b{f}}}f}{{{b{h}}}h}{{{b{j}}}j}{{{b{c}}{b{de}}}l{}{}}00{{{b{c}}}l{}}0000{c{{n{f}}}A`}{c{{n{h}}}A`}{c{{n{j}}}A`}{{{b{f}}{b{f}}}Ab}{{{b{h}}{b{h}}}Ab}{{{b{j}}{b{j}}}Ab}{{{b{f}}{b{dAd}}}Af}0{{{b{h}}{b{dAd}}}Af}0{{{b{j}}{b{dAd}}}Af}0{cc{}}00{jf}{ce{}{}}00{{{b{f}}c}nAh}{{{b{h}}c}nAh}{{{b{j}}c}nAh}{{{b{c}}}e{}{}}00{{{b{c}}}Aj{}}00{c{{n{e}}}{}{}}00{{{Al{h}}}{{n{fAn}}}}111{{{b{c}}}B`{}}00```","D":"Ab","p":[[1,"reference"],[0,"mut"],[6,"LambdaAST",0,68],[6,"ValueAccessor",0,68],[6,"Functor",0,68],[1,"unit"],[6,"Result",69],[10,"Deserializer",70],[1,"bool"],[5,"Formatter",71],[8,"Result",71],[10,"Serializer",72],[5,"String",73],[5,"Vec",74],[5,"EmptyError",75],[5,"TypeId",76],[15,"FieldAccessByName",65],[15,"ArrayAccess",65],[15,"FieldAccessByScalar",65]],"r":[[4,68],[6,68],[8,68]],"b":[[33,"impl-Display-for-LambdaAST%3C\'_%3E"],[34,"impl-Debug-for-LambdaAST%3C\'input%3E"],[35,"impl-Debug-for-ValueAccessor%3C\'input%3E"],[36,"impl-Display-for-ValueAccessor%3C\'_%3E"],[37,"impl-Display-for-Functor"],[38,"impl-Debug-for-Functor"]],"c":"OjAAAAAAAAA=","e":"OzAAAAEAADsABgAAAAUABwAAAAkAAAALABwAKwAAAC8AFQA="}],\ +["air_lambda_parser",{"t":"PPPPGPGFPGPGPPPPPGPNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOO","n":["ArrayAccess","Error","FieldAccessByName","FieldAccessByScalar","Functor","Functor","LambdaAST","LambdaASTLexer","LambdaError","LambdaParserError","Length","LexerError","LexerError","ParseError","ParseIntError","RecoveryErrors","UnexpectedSymbol","ValueAccessor","ValuePath","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","deserialize","deserialize","deserialize","eq","eq","eq","eq","eq","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","from","from_functor","into","into","into","into","into","into","into_iter","new","next","next_token","parse","serialize","serialize","serialize","source","source","to_owned","to_owned","to_owned","to_owned","to_owned","to_string","to_string","to_string","to_string","to_string","try_from","try_from","try_from","try_from","try_from","try_from","try_from_accessors","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","field_name","idx","scalar_name"],"q":[[0,"air_lambda_parser"],[121,"air_lambda_parser::ValueAccessor"],[124,"air_lambda_ast::ast"],[125,"air_lambda_parser::parser::lexer::errors"],[126,"air_lambda_parser::parser::errors"],[127,"core::result"],[128,"serde::de"],[129,"core::fmt"],[130,"lalrpop_util"],[131,"alloc::vec"],[132,"air_lambda_parser::parser::lexer::lambda_ast_lexer"],[133,"core::option"],[134,"serde::ser"],[135,"core::error"],[136,"alloc::string"],[137,"non_empty_vec"],[138,"core::any"],[139,"air_lambda_parser::parser::lambda_parser"]],"i":[4,4,4,4,0,3,0,0,7,0,6,0,7,7,5,7,5,0,3,3,20,4,5,6,7,3,20,4,5,6,7,3,4,5,6,7,3,4,5,6,7,3,4,4,5,6,6,7,3,4,6,3,4,5,6,7,3,3,4,4,5,5,6,6,7,7,3,20,4,5,6,7,7,7,7,3,3,20,4,5,6,7,20,20,20,20,0,3,4,6,5,7,3,4,5,6,7,3,4,5,6,7,3,20,4,5,6,7,3,3,20,4,5,6,7,3,20,4,5,6,7,28,29,30],"f":"```````````````````{{{b{c}}}{{b{e}}}{}{}}00000{{{b{dc}}}{{b{de}}}{}{}}00000{{{b{f}}}f}{{{b{h}}}h}{{{b{j}}}j}{{{b{l}}}l}{{{b{n}}}n}{{{b{c}}{b{de}}}A`{}{}}0000{{{b{c}}}A`{}}000000{c{{Ab{f}}}Ad}{c{{Ab{h}}}Ad}{c{{Ab{l}}}Ad}{{{b{f}}{b{f}}}Af}{{{b{h}}{b{h}}}Af}{{{b{j}}{b{j}}}Af}{{{b{l}}{b{l}}}Af}{{{b{n}}{b{n}}}Af}{{{b{f}}{b{dAh}}}{{Ab{A`Aj}}}}0{{{b{h}}{b{dAh}}}{{Ab{A`Aj}}}}0{{{b{j}}{b{dAh}}}Al}0{{{b{l}}{b{dAh}}}{{Ab{A`Aj}}}}0{{{b{n}}{b{dAh}}}Al}0{cc{}}00000{{{B`{An`j}}}n}{{{Bd{{Bb{An`j}}}}}n}{jn}{lf}{ce{}{}}000000{{{b{Bf}}}Bh}{{{b{dBh}}}{{Bj{c}}}{}}{{{b{dBh}}}{{Bj{{Ab{{Bl{An`An}}j}}}}}}{{{b{Bf}}}{{Ab{fn}}}}{{{b{f}}c}AbBn}{{{b{h}}c}AbBn}{{{b{l}}c}AbBn}{{{b{j}}}{{Bj{{b{C`}}}}}}{{{b{n}}}{{Bj{{b{C`}}}}}}{{{b{c}}}e{}{}}0000{{{b{c}}}Cb{}}0000{c{{Ab{e}}}{}{}}00000{{{Bd{h}}}{{Ab{fCd}}}}111111{{{b{c}}}Cf{}}00000```","D":"B`","p":[[1,"reference"],[0,"mut"],[6,"LambdaAST",0,124],[6,"ValueAccessor",0,124],[6,"LexerError",0,125],[6,"Functor",0,124],[6,"LambdaParserError",0,126],[1,"unit"],[6,"Result",127],[10,"Deserializer",128],[1,"bool"],[5,"Formatter",129],[5,"Error",129],[8,"Result",129],[1,"usize"],[6,"ParseError",130],[5,"ErrorRecovery",130],[5,"Vec",131],[1,"str"],[5,"LambdaASTLexer",0,132],[6,"Option",133],[1,"tuple"],[10,"Serializer",134],[10,"Error",135],[5,"String",136],[5,"EmptyError",137],[5,"TypeId",138],[15,"FieldAccessByName",121],[15,"ArrayAccess",121],[15,"FieldAccessByScalar",121]],"r":[[4,124],[6,124],[7,132],[9,126],[11,125],[17,124],[86,139]],"b":[[56,"impl-Debug-for-LambdaAST%3C\'input%3E"],[57,"impl-Display-for-LambdaAST%3C\'_%3E"],[58,"impl-Debug-for-ValueAccessor%3C\'input%3E"],[59,"impl-Display-for-ValueAccessor%3C\'_%3E"],[60,"impl-Display-for-LexerError"],[61,"impl-Debug-for-LexerError"],[62,"impl-Debug-for-Functor"],[63,"impl-Display-for-Functor"],[64,"impl-Debug-for-LambdaParserError%3C\'input%3E"],[65,"impl-Display-for-LambdaParserError%3C\'input%3E"],[72,"impl-From%3CParseError%3Cusize,+Token%3C\'input%3E,+LexerError%3E%3E-for-LambdaParserError%3C\'input%3E"],[73,"impl-From%3CVec%3CErrorRecovery%3Cusize,+Token%3C\'input%3E,+LexerError%3E%3E%3E-for-LambdaParserError%3C\'input%3E"],[74,"impl-From%3CLexerError%3E-for-LambdaParserError%3C\'input%3E"]],"c":"OjAAAAAAAAA=","e":"OzAAAAEAAGwABwAAAAUABwADAAwABgAUAC4ASQADAFMAAwBYACQA"}],\ +["air_log_targets",{"t":"SSSSSSSSSSS","n":["DATA_CACHE","EXECUTED_STATE_CHANGING","EXECUTED_TRACE_MERGE","INSTRUCTION","JOIN_BEHAVIOUR","NEW_EXECUTED_TRACE","NEXT_PEER_PKS","RUN_PARAMS","SUBGRAPH_COMPLETE","SUBGRAPH_ELEMENTS","TARGET_MAP"],"q":[[0,"air_log_targets"]],"i":[0,0,0,0,0,0,0,0,0,0,0],"f":"```````````","D":"Af","p":[],"r":[],"b":[],"c":"OjAAAAAAAAA=","e":"OjAAAAEAAAAAAAAAEAAAAAAA"}],\ +["air_parser",{"t":"FFFFNCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNQNNNNNHNNNNNNNNNNNNNNNNNNNNFPGFPGPPFPGFPFPFPPPPPFPPPPPFPFPPPPFPPPPPPPPPPPPGPPFPGFPFPGGGPPPGFPPPPPPPPPPPFPFPFPFPGFPPFPGPPFPKGGFPPPPPPPPPPPFPPPPPPFPFFPPPFPGPPPPFPPFPOOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONOOOOOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOONOOOOOOOOOOMNNNNNNNNNNNNNNNNNNNONNNNOOOOOOOONNNNNNNNNNNNNNNNNNNNNNNNNNONOOOOOOOOOOOOOOOONNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOONNOOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOO","n":["AIRLexer","AIRParser","AirPos","VariableValidator","add","ast","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","clone","clone","clone_into","clone_into","clone_to_uninit","clone_to_uninit","clone_to_uninit","cmp","default","default","deserialize","eq","eq","fmt","fmt","fmt","from","from","from","from","from","hash","into","into","into","into","into_iter","make_user_error","new","new","new","next","next_token","parse","parse","partial_cmp","serialize","sub","sub","to_owned","to_owned","to_string","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","Ap","Ap","ApArgument","ApMap","ApMap","ApResult","Boolean","Boolean","Call","Call","CallOutputValue","Canon","Canon","CanonMap","CanonMap","CanonStream","CanonStream","CanonStream","CanonStream","CanonStream","CanonStream","CanonStreamMap","CanonStreamMap","CanonStreamMap","CanonStreamMap","CanonStreamMap","CanonStreamMap","CanonStreamMapScalar","CanonStreamMapScalar","CanonStreamMapWithLambda","CanonStreamMapWithLambda","CanonStreamMapWithLambda","CanonStreamMapWithLambda","CanonStreamMapWithLambda","CanonStreamWithLambda","CanonStreamWithLambda","CanonStreamWithLambda","CanonStreamWithLambda","CanonStreamWithLambda","CanonStreamWithLambda","EmptyArray","EmptyArray","EmptyArray","Error","Error","Error","Error","Fail","Fail","Float","FoldScalar","FoldScalar","FoldScalarIterable","FoldStream","FoldStream","FoldStreamMap","FoldStreamMap","ImmutableValue","ImmutableVariable","ImmutableVariableWithLambda","InitPeerId","InitPeerId","InitPeerId","Instruction","InstructionErrorAST","Int","Int","LastError","LastError","LastError","Literal","Literal","Literal","Literal","Literal","Literal","Match","Match","MisMatch","MisMatch","Never","Never","New","New","NewArgument","Next","Next","None","Null","Null","Number","Number","Number","Par","Par","PeerIDErrorLogable","ResolvableToPeerIdVariable","ResolvableToStringVariable","Scalar","Scalar","Scalar","Scalar","Scalar","Scalar","Scalar","Scalar","Scalar","Scalar","Scalar","Scalar","ScalarWithLambda","ScalarWithLambda","ScalarWithLambda","ScalarWithLambda","ScalarWithLambda","ScalarWithLambda","ScalarWithLambda","Seq","Seq","Span","Stream","Stream","Stream","Stream","StreamMap","StreamMap","StreamMapKeyClause","TTL","TTL","Timestamp","Timestamp","Triplet","Variable","VariableWithLambda","Xor","Xor","args","argument","argument","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","canon_stream","canon_stream","canon_stream","canon_stream_map","canon_stream_map","canon_stream_map","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","cmp","contains_position","contains_span","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","function_name","hash","instruction","instruction","instruction","instruction","instruction","instruction","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","iterable","iterable","iterable","iterator","iterator","iterator","iterator","key","lambda","lambda","lambda","lambda","last_instruction","last_instruction","last_instruction","left","left_value","left_value","lens","log_errors_with_peer_id","log_errors_with_peer_id","log_errors_with_peer_id","log_errors_with_peer_id","log_errors_with_peer_id","log_errors_with_peer_id","log_errors_with_peer_id","log_errors_with_peer_id","log_errors_with_peer_id","log_errors_with_peer_id","log_errors_with_peer_id","log_errors_with_peer_id","log_errors_with_peer_id","log_errors_with_peer_id","log_errors_with_peer_id","log_errors_with_peer_id","log_errors_with_peer_id","log_errors_with_peer_id","log_errors_with_peer_id","log_errors_with_peer_id","map","name","name","name","name","name","name","name","name","name","name","name","name","new","new","new","new","new","new","new","new","new","new","new","new","new","new","new","new","new","new","new","new","new","new","new","new","new","new","output","partial_cmp","peer_id","peer_id","peer_id","peer_id","position","position","position","position","position","position","position","position","result","right","right_value","right_value","scalar","scalar","scalar","scalar","scalar","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","service_id","span","span","span","span","stream","stream","stream","stream_map","stream_map","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","triplet","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","value","error_message","ret_code"],"q":[[0,"air_parser"],[68,"air_parser::ast"],[965,"air_parser::ast::Fail"],[967,"air_parser::parser::lexer::text_pos"],[968,"air_parser::parser::validator"],[969,"core::cmp"],[970,"core::result"],[971,"serde::de"],[972,"core::fmt"],[973,"core::hash"],[974,"air_parser::parser::lexer::air_lexer"],[975,"air_parser::parser::air::__parse__AIR"],[976,"core::option"],[977,"air_parser::ast::instructions"],[978,"alloc::string"],[979,"lalrpop_util"],[980,"alloc::vec"],[981,"core::iter::traits::collect"],[982,"serde::ser"],[983,"core::any"],[984,"air_parser::ast::values"],[985,"air_lambda_ast::ast"],[986,"air_parser::ast::instruction_arguments"],[987,"air_parser::parser::span"],[988,"core::ops::range"],[989,"alloc::rc"],[990,"air_parser::parser::air_parser"]],"i":[0,0,0,0,1,0,15,1,16,5,15,1,16,5,1,5,1,5,1,1,5,1,1,5,1,1,1,1,1,5,15,1,1,16,5,1,15,1,16,5,15,0,15,16,5,15,15,0,16,1,1,1,1,1,5,1,15,1,16,5,15,1,16,5,15,1,16,5,0,19,0,0,19,0,34,36,0,19,0,0,19,0,19,0,36,40,41,28,30,0,36,40,41,28,30,0,19,0,31,32,36,40,0,31,32,36,38,63,34,36,40,34,36,19,63,0,19,39,0,19,0,0,19,0,19,0,0,0,31,34,36,0,0,38,39,34,36,63,31,32,34,36,38,63,0,19,0,19,0,19,0,19,0,0,19,35,0,19,0,34,36,0,19,0,0,0,0,31,32,35,36,37,38,40,41,63,28,30,0,31,32,36,38,40,63,0,19,0,0,35,37,41,0,41,0,34,36,34,36,0,34,34,0,19,52,53,69,31,32,33,34,35,36,37,38,39,40,41,19,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,42,43,44,45,46,47,48,28,30,49,50,51,31,32,33,34,35,36,37,38,39,40,41,19,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,42,43,44,45,46,47,48,28,30,49,50,51,28,30,55,28,30,56,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,28,30,49,50,51,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,28,30,49,50,51,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,28,30,49,50,51,51,51,51,51,31,32,33,34,36,37,38,39,40,41,42,43,44,45,46,47,48,28,30,49,50,51,31,32,33,34,35,36,37,38,39,40,41,19,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,42,43,44,45,46,47,48,28,30,49,50,51,31,31,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,41,19,19,52,52,53,53,54,54,55,55,56,56,57,57,58,58,59,59,60,60,61,61,62,62,63,63,64,64,65,65,66,66,67,67,68,68,69,69,70,70,42,42,43,43,44,44,45,45,46,46,47,47,48,48,28,28,30,30,49,49,50,51,31,32,33,34,35,36,37,38,39,40,41,19,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,42,43,44,45,46,47,48,28,30,49,50,51,51,33,51,61,62,64,65,66,69,31,32,33,34,35,36,37,38,39,40,41,19,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,42,43,44,45,46,47,48,28,30,49,50,51,64,65,66,64,65,66,67,54,30,43,47,48,64,65,66,51,61,62,50,72,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,54,37,41,28,30,42,43,44,45,46,47,48,49,52,53,54,55,56,57,58,59,60,61,62,64,65,66,67,69,42,43,44,45,46,47,48,49,50,51,52,51,33,55,56,57,42,43,44,45,46,47,48,49,53,51,61,62,35,37,28,30,57,31,32,33,34,35,36,37,38,39,40,41,19,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,42,43,44,45,46,47,48,28,30,49,50,51,33,64,65,66,69,35,37,55,56,57,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,28,30,49,50,51,31,32,33,34,35,36,37,38,39,40,41,19,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,42,43,44,45,46,47,48,28,30,49,52,31,32,33,34,35,36,37,38,39,40,41,19,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,42,43,44,45,46,47,48,28,30,49,50,51,31,32,33,34,35,36,37,38,39,40,41,19,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,42,43,44,45,46,47,48,28,30,49,50,51,31,32,33,34,35,36,37,38,39,40,41,19,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,42,43,44,45,46,47,48,28,30,49,50,51,54,74,74],"f":"````{{bd}c{}}`{{{f{c}}}{{f{e}}}{}{}}000{{{f{hc}}}{{f{he}}}{}{}}000{{{f{b}}}b}{{{f{j}}}j}{{{f{c}}{f{he}}}l{}{}}0{{{f{c}}}l{}}00{{{f{b}}{f{b}}}n}{{}b}{{}j}{c{{A`{b}}}Ab}{{{f{b}}{f{b}}}Ad}{{{f{b}}{f{d}}}Ad}{{{f{b}}{f{hAf}}}Ah}0{{{f{j}}{f{hAf}}}Ah}{cc{}}{db}111{{{f{b}}{f{hc}}}lAj}{ce{}{}}0000`{{{f{Al}}}An}{{}B`};{{{f{hAn}}}{{Bb{c}}}{}}{{{f{hAn}}}{{Bb{{A`{{Bd{b`b}}`}}}}}}{{{f{Al}}}{{A`{BfBh}}}}{{{f{B`}}{f{Al}}{f{h{Bl{{Bj{b``}}}}}}{f{hj}}e}{{A`{Bf{Bn{b``}}}}}`{{Cb{}{{C`{c}}}}}}{{{f{b}}{f{b}}}{{Bb{n}}}}{{{f{b}}c}A`Cd}{{bb}c{}}{{bd}c{}}{{{f{c}}}e{}{}}0{{{f{c}}}Bh{}}{c{{A`{e}}}{}{}}0000000{{{f{c}}}Cf{}}000```````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````{{{f{c}}}{{f{e}}}{}{}}000000000000000000000000000000000000000000{{{f{hc}}}{{f{he}}}{}{}}000000000000000000000000000000000000000000{{{f{Al}}b}Ch}{{{f{Al}}Cjb}Cl}`10`{{{f{Cn}}}Cn}{{{f{D`}}}D`}{{{f{Db}}}Db}{{{f{Dd}}}Dd}{{{f{Df}}}Df}{{{f{Dh}}}Dh}{{{f{Dj}}}Dj}{{{f{Dl}}}Dl}{{{f{Dn}}}Dn}{{{f{E`}}}E`}{{{f{Eb}}}Eb}{{{f{Ed}}}Ed}{{{f{Ef}}}Ef}{{{f{Eh}}}Eh}{{{f{Ej}}}Ej}{{{f{El}}}El}{{{f{En}}}En}{{{f{F`}}}F`}{{{f{Ch}}}Ch}{{{f{Cl}}}Cl}{{{f{Fb}}}Fb}{{{f{Fd}}}Fd}{{{f{Ff}}}Ff}{{{f{c}}{f{he}}}l{}{}}0000000000000000000000{{{f{c}}}l{}}00000000000000000000000{{{f{Ff}}{f{Ff}}}n}{{{f{Ff}}b}Ad}{{{f{Ff}}Ff}Ad}{c{{A`{Cn}}}Ab}{c{{A`{D`}}}Ab}{c{{A`{Db}}}Ab}{c{{A`{Dd}}}Ab}{c{{A`{Dh}}}Ab}{c{{A`{Dj}}}Ab}{c{{A`{Dl}}}Ab}{c{{A`{Dn}}}Ab}{c{{A`{E`}}}Ab}{c{{A`{Eb}}}Ab}{c{{A`{Ed}}}Ab}{c{{A`{Ef}}}Ab}{c{{A`{Eh}}}Ab}{c{{A`{Ej}}}Ab}{c{{A`{El}}}Ab}{c{{A`{En}}}Ab}{c{{A`{F`}}}Ab}{c{{A`{Ch}}}Ab}{c{{A`{Cl}}}Ab}{c{{A`{Fb}}}Ab}{c{{A`{Fd}}}Ab}{c{{A`{Ff}}}Ab}{{{f{Cn}}{f{Cn}}}Ad}{{{f{D`}}{f{D`}}}Ad}{{{f{Db}}{f{Db}}}Ad}{{{f{Dd}}{f{Dd}}}Ad}{{{f{Df}}{f{Df}}}Ad}{{{f{Dh}}{f{Dh}}}Ad}{{{f{Dj}}{f{Dj}}}Ad}{{{f{Dl}}{f{Dl}}}Ad}{{{f{Dn}}{f{Dn}}}Ad}{{{f{E`}}{f{E`}}}Ad}{{{f{Eb}}{f{Eb}}}Ad}{{{f{Bf}}{f{Bf}}}Ad}{{{f{Fh}}{f{Fh}}}Ad}{{{f{Fj}}{f{Fj}}}Ad}{{{f{Fl}}{f{Fl}}}Ad}{{{f{Fn}}{f{Fn}}}Ad}{{{f{G`}}{f{G`}}}Ad}{{{f{Gb}}{f{Gb}}}Ad}{{{f{Gd}}{f{Gd}}}Ad}{{{f{Gf}}{f{Gf}}}Ad}{{{f{Gh}}{f{Gh}}}Ad}{{{f{Gj}}{f{Gj}}}Ad}{{{f{Gl}}{f{Gl}}}Ad}{{{f{Gn}}{f{Gn}}}Ad}{{{f{H`}}{f{H`}}}Ad}{{{f{Hb}}{f{Hb}}}Ad}{{{f{Hd}}{f{Hd}}}Ad}{{{f{Hf}}{f{Hf}}}Ad}{{{f{Hh}}{f{Hh}}}Ad}{{{f{Hj}}{f{Hj}}}Ad}{{{f{Hl}}{f{Hl}}}Ad}{{{f{Ed}}{f{Ed}}}Ad}{{{f{Ef}}{f{Ef}}}Ad}{{{f{Eh}}{f{Eh}}}Ad}{{{f{Ej}}{f{Ej}}}Ad}{{{f{El}}{f{El}}}Ad}{{{f{En}}{f{En}}}Ad}{{{f{F`}}{f{F`}}}Ad}{{{f{Ch}}{f{Ch}}}Ad}{{{f{Cl}}{f{Cl}}}Ad}{{{f{Fb}}{f{Fb}}}Ad}{{{f{Fd}}{f{Fd}}}Ad}{{{f{Ff}}{f{Ff}}}Ad}{{{f{Cn}}{f{hAf}}}Ah}0{{{f{D`}}{f{hAf}}}Ah}0{{{f{Db}}{f{hAf}}}Ah}0{{{f{Dd}}{f{hAf}}}Ah}0{{{f{Df}}{f{hAf}}}Ah}0{{{f{Dh}}{f{hAf}}}Ah}0{{{f{Dj}}{f{hAf}}}Ah}0{{{f{Dl}}{f{hAf}}}Ah}0{{{f{Dn}}{f{hAf}}}Ah}0{{{f{E`}}{f{hAf}}}Ah}0{{{f{Eb}}{f{hAf}}}Ah}0{{{f{Bf}}{f{hAf}}}Ah}0{{{f{Fh}}{f{hAf}}}Ah}0{{{f{Fj}}{f{hAf}}}Ah}0{{{f{Fl}}{f{hAf}}}Ah}0{{{f{Fn}}{f{hAf}}}Ah}0{{{f{G`}}{f{hAf}}}Ah}0{{{f{Gb}}{f{hAf}}}Ah}0{{{f{Gd}}{f{hAf}}}Ah}0{{{f{Gf}}{f{hAf}}}Ah}0{{{f{Gh}}{f{hAf}}}Ah}0{{{f{Gj}}{f{hAf}}}Ah}0{{{f{Gl}}{f{hAf}}}Ah}0{{{f{Gn}}{f{hAf}}}Ah}0{{{f{H`}}{f{hAf}}}Ah}0{{{f{Hb}}{f{hAf}}}Ah}0{{{f{Hd}}{f{hAf}}}Ah}0{{{f{Hf}}{f{hAf}}}Ah}0{{{f{Hh}}{f{hAf}}}Ah}0{{{f{Hj}}{f{hAf}}}Ah}0{{{f{Hl}}{f{hAf}}}Ah}0{{{f{Ed}}{f{hAf}}}Ah}0{{{f{Ef}}{f{hAf}}}Ah}0{{{f{Eh}}{f{hAf}}}Ah}0{{{f{Ej}}{f{hAf}}}Ah}0{{{f{El}}{f{hAf}}}Ah}0{{{f{En}}{f{hAf}}}Ah}0{{{f{F`}}{f{hAf}}}Ah}0{{{f{Ch}}{f{hAf}}}Ah}0{{{f{Cl}}{f{hAf}}}Ah}0{{{f{Fb}}{f{hAf}}}Ah}0{{{f{Fd}}{f{hAf}}}Ah}{{{f{Ff}}{f{hAf}}}Ah}{cc{}}000000000000000000000000000000000000000000{{{Hn{b}}}Ff}`{{{f{Ff}}{f{hc}}}lAj}``````{ce{}{}}000000000000000000000000000000000000000000````````{{{f{Cl}}}{{f{Cj}}}}``````````{{{f{I`}}}Ad}{{{f{Fh}}}Ad}{{{f{Fj}}}Ad}{{{f{Fl}}}Ad}{{{f{Fn}}}Ad}{{{f{G`}}}Ad}{{{f{Gb}}}Ad}{{{f{Gd}}}Ad}{{{f{Gf}}}Ad}{{{f{Gh}}}Ad}{{{f{Gj}}}Ad}{{{f{Gl}}}Ad}{{{f{Gn}}}Ad}{{{f{H`}}}Ad}{{{f{Hb}}}Ad}{{{f{Hd}}}Ad}{{{f{Hf}}}Ad}{{{f{Hh}}}Ad}{{{f{Hj}}}Ad}{{{f{Hl}}}Ad}`{{{f{Dj}}}{{f{Al}}}}{{{f{Eb}}}{{f{Al}}}}{{{f{Ch}}}{{f{Al}}}}{{{f{Cl}}}{{f{Al}}}}````````{{Db{Ib{{Bl{Dd}}}}Df}Fh}{{DhDj}Fj}{{DlDhFb}Fl}{{CnEhEj}Fn}{{CnFbEl}G`}{{CnFbEd}Gb}{{BfBf}Gd}{{BfBf}Gf}{{BfBf}Gh}{{DdDdBf}Gj}{{DdDdBf}Gl}{{E`EdBf{Bb{Bf}}Ff}H`}{{EhEdBf{Bb{Bf}}Ff}Hb}{{FbEdBf{Bb{Bf}}Ff}Hd}{EdHf}{{EbBfFf}Hj}{{{f{Al}}b}Ed}{{{f{Al}}Cjb}Ef}{{{f{Al}}b}Eh}{{{f{Al}}b}Ej}{{{f{Al}}b}El}{{{f{Al}}Cjb}En}{{{f{Al}}Cjb}F`}{{{f{Al}}b}Fb}{{{Bb{Cj}}}Fd}{{bb}Ff}`{{{f{Ff}}{f{Ff}}}{{Bb{n}}}}````````````````{{{f{Al}}b}Df}{{{f{Al}}b}Dj}{{{f{Al}}b}Ch}{{{f{Al}}Cjb}Cl}`{{{f{Cn}}c}A`Cd}{{{f{D`}}c}A`Cd}{{{f{Db}}c}A`Cd}{{{f{Dd}}c}A`Cd}{{{f{Df}}c}A`Cd}{{{f{Dh}}c}A`Cd}{{{f{Dj}}c}A`Cd}{{{f{Dl}}c}A`Cd}{{{f{Dn}}c}A`Cd}{{{f{E`}}c}A`Cd}{{{f{Eb}}c}A`Cd}{{{f{Bf}}c}A`Cd}{{{f{Fh}}c}A`Cd}{{{f{Fj}}c}A`Cd}{{{f{Fl}}c}A`Cd}{{{f{Fn}}c}A`Cd}{{{f{G`}}c}A`Cd}{{{f{Gb}}c}A`Cd}{{{f{Gd}}c}A`Cd}{{{f{Gf}}c}A`Cd}{{{f{Gh}}c}A`Cd}{{{f{Gj}}c}A`Cd}{{{f{Gl}}c}A`Cd}{{{f{Gn}}c}A`Cd}{{{f{H`}}c}A`Cd}{{{f{Hb}}c}A`Cd}{{{f{Hd}}c}A`Cd}{{{f{Hf}}c}A`Cd}{{{f{Hh}}c}A`Cd}{{{f{Hj}}c}A`Cd}{{{f{Hl}}c}A`Cd}{{{f{Ed}}c}A`Cd}{{{f{Ef}}c}A`Cd}{{{f{Eh}}c}A`Cd}{{{f{Ej}}c}A`Cd}{{{f{El}}c}A`Cd}{{{f{En}}c}A`Cd}{{{f{F`}}c}A`Cd}{{{f{Ch}}c}A`Cd}{{{f{Cl}}c}A`Cd}{{{f{Fb}}c}A`Cd}{{{f{Fd}}c}A`Cd}{{{f{Ff}}c}A`Cd}`````{{{f{Al}}b}Df}{{{f{Al}}b}Dj}```{{{f{c}}}e{}{}}0000000000000000000000{{{f{c}}}Bh{}}0000000000000000000000000000000000000000`{c{{A`{e}}}{}{}}0000000000000000000000000000000000000000000000000000000000000000000000000000000000000{{{f{c}}}Cf{}}000000000000000000000000000000000000000000```","D":"A@f","p":[[5,"AirPos",0,967],[1,"usize"],[1,"reference"],[0,"mut"],[5,"VariableValidator",0,968],[1,"unit"],[6,"Ordering",969],[6,"Result",970],[10,"Deserializer",971],[1,"bool"],[5,"Formatter",972],[8,"Result",972],[10,"Hasher",973],[1,"str"],[5,"AIRLexer",0,974],[5,"AIRParser",0,975],[6,"Option",976],[1,"tuple"],[6,"Instruction",68,977],[5,"String",978],[5,"ErrorRecovery",979],[5,"Vec",980],[6,"ParseError",979],[17,"Item"],[10,"IntoIterator",981],[10,"Serializer",982],[5,"TypeId",983],[6,"ImmutableVariable",68,984],[6,"LambdaAST",985],[6,"ImmutableVariableWithLambda",68,984],[6,"ResolvableToPeerIdVariable",68,986],[6,"ResolvableToStringVariable",68,986],[5,"Triplet",68,986],[6,"ImmutableValue",68,986],[6,"CallOutputValue",68,986],[6,"ApArgument",68,986],[6,"ApResult",68,986],[6,"StreamMapKeyClause",68,986],[6,"Number",68,986],[6,"FoldScalarIterable",68,986],[6,"NewArgument",68,986],[5,"Scalar",68,984],[5,"ScalarWithLambda",68,984],[5,"Stream",68,984],[5,"CanonStream",68,984],[5,"CanonStreamMap",68,984],[5,"CanonStreamWithLambda",68,984],[5,"CanonStreamMapWithLambda",68,984],[5,"StreamMap",68,984],[5,"InstructionErrorAST",68,984],[5,"Span",68,987],[5,"Call",68,977],[5,"Ap",68,977],[5,"ApMap",68,977],[5,"Canon",68,977],[5,"CanonMap",68,977],[5,"CanonStreamMapScalar",68,977],[5,"Seq",68,977],[5,"Par",68,977],[5,"Xor",68,977],[5,"Match",68,977],[5,"MisMatch",68,977],[6,"Fail",68,977],[5,"FoldScalar",68,977],[5,"FoldStream",68,977],[5,"FoldStreamMap",68,977],[5,"Next",68,977],[5,"Never",68,977],[5,"New",68,977],[5,"Null",68,977],[5,"Range",988],[10,"PeerIDErrorLogable",68,977],[5,"Rc",989],[15,"Literal",965]],"r":[[0,974],[1,975],[2,967],[3,968],[47,990],[68,977],[70,986],[71,977],[73,986],[76,977],[78,986],[79,977],[81,977],[83,984],[89,984],[95,977],[97,984],[102,984],[115,977],[118,977],[120,986],[121,977],[123,977],[125,986],[126,984],[127,984],[131,977],[132,984],[144,977],[146,977],[148,977],[150,977],[152,986],[153,977],[156,977],[158,986],[161,977],[163,977],[164,986],[165,986],[166,984],[178,984],[185,977],[187,987],[188,984],[192,984],[194,986],[199,986],[202,977]],"b":[[25,"impl-PartialEq-for-AirPos"],[26,"impl-PartialEq%3Cusize%3E-for-AirPos"],[27,"impl-Display-for-AirPos"],[28,"impl-Debug-for-AirPos"],[51,"impl-Sub-for-AirPos"],[52,"impl-Sub%3Cusize%3E-for-AirPos"],[437,"impl-Display-for-ResolvableToPeerIdVariable%3C\'_%3E"],[438,"impl-Debug-for-ResolvableToPeerIdVariable%3C\'i%3E"],[439,"impl-Debug-for-ResolvableToStringVariable%3C\'i%3E"],[440,"impl-Display-for-ResolvableToStringVariable%3C\'_%3E"],[441,"impl-Display-for-Triplet%3C\'_%3E"],[442,"impl-Debug-for-Triplet%3C\'i%3E"],[443,"impl-Debug-for-ImmutableValue%3C\'i%3E"],[444,"impl-Display-for-ImmutableValue%3C\'_%3E"],[445,"impl-Debug-for-CallOutputValue%3C\'i%3E"],[446,"impl-Display-for-CallOutputValue%3C\'_%3E"],[447,"impl-Debug-for-ApArgument%3C\'i%3E"],[448,"impl-Display-for-ApArgument%3C\'_%3E"],[449,"impl-Debug-for-ApResult%3C\'i%3E"],[450,"impl-Display-for-ApResult%3C\'_%3E"],[451,"impl-Display-for-StreamMapKeyClause%3C\'_%3E"],[452,"impl-Debug-for-StreamMapKeyClause%3C\'i%3E"],[453,"impl-Display-for-Number"],[454,"impl-Debug-for-Number"],[455,"impl-Debug-for-FoldScalarIterable%3C\'i%3E"],[456,"impl-Display-for-FoldScalarIterable%3C\'_%3E"],[457,"impl-Display-for-NewArgument%3C\'_%3E"],[458,"impl-Debug-for-NewArgument%3C\'i%3E"],[459,"impl-Display-for-Instruction%3C\'_%3E"],[460,"impl-Debug-for-Instruction%3C\'i%3E"],[461,"impl-Display-for-Call%3C\'_%3E"],[462,"impl-Debug-for-Call%3C\'i%3E"],[463,"impl-Display-for-Ap%3C\'_%3E"],[464,"impl-Debug-for-Ap%3C\'i%3E"],[465,"impl-Debug-for-ApMap%3C\'i%3E"],[466,"impl-Display-for-ApMap%3C\'_%3E"],[467,"impl-Debug-for-Canon%3C\'i%3E"],[468,"impl-Display-for-Canon%3C\'_%3E"],[469,"impl-Display-for-CanonMap%3C\'_%3E"],[470,"impl-Debug-for-CanonMap%3C\'i%3E"],[471,"impl-Debug-for-CanonStreamMapScalar%3C\'i%3E"],[472,"impl-Display-for-CanonStreamMapScalar%3C\'_%3E"],[473,"impl-Debug-for-Seq%3C\'i%3E"],[474,"impl-Display-for-Seq%3C\'_%3E"],[475,"impl-Display-for-Par%3C\'_%3E"],[476,"impl-Debug-for-Par%3C\'i%3E"],[477,"impl-Debug-for-Xor%3C\'i%3E"],[478,"impl-Display-for-Xor%3C\'_%3E"],[479,"impl-Debug-for-Match%3C\'i%3E"],[480,"impl-Display-for-Match%3C\'_%3E"],[481,"impl-Debug-for-MisMatch%3C\'i%3E"],[482,"impl-Display-for-MisMatch%3C\'_%3E"],[483,"impl-Display-for-Fail%3C\'_%3E"],[484,"impl-Debug-for-Fail%3C\'i%3E"],[485,"impl-Debug-for-FoldScalar%3C\'i%3E"],[486,"impl-Display-for-FoldScalar%3C\'_%3E"],[487,"impl-Display-for-FoldStream%3C\'_%3E"],[488,"impl-Debug-for-FoldStream%3C\'i%3E"],[489,"impl-Display-for-FoldStreamMap%3C\'_%3E"],[490,"impl-Debug-for-FoldStreamMap%3C\'i%3E"],[491,"impl-Debug-for-Next%3C\'i%3E"],[492,"impl-Display-for-Next%3C\'_%3E"],[493,"impl-Display-for-Never"],[494,"impl-Debug-for-Never"],[495,"impl-Display-for-New%3C\'_%3E"],[496,"impl-Debug-for-New%3C\'i%3E"],[497,"impl-Display-for-Null"],[498,"impl-Debug-for-Null"],[499,"impl-Display-for-Scalar%3C\'_%3E"],[500,"impl-Debug-for-Scalar%3C\'i%3E"],[501,"impl-Display-for-ScalarWithLambda%3C\'_%3E"],[502,"impl-Debug-for-ScalarWithLambda%3C\'i%3E"],[503,"impl-Debug-for-Stream%3C\'i%3E"],[504,"impl-Display-for-Stream%3C\'_%3E"],[505,"impl-Debug-for-CanonStream%3C\'i%3E"],[506,"impl-Display-for-CanonStream%3C\'_%3E"],[507,"impl-Display-for-CanonStreamMap%3C\'_%3E"],[508,"impl-Debug-for-CanonStreamMap%3C\'i%3E"],[509,"impl-Display-for-CanonStreamWithLambda%3C\'_%3E"],[510,"impl-Debug-for-CanonStreamWithLambda%3C\'i%3E"],[511,"impl-Display-for-CanonStreamMapWithLambda%3C\'_%3E"],[512,"impl-Debug-for-CanonStreamMapWithLambda%3C\'i%3E"],[513,"impl-Display-for-ImmutableVariable%3C\'_%3E"],[514,"impl-Debug-for-ImmutableVariable%3C\'i%3E"],[515,"impl-Display-for-ImmutableVariableWithLambda%3C\'_%3E"],[516,"impl-Debug-for-ImmutableVariableWithLambda%3C\'i%3E"],[517,"impl-Debug-for-StreamMap%3C\'i%3E"],[518,"impl-Display-for-StreamMap%3C\'_%3E"]],"c":"OjAAAAAAAAA=","e":"OzAAAAEAAEQDJgAAAAIABQAZACAAAAAkAAAAKQAGADEAEwBGAAEASQADAE4AAQBRAAAAUwAAAFUABABbAAQAYQAAAGMAAwBoAAsAdQABAHgAAQB7AAAAfQAAAIEAAwCGAAoAkgAAAJQAAACWAAAAmAABAJsAAQCeAAMAowABAKgACgC0AAUAuwABAL4AAgDCAAUAyQABAMwAPQE1AggAaQJeAQ=="}],\ +["air_test_framework",{"t":"EEECCCCCPPPPPPPPPPPPPPGGNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOIFFFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNNNNNNNNPGFFPNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNPPPGIKFPPPPPPNNNNMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCFNNNNNNNNNNNNNNNNNNNNNNNNNN","n":["AirScriptExecutor","Network","TransformedAirScript","asserts","ephemeral","execution","services","transform","Behaviour","Behaviour","DbgBehaviour","DbgBehaviour","Error","Error","Map","Map","Ok","Ok","SeqError","SeqError","SeqOk","SeqOk","ServiceDefinition","ServiceTagName","as_component_extern_name","as_component_extern_name","as_ref","behaviour","borrow","borrow","borrow_mut","borrow_mut","call","clone","clone","clone_into","clone_into","clone_to_uninit","clone_to_uninit","clone_to_uninit","debug","debug","deref","deref","deref_mut","deref_mut","deserialize","deserialize","drop","drop","eq","eq","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","error","fmt","fmt","from","from","from","from","from_str","from_str","get_fd_flags","get_fd_flags","init","init","into","into","layout_raw","layout_raw","map","new_set_fd_flags","new_set_fd_flags","ok","pointer_metadata","pointer_metadata","seq_error","seq_ok","set_fd_flags","set_fd_flags","to_owned","to_owned","try_from","try_from","try_from","try_into","try_into","type_id","type_id","vzip","vzip","call_map","call_map","call_number_seq","call_number_seq","Data","Network","Peer","PeerId","add_peer","add_peer_env","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","clone","clone_into","clone_to_uninit","debug","debug","debug","deref","deref","deref","deref","deref_mut","deref_mut","deref_mut","deserialize","deserialize","deserialize","drop","drop","drop","empty","ensure_named_peer","eq","equivalent","equivalent","equivalent","equivalent","equivalent","fail_peer_for","fmt","fmt","from","from","from","from","from","from","from_keypair","from_peers","get_fd_flags","get_fd_flags","get_fd_flags","get_hash","get_keypair","get_named_peer_env","get_peer_env","get_peer_id","get_peers","hash","init","init","init","into","into","into","layout_raw","layout_raw","layout_raw","neighborhood","new","new","new","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","pointer_metadata","pointer_metadata","pointer_metadata","resolve_peer","set_fd_flags","set_fd_flags","set_fd_flags","set_peer_failed","to_owned","try_from","try_from","try_from","try_into","try_into","try_into","type_id","type_id","type_id","unfail_peer_for","vzip","vzip","vzip","Added","AlterState","Neighborhood","PeerEnv","Removed","alter","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","clone","clone_into","clone_to_uninit","clone_to_uninit","debug","debug","debug","deref","deref","deref","deref_mut","deref_mut","deref_mut","deserialize","deserialize","deserialize","drop","drop","drop","eq","equivalent","equivalent","equivalent","equivalent","equivalent","extend_neighborhood","fmt","from","from","from","get_alter_state","get_fd_flags","get_fd_flags","get_fd_flags","get_neighborhood","get_neighborhood_mut","get_peer","init","init","init","into","into","into","into_iter","into_iter","is_failed","is_reachable","is_reachable","iter","iter","layout_raw","layout_raw","layout_raw","new","new","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","pointer_metadata","pointer_metadata","pointer_metadata","remove_from_neighborhood","set_failed","set_fd_flags","set_fd_flags","set_fd_flags","set_target_unreachable","to_owned","try_from","try_from","try_from","try_into","try_into","try_into","type_id","type_id","type_id","unalter","unset_target_unreachable","vzip","vzip","vzip","AirScriptExecutor","borrow","borrow_mut","debug","deref","deref_mut","deserialize","drop","enqueue","execute_all","execute_one","execution_iter","from","from_annotated","from_network","from_transformed_air_script","get_fd_flags","get_network","get_prev_data","get_transformed_air_script","init","into","layout_raw","new","new_set_fd_flags","new_with_init_parameters","pointer_metadata","resolve_name","set_fd_flags","try_from","try_into","type_id","vzip","Array","Bool","Empty","FunctionOutcome","JValue","MarineService","MarineServiceHandle","NotDefined","Null","Number","Object","ServiceResult","String","borrow","borrow","borrow_mut","borrow_mut","call","call","clone","clone_into","clone_to_uninit","debug","debug","deref","deref","deref_mut","deref_mut","deserialize","deserialize","drop","drop","fmt","from","from","from_service_result","from_value","get_fd_flags","get_fd_flags","init","init","into","into","layout_raw","layout_raw","new_set_fd_flags","new_set_fd_flags","pointer_metadata","pointer_metadata","set_fd_flags","set_fd_flags","to_handle","to_owned","try_from","try_from","try_into","try_into","type_id","type_id","vzip","vzip","walker","TransformedAirScript","borrow","borrow_mut","clone","clone_into","clone_to_uninit","debug","deref","deref","deref_mut","deserialize","drop","from","get_fd_flags","get_network","init","into","layout_raw","new","new_set_fd_flags","pointer_metadata","set_fd_flags","to_owned","try_from","try_into","type_id","vzip"],"q":[[0,"air_test_framework"],[8,"air_test_framework::asserts"],[100,"air_test_framework::asserts::ServiceDefinition"],[104,"air_test_framework::ephemeral"],[203,"air_test_framework::ephemeral::neighborhood"],[297,"air_test_framework::execution"],[330,"air_test_framework::services"],[391,"air_test_framework::transform"],[392,"air_test_framework::transform::walker"],[419,"wasm_encoder::component::imports"],[420,"avm_interface::call_request_parameters"],[421,"avm_interface::call_service_result"],[422,"core::fmt"],[423,"core::result"],[424,"rkyv::with"],[425,"system_interface::fs::fd_flags"],[426,"std::io::error"],[427,"core::alloc::layout"],[428,"alloc::string"],[429,"std::collections::hash::map"],[430,"io_lifetimes::portability"],[431,"core::any"],[432,"alloc::rc"],[433,"air_test_utils::test_runner"],[434,"core::convert"],[435,"core::iter::traits::collect"],[436,"air_test_utils::wasm_test_runner"],[437,"core::hash"],[438,"core::cmp"],[439,"core::marker"],[440,"fluence_keypair::key_pair"],[441,"alloc::vec"],[442,"core::cell"],[443,"core::option"],[444,"core::iter::traits::iterator"],[445,"avm_interface::raw_outcome"],[446,"futures_core::stream"],[447,"futures_core::future"],[448,"core::clone"]],"i":[0,0,0,0,0,0,0,0,4,6,4,6,4,6,4,6,4,6,4,6,4,6,0,0,4,4,4,6,4,6,4,6,6,4,6,4,6,4,4,6,4,6,4,6,4,6,4,6,4,6,4,6,4,4,4,4,4,6,6,6,6,6,6,4,6,4,4,4,6,4,6,4,6,4,6,4,6,4,6,6,4,6,6,4,6,6,6,4,6,4,6,4,4,6,4,6,4,6,4,6,64,65,64,65,0,0,0,0,28,28,30,28,32,32,30,28,32,32,32,32,30,28,32,30,28,32,32,30,28,32,30,28,32,30,28,32,28,28,32,32,32,32,32,32,28,30,32,30,28,32,32,32,32,32,28,30,28,32,32,30,28,28,30,28,32,30,28,32,30,28,32,30,28,32,0,30,28,32,30,28,32,30,28,32,28,30,28,32,28,32,30,28,32,30,28,32,30,28,32,28,30,28,32,53,0,0,0,53,52,52,45,53,52,45,53,53,53,53,53,52,45,53,52,45,53,52,45,53,52,45,53,52,45,53,53,53,53,53,53,53,45,53,52,45,53,52,52,45,53,45,45,45,52,45,53,52,45,53,52,45,45,52,45,52,45,52,45,53,52,45,52,45,53,52,45,53,45,45,52,45,53,52,53,52,45,53,52,45,53,52,45,53,52,52,52,45,53,0,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,23,23,61,0,0,0,0,61,23,23,23,61,23,61,50,61,50,60,50,50,50,50,61,50,61,50,61,50,61,50,61,50,61,61,50,61,61,61,50,61,50,61,50,61,50,61,50,61,50,61,50,60,50,61,50,61,50,61,50,61,50,0,0,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59],"f":"````````````````````````{{{b{c}}}d{}}{{{b{c}}}f{}}{{{b{h}}}{{b{j}}}}`{{{b{c}}}{{b{e}}}{}{}}0{{{b{nc}}}{{b{ne}}}{}{}}0{{{b{l}}A`}Ab}{{{b{h}}}h}{{{b{l}}}l}{{{b{c}}{b{ne}}}Ad{}{}}0{{{b{c}}}Ad{}}00{{{b{nAf}}}{{Aj{AdAh}}}}0{Al{{b{c}}}{}}0{Al{{b{nc}}}{}}0{{{b{c}}{b{ne}}}{{Aj{{An{gi}}}}}{}{}{}{}}0{AlAd}0{{{b{h}}{b{h}}}B`}{{{b{l}}{b{l}}}B`}{{{b{c}}{b{e}}}B`{}{}}000000000{Abl}{{{b{h}}{b{nAf}}}Bb}{{{b{l}}{b{nAf}}}Bb}{cc{}}{lh}{{{b{l}}}h}2{{{b{j}}}{{Aj{hc}}}{}}{{{b{j}}}{{Aj{lc}}}{}}{{{b{c}}}{{Aj{BdBf}}}{}}0{{}Al}0{ce{}{}}0{{}{{Aj{BhBj}}}}0{{{C`{BlBn}}}l}{{{b{c}}Bd}{{Aj{{Cb{e}}Bf}}}{}Cd}0{Bnl}{b}0{{{C`{BlAb}}}l}4{{{b{nc}}{Cb{e}}}{{Aj{AdBf}}}{}Cd}0{{{b{c}}}e{}{}}0{c{{Aj{e}}}{}{}}=000{{{b{c}}}Cf{}}0::````````{{{b{{Cj{{Ch{c}}}}}}{Cl{c}}}AdCn}{{{b{{Cj{{Ch{c}}}}}}{Cl{c}}g}AdCn{{Db{D`}}}{{Df{}{{Dd{e}}}}}}{{{b{c}}}{{b{e}}}{}{}}00{{{b{D`}}}{{b{j}}}}{{{b{nc}}}{{b{ne}}}{}{}}00{{{b{D`}}}D`}{{{b{c}}{b{ne}}}Ad{}{}}{{{b{c}}}Ad{}}{{{b{nAf}}}{{Aj{AdAh}}}}00{Al{{b{c}}}{}}00{{{b{D`}}}{{b{c}}}{}}{Al{{b{nc}}}{}}00{{{b{c}}{b{ne}}}{{Aj{{An{gi}}}}}{}{}{}{}}00{AlAd}00{{}{{Cj{{Ch{Dh}}}}}}{{{b{{Cj{{Ch{c}}}}}}eDj}D`Cn{{Db{D`}}}}{{{b{D`}}{b{D`}}}B`}{{{b{c}}{b{e}}}B`{}{}}0000{{{b{n{Ch{c}}}}{b{e}}{b{g}}}AdCn{DlDnE`}{DlDnE`}}{{{b{{Cl{c}}}}{b{nAf}}}BbCn}{{{b{D`}}{b{nAf}}}Bb}{cc{}}0{BlD`}{{{b{D`}}}D`}{{{b{j}}}D`}3{{{b{Eb}}}D`}{{{Ed{{Cl{c}}}}Dj}{{Cj{{Ch{c}}}}}Cn}{{{b{c}}}{{Aj{BdBf}}}{}}00{{{b{c}}{b{e}}}Ef{DlE`}Eh}{{{b{{Cl{c}}}}}{{b{Eb}}}Cn}{{{b{{Ch{c}}}}{b{e}}}{{En{{Cj{{El{{Ej{c}}}}}}}}}Cn{DlDnE`}}0{{{b{{Cl{c}}}}}{{b{D`}}}Cn}{{{b{{Ch{c}}}}}{{`{{F`{}{{Dd{D`}}}}}}}Cn}{{{b{D`}}{b{nc}}}AdFb}{{}Al}00{ce{}{}}00{{}{{Aj{BhBj}}}}00`{{c{Cj{{Ff{Fd}}}}Dj}{{Cl{e}}}{{Db{Eb}}}Cn}{{e{Ed{Fd}}Dj}{{Cj{{Ch{g}}}}}{{Db{D`}}}{{F`{}{{Dd{c}}}}}Cn}{cD`{{Db{{b{j}}}}}}{{{b{c}}Bd}{{Aj{{Cb{e}}Bf}}}{}Cd}00{b}00{{{b{{Ch{c}}}}{b{e}}}D`Cn{DlDnE`}}{{{b{nc}}{Cb{e}}}{{Aj{AdBf}}}{}Cd}00{{{b{n{Ch{c}}}}{b{e}}B`}AdCn{DlDnE`}}{{{b{c}}}e{}{}}{c{{Aj{e}}}{}{}}00000{{{b{c}}}Cf{}}00{{{b{n{Ch{c}}}}{b{e}}{b{g}}}AdCn{DlDnE`}{DlDnE`}}===`````{{{b{n{Fh{c}}}}eFj}AdCn{{Db{D`}}}}{{{b{c}}}{{b{e}}}{}{}}00{{{b{nc}}}{{b{ne}}}{}{}}00{{{b{Fj}}}Fj}{{{b{c}}{b{ne}}}Ad{}{}}{{{b{c}}}Ad{}}0{{{b{nAf}}}{{Aj{AdAh}}}}00{Al{{b{c}}}{}}00{Al{{b{nc}}}{}}00{{{b{c}}{b{ne}}}{{Aj{{An{gi}}}}}{}{}{}{}}00{AlAd}00{{{b{Fj}}{b{Fj}}}B`}{{{b{c}}{b{e}}}B`{}{}}0000{{{b{n{Ej{c}}}}g}AdCn{{Db{D`}}}{{F`{}{{Dd{e}}}}}}{{{b{Fj}}{b{nAf}}}Bb}{cc{}}00{{{b{{Fh{c}}}}{b{e}}}{{En{Fj}}}Cn{DnDlE`}}{{{b{c}}}{{Aj{BdBf}}}{}}00{{{b{{Ej{c}}}}}{{b{{Fh{c}}}}}Cn}{{{b{n{Ej{c}}}}}{{b{n{Fh{c}}}}}Cn}{{{b{{Ej{c}}}}}{{b{{Cl{c}}}}}Cn}{{}Al}00{ce{}{}}00{{{b{{Fh{c}}}}}eCn{}}{{{b{{Ej{c}}}}}eCn{}}{{{b{{Ej{c}}}}}B`Cn}{{{b{{Fh{c}}}}e}B`Cn{{Db{D`}}}}{{{b{{Ej{c}}}}e}B`Cn{{Db{D`}}}}{{{b{{Fh{c}}}}}{{`{{F`{}{{Dd{D`}}}}}}}Cn}{{{b{{Ej{c}}}}}{{`{{F`{}{{Dd{D`}}}}}}}Cn}{{}{{Aj{BhBj}}}}00{{{b{{Cj{{Ch{c}}}}}}}{{Fh{c}}}Cn}{{{Cl{c}}{b{{Cj{{Ch{c}}}}}}}{{Ej{c}}}Cn}{{{b{c}}Bd}{{Aj{{Cb{e}}Bf}}}{}Cd}00{b}00{{{b{n{Ej{c}}}}g}AdCn{{Db{D`}}}{{F`{}{{Dd{e}}}}}}{{{b{n{Ej{c}}}}B`}AdCn}{{{b{nc}}{Cb{e}}}{{Aj{AdBf}}}{}Cd}00{{{b{n{Fh{c}}}}e}AdCn{{Db{D`}}}}{{{b{c}}}e{}{}}{c{{Aj{e}}}{}{}}00000{{{b{c}}}Cf{}}00{{{b{n{Fh{c}}}}{b{e}}}AdCn{DnDlE`}}0{ce{}{}}00`{{{b{c}}}{{b{e}}}{}{}}{{{b{nc}}}{{b{ne}}}{}{}}{{{b{nAf}}}{{Aj{AdAh}}}}{Al{{b{c}}}{}}{Al{{b{nc}}}{}}{{{b{c}}{b{ne}}}{{Aj{{An{gi}}}}}{}{}{}{}}{AlAd}{{{b{{Fl{c}}}}eFn}AdCn{{Db{D`}}}}{{{b{{Fl{c}}}}{b{e}}}{{En{{Ed{G`}}}}}Cn{DnDlE`}}{{{b{{Fl{c}}}}{b{e}}}{{En{G`}}}Cn{DnDlE`}}{{{b{{Fl{c}}}}{b{e}}}{{En{{`{{Gb{}{{Dd{G`}}}}}}}}}Cn{DnDlE`}}{cc{}}{{Gd{b{j}}}{{Aj{{Fl{Dh}}Bl}}}}{{GdDj{Cj{{Ch{c}}}}{b{j}}}{{Aj{{Fl{c}}Bl}}}Cn}{{GdDj{Gf{c}}}{{Aj{{Fl{c}}Bl}}}Cn}{{{b{c}}}{{Aj{BdBf}}}{}}{{{b{{Fl{c}}}}}{{Cj{{Ch{c}}}}}Cn}{{{b{{Fl{c}}}}e}FnCn{{Db{D`}}}}{{{b{{Fl{c}}}}}{{b{{Gf{c}}}}}Cn}{{}Al}{ce{}{}}{{}{{Aj{BhBj}}}}{{Gd{Ed{Fd}}c{b{j}}}{{Aj{{Fl{e}}Bl}}}{{Df{}{{Dd{D`}}}}}Cn}{{{b{c}}Bd}{{Aj{{Cb{e}}Bf}}}{}Cd}{{GdDj{Ed{Fd}}c{b{j}}}{{Aj{{Fl{e}}Bl}}}{{Df{}{{Dd{D`}}}}}Cn}{b}{{{b{{Fl{c}}}}{b{j}}}D`Cn}{{{b{nc}}{Cb{e}}}{{Aj{AdBf}}}{}Cd}{c{{Aj{e}}}{}{}}0{{{b{c}}}Cf{}}9`````````````{{{b{c}}}{{b{e}}}{}{}}0{{{b{nc}}}{{b{ne}}}{}{}}0{{{b{Gh}}A`}{{Gl{Gj}}}}{{{b{Fd}}A`}{{Gl{Gj}}}}{{{b{Fd}}}Fd}{{{b{c}}{b{ne}}}Ad{}{}}{{{b{c}}}Ad{}}{{{b{nAf}}}{{Aj{AdAh}}}}0{Al{{b{c}}}{}}0{Al{{b{nc}}}{}}0{{{b{c}}{b{ne}}}{{Aj{{An{gi}}}}}{}{}{}{}}0{AlAd}0{{{b{Gj}}{b{nAf}}}Bb}{cc{}}0{AbGj}{BnGj}{{{b{c}}}{{Aj{BdBf}}}{}}0{{}Al}0{ce{}{}}0{{}{{Aj{BhBj}}}}0{{{b{c}}Bd}{{Aj{{Cb{e}}Bf}}}{}Cd}0{b}0{{{b{nc}}{Cb{e}}}{{Aj{AdBf}}}{}Cd}0{GhFd}{{{b{c}}}e{}{}}{c{{Aj{e}}}{}{}}000{{{b{c}}}Cf{}}088``{{{b{c}}}{{b{e}}}{}{}}{{{b{nc}}}{{b{ne}}}{}{}}{{{b{{Gf{c}}}}}{{Gf{c}}}Gn}{{{b{c}}{b{ne}}}Ad{}{}}{{{b{c}}}Ad{}}{{{b{nAf}}}{{Aj{AdAh}}}}{{{b{{Gf{c}}}}}{{b{e}}}{}{}}{Al{{b{c}}}{}}{Al{{b{nc}}}{}}{{{b{c}}{b{ne}}}{{Aj{{An{gi}}}}}{}{}{}{}}{AlAd}{cc{}}{{{b{c}}}{{Aj{BdBf}}}{}}{{{b{{Gf{c}}}}}{{Cj{{Ch{c}}}}}Cn}{{}Al}{ce{}{}}{{}{{Aj{BhBj}}}}{{{b{j}}{Cj{{Ch{c}}}}Dj}{{Aj{{Gf{c}}Bl}}}Cn}{{{b{c}}Bd}{{Aj{{Cb{e}}Bf}}}{}Cd}{b}{{{b{nc}}{Cb{e}}}{{Aj{AdBf}}}{}Cd}{{{b{c}}}e{}{}}{c{{Aj{e}}}{}{}}0{{{b{c}}}Cf{}}8","D":"G`","p":[[1,"reference"],[6,"ComponentExternName",419],[6,"ComponentExternName",419],[6,"ServiceTagName",8],[1,"str"],[6,"ServiceDefinition",8],[0,"mut"],[5,"CallRequestParams",420],[5,"CallServiceResult",421],[1,"unit"],[5,"Formatter",422],[5,"Error",422],[6,"Result",423],[1,"usize"],[5,"With",424],[1,"bool"],[8,"Result",422],[5,"FdFlags",425],[5,"Error",426],[5,"Layout",427],[5,"LayoutError",427],[5,"String",428],[8,"JValue",330],[5,"HashMap",429],[5,"SetFdFlags",425],[10,"AsFilelike",430],[5,"TypeId",431],[5,"Network",104],[5,"Rc",432],[5,"Peer",104],[10,"AirRunner",433],[5,"PeerId",104],[10,"Into",434],[17,"Item"],[10,"IntoIterator",435],[5,"WasmAirRunner",436],[5,"TestInitParameters",433],[10,"Hash",437],[10,"Eq",438],[10,"Sized",439],[6,"KeyPair",440],[5,"Vec",441],[1,"u64"],[10,"BuildHasher",437],[5,"PeerEnv",203],[5,"RefCell",442],[6,"Option",443],[10,"Iterator",444],[10,"Hasher",437],[5,"MarineServiceHandle",330],[1,"slice"],[5,"Neighborhood",203],[6,"AlterState",203],[5,"AirScriptExecutor",297],[8,"Data",104],[5,"RawAVMOutcome",445],[10,"Stream",446],[5,"TestRunParameters",433],[5,"TransformedAirScript",392],[10,"MarineService",330],[6,"FunctionOutcome",330],[8,"LocalBoxFuture",447],[10,"Clone",448],[15,"SeqOk",100],[15,"SeqError",100]],"r":[[0,297],[1,104],[2,392]],"b":[[66,"impl-From%3CServiceDefinition%3E-for-ServiceTagName"],[67,"impl-From%3C%26ServiceDefinition%3E-for-ServiceTagName"],[149,"impl-From%3CString%3E-for-PeerId"],[150,"impl-From%3C%26PeerId%3E-for-PeerId"],[151,"impl-From%3C%26str%3E-for-PeerId"]],"c":"OjAAAAAAAAA=","e":"OzAAAAEAAGsBGwAAAAgAEwABABkAKABDAAEARgAFAE4AHgBuACUAlgACAJoADgCsACEAzwAjAPYACQADASYAKwEGADgBBgBAAQAAQgEIAE0BAABPAQAAUQEBAFYBAABYARMAbgEFAHYBEgCKAQoAlgECAJoBCQA="}],\ +["air_test_utils",{"t":"FFIGFFIFFPPPPFFFFGFFGFFFGFFFFFFGFGFFFGPPPPPPPSPPPPPFIPGGIPGPIFFFPPPPPPFFGFFGFFFFGFPPGKPPPPRFPPPPPPGGFFPPPPPPPPPPIFFFFFFIIGPPPPGGPFFIFFPPPPPPPPPPPPPPPPPPPFFFPPPPPPIGGFFFPPPPPPPPPGPIPPPPPPPPPPPFGGPPPFFFPPPPPFFIFFPPPPPPPPPPPTTGGFQNNNNNOOOOOONOOOONNNNNNQQOCOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOCQNOOOONNNNNNNNNNNNNNNNNNNNNNHNNNQNOOMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMNNOOOOHOHONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOONNNCNNOONQNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOONNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOMOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNHNHNCOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOONONNOOOOOOONOOCCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOONOONNNNNOOOOOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCNOHOONHHCQMNOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOQQNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOONOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOONOONNNNMQQNNNNOOOOCOOOOOOOOOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNQOOOOOOOOOOCNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOFFNNNONONNNNNONNNNNNNNONONONNNNNIPPPGNNNNNNNHHHNNNNNNNHNHHHNNNHNFFFHHNNNNNNNHHHNNNNNNNNNNNNNNNNNHHNNNNHNNNNNNNNNNNNNNNNNNNNNHNNNNNOHONNNNNNNNHNNHHOONNNNNNNNNNHONNNHHFNNNNNNNNNNNNNNNNNNNNNNFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNPPGPPPPNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNQNNNNNNNNNNNNNNNNFNNONNNONNNNNNNNNNNNONNNNNNNNONONNONNNNNKEEEFFFEONNNNNNMNONNNNNNNNHHHNNNNNNNNNNNNNNNNNNNNNNNNNMNNNONNNONNNONNNMNNNNNNOOONNNONNNONNNNNNNNONNNNNNNFGPPPPPNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOFFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN","n":["AVM","AVMConfig","AVMDataStore","AVMError","AVMMemoryStats","AVMOutcome","AVMResult","AVMRuntimeLimits","AnomalyData","AnomalyDataSeError","Ap","Ap","Ap","ApResult","ApResultResolver","AquaVMRuntimeLimits","ArchivedApResult","ArchivedCallResult","ArchivedCallServiceFailed","ArchivedCanonCidAggregate","ArchivedCanonResult","ArchivedCanonResultCidAggregate","ArchivedCidInfo","ArchivedCidStore","ArchivedExecutedState","ArchivedExecutionTrace","ArchivedFoldResult","ArchivedFoldSubTraceLore","ArchivedGenerationIdx","ArchivedInterpreterData","ArchivedParResult","ArchivedProvenance","ArchivedRawValue","ArchivedSender","ArchivedServiceResultCidAggregate","ArchivedSubTraceDesc","ArchivedTracePos","ArchivedValueRef","Array","Array","Aux","Boolean","Boolean","ByteArray","ByteArray","CALL_SERVICE_SUCCESS","Call","Call","Call","CallParamsArgsDeFailed","CallParamsTetrapletsDeFailed","CallRequestParams","CallRequests","CallRequestsDeError","CallResult","CallResultResolver","CallResults","CallResultsSeFailed","CallSeDeErrors","CallSeDeErrors","CallServiceClosure","CallServiceFailed","CallServiceFailedResolver","CallServiceResult","Canon","Canon","Canon","Canon","Canon","Canon","CanonCidAggregate","CanonCidAggregateResolver","CanonResult","CanonResultCidAggregate","CanonResultCidAggregateResolver","CanonResultResolver","CidInfo","CidInfoResolver","CidStore","CidStoreResolver","CidStoreVerificationError","CidTracker","CidVerificationError","Data","DataDeserializationError","DataStore","DataStoreError","Envelope","Err","Err","Error","ErrorAVMOutcome","Executed","Executed","Executed","Executed","Executed","Executed","ExecutedState","ExecutedStateResolver","ExecutionTrace","ExecutionTraceResolver","F32","F32","F64","F64","Failed","Failed","Failed","Fold","Fold","Fold","FoldLore","FoldResult","FoldResultResolver","FoldSubTraceLore","FoldSubTraceLoreResolver","GenerationIdx","GenerationIdxResolver","HostExportedFunc","HostImportDescriptor","HostImportError","I32","I32","I64","I64","IType","IValue","IncorrectInterpreterResult","InterpreterData","InterpreterDataEnvelope","InterpreterDataEnvelopeFormat","InterpreterDataEnvelopeRepr","InterpreterDataResolver","InterpreterFailed","InterpreterResultDeError","InvalidAIRPath","InvalidUTF8String","KeyError","LifterError","Literal","Literal","Literal","LowererError","MarineError","MismatchWValues","MismatchWValuesCount","MissingReference","Ok","Ok","Par","Par","Par","ParResult","ParResultResolver","ParticleParameters","PeerId","PeerId","PeerId","PeerIdWithCallId","PeerIdWithCallId","PeerIdWithCallId","PosType","Provenance","ProvenanceResolver","RawAVMOutcome","RawValue","RawValueResolver","Record","Record","RecordNotFound","RequestSentBy","RequestSentBy","RequestSentBy","RequestSentBy","RequestSentBy","RequestSentBy","RunnerError","RunnerError","RunnerResult","S16","S16","S32","S32","S64","S64","S8","S8","Scalar","Scalar","Scalar","SecurityTetraplet","Sender","SenderResolver","ServiceResult","ServiceResult","ServiceResult","ServiceResultCidAggregate","ServiceResultCidAggregateResolver","SoftLimitsTriggering","Stream","Stream","Stream","String","String","SubTraceDesc","SubTraceDescResolver","TraceLen","TracePos","TracePosResolver","U16","U16","U32","U32","U64","U64","U8","U8","Unused","Unused","Unused","VARIANT_COUNT","VARIANT_COUNT","ValueRef","ValueRefResolver","Versions","_trace_value_body","add","add","add_assign","add_assign","add_lens","air_script","air_size_limit","air_size_limit","air_size_limit_exceeded","air_wasm_path","allocation_rejects","are_limits_exceeded","argument_hash","argument_hash","argument_types","arguments","as_error","as_error","as_error","as_error","as_error","as_error","assert_error_eq","assert_next_pks","avm_outcome","avm_runner","begin_pos","begin_pos","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","call","call_requests","call_requests","call_result_size_limit","call_result_size_limit","call_result_size_limit_exceeded","call_results","call_services","call_vm","canon","canon_element_store","canon_element_store","canon_result_store","canon_result_store","check_bytes","check_bytes","check_bytes","check_bytes","check_bytes","check_bytes","check_bytes","check_bytes","check_bytes","check_bytes","check_bytes","check_bytes","check_bytes","check_bytes","check_bytes","check_bytes","check_bytes","check_bytes","check_bytes","check_bytes","check_bytes","check_bytes","check_error","check_reference","checked_add","checked_add","checked_call_vm","checked_sub","cid_info","cid_info","cleanup_data","cleanup_data","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","cmp","cmp","collect_anomaly_data","compare","compare","current_data","current_peer_id","data","data","data_from_result","data_store","data_version","data_version","debug","debug","debug","debug","debug","debug","debug","debug","debug","debug","debug","debug","debug","debug","debug","debug","debug","debug","debug","debug","debug","debug","debug","debug","debug","debug","debug","debug","debug","debug","debug","debug","debug","debug","debug","debug","debug","debug","debug","debug","debug","debug","debug","debug","debug","debug","debug","debug","debug","debug","debug","debug","debug","debug","debug","debug","debug","debug","debug","debug","debug","debug","debug","debug","debug","debug","debug","debug","debug","debug","debug","debug","debug","debug","debug","debug","debug","debug","debug","debug","debug","debug","debug","debug","debug","debug","debug","debug","debug","debug","debug","default","default","default","default","default","default","default","default","default","default","default","default","default","default","default","default","default","default","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","detect_anomaly","drop","drop","drop","drop","drop","drop","drop","drop","drop","drop","drop","drop","drop","drop","drop","drop","drop","drop","drop","drop","drop","drop","drop","drop","drop","drop","drop","drop","drop","drop","drop","drop","drop","drop","drop","drop","drop","drop","drop","drop","drop","drop","drop","drop","drop","drop","drop","drop","drop","drop","drop","drop","drop","drop","drop","drop","drop","drop","drop","drop","drop","drop","drop","drop","drop","drop","drop","drop","drop","drop","drop","drop","drop","drop","drop","drop","drop","drop","drop","drop","drop","drop","drop","drop","drop","drop","drop","drop","drop","drop","drop","env_from_result","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","err","error_code","error_handler","error_message","error_message","executed","executed_scalar","executed_service_result","executed_state","executed_stream_stub","executed_unused","execution_time","execution_time","failed","failed","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from_cid_stores","from_execution_result","from_fd","from_filelike","from_grip","from_into_filelike","from_into_socketlike","from_raw_outcome","from_socketlike","from_value","function_name","function_name","get","get","get","get","get","get_cid","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_format","get_hash","get_hash","get_hash","get_hash","get_mut","get_mut","get_mut","get_unchecked","get_unchecked","get_unchecked_mut","get_unchecked_mut","get_value","hard_limit_enabled","hard_limit_enabled","hash","hash","hash","hash","host_exported_func","index","index","index","index_mut","index_mut","index_mut","init","init","init","init","init","init","init","init","init","init","init","init","init","init","init","init","init","init","init","init","init","init","init","init","init","init","init","init","init","init","init","init","init","init","init","init","init","init","init","init","init","init","init","init","init","init","init","init","init","init","init","init","init","init","init","init","init","init","init","init","init","init","init","init","init","init","init","init","init","init","init","init","init","init","init","init","init","init","init","init","init","init","init","init","init","init","init","init","init","init","init","init_peer_id","initialize","inner_data","interpreter_version","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into_iter","into_iter","into_raw","into_raw_result","is_empty","is_interpreter_succeded","iter","key_utils","last_call_request_id","last_call_request_id","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","left_size","left_size","len","lens","literal","literal_tetraplet","logging_mask","lore","lore","max_heap_size","memory_delta","memory_delta","memory_size","memory_stats","message","message","native_test_runner","ne_vec","new","new","new","new","new","new","new","new","new","new","new","new","new","new","new","new","new","new","new","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","next","next_peer_pks","next_peer_pks","ok","outcome","output_type","par","parse","partial_cmp","partial_cmp","partial_cmp","particle","particle_id","particle_size_limit","particle_size_limit","particle_size_limit_exceeded","peer_pk","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pop","prelude","prev","prev_data","print_trace","provenance","provenance","push","raw_data_from_trace","raw_data_from_trace_with_canon","raw_outcome","rc","read_data","request_sent_by","res_generations","res_generations","resolve","resolve","resolve","resolve","resolve","resolve","resolve","resolve","resolve","resolve","resolve","resolve","resolve","resolve","resolve","resolve","resolve","resolve","resolve","resolve","resolve","resolve","resolve","resolve_metadata","resolve_metadata","resolve_metadata","resolve_metadata","resolve_metadata","resolve_metadata","resolve_metadata","resolve_metadata","resolve_metadata","resolve_metadata","resolve_metadata","resolve_metadata","resolve_metadata","resolve_metadata","resolve_metadata","resolve_metadata","resolve_metadata","resolve_metadata","resolve_metadata","resolve_metadata","resolve_metadata","resolve_metadata","resolve_metadata","result","ret_code","ret_code","ret_code","ret_code","right_size","right_size","scalar","scalar_tracked","sent_peer_id","sent_peer_id_with_call_id","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize_metadata","serialize_metadata","serialize_metadata","serialize_metadata","serialize_metadata","serialize_metadata","serialize_metadata","serialize_metadata","serialize_metadata","serialize_metadata","serialize_metadata","serialize_metadata","serialize_metadata","serialize_metadata","serialize_metadata","serialize_metadata","serialize_metadata","serialize_metadata","serialize_metadata","serialize_metadata","serialize_metadata","serialize_metadata","serialize_metadata","serialize_unsized","serialize_unsized","serialize_unsized","serialize_unsized","serialize_unsized","serialize_unsized","serialize_unsized","serialize_unsized","serialize_unsized","serialize_unsized","serialize_unsized","serialize_unsized","serialize_unsized","serialize_unsized","serialize_unsized","serialize_unsized","serialize_unsized","serialize_unsized","serialize_unsized","serialize_unsized","serialize_unsized","serialize_unsized","serialize_unsized","service_id","service_id","service_result","service_result_store","service_result_store","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","signatures","signatures","size","soft_limits_triggering","soft_limits_triggering","source","source","source","source","store_data","stream","stream_tracked","stub","stub","sub","sub","subtrace_len","subtrace_len","subtraces_desc","subtraces_desc","test_runner","tetraplet","tetraplet","tetraplet","tetraplet","tetraplet_cid","tetraplet_cid","tetraplet_store","tetraplet_store","tetraplets","timestamp","to_bytes","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_value","total_memory_limit","trace","trace","trace_from_result","trace_states_count","track_raw_value","track_value","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from_slice","try_from_slice","try_get_versions","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","ttl","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","unused","value","value","value_cid","value_cid","value_pos","value_pos","value_store","value_store","values","values","verification","verify","verify","verify_raw_value","versions","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","wasm_test_runner","cid","cid","call_id","peer_id","cid","generation","call_params","call_params","call_results","de_error","de_error","error","raw_call_request","se_error","source_type_name","target_cid_repr","target_type_name","cid","cid","cid","cid","invalid_path","io_error","reason","call_id","peer_id","call_id","peer_id","cid","generation","cid","generation","AVMRunner","RawAVMOutcome","borrow","borrow_mut","call","call_requests","call_tracing","data","debug","deref","deref_mut","deserialize","drop","error_message","from","get_fd_flags","init","into","layout_raw","memory_stats","new","new_set_fd_flags","next_peer_pks","pointer_metadata","ret_code","set_fd_flags","soft_limits_triggering","to_human_readable_data","try_from","try_into","type_id","vzip","ArgTetraplets","Argument","FunctionName","ServiceName","VariableOptionSource","borrow","borrow_mut","debug","deref","deref_mut","deserialize","drop","echo_call_service","fallible_call_service","fallible_call_service_by_arg","from","get_fd_flags","init","into","layout_raw","new_set_fd_flags","pointer_metadata","return_string_call_service","set_fd_flags","set_variable_call_service","set_variables_call_service","tetraplet_host_function","try_from","try_into","type_id","unit_call_service","vzip","CanonResultAlike","ExecutedCallBuilder","ValueAggregateAlike","_failure_to_value","ap","args","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","canon","canon_request","canon_tracked","debug","debug","debug","deref","deref","deref","deref_mut","deref_mut","deref_mut","deserialize","deserialize","deserialize","deserialize","deserialize","drop","drop","drop","extract_canon_result_cid","extract_service_result_cid","failed","failed_tracked","fmt","fmt","fold","from","from","from","function","get_fd_flags","get_fd_flags","get_fd_flags","init","init","init","into","into","into","layout_raw","layout_raw","layout_raw","lens","new","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","par","peer","peer_name","pointer_metadata","pointer_metadata","pointer_metadata","provenance","request_sent_by","result","scalar","scalar_tracked","serialize","serialize","service","set_fd_flags","set_fd_flags","set_fd_flags","simple_value_aggregate_cid","stream","stream_tracked","subtrace_desc","subtrace_lore","tetraplet","tetraplet","try_from","try_from","try_from","try_into","try_into","try_into","type_id","type_id","type_id","unused","value_aggregate_cid","values","vzip","vzip","vzip","at","derive_dummy_keypair","NativeAirRunner","borrow","borrow_mut","call","debug","deref","deref_mut","deserialize","drop","from","get_current_peer_id","get_fd_flags","init","into","layout_raw","new","new_set_fd_flags","pointer_metadata","set_fd_flags","try_from","try_into","type_id","vzip","NEVec","borrow","borrow_mut","clone","clone_into","clone_to_uninit","debug","default","deref","deref","deref_mut","deserialize","deserialize","drop","eq","equivalent","equivalent","equivalent","equivalent","equivalent","fmt","from","get_fd_flags","get_hash","hash","init","into","into_vec","layout_raw","new","new_set_fd_flags","pointer_metadata","serialize","set_fd_flags","to_owned","try_from","try_into","type_id","vzip","Array","Bool","JValue","Null","Number","Object","String","array","array_from_iter","as_array","as_bool","as_f64","as_i64","as_null","as_number","as_object","as_str","as_u64","borrow","borrow_mut","clone","clone_into","clone_to_uninit","debug","default","deref","deref_mut","deserialize","deserialize","drop","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","equivalent","equivalent","equivalent","equivalent","equivalent","fmt","fmt","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from_iter","from_iter","get","get_fd_flags","index","init","into","is_array","is_boolean","is_f64","is_i64","is_null","is_number","is_object","is_string","is_u64","json","layout_raw","new_set_fd_flags","object","object_from_pairs","pointer","pointer_metadata","serialize","set_fd_flags","string","take","to_owned","to_string","try_from","try_into","type_id","vzip","RawAVMOutcome","borrow","borrow_mut","call_requests","clone","clone_into","clone_to_uninit","data","debug","deref","deref_mut","deserialize","deserialize","drop","eq","equivalent","equivalent","equivalent","equivalent","equivalent","error_message","fmt","from","from_interpreter_outcome","get_fd_flags","init","into","layout_raw","new_set_fd_flags","next_peer_pks","pointer_metadata","ret_code","serialize","set_fd_flags","soft_limits_triggering","to_owned","try_from","try_into","type_id","vzip","AirRunner","DefaultAirRunner","NativeAirRunner","ReleaseWasmAirRunner","TestInitParameters","TestRunParameters","TestRunner","WasmAirRunner","air_size_limit","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","call","call","call_result_size_limit","call_single","clone","clone","clone_into","clone_into","clone_to_uninit","clone_to_uninit","clone_to_uninit","create_avm","create_avm_with_key","create_custom_avm","debug","debug","debug","default","default","deref","deref","deref","deref_mut","deref_mut","deref_mut","deserialize","deserialize","deserialize","drop","drop","drop","fmt","fmt","from","from","from","from_init_peer_id","from_timestamp","from_ttl","get_current_peer_id","get_fd_flags","get_fd_flags","get_fd_flags","hard_limit_enabled","init","init","init","init_peer_id","into","into","into","keypair","layout_raw","layout_raw","layout_raw","new","new","new","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","no_limits","override_current_peer_id","particle_id","particle_size_limit","pointer_metadata","pointer_metadata","pointer_metadata","runner","set_fd_flags","set_fd_flags","set_fd_flags","timestamp","to_owned","to_owned","try_from","try_from","try_from","try_into","try_into","try_into","ttl","type_id","type_id","type_id","vzip","vzip","vzip","with_particle_id","DataVerifier","DataVerifierError","MalformedKey","MalformedSignature","MergeMismatch","PeerIdNotFound","SignatureMismatch","as_error","borrow","borrow","borrow_mut","borrow_mut","debug","debug","deref","deref","deref_mut","deref_mut","deserialize","deserialize","drop","drop","fmt","fmt","from","from","get_fd_flags","get_fd_flags","init","init","into","into","layout_raw","layout_raw","merge","new","new_set_fd_flags","new_set_fd_flags","pointer_metadata","pointer_metadata","set_fd_flags","set_fd_flags","source","to_string","try_from","try_from","try_into","try_into","type_id","type_id","verify","vzip","vzip","cids","error","error","key","larger_cids","peer_id","peer_id","smaller_cids","ReleaseWasmAirRunner","WasmAirRunner","borrow","borrow","borrow_mut","borrow_mut","call","call","debug","debug","deref","deref","deref_mut","deref_mut","deserialize","deserialize","drop","drop","from","from","get_current_peer_id","get_current_peer_id","get_fd_flags","get_fd_flags","init","init","into","into","layout_raw","layout_raw","new","new","new_set_fd_flags","new_set_fd_flags","pointer_metadata","pointer_metadata","set_fd_flags","set_fd_flags","try_from","try_from","try_into","try_into","type_id","type_id","vzip","vzip"],"q":[[0,"air_test_utils"],[2918,"air_test_utils::ArchivedProvenance"],[2920,"air_test_utils::ArchivedSender"],[2922,"air_test_utils::ArchivedValueRef"],[2924,"air_test_utils::CallSeDeErrors"],[2932,"air_test_utils::CidStoreVerificationError"],[2935,"air_test_utils::Provenance"],[2937,"air_test_utils::ProvenanceResolver"],[2939,"air_test_utils::RunnerError"],[2942,"air_test_utils::Sender"],[2944,"air_test_utils::SenderResolver"],[2946,"air_test_utils::ValueRef"],[2948,"air_test_utils::ValueRefResolver"],[2950,"air_test_utils::avm_runner"],[2982,"air_test_utils::call_services"],[3014,"air_test_utils::executed_state"],[3113,"air_test_utils::key_utils"],[3115,"air_test_utils::native_test_runner"],[3138,"air_test_utils::ne_vec"],[3177,"air_test_utils::prelude"],[3306,"air_test_utils::raw_outcome"],[3346,"air_test_utils::test_runner"],[3450,"air_test_utils::verification"],[3503,"air_test_utils::verification::DataVerifierError"],[3511,"air_test_utils::wasm_test_runner"],[3557,"air_interpreter_data::trace_pos"],[3558,"marine_call_parameters"],[3559,"air_interpreter_interface::interpreter_outcome"],[3560,"core::error"],[3561,"avm_server::avm"],[3562,"avm_interface::particle_parameters"],[3563,"avm_interface::call_service_result"],[3564,"std::collections::hash::map"],[3565,"fluence_keypair::key_pair"],[3566,"avm_interface::outcome"],[3567,"avm_server::errors"],[3568,"core::result"],[3569,"marine_wasm_backend_traits"],[3570,"alloc::string"],[3571,"core::convert"],[3572,"alloc::vec"],[3573,"air_interpreter_data::executed_state"],[3574,"air_interpreter_cid"],[3575,"air_interpreter_data::cid_info"],[3576,"bytecheck"],[3577,"core::marker"],[3578,"air_interpreter_data::cid_store"],[3579,"air_interpreter_data::generation_idx"],[3580,"air_interpreter_data::interpreter_data"],[3581,"air_interpreter_data::raw_value"],[3582,"air_interpreter_data::trace"],[3583,"avm_interface::raw_outcome"],[3584,"air::utils::to_error_code"],[3585,"core::option"],[3586,"avm_data_store"],[3587,"avm_interface::call_request_parameters"],[3588,"avm_server::runner"],[3589,"fluence_it_types::types"],[3590,"core::clone"],[3591,"fluence_it_types::values"],[3592,"core::cmp"],[3593,"semver"],[3594,"core::fmt"],[3595,"air_interpreter_data::interpreter_data::repr"],[3596,"serde::de"],[3597,"rkyv::with"],[3598,"rkyv"],[3599,"core::time"],[3600,"serde_json::value"],[3601,"air_interpreter_value::value"],[3602,"avm_interface"],[3603,"marine_core::host_imports::errors"],[3604,"polyplets::triplet"],[3605,"marine::errors"],[3606,"air::execution_step::execution_context::cid_state"],[3607,"air_interpreter_cid::verify"],[3608,"it_lilo::lowerer::error"],[3609,"it_lilo::traits::record_resolvable"],[3610,"it_lilo::lifter::error"],[3611,"air_interpreter_signatures::stores"],[3612,"std::os::fd::owned"],[3613,"io_lifetimes::portability"],[3614,"alloc::rc"],[3615,"typed_index_collections::slice"],[3616,"system_interface::fs::fd_flags"],[3617,"std::io::error"],[3618,"air_interpreter_sede::rmp_serde"],[3619,"core::hash"],[3620,"air_interpreter_interface::call_service_result"],[3621,"core::iter::traits::iterator"],[3622,"core::alloc::layout"],[3623,"avm_server::config"],[3624,"alloc::borrow"],[3625,"wast::parser"],[3626,"wast"],[3627,"serde::ser"],[3628,"rkyv::ser::serializers::alloc"],[3629,"rkyv::ser::serializers"],[3630,"std::io"],[3631,"core::any"],[3632,"std::path"],[3633,"core::cell"],[3634,"core::iter::traits::collect"],[3635,"air_interpreter_signatures"],[3636,"alloc::boxed"],[3637,"futures_core::future"],[3638,"fluence_it_types::ne_vec"],[3639,"core::default"],[3640,"serde_json::number"],[3641,"alloc::collections::btree::map"],[3642,"air::execution_step::execution_context::stream_maps_variables::stream_map_key"],[3643,"air_parser::ast::instruction_arguments"],[3644,"air_interpreter_value::value::index"],[3645,"air_interpreter_data::interpreter_data::errors"],[3646,"air_interpreter_data::interpreter_data::verification"],[3647,"avm_server"],[3648,"marine_core::wasmtime"],[3649,"air_interpreter_data"],[3650,"marine_core"],[3651,"serde_json"]],"i":[0,0,0,0,0,0,0,0,0,17,198,47,83,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66,70,108,66,70,66,70,0,198,47,83,109,109,0,0,109,0,0,0,109,0,108,0,0,0,0,199,46,26,198,47,83,0,0,0,0,0,0,0,0,0,0,0,0,57,111,0,0,17,111,200,201,61,0,202,35,73,203,43,81,0,0,0,0,66,70,66,70,202,35,73,198,47,83,0,0,0,0,0,0,0,0,0,0,66,70,66,70,0,0,108,0,0,0,0,0,17,108,108,110,108,110,199,46,26,110,108,110,110,57,200,201,198,47,83,0,0,0,204,33,72,204,33,72,0,0,0,0,0,0,66,70,110,202,35,73,203,43,81,0,17,0,66,70,66,70,66,70,66,70,205,36,74,0,0,0,199,46,26,0,0,0,205,36,74,66,70,0,0,0,0,0,66,70,66,70,66,70,66,70,205,36,74,66,70,0,0,0,0,1,1,1,1,6,62,64,93,8,148,147,8,38,76,206,63,17,108,109,57,110,111,0,0,62,0,40,78,62,11,148,63,147,6,13,17,108,64,16,93,65,12,66,207,8,27,109,67,208,30,56,57,69,209,32,70,110,71,204,33,72,202,35,73,205,36,74,210,37,75,211,38,76,212,39,77,213,40,78,214,41,79,215,42,80,203,43,81,216,44,24,217,45,82,199,46,26,198,47,83,218,48,58,94,111,84,219,49,85,86,220,50,87,221,51,88,222,52,1,62,11,148,63,147,6,13,17,108,64,16,93,65,12,66,207,8,27,109,67,208,30,56,57,69,209,32,70,110,71,204,33,72,202,35,73,205,36,74,210,37,75,211,38,76,212,39,77,213,40,78,214,41,79,215,42,80,203,43,81,216,44,24,217,45,82,199,46,26,198,47,83,218,48,58,94,111,84,219,49,85,86,220,50,87,221,51,88,222,52,1,11,16,53,64,93,8,62,0,0,26,27,67,27,67,27,30,32,33,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,0,56,58,1,0,58,49,85,61,11,62,63,6,13,64,16,65,12,66,8,67,56,69,70,71,72,73,74,75,76,77,78,79,80,81,24,82,26,83,58,84,85,86,87,88,1,62,63,6,13,64,16,65,12,66,8,67,56,69,70,71,72,73,74,75,76,77,78,79,80,81,24,82,26,83,58,84,85,86,87,88,1,62,63,6,13,64,64,16,65,12,66,8,8,67,56,69,70,71,71,72,73,74,75,76,77,78,78,79,80,81,24,82,26,83,58,58,84,85,86,87,88,1,1,58,1,61,58,1,62,12,16,53,0,148,0,86,62,11,148,63,147,6,13,17,108,64,16,93,65,12,66,207,8,27,109,67,208,30,56,57,69,209,32,70,110,71,204,33,72,202,35,73,205,36,74,210,37,75,211,38,76,212,39,77,213,40,78,214,41,79,215,42,80,203,43,81,216,44,24,217,45,82,199,46,26,198,47,83,218,48,58,94,111,84,219,49,85,86,220,50,87,221,51,88,222,52,1,6,13,93,8,67,56,69,70,71,77,78,79,80,58,94,85,88,1,62,11,148,63,147,6,13,17,108,64,16,93,65,12,66,207,8,27,109,67,208,30,56,57,69,209,32,70,110,71,204,33,72,202,35,73,205,36,74,210,37,75,211,38,76,212,39,77,213,40,78,214,41,79,215,42,80,203,43,81,216,44,24,217,45,82,199,46,26,198,47,83,218,48,58,94,111,84,219,49,85,86,220,50,87,221,51,88,88,222,52,1,62,11,148,63,147,6,13,17,108,64,16,93,65,12,66,207,8,27,109,67,208,30,56,57,69,209,32,70,110,71,204,33,72,202,35,73,205,36,74,210,37,75,211,38,76,212,39,77,213,40,78,214,41,79,215,42,80,203,43,81,216,44,24,217,45,82,199,46,26,198,47,83,218,48,58,94,111,84,219,49,85,86,220,50,87,221,51,88,222,52,1,62,62,11,148,63,63,147,6,6,6,13,13,17,108,64,16,16,93,65,65,12,12,66,66,207,8,8,27,109,67,67,67,208,30,56,56,56,57,69,209,32,70,110,71,71,204,33,72,72,72,202,35,73,73,73,205,36,74,74,74,210,37,75,75,75,211,38,76,76,76,212,39,77,77,77,213,40,78,78,78,214,41,79,79,79,215,42,80,80,80,203,43,81,81,81,216,44,24,24,24,217,45,82,82,82,199,46,26,26,26,198,47,83,83,83,218,48,58,58,58,94,94,111,84,84,219,49,85,85,85,86,86,220,50,87,87,87,221,51,88,88,88,222,52,1,1,1,61,62,11,148,63,147,6,13,17,108,64,16,93,65,12,66,207,8,27,109,67,208,30,56,57,69,209,32,70,110,71,204,33,72,202,35,73,205,36,74,210,37,75,211,38,76,212,39,77,213,40,78,214,41,79,215,42,80,203,43,81,216,44,24,217,45,82,199,46,26,198,47,83,218,48,58,94,111,84,219,49,85,86,220,50,87,221,51,88,222,52,1,0,62,63,6,13,16,65,66,8,67,56,70,71,72,73,74,75,76,77,78,79,80,81,24,82,26,83,58,58,87,88,88,1,62,62,62,62,62,63,63,63,63,63,6,6,6,6,6,13,13,13,13,13,16,16,16,16,16,65,65,65,65,65,66,66,66,66,66,8,8,8,8,8,67,67,67,67,67,56,56,56,56,56,71,71,71,71,71,72,72,72,72,72,73,73,73,73,73,74,74,74,74,74,75,75,75,75,75,76,76,76,76,76,77,77,77,77,77,78,78,78,78,78,79,79,79,79,79,80,80,80,80,80,81,81,81,81,81,24,24,24,24,24,82,82,82,82,82,26,26,26,26,26,83,83,83,83,83,58,58,58,58,58,87,87,87,87,87,88,88,88,88,88,1,1,1,1,1,13,65,206,65,53,81,73,73,0,73,73,62,16,73,0,62,63,6,6,13,13,17,17,108,108,64,16,65,12,66,8,109,109,67,56,57,57,69,70,110,110,71,72,72,73,74,74,75,76,77,78,79,80,81,24,82,26,83,83,58,58,94,111,111,84,85,86,87,88,1,1,62,11,148,63,147,6,6,13,17,17,17,108,108,108,64,64,64,16,93,93,65,12,66,207,8,27,109,67,67,208,30,56,56,57,57,69,209,32,70,70,70,70,70,70,70,70,70,70,70,70,70,110,110,110,110,110,71,204,33,72,202,35,73,205,36,74,210,37,75,211,38,76,212,39,77,213,40,78,214,41,79,215,42,80,203,43,81,216,44,24,217,45,82,199,46,26,198,47,83,218,48,58,58,94,111,84,219,49,85,86,220,50,87,87,221,51,88,88,222,52,1,1,69,84,17,17,17,17,17,16,17,87,63,6,56,69,58,88,1,73,62,11,148,63,147,6,13,17,108,64,16,93,65,12,66,207,8,27,109,67,208,30,56,57,69,209,32,70,110,71,204,33,72,202,35,73,205,36,74,210,37,75,211,38,76,212,39,77,213,40,78,214,41,79,215,42,80,203,43,81,216,44,24,217,45,82,199,46,26,198,47,83,218,48,58,94,111,84,219,49,85,86,220,50,87,221,51,88,222,52,1,94,6,66,58,1,58,88,1,58,1,58,1,87,64,93,6,66,58,1,206,58,88,1,58,88,1,62,11,148,63,147,6,13,17,108,64,16,93,65,12,66,207,8,27,109,67,208,30,56,57,69,209,32,70,110,71,204,33,72,202,35,73,205,36,74,210,37,75,211,38,76,212,39,77,213,40,78,214,41,79,215,42,80,203,43,81,216,44,24,217,45,82,199,46,26,198,47,83,218,48,58,94,111,84,219,49,85,86,220,50,87,221,51,88,222,52,1,12,61,84,86,62,11,148,63,147,6,13,17,108,64,16,93,65,12,66,207,8,27,109,67,208,30,56,57,69,209,32,70,110,71,204,33,72,202,35,73,205,36,74,210,37,75,211,38,76,212,39,77,213,40,78,214,41,79,215,42,80,203,43,81,216,44,24,217,45,82,199,46,26,198,47,83,218,48,58,94,111,84,219,49,85,86,220,50,87,221,51,88,222,52,1,56,88,13,0,56,0,56,0,49,85,62,11,148,63,147,6,13,17,108,64,16,93,65,12,66,207,8,27,109,67,208,30,56,57,69,209,32,70,110,71,204,33,72,202,35,73,205,36,74,210,37,75,211,38,76,212,39,77,213,40,78,214,41,79,215,42,80,203,43,81,216,44,24,217,45,82,199,46,26,198,47,83,218,48,58,94,111,84,219,49,85,86,220,50,87,221,51,88,222,52,1,32,71,56,6,26,6,148,41,79,148,62,16,147,11,37,75,0,0,62,11,63,6,64,93,12,8,56,69,71,75,76,78,80,24,82,84,86,62,11,148,63,147,6,13,17,108,64,16,93,65,12,66,207,8,27,109,67,208,30,56,57,69,209,32,70,110,71,204,33,72,202,35,73,205,36,74,210,37,75,211,38,76,212,39,77,213,40,78,214,41,79,215,42,80,203,43,81,216,44,24,217,45,82,199,46,26,198,47,83,218,48,58,94,111,84,219,49,85,86,220,50,87,221,51,88,222,52,1,58,16,53,13,65,206,83,66,58,58,1,62,12,64,93,8,6,62,11,148,63,147,6,13,17,108,64,16,93,65,12,66,207,8,27,109,67,208,30,56,57,69,209,32,70,110,71,204,33,72,202,35,73,205,36,74,210,37,75,211,38,76,212,39,77,213,40,78,214,41,79,215,42,80,203,43,81,216,44,24,217,45,82,199,46,26,198,47,83,218,48,58,94,111,84,219,49,85,86,220,50,87,221,51,88,222,52,1,88,0,58,62,0,45,82,88,0,0,0,0,61,81,42,80,6,67,56,71,72,73,74,75,76,77,78,79,80,81,24,82,26,83,58,85,87,88,1,6,67,56,71,72,73,74,75,76,77,78,79,80,81,24,82,26,83,58,85,87,88,1,13,13,53,37,75,32,71,0,0,73,73,62,63,6,6,13,16,65,12,66,8,67,67,56,56,71,72,72,73,73,74,74,75,75,76,76,77,77,78,78,79,79,80,80,81,81,24,24,82,82,26,26,83,83,58,58,84,84,85,85,85,86,87,87,88,88,1,1,6,67,56,71,72,73,74,75,76,77,78,79,80,81,24,82,26,83,58,85,87,88,1,6,67,56,71,72,73,74,75,76,77,78,79,80,81,24,82,26,83,58,85,87,88,1,63,6,26,27,67,62,11,148,63,147,6,13,17,108,64,16,93,65,12,66,207,8,27,109,67,208,30,56,57,69,209,32,70,110,71,204,33,72,202,35,73,205,36,74,210,37,75,211,38,76,212,39,77,213,40,78,214,41,79,215,42,80,203,43,81,216,44,24,217,45,82,199,46,26,198,47,83,218,48,58,94,111,84,219,49,85,86,220,50,87,221,51,88,222,52,1,49,85,71,16,53,17,108,57,110,61,0,0,80,58,1,1,40,78,39,77,0,44,24,45,82,38,76,27,67,63,12,66,62,63,6,13,64,16,65,12,66,8,67,56,69,70,71,72,73,74,75,76,77,78,79,80,81,24,82,26,83,58,84,85,86,87,88,1,6,13,17,108,66,109,57,110,72,74,83,58,111,1,75,147,49,85,0,88,69,69,62,11,148,63,147,6,13,17,108,64,16,93,65,12,66,207,8,27,109,67,208,30,56,57,69,209,32,70,110,71,204,33,72,202,35,73,205,36,74,210,37,75,211,38,76,212,39,77,213,40,78,214,41,79,215,42,80,203,43,81,216,44,24,217,45,82,199,46,26,198,47,83,218,48,58,94,111,84,219,49,85,86,220,50,87,221,51,88,222,52,1,1,84,85,84,62,11,148,63,147,6,13,17,108,64,16,93,65,12,66,207,8,27,109,67,208,30,56,57,69,209,32,70,110,71,204,33,72,202,35,73,205,36,74,210,37,75,211,38,76,212,39,77,213,40,78,214,41,79,215,42,80,203,43,81,216,44,24,217,45,82,199,46,26,198,47,83,218,48,58,94,111,84,219,49,85,86,220,50,87,221,51,88,222,52,1,12,62,11,148,63,147,6,13,17,108,64,16,93,65,12,66,207,8,27,109,67,208,30,56,57,69,209,32,70,110,71,204,33,72,202,35,73,205,36,74,210,37,75,211,38,76,212,39,77,213,40,78,214,41,79,215,42,80,203,43,81,216,44,24,217,45,82,199,46,26,198,47,83,218,48,58,94,111,84,219,49,85,86,220,50,87,221,51,88,222,52,1,0,45,82,38,76,39,77,27,67,44,24,0,67,56,56,84,62,11,148,63,147,6,13,17,108,64,16,93,65,12,66,207,8,27,109,67,208,30,56,57,69,209,32,70,110,71,204,33,72,202,35,73,205,36,74,210,37,75,211,38,76,212,39,77,213,40,78,214,41,79,215,42,80,203,43,81,216,44,24,217,45,82,199,46,26,198,47,83,218,48,58,94,111,84,219,49,85,86,220,50,87,221,51,88,222,52,1,0,223,224,225,225,226,226,227,228,229,227,228,230,230,229,231,231,231,232,233,234,235,236,236,236,237,237,238,238,239,239,240,240,0,0,163,163,163,53,163,53,163,163,163,163,163,53,163,163,163,163,163,163,163,163,53,163,53,163,53,163,163,163,163,163,0,166,166,166,0,166,166,166,166,166,166,166,0,0,0,166,166,166,166,166,166,166,0,166,0,0,0,166,166,166,0,166,0,0,0,0,0,169,169,171,172,169,171,172,0,0,0,169,171,172,169,171,172,169,171,172,169,171,171,172,172,169,171,172,0,0,169,169,171,172,0,169,171,172,169,169,171,172,169,171,172,169,171,172,169,171,172,169,169,169,171,172,0,169,169,169,171,172,171,0,171,169,169,171,172,169,169,171,172,0,169,169,0,0,171,172,169,171,172,169,171,172,169,171,172,169,0,172,169,171,172,0,0,0,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,0,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,105,105,0,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,0,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,0,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,0,0,0,0,0,0,0,0,115,192,193,115,192,193,115,191,192,115,192,193,115,193,115,193,115,115,0,0,0,192,193,115,193,115,192,193,115,192,193,115,192,193,115,192,193,115,193,115,192,193,115,193,193,193,191,192,193,115,115,192,193,115,193,192,193,115,192,192,193,115,191,193,115,192,193,115,115,193,193,115,192,193,115,192,192,193,115,193,193,115,192,193,115,192,193,115,193,192,193,115,192,193,115,193,0,0,194,194,194,194,194,194,195,194,195,194,195,194,195,194,195,194,195,194,195,194,194,194,195,194,195,194,195,194,195,194,195,194,195,195,195,194,195,194,195,194,194,194,195,194,195,194,195,194,195,195,194,241,242,241,242,243,241,243,243,0,0,196,197,196,197,196,197,196,197,196,197,196,197,196,197,196,197,196,197,196,197,196,197,196,197,196,197,196,197,196,197,196,197,196,197,196,197,196,197,196,197,196,197,196,197],"f":"```````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````{{bd}b}{{bb}b}{{{h{fb}}d}j}{{{h{fb}}b}j}{{{h{fl}}{h{n}}}j}``````{{{h{A`}}}Ab}````{{{h{c}}}{{h{Ad}}}{}}00000``````{{{h{c}}}{{h{e}}}{}{}}000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000{{{h{fc}}}{{h{fe}}}{}{}}000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000{{{h{f{Af{ce}}}}giAh{Al{dAj}}{h{An}}}{{Bd{B`{Bb{c}}}}}{}Bf{{Bj{Bh}}}{{Bj{{Bn{Bl}}}}}}````````{{{Cb{C`}}}Cd}````{{Cf{h{fc}}}{{Bd{{h{Cf}}Ch}}}Cj}{{Cl{h{fc}}}{{Bd{{h{{Cl{e}}}}Cn}}}Cj{}}{{D`{h{fc}}}{{Bd{{h{D`}}Ch}}}Cj}{{Db{h{fc}}}{{Bd{{h{Db}}{Dd{Bl}}}}}Cj}{{Df{h{fc}}}{{Bd{{h{Df}}{Dd{Bl}}}}}Cj}{{Dh{h{fc}}}{{Bd{{h{Dh}}{Dd{Bl}}}}}Cj}{{Dj{h{fc}}}{{Bd{{h{Dj}}Ch}}}Cj}{{Dl{h{fc}}}{{Bd{{h{Dl}}Ch}}}Cj}{{Dn{h{fc}}}{{Bd{{h{Dn}}Ch}}}Cj}{{E`{h{fc}}}{{Bd{{h{E`}}Ch}}}Cj}{{Eb{h{fc}}}{{Bd{{h{Eb}}Ch}}}Cj}{{Ed{h{fc}}}{{Bd{{h{Ed}}Ch}}}Cj}{{Ef{h{fc}}}{{Bd{{h{Ef}}{Dd{Bl}}}}}Cj}{{Eh{h{fc}}}{{Bd{{h{Eh}}Ch}}}Cj}{{Ej{h{fc}}}{{Bd{{h{Ej}}Ch}}}Cj}{{El{h{fc}}}{{Bd{{h{El}}{Dd{Bl}}}}}Cj}{{En{h{fc}}}{{Bd{{h{En}}{Dd{Bl}}}}}Cj}{{F`{h{fc}}}{{Bd{{h{F`}}Cn}}}Cj}{{Fb{h{fc}}}{{Bd{{h{Fb}}Ch}}}Cj}{{Fd{h{fc}}}{{Bd{{h{Fd}}Ch}}}Cj}{{Ff{h{fc}}}{{Bd{{h{Ff}}Cn}}}Cj}{{Fh{h{fc}}}{{Bd{{h{Fh}}Cn}}}Cj}{{{h{Fj}}c}Ab{FlFn}}{{{h{{G`{c}}}}{h{{Cb{e}}}}{h{{Cb{c}}}}}{{Bd{jGb}}}{}{}}{{GdGd}{{Gf{Gd}}}}{{{h{b}}{h{b}}}{{Gf{b}}}}`1``{{{h{f{Gj{}{{Gh{c}}}}}}{h{n}}{h{n}}}{{Bd{jc}}}{}}{{{h{f{Af{ce}}}}{h{n}}{h{n}}}{{Bd{j{Bb{c}}}}}{}Bf}{{{h{Gl}}}Gl}{{{h{Gn}}}Gn}{{{h{l}}}l}{{{h{Aj}}}Aj}{{{h{H`}}}H`}{{{h{B`}}}B`}{{{h{Hb}}}Hb}{{{h{Ah}}}Ah}{{{h{Hd}}}Hd}{{{h{A`}}}A`}{{{h{Hf}}}Hf}{{{h{{G`{c}}}}}{{G`{c}}}Hh}{{{h{{Hj{c}}}}}{{Hj{c}}}Hh}{{{h{Hl}}}Hl}{{{h{Hn}}}Hn}{{{h{I`}}}I`}{{{h{Ib}}}Ib}{{{h{Id}}}Id}{{{h{If}}}If}{{{h{Ih}}}Ih}{{{h{Ij}}}Ij}{{{h{Il}}}Il}{{{h{In}}}In}{{{h{J`}}}J`}{{{h{Jb}}}Jb}{{{h{C`}}}C`}{{{h{Jd}}}Jd}{{{h{Cd}}}Cd}{{{h{Jf}}}Jf}{{{h{Gd}}}Gd}{{{h{Jh}}}Jh}{{{h{Jj}}}Jj}{{{h{Jl}}}Jl}{{{h{Jn}}}Jn}{{{h{K`}}}K`}{{{h{b}}}b}{{{h{c}}{h{fe}}}j{}{}}00000000000000000000000000000000000{{{h{c}}}j{}}00000000000000000000000000000000000000000{{{h{Gd}}{h{Gd}}}Kb}{{{h{b}}{h{b}}}Kb}{{{h{f{Gj{}{{Gh{c}}}}}}{h{n}}{h{n}}Gl}{{Bd{jc}}}{}}{{{h{c}}{h{e}}}Kb{}{}}0````{{{h{Fj}}}Jj}`{{}{{h{Kd}}}}`{{{h{fKf}}}{{Bd{jKh}}}}000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000{{}l}{{}Aj}{{}Kj}{{}A`}{{}Hf}{{}{{G`{c}}}{}}{{}{{Hj{c}}}{}}{{}Hl}{{}Hn}{{}Ij}{{}Il}{{}In}{{}J`}{{}Gd}{{}Kl}{{}Jj}{{}K`}{{}b}{Kn{{h{c}}}{}}000000000000000000000000000000000000000000000000000000000000000000000000000000000000000{{{h{K`}}}{{h{{L`{Jf}}}}}}111{Kn{{h{fc}}}{}}000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000{c{{Bd{Gl}}}Lb}{{{h{c}}{h{fe}}}{{Bd{{Ld{gi}}}}}{}{}{}{}}00{c{{Bd{Gn}}}Lb}11{c{{Bd{l}}}Lb}{{h{h{fc}}}{{Bd{l}}}{LfCj}}33{c{{Bd{Aj}}}Lb}4444{c{{Bd{B`}}}Lb}55{c{{Bd{Hb}}}Lb}{c{{Bd{Ah}}}Lb}77{c{{Bd{Hd}}}Lb}88{c{{Bd{A`}}}Lb}99{c{{Bd{Hf}}}Lb}{{h{h{fc}}}{{Bd{Hf}}}{LfCj}};;;{c{{Bd{{G`{e}}}}}LbLh}{{h{h{fc}}}{{Bd{{G`{e}}}}}{LfCj}{}}======={{h{h{fc}}}{{Bd{Hn}}}{LfCj}}>>>{{h{h{fc}}}{{Bd{I`}}}{LfCj}}{c{{Bd{I`}}}Lb}{{{h{c}}{h{fe}}}{{Bd{{Ld{gi}}}}}{}{}{}{}}000{c{{Bd{Ib}}}Lb}{{h{h{fc}}}{{Bd{Ib}}}{LfCj}}22{{h{h{fc}}}{{Bd{Id}}}{LfCj}}3{c{{Bd{Id}}}Lb}44{c{{Bd{If}}}Lb}5{{h{h{fc}}}{{Bd{If}}}{LfCj}}66{c{{Bd{Ih}}}Lb}{{h{h{fc}}}{{Bd{Ih}}}{LfCj}}888{c{{Bd{Ij}}}Lb}9{{h{h{fc}}}{{Bd{Ij}}}{LfCj}}:::{{h{h{fc}}}{{Bd{Il}}}{LfCj}}{c{{Bd{Il}}}Lb}<<<{c{{Bd{In}}}Lb}{{h{h{fc}}}{{Bd{In}}}{LfCj}}>>>{c{{Bd{J`}}}Lb}{{h{h{fc}}}{{Bd{J`}}}{LfCj}}{{{h{c}}{h{fe}}}{{Bd{{Ld{gi}}}}}{}{}{}{}}00{c{{Bd{Jb}}}Lb}{{h{h{fc}}}{{Bd{Jb}}}{LfCj}}22{{h{h{fc}}}{{Bd{C`}}}{LfCj}}3{c{{Bd{C`}}}Lb}444{{h{h{fc}}}{{Bd{Jd}}}{LfCj}}{c{{Bd{Jd}}}Lb}66{{h{h{fc}}}{{Bd{Cd}}}{LfCj}}7{c{{Bd{Cd}}}Lb}88{{h{h{fc}}}{{Bd{Jf}}}{LfCj}}{c{{Bd{Jf}}}Lb}:::{c{{Bd{Gd}}}Lb}{{h{h{fc}}}{{Bd{Gd}}}{LfCj}}<{{{h{Kl}}{h{{L`{Bl}}}}}{{Bd{Jl}}}}==={c{{Bd{Jh}}}Lb}>>{c{{Bd{Jj}}}Lb}{{h{h{fc}}}{{Bd{Jj}}}{LfCj}}{{{h{c}}{h{fe}}}{{Bd{{Ld{gi}}}}}{}{}{}{}}0{c{{Bd{Jl}}}Lb}11{{h{h{fc}}}{{Bd{Jn}}}{LfCj}}2{c{{Bd{Jn}}}Lb}33{c{{Bd{K`}}}Lb}{{h{h{fc}}}{{Bd{K`}}}{LfCj}}5555{c{{Bd{b}}}Lb}{{h{h{fc}}}{{Bd{b}}}{LfCj}}{{{h{{Gj{}{{Gh{c}}}}}}LjKn{h{Fj}}}Ab{}}{Knj}000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000{{{h{Fj}}}Jh}{{{h{Gl}}{h{Gl}}}Ab}{{{h{Gn}}{h{Gn}}}Ab}{{{h{l}}{h{l}}}Ab}{{{h{Aj}}{h{Aj}}}Ab}{{{h{B`}}{h{B`}}}Ab}{{{h{Hb}}{h{Hb}}}Ab}{{{h{Hd}}{h{Hd}}}Ab}{{{h{A`}}{h{A`}}}Ab}{{{h{Hf}}{h{Hf}}}Ab}{{{h{{G`{c}}}}{h{{G`{c}}}}}AbLl}{{{h{Hl}}{h{Hl}}}Ab}{{{h{Hn}}{h{Hn}}}Ab}{{{h{I`}}{h{I`}}}Ab}{{{h{Ib}}{h{Ib}}}Ab}{{{h{Id}}{h{Id}}}Ab}{{{h{If}}{h{If}}}Ab}{{{h{Ih}}{h{Ih}}}Ab}{{{h{Ij}}{h{Ij}}}Ab}{{{h{Il}}{h{Il}}}Ab}{{{h{In}}{h{In}}}Ab}{{{h{J`}}{h{J`}}}Ab}{{{h{Jb}}{h{Jb}}}Ab}{{{h{C`}}{h{C`}}}Ab}{{{h{Jd}}{h{Jd}}}Ab}{{{h{Cd}}{h{Cd}}}Ab}{{{h{Jf}}{h{Jf}}}Ab}{{{h{Gd}}{h{Kn}}}Ab}{{{h{Gd}}{h{Gd}}}Ab}{{{h{Jn}}{h{Jn}}}Ab}{{{h{K`}}{h{{Bn{Jf}}}}}Ab}{{{h{K`}}{h{K`}}}Ab}{{{h{b}}{h{b}}}Ab}{{{h{c}}{h{e}}}Ab{}{}}000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000{{LnM`}Aj}````{{{Cb{C`}}}Jb}{{{Cb{Ih}}}Ib}{IdIb}`1{{{Cb{Mb}}}Ib}``2`{{{h{Gl}}{h{fKf}}}{{Bd{jKh}}}}{{{h{Gn}}{h{fKf}}}{{Bd{jKh}}}}{{{h{l}}{h{fKf}}}{{Bd{jKh}}}}0{{{h{Aj}}{h{fKf}}}{{Bd{jKh}}}}0{{{h{{Bb{c}}}}{h{fKf}}}{{Bd{jKh}}}Md}{{{h{{Bb{c}}}}{h{fKf}}}{{Bd{jKh}}}Mf}{{{h{Mh}}{h{fKf}}}{{Bd{jKh}}}}0{{{h{H`}}{h{fKf}}}{{Bd{jKh}}}}{{{h{B`}}{h{fKf}}}{{Bd{jKh}}}}{{{h{Hb}}{h{fKf}}}{{Bd{jKh}}}}{{{h{Ah}}{h{fKf}}}{{Bd{jKh}}}}{{{h{Hd}}{h{fKf}}}{{Bd{jKh}}}}{{{h{A`}}{h{fKf}}}{{Bd{jKh}}}}{{{h{Mj}}{h{fKf}}}{{Bd{jKh}}}}0{{{h{Hf}}{h{fKf}}}{{Bd{jKh}}}}{{{h{{G`{c}}}}{h{fKf}}}{{Bd{jKh}}}Md}{{{h{Gb}}{h{fKf}}}{{Bd{jKh}}}}0{{{h{{Hj{c}}}}{h{fKf}}}{{Bd{jKh}}}Md}{{{h{Hl}}{h{fKf}}}{{Bd{jKh}}}}{{{h{Ml}}{h{fKf}}}{{Bd{jKh}}}}0{{{h{Hn}}{h{fKf}}}{{Bd{jKh}}}}{{{h{I`}}{h{fKf}}}{{Bd{jKh}}}}0{{{h{Ib}}{h{fKf}}}{{Bd{jKh}}}}{{{h{Id}}{h{fKf}}}{{Bd{jKh}}}}0{{{h{If}}{h{fKf}}}{{Bd{jKh}}}}{{{h{Ih}}{h{fKf}}}{{Bd{jKh}}}}{{{h{Ij}}{h{fKf}}}{{Bd{jKh}}}}{{{h{Il}}{h{fKf}}}{{Bd{jKh}}}}{{{h{In}}{h{fKf}}}{{Bd{jKh}}}}{{{h{J`}}{h{fKf}}}{{Bd{jKh}}}}{{{h{Jb}}{h{fKf}}}{{Bd{jKh}}}}{{{h{C`}}{h{fKf}}}{{Bd{jKh}}}}{{{h{Jd}}{h{fKf}}}{{Bd{jKh}}}}{{{h{Cd}}{h{fKf}}}{{Bd{jKh}}}}{{{h{Jf}}{h{fKf}}}{{Bd{jKh}}}}0{{{h{Gd}}{h{fKf}}}{{Bd{jKh}}}}0{{{h{Kl}}{h{fKf}}}{{Bd{jKh}}}}{{{h{Mn}}{h{fKf}}}{{Bd{jKh}}}}0{{{h{Jh}}{h{fKf}}}{{Bd{jKh}}}}{{{h{Jj}}{h{fKf}}}{{Bd{jKh}}}}{{{h{Jl}}{h{fKf}}}{{Bd{jKh}}}}{{{h{Jn}}{h{fKf}}}{{Bd{jKh}}}}{{{h{K`}}{h{fKf}}}{{Bd{jKh}}}}{{{h{b}}{h{fKf}}}{{Bd{jKh}}}}0{cc{}}0000{N`l}11{c{{Bb{c}}}{}}{Nbc{}}3{MjMh}4{NdMh}{KjH`}{NfH`}777{NfKj}8888888{NhHf}999{{{Hj{c}}}{{G`{c}}}{}}::{NjGb};;;{{{Bn{Bl}}}Hl}{LnHl}={NlHl}{dHl}{NnHl}{O`Hl}{ObHl}{BhHl}{OdHl}{BlHl}{OfHl}{OhHl}{OjMl}{OlMl}{cc{}}{OnMl}{A@`Ml}222222222222222222222222222222222222222222222{KnGd}33333333333{MbJn}444{{{Bn{Jf}}}K`}55{db}6{{{G`{c}}{G`{c}}}{{Hj{c}}}{}}{{K`HfA@bdKd}Jh}{A@dc{}}00{ceA@f{}}{ceA@h{}}{{FjKnLj}{{Bd{B`Hb}}}}3{cJn{{Bj{Mb}}}}``{{{h{{G`{c}}}}{h{{Cb{c}}}}}{{Gf{{A@j{c}}}}}{}}{{{h{{Hj{c}}}}{h{{Cb{c}}}}}{{Gf{{A@j{c}}}}}{}}{{c{h{{A@l{eg}}}}}{{Gf{h}}}{}{}{}}{{{h{K`}}b}{{Gf{{h{Jf}}}}}}1{{{h{Ib}}}{{Gf{{h{{Cb{Ih}}}}}}}}{{{h{c}}}{{Bd{A@nAA`}}}{}}000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000{{{h{Kl}}}AAb}{{{h{c}}{h{e}}}Of{AAdCj}AAf}000{{c{h{f{A@l{eg}}}}}{{Gf{{h{f}}}}}{}{}{}}{{{h{fK`}}b}{{Gf{{h{fJf}}}}}}1{{c{h{{A@l{eg}}}}}h{}{}{}}0{{c{h{f{A@l{eg}}}}}{{h{f}}}{}{}{}}0{{{h{Jn}}}Mb}``{{{h{l}}{h{fc}}}jAAh}{{{h{Hd}}{h{fc}}}jAAh}{{{h{Gd}}{h{fc}}}jAAh}{{{h{b}}{h{fc}}}jAAh}`6{{{h{K`}}b}h}76{{{h{fK`}}b}{{h{f}}}}7{{}Kn}000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000`{{{h{f{Gj{}{{Gh{c}}}}}}}{{Bd{jc}}}{}}``{ce{}{}}000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000{{{G`{c}}}{}{}}{{{h{K`}}}}{AjAAj}{{{Al{dAj}}}{{Al{BhAAj}}}}{{{h{{G`{c}}}}}Ab{}}{{{h{Fj}}}Ab}{{{h{{G`{c}}}}}{{`{{AB`{}{{AAl{{AAn{{h{{Cb{c}}}}{h{{A@j{c}}}}}}}}}}}}}{}}```{{}{{Bd{ABbABd}}}}000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000``{{{h{{G`{c}}}}}Kn{}}`{{}Cd}{cl{{Bj{Bh}}}}```````{{{h{{Af{ce}}}}}ABf{}Bf}````{{{h{n}}{h{{L`{Bl}}}}{h{{L`{Bl}}}}{h{{L`{Bl}}}}{h{{L`{Bl}}}}{h{{L`{Bl}}}}LjKn}Gl}{{{ABh{c}}e}{{Bd{{Af{ce}}{Bb{c}}}}}{}Bf}{{ce{Bn{M`}}{Bn{{Bn{l}}}}}Gn{{Bj{Bh}}}{{Bj{Bh}}}}{{cegi}l{{Bj{Bh}}}{{Bj{Bh}}}{{Bj{Bh}}}{{Bj{Bh}}}}{{OfOfOfAb}H`}{{{Gf{Of}}{Gf{Of}}{Gf{Of}}Ab}Kj}{{{ABj{n}}{ABj{n}}Ofd{ABj{n}}}Ah}{{AbAbAb}A`}{{}{{G`{c}}}{}}{{}{{Hj{c}}}{}}{{dd}Hn}{{Ln{A@j{Bh}}}If}{{{Cb{Jn}}{A@j{n}}{Cb{l}}}Ih}{{bKn}Il}{GdJ`}{{{Cb{l}}{Bn{{Cb{Jd}}}}}C`}{{{Cb{Jn}}{Cb{l}}Cd}Jd}{KdJh}{KdJl}{{{h{c}}A@n}{{Bd{{ABl{e}}AA`}}}{}ABn}000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000{GdGd}``{M`Aj}``{{KnKn}Jf}{AC`{{Bd{HdACb}}}}{{{h{Gd}}{h{Kn}}}{{Gf{Kb}}}}{{{h{Gd}}{h{Gd}}}{{Gf{Kb}}}}{{{h{b}}{h{b}}}{{Gf{Kb}}}}``````{h}000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000{{{h{fK`}}}{{Gf{Jf}}}}`8`{{{h{Fj}}{h{n}}}j}``{{{h{fK`}}Jf}j}{{cNh}{{Bn{Bl}}}{{Bj{K`}}}}0``{{{h{f{Gj{}{{Gh{c}}}}}}{h{n}}{h{n}}}{{Bd{{Bn{Bl}}c}}}{}}{{{A@j{Bh}}}Jb}``{{{h{l}}Kn}j}{{{h{Hf}}Kn}j}{{{h{{G`{c}}}}Kn}j{}}{{{h{Hn}}Kn}j}{{{h{I`}}Kn}j}{{{h{Ib}}Kn}j}{{{h{Id}}Kn}j}{{{h{If}}Kn}j}{{{h{Ih}}Kn}j}{{{h{Ij}}Kn}j}{{{h{Il}}Kn}j}{{{h{In}}Kn}j}{{{h{J`}}Kn}j}{{{h{Jb}}Kn}j}{{{h{C`}}Kn}j}{{{h{Jd}}Kn}j}{{{h{Cd}}Kn}j}{{{h{Jf}}Kn}j}{{{h{Gd}}Kn}j}{{{h{Jj}}Kn}j}{{{h{Jn}}Kn}j}{{{h{K`}}Kn}j}{{{h{b}}Kn}j}{{{h{c}}Kn}j{}}0000000000000000000000`````````{{{A@j{Bh}}}Ib}{{{A@j{Bh}}d}Ib}{{{h{Gl}}c}BdACd}{{{h{Gn}}c}BdACd}{{{h{l}}{h{fc}}}Bd{LfCj}}{{{h{l}}c}BdACd}{{{h{Aj}}c}BdACd}{{{h{B`}}c}BdACd}{{{h{Hb}}c}BdACd}{{{h{Ah}}c}BdACd}{{{h{Hd}}c}BdACd}{{{h{A`}}c}BdACd}{{{h{Hf}}c}BdACd}{{{h{Hf}}{h{fc}}}Bd{LfCj}}{{{h{{G`{c}}}}e}BdACfACd}{{{h{{G`{c}}}}{h{fe}}}Bd{}{LfCj}}{{{h{Hn}}{h{fc}}}Bd{LfCj}}{{{h{I`}}{h{fc}}}Bd{LfCj}}{{{h{I`}}c}BdACd}{{{h{Ib}}{h{fc}}}Bd{LfCj}}{{{h{Ib}}c}BdACd}{{{h{Id}}c}BdACd}{{{h{Id}}{h{fc}}}Bd{LfCj}}{{{h{If}}{h{fc}}}Bd{LfCj}}{{{h{If}}c}BdACd}{{{h{Ih}}{h{fc}}}Bd{LfCj}}{{{h{Ih}}c}BdACd}{{{h{Ij}}{h{fc}}}Bd{LfCj}}{{{h{Ij}}c}BdACd}{{{h{Il}}{h{fc}}}Bd{LfCj}}{{{h{Il}}c}BdACd}{{{h{In}}c}BdACd}{{{h{In}}{h{fc}}}Bd{LfCj}}{{{h{J`}}{h{fc}}}Bd{LfCj}}{{{h{J`}}c}BdACd}{{{h{Jb}}c}BdACd}{{{h{Jb}}{h{fc}}}Bd{LfCj}}{{{h{C`}}{h{fc}}}Bd{LfCj}}{{{h{C`}}c}BdACd}{{{h{Jd}}c}BdACd}{{{h{Jd}}{h{fc}}}Bd{LfCj}}{{{h{Cd}}{h{fc}}}Bd{LfCj}}{{{h{Cd}}c}BdACd}{{{h{Jf}}{h{fc}}}Bd{LfCj}}{{{h{Jf}}c}BdACd}{{{h{Gd}}c}BdACd}{{{h{Gd}}{h{fc}}}Bd{LfCj}}{{{h{Jh}}}{{Bd{{Bn{Bl}}}}}}{{{h{Jh}}c}BdACd}{{{h{Jj}}{h{fc}}}Bd{LfCj}}{{{h{Jj}}}{{Bd{{Bn{Bl}}{ACn{AChACjACl}}}}}}{{{h{Jj}}c}BdACd}{{{h{Jl}}c}BdACd}{{{h{Jn}}{h{fc}}}Bd{LfCj}}{{{h{Jn}}c}BdACd}{{{h{K`}}{h{fc}}}Bd{LfCj}}{{{h{K`}}c}BdACd}{{{h{b}}c}BdACd}{{{h{b}}{h{fc}}}Bd{LfCj}}{{{h{c}}{h{fe}}}{{Bd{j}}}{}{}}0000000000000000000000{{{h{c}}{h{fe}}}{{Bd{Kn}}}{}{}}0000000000000000000000``{{{Cb{Ih}}}Cd}``{{{h{fc}}{ABl{e}}}{{Bd{jAA`}}}{}ABn}000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000``{{{h{Hn}}}{{Gf{d}}}}``{{{h{{Bb{c}}}}}{{Gf{{h{Ad}}}}}Ad}{{{h{Mh}}}{{Gf{{h{Ad}}}}}}{{{h{Gb}}}{{Gf{{h{Ad}}}}}}{{{h{Ml}}}{{Gf{{h{Ad}}}}}}{{{h{f{Gj{}{{Gh{c}}}}}}{h{{L`{Bl}}}}{h{n}}{h{n}}}{{Bd{jc}}}{}}``{{}J`}{{}Gd}{{bd}b}{{bb}b}```````````````{{{h{Hd}}{h{fc}}}{{Bd{jAA`}}}AD`}{{{h{c}}}e{}{}}00000000000000000000000000000000000{{{h{c}}}Bh{}}000{{{h{{h{Hd}}}}}Bh}111111111{{{h{If}}}Mb}```{{{h{Fj}}}K`}{{{h{K`}}}d}{{{h{f{Hj{Jn}}}}c}{{Cb{Jn}}}{{Bj{{A@j{Jn}}}}}}{{{h{f{Hj{c}}}}e}{{Bd{{Cb{c}}ADb}}}ACf{{Bj{{A@j{c}}}}}}{c{{Bd{e}}}{}{}}000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000{Kn{{Bd{b}}}}{{{h{{L`{Bl}}}}}{{Bd{JhMn}}}}{{{h{{L`{Bl}}}}}{{Bd{JjMn}}}}{{{h{{L`{Bl}}}}}{{Bd{JlMn}}}}4444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444`{{{h{c}}}ADd{}}000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000````````````{{{h{Hf}}}{{Bd{jGb}}}}{{{h{{G`{c}}}}}{{Bd{jGb}}}ACf}{{{h{{G`{Jn}}}}}{{Bd{jGb}}}}`{ce{}{}}000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000```````````````````````````````````{{{h{c}}}{{h{e}}}{}{}}{{{h{fc}}}{{h{fe}}}{}{}}{{{h{f{ADf{c}}}}egikOfdm{Al{dAj}}{h{An}}Bh}{{Bd{FjMh}}}Bf{{Bj{Bh}}}{{Bj{{Bn{Bl}}}}}{{Bj{{Bn{Bl}}}}}{{Bj{Bh}}}{{Bj{Bh}}}}`{{{h{f{ADf{c}}}}egikOfdm{Al{dAj}}BhBlBl{Bn{Bl}}Bh}{{Bd{FjMh}}}Bf{{Bj{Bh}}}{{Bj{{Bn{Bl}}}}}{{Bj{{Bn{Bl}}}}}{{Bj{Bh}}}{{Bj{Bh}}}}`{{{h{fKf}}}{{Bd{jKh}}}}{Kn{{h{c}}}{}}{Kn{{h{fc}}}{}}{{{h{c}}{h{fe}}}{{Bd{{Ld{gi}}}}}{}{}{}{}}{Knj}`{cc{}}{{{h{c}}}{{Bd{A@nAA`}}}{}}{{}Kn}<{{}{{Bd{ABbABd}}}}{{{h{{ADf{c}}}}}ABfBf}{{ADh{Gf{Of}}KjLnc}{{Bd{{ADf{c}}Mh}}}Bf}{{{h{c}}A@n}{{Bd{{ABl{e}}AA`}}}{}ABn}`{h}`{{{h{fc}}{ABl{e}}}{{Bd{jAA`}}}{}ABn}`{{{h{f{ADf{c}}}}{Bn{Bl}}}{{Bd{BhMh}}}Bf}{c{{Bd{e}}}{}{}}0{{{h{c}}}ADd{}}{ce{}{}}`````{{{h{c}}}{{h{e}}}{}{}}{{{h{fc}}}{{h{fe}}}{}{}}{{{h{fKf}}}{{Bd{jKh}}}}{Kn{{h{c}}}{}}{Kn{{h{fc}}}{}}{{{h{c}}{h{fe}}}{{Bd{{Ld{gi}}}}}{}{}{}{}}{Knj}{{}ADj}{cADj{{Bj{Bh}}}}{cADj{{Bj{M`}}}}{cc{}}{{{h{c}}}{{Bd{A@nAA`}}}{}}{{}Kn}={{}{{Bd{ABbABd}}}}{{{h{c}}A@n}{{Bd{{ABl{e}}AA`}}}{}ABn}{h}7{{{h{fc}}{ABl{e}}}{{Bd{jAA`}}}{}ABn}{M`ADj}{{{Al{BhM`}}ADl}ADj}{ADj{{AAn{ADj{A@j{{AE`{ADn}}}}}}}}{c{{Bd{e}}}{}{}}0{{{h{c}}}ADd{}}>{ce{}{}}```{{Ln{h{n}}}Mb}{cJf{{Bj{Gd}}}}{{AEbe}AEb{{Bj{Mb}}}{{AEd{}{{AAl{c}}}}}}{{{h{c}}}{{h{e}}}{}{}}00{{{h{fc}}}{{h{fe}}}{}{}}00{M`Jf}{cJf{{Bj{Bh}}}}{{M`{h{fNh}}}Jf}{{{h{fKf}}}{{Bd{jKh}}}}00{Kn{{h{c}}}{}}00{Kn{{h{fc}}}{}}00{{{h{c}}{h{fe}}}{{Bd{{Ld{gi}}}}}{}{}{}{}}0{c{{Bd{AEf}}}Lb}1{c{{Bd{AEh}}}Lb}{Knj}00{{{h{Jf}}}{{Cb{C`}}}}{{{h{Jf}}}{{Cb{Ih}}}}{AEbJf}{{AEb{h{fNh}}}Jf}{{{h{AEf}}{h{fKf}}}AEj}{{{h{AEh}}{h{fKf}}}AEj}{AElJf}{cc{}}00{{AEbc}AEb{{Bj{Bh}}}}{{{h{c}}}{{Bd{A@nAA`}}}{}}00{{}Kn}00{ce{}{}}00{{}{{Bd{ABbABd}}}}004{cAEb{{Bj{Mb}}}}{{{h{c}}A@n}{{Bd{{ABl{e}}AA`}}}{}ABn}00{{dd}Jf}7{{AEbc}AEb{{AEn{n}}}}{h}00`{cJf{{Bj{Bh}}}}`{AEbJf}{{AEb{h{fNh}}}Jf}{{{h{AEf}}c}BdACd}{{{h{AEh}}c}BdACd}>{{{h{fc}}{ABl{e}}}{{Bd{jAA`}}}{}ABn}00{{c{h{fNh}}}{{Cb{Ih}}}{{Bj{Mb}}}}{{AEbd}Jf}{{AEbd{h{fNh}}}Jf}{{cd}Il{{Bj{b}}}}{{cIlIl}Ij{{Bj{b}}}}``{c{{Bd{e}}}{}{}}00000{{{h{c}}}ADd{}}00;{{cl{Bn{Mb}}{h{fNh}}}{{Cb{Ih}}}{{Bj{Mb}}}}`{ce{}{}}00{{{h{n}}}Bh}{{{h{n}}}{{AAn{AF`Bh}}}}`{{{h{c}}}{{h{e}}}{}{}}{{{h{fc}}}{{h{fe}}}{}{}}{{{h{fAFb}}cegiOfd{Gf{Bh}}AFd{h{An}}Bh}{{AFh{{Bd{Fj{AFf{Ad}}}}}}}{{Bj{Bh}}}{{Bj{{Bn{Bl}}}}}{{Bj{{Bn{Bl}}}}}{{Bj{Bh}}}}{{{h{fKf}}}{{Bd{jKh}}}}{Kn{{h{c}}}{}}{Kn{{h{fc}}}{}}{{{h{c}}{h{fe}}}{{Bd{{Ld{gi}}}}}{}{}{}{}}{Knj}{cc{}}{{{h{AFb}}}{{h{n}}}}{{{h{c}}}{{Bd{A@nAA`}}}{}}{{}Kn}>{{}{{Bd{ABbABd}}}}{{cNf}{{AFh{AFb}}}{{Bj{Bh}}}}{{{h{c}}A@n}{{Bd{{ABl{e}}AA`}}}{}ABn}{h}{{{h{fc}}{ABl{e}}}{{Bd{jAA`}}}{}ABn}{c{{Bd{e}}}{}{}}0{{{h{c}}}ADd{}}{ce{}{}}`{{{h{c}}}{{h{e}}}{}{}}{{{h{fc}}}{{h{fe}}}{}{}}{{{h{{AFj{c}}}}}{{AFj{c}}}{HhMd}}{{{h{c}}{h{fe}}}j{}{}}{{{h{c}}}j{}}{{{h{fKf}}}{{Bd{jKh}}}}{{}{{AFj{c}}}{AFlMd}}{{{h{{AFj{c}}}}}hMd}{Kn{{h{c}}}{}}{Kn{{h{fc}}}{}}{c{{Bd{{AFj{e}}}}}Lb{MdLh}}{{{h{c}}{h{fe}}}{{Bd{{Ld{gi}}}}}{}{}{}{}}{Knj}{{{h{{AFj{c}}}}{h{{AFj{c}}}}}Ab{LlMd}}{{{h{c}}{h{e}}}Ab{}{}}0000{{{h{{AFj{c}}}}{h{fKf}}}{{Bd{jKh}}}Md}{cc{}}{{{h{c}}}{{Bd{A@nAA`}}}{}}{{{h{c}}{h{e}}}Of{AAdCj}AAf}{{{h{{AFj{c}}}}{h{fe}}}j{AAdMd}AAh}{{}Kn}{ce{}{}}{{{AFj{c}}}{{Bn{c}}}Md}{{}{{Bd{ABbABd}}}}{{{Bn{c}}}{{Bd{{AFj{c}}AFn}}}Md}{{{h{c}}A@n}{{Bd{{ABl{e}}AA`}}}{}ABn}{h}{{{h{{AFj{c}}}}e}Bd{MdACf}ACd}{{{h{fc}}{ABl{e}}}{{Bd{jAA`}}}{}ABn}{{{h{c}}}e{}{}}{c{{Bd{e}}}{}{}}0{{{h{c}}}ADd{}}:```````{cMb{{Bj{{A@j{{L`{Mb}}}}}}}}{eMb{{Bj{Mb}}}{{AEd{}{{AAl{c}}}}}}{{{h{Mb}}}{{Gf{{h{{L`{Mb}}}}}}}}{{{h{Mb}}}{{Gf{Ab}}}}{{{h{Mb}}}{{Gf{Oh}}}}{{{h{Mb}}}{{Gf{Od}}}}{{{h{Mb}}}{{Gf{j}}}}{{{h{Mb}}}{{Gf{{h{AG`}}}}}}{{{h{Mb}}}{{Gf{{h{{AGb{{A@j{n}}Mb}}}}}}}}{{{h{Mb}}}{{Gf{{h{{A@j{n}}}}}}}}{{{h{Mb}}}{{Gf{Of}}}}{{{h{c}}}{{h{e}}}{}{}}{{{h{fc}}}{{h{fe}}}{}{}}{{{h{Mb}}}Mb}{{{h{c}}{h{fe}}}j{}{}}{{{h{c}}}j{}}{{{h{fKf}}}{{Bd{jKh}}}}{{}Mb}{Kn{{h{c}}}{}}{Kn{{h{fc}}}{}}{c{{Bd{Mb}}}Lb}{{{h{c}}{h{fe}}}{{Bd{{Ld{gi}}}}}{}{}{}{}}{Knj}{{{h{{h{Mb}}}}{h{Ob}}}Ab}{{{h{{h{Mb}}}}{h{Ln}}}Ab}{{{h{Mb}}{h{Kn}}}Ab}{{{h{{h{Mb}}}}{h{Nl}}}Ab}{{{h{Mb}}{h{Nl}}}Ab}{{{h{{h{Mb}}}}{h{Oh}}}Ab}{{{h{Mb}}{h{Of}}}Ab}{{{h{Mb}}{h{Nn}}}Ab}{{{h{{h{Mb}}}}{h{Kn}}}Ab}{{{h{Mb}}{h{d}}}Ab}{{{h{{h{Mb}}}}{h{Ab}}}Ab}{{{h{{h{Mb}}}}{h{d}}}Ab}{{{h{Mb}}{h{Ab}}}Ab}{{{h{Mb}}{h{O`}}}Ab}{{{h{Mb}}{h{{h{n}}}}}Ab}{{{h{Mb}}{h{n}}}Ab}{{{h{Mb}}{h{AGd}}}Ab}{{{h{Mb}}{h{Ln}}}Ab}{{{h{Mb}}{h{Mb}}}Ab}{{{h{Mb}}{h{Bl}}}Ab}{{{h{Mb}}{h{Od}}}Ab}{{{h{Mb}}{h{Ob}}}Ab}{{{h{Mb}}{h{Bh}}}Ab}{{{h{{h{Mb}}}}{h{Of}}}Ab}{{{h{{h{Mb}}}}{h{Nn}}}Ab}{{{h{{h{Mb}}}}{h{Bl}}}Ab}{{{h{{h{Mb}}}}{h{Od}}}Ab}{{{h{Mb}}{h{Oh}}}Ab}{{{h{{h{Mb}}}}{h{AGd}}}Ab}{{{h{{h{Mb}}}}{h{O`}}}Ab}{{{h{c}}{h{e}}}Ab{}{}}0000{{{h{Mb}}{h{fKf}}}{{Bd{jKh}}}}0{{{Al{ce}}}Mb{{Bj{{A@j{n}}}}}{{Bj{Mb}}}}{{{Gf{c}}}Mb{{Bj{Mb}}}}{{{Bn{c}}}Mb{{Bj{Mb}}}}{{{h{n}}}Mb}{OfMb}{NlMb}{OhMb}{KnMb}{{{h{{L`{c}}}}}Mb{Hh{Bj{Mb}}}}{{{A@j{n}}}Mb}{{{ABj{n}}}Mb}{AGdMb}{O`Mb}{{{AGb{{A@j{n}}Mb}}}Mb}{NnMb}{dMb}{BlMb}{OdMb}{ObMb}{AbMb}{jMb}{cc{}}{AGfMb}{LnMb}{AG`Mb}{BhMb}{{{h{AGh}}}Mb}{M`Mb}{{{h{M`}}}Mb}{gMb{{Bj{{A@j{n}}}}}{{Bj{Mb}}}{{AEd{}{{AAl{{AAn{ce}}}}}}}}{eMb{{Bj{Mb}}}{{AEd{}{{AAl{c}}}}}}{{{h{Mb}}c}{{Gf{{h{Mb}}}}}AGj}{{{h{c}}}{{Bd{A@nAA`}}}{}}{{{h{Mb}}c}{{h{Mb}}}AGj}{{}Kn}{ce{}{}}{{{h{Mb}}}Ab}00000000`{{}{{Bd{ABbABd}}}}{{{h{c}}A@n}{{Bd{{ABl{e}}AA`}}}{}ABn}{cMb{{Bj{{AGb{{A@j{n}}Mb}}}}}}:{{{h{Mb}}{h{n}}}{{Gf{{h{Mb}}}}}}{h}{{{h{Mb}}c}BdACd}{{{h{fc}}{ABl{e}}}{{Bd{jAA`}}}{}ABn}{cMb{{Bj{{A@j{n}}}}}}{{{h{fMb}}}Mb}{{{h{c}}}e{}{}}{{{h{c}}}Bh{}}{c{{Bd{e}}}{}{}}0{{{h{c}}}ADd{}}>`{{{h{c}}}{{h{e}}}{}{}}{{{h{fc}}}{{h{fe}}}{}{}}`{{{h{Fj}}}Fj}{{{h{c}}{h{fe}}}j{}{}}{{{h{c}}}j{}}`{{{h{fKf}}}{{Bd{jKh}}}}{Kn{{h{c}}}{}}{Kn{{h{fc}}}{}}{c{{Bd{Fj}}}Lb}{{{h{c}}{h{fe}}}{{Bd{{Ld{gi}}}}}{}{}{}{}}{Knj}{{{h{Fj}}{h{Fj}}}Ab}{{{h{c}}{h{e}}}Ab{}{}}0000`{{{h{Fj}}{h{fKf}}}{{Bd{jKh}}}}{cc{}}{AGl{{Bd{FjMj}}}}{{{h{c}}}{{Bd{A@nAA`}}}{}}{{}Kn}{ce{}{}}{{}{{Bd{ABbABd}}}}{{{h{c}}A@n}{{Bd{{ABl{e}}AA`}}}{}ABn}`{h}`{{{h{Fj}}c}BdACd}{{{h{fc}}{ABl{e}}}{{Bd{jAA`}}}{}ABn}`{{{h{c}}}e{}{}}{c{{Bd{e}}}{}{}}0{{{h{c}}}ADd{}}8`````````{{{h{c}}}{{h{e}}}{}{}}00{{{h{fc}}}{{h{fe}}}{}{}}00{{{h{fAGn}}cegiOfd{Gf{Bh}}AFd{h{An}}Bh}{{AFh{{Bd{Fj{AFf{Ad}}}}}}}{{Bj{Bh}}}{{Bj{{Bn{Bl}}}}}{{Bj{{Bn{Bl}}}}}{{Bj{Bh}}}}{{{h{f{AH`{c}}}}egiAHb}{{Bd{FjBh}}}AGn{{Bj{Bh}}}{{Bj{{Bn{Bl}}}}}{{Bj{{Bn{Bl}}}}}}`{{{h{f{AH`{c}}}}egikOfd{Gf{Bh}}AFdm}{{Bd{Fj{AFf{Ad}}}}}AGn{{Bj{Bh}}}{{Bj{{Bn{Bl}}}}}{{Bj{{Bn{Bl}}}}}{{Bj{Bh}}}{{Bj{Bh}}}}{{{h{AHb}}}AHb}{{{h{Nf}}}Nf}{{{h{c}}{h{fe}}}j{}{}}0{{{h{c}}}j{}}00{{ADjc}AH`{{Bj{Bh}}}}{{cADjNf}{{AH`{e}}}{{Bj{An}}}AGn}{{ADjc}{{AH`{e}}}{{Bj{Bh}}}AGn}{{{h{fKf}}}{{Bd{jKh}}}}00{{}AHb}{{}Nf}{Kn{{h{c}}}{}}00{Kn{{h{fc}}}{}}00{{{h{c}}{h{fe}}}{{Bd{{Ld{gi}}}}}{}{}{}{}}00{Knj}00{{{h{AHb}}{h{fKf}}}AEj}{{{h{Nf}}{h{fKf}}}AEj}{cc{}}00{cAHb{{Bj{Bh}}}}{OfAHb}{dAHb}{{{h{AGn}}}{{h{n}}}}{{{h{c}}}{{Bd{A@nAA`}}}{}}00`{{}Kn}00`{ce{}{}}00`{{}{{Bd{ABbABd}}}}00{{cNf}{{AFh{AGn}}}{{Bj{Bh}}}}{{cOfde}AHb{{Bj{Bh}}}{{Bj{Bh}}}}{{OfOfOfAb}Nf}{{{h{c}}A@n}{{Bd{{ABl{e}}AA`}}}{}ABn}00{{}Nf}```{h}00`{{{h{fc}}{ABl{e}}}{{Bd{jAA`}}}{}ABn}00`{{{h{c}}}e{}{}}0{c{{Bd{e}}}{}{}}00000`{{{h{c}}}ADd{}}00;;;{{AHbc}AHb{{Bj{Bh}}}}```````{{{h{c}}}{{h{Ad}}}{}}{{{h{c}}}{{h{e}}}{}{}}0{{{h{fc}}}{{h{fe}}}{}{}}0{{{h{fKf}}}{{Bd{jKh}}}}0{Kn{{h{c}}}{}}0{Kn{{h{fc}}}{}}0{{{h{c}}{h{fe}}}{{Bd{{Ld{gi}}}}}{}{}{}{}}0{Knj}0{{{h{AHd}}{h{fKf}}}{{Bd{jKh}}}}0{cc{}}0{{{h{c}}}{{Bd{A@nAA`}}}{}}0{{}Kn}0{ce{}{}}0{{}{{Bd{ABbABd}}}}0{{AHfAHf}{{Bd{A@bAHd}}}}{{{h{Jj}}{h{n}}}{{Bd{AHfAHd}}}}{{{h{c}}A@n}{{Bd{{ABl{e}}AA`}}}{}ABn}0{h}0{{{h{fc}}{ABl{e}}}{{Bd{jAA`}}}{}ABn}0{{{h{AHd}}}{{Gf{{h{Ad}}}}}}{{{h{c}}}Bh{}}{c{{Bd{e}}}{}{}}000{{{h{c}}}ADd{}}0{{{h{AHf}}}{{Bd{jAHd}}}};;``````````{{{h{c}}}{{h{e}}}{}{}}0{{{h{fc}}}{{h{fe}}}{}{}}0{{{h{fAHh}}cegiOfd{Gf{Bh}}AFd{h{An}}Bh}{{AFh{{Bd{Fj{AFf{Ad}}}}}}}{{Bj{Bh}}}{{Bj{{Bn{Bl}}}}}{{Bj{{Bn{Bl}}}}}{{Bj{Bh}}}}{{{h{fAHj}}cegiOfd{Gf{Bh}}AFd{h{An}}Bh}{{AFh{{Bd{Fj{AFf{Ad}}}}}}}{{Bj{Bh}}}{{Bj{{Bn{Bl}}}}}{{Bj{{Bn{Bl}}}}}{{Bj{Bh}}}}{{{h{fKf}}}{{Bd{jKh}}}}0{Kn{{h{c}}}{}}0{Kn{{h{fc}}}{}}0{{{h{c}}{h{fe}}}{{Bd{{Ld{gi}}}}}{}{}{}{}}0{Knj}0{cc{}}0{{{h{AHh}}}{{h{n}}}}{{{h{AHj}}}{{h{n}}}}{{{h{c}}}{{Bd{A@nAA`}}}{}}0{{}Kn}0{ce{}{}}0{{}{{Bd{ABbABd}}}}0{{cNf}{{AFh{AHh}}}{{Bj{Bh}}}}{{cNf}{{AFh{AHj}}}{{Bj{Bh}}}}{{{h{c}}A@n}{{Bd{{ABl{e}}AA`}}}{}ABn}0{h}0{{{h{fc}}{ABl{e}}}{{Bd{jAA`}}}{}ABn}0{c{{Bd{e}}}{}{}}000{{{h{c}}}ADd{}}088","D":"DC`","p":[[5,"TracePos",0,3557],[1,"u32"],[0,"mut"],[1,"reference"],[1,"unit"],[5,"SecurityTetraplet",0,3558],[1,"str"],[5,"SoftLimitsTriggering",0,3559],[1,"bool"],[10,"Error",3560],[5,"AVM",0,3561],[5,"ParticleParameters",0,3562],[5,"CallServiceResult",0,3563],[5,"HashMap",3564],[6,"KeyPair",3565],[5,"AVMOutcome",0,3566],[6,"AVMError",0,3567],[6,"Result",3568],[10,"WasmBackend",3569],[5,"String",3570],[10,"Into",3571],[1,"u8"],[5,"Vec",3572],[5,"CanonResultCidAggregate",0,3573],[5,"CID",3574],[6,"Provenance",0,3573],[5,"ArchivedCidInfo",0,3575],[5,"StructCheckError",3576],[10,"Sized",3577],[5,"ArchivedCidStore",0,3578],[5,"TupleStructCheckError",3576],[5,"ArchivedParResult",0,3573],[6,"ArchivedSender",0,3573],[6,"EnumCheckError",3576],[6,"ArchivedCallResult",0,3573],[6,"ArchivedValueRef",0,3573],[5,"ArchivedCallServiceFailed",0,3573],[5,"ArchivedServiceResultCidAggregate",0,3573],[5,"ArchivedFoldSubTraceLore",0,3573],[5,"ArchivedSubTraceDesc",0,3573],[5,"ArchivedFoldResult",0,3573],[5,"ArchivedApResult",0,3573],[6,"ArchivedCanonResult",0,3573],[5,"ArchivedCanonResultCidAggregate",0,3573],[5,"ArchivedCanonCidAggregate",0,3573],[6,"ArchivedProvenance",0,3573],[6,"ArchivedExecutedState",0,3573],[5,"ArchivedGenerationIdx",0,3579],[5,"ArchivedInterpreterData",0,3580],[5,"ArchivedRawValue",0,3581],[5,"ArchivedExecutionTrace",0,3582],[5,"ArchivedTracePos",0,3557],[5,"RawAVMOutcome",3306,3583],[10,"ToErrorCode",3584],[10,"ToString",3570],[5,"CidStore",0,3578],[6,"CidStoreVerificationError",0,3578],[5,"GenerationIdx",0,3579],[6,"Option",3585],[17,"Error"],[10,"DataStore",0,3586],[5,"AnomalyData",0,3586],[5,"CallRequestParams",0,3587],[5,"AquaVMRuntimeLimits",0,3588],[5,"ErrorAVMOutcome",0,3566],[6,"IType",0,3589],[5,"CidInfo",0,3575],[10,"Clone",3590],[5,"CidTracker",0,3578],[6,"IValue",0,3591],[5,"ParResult",0,3573],[6,"Sender",0,3573],[6,"CallResult",0,3573],[6,"ValueRef",0,3573],[5,"CallServiceFailed",0,3573],[5,"ServiceResultCidAggregate",0,3573],[5,"FoldSubTraceLore",0,3573],[5,"SubTraceDesc",0,3573],[5,"FoldResult",0,3573],[5,"ApResult",0,3573],[6,"CanonResult",0,3573],[5,"CanonCidAggregate",0,3573],[6,"ExecutedState",0,3573],[5,"InterpreterDataEnvelope",0,3580],[5,"InterpreterData",0,3580],[5,"Versions",0,3580],[5,"RawValue",0,3581],[5,"ExecutionTrace",0,3582],[6,"Ordering",3592],[5,"Version",3593],[5,"Formatter",3594],[5,"Error",3594],[5,"AVMRuntimeLimits",0,3588],[5,"InterpreterDataEnvelopeRepr",0,3595],[1,"usize"],[1,"slice"],[10,"Deserializer",3596],[5,"With",3597],[10,"Fallible",3598],[10,"Deserialize",3596],[5,"Duration",3599],[10,"PartialEq",3592],[1,"i32"],[6,"Value",3600],[6,"JValue",3177,3601],[10,"Debug",3594],[10,"Display",3594],[6,"RunnerError",0,3567],[6,"CallSeDeErrors",0,3602],[6,"HostImportError",0,3603],[6,"DataDeserializationError",0,3580],[5,"ResolvedTriplet",3604],[1,"never"],[6,"MarineError",3605],[5,"TestInitParameters",3346],[5,"ExecutionCidState",3606],[6,"CidVerificationError",3607],[1,"f32"],[1,"i8"],[1,"u16"],[1,"i16"],[1,"i64"],[1,"u64"],[1,"f64"],[6,"LoError",3608],[6,"RecordResolvableError",3609],[5,"FromUtf8Error",3570],[6,"LiError",3610],[5,"SignatureStore",3611],[5,"OwnedFd",3612],[10,"IntoFilelike",3613],[10,"IntoSocketlike",3613],[5,"Rc",3614],[5,"TiSlice",3615],[5,"FdFlags",3616],[5,"Error",3617],[5,"RmpSerdeFormat",3618],[10,"Hash",3619],[10,"BuildHasher",3619],[10,"Hasher",3619],[5,"CallServiceResult",3620],[17,"Item"],[1,"tuple"],[10,"Iterator",3621],[5,"Layout",3622],[5,"LayoutError",3622],[5,"AVMMemoryStats",0,3588],[5,"AVMConfig",0,3623],[6,"Cow",3624],[5,"SetFdFlags",3616],[10,"AsFilelike",3613],[5,"Parser",3625],[5,"Error",3626],[10,"Serializer",3627],[10,"Serialize",3627],[6,"Infallible",3571],[6,"AllocScratchError",3628],[6,"SharedSerializeMapError",3628],[6,"CompositeSerializerError",3629],[10,"Write",3630],[6,"CidCalculationError",3574],[5,"TypeId",3631],[5,"AVMRunner",2950,3588],[5,"PathBuf",3632],[8,"CallServiceClosure",0],[6,"VariableOptionSource",2982],[8,"ArgTetraplets",2982],[5,"RefCell",3633],[5,"ExecutedCallBuilder",3014],[10,"IntoIterator",3634],[5,"ValueAggregateAlike",3014],[5,"CanonResultAlike",3014],[8,"Result",3594],[8,"FoldLore",0,3573],[10,"AsRef",3571],[5,"KeyPair",3635],[5,"NativeAirRunner",3115],[8,"CallResults",0,3563],[5,"Box",3636],[8,"LocalBoxFuture",3637],[5,"NEVec",3138,3638],[10,"Default",3639],[5,"EmptyVec",3638],[5,"Number",3640],[5,"BTreeMap",3641],[1,"isize"],[6,"StreamMapKey",3642],[6,"Number",3643],[10,"Index",3644],[5,"InterpreterOutcome",3559],[10,"AirRunner",3346],[5,"TestRunner",3346],[5,"TestRunParameters",3346],[6,"DataVerifierError",3450,3645],[5,"DataVerifier",3450,3646],[5,"WasmAirRunner",3511],[5,"ReleaseWasmAirRunner",3511],[6,"ExecutedStateResolver",0],[6,"ProvenanceResolver",0],[8,"AVMResult",0],[8,"RunnerResult",0],[6,"CallResultResolver",0],[6,"CanonResultResolver",0],[6,"SenderResolver",0],[6,"ValueRefResolver",0],[8,"HostImportDescriptor",0],[5,"CidInfoResolver",0],[5,"CidStoreResolver",0],[5,"ParResultResolver",0],[5,"CallServiceFailedResolver",0],[5,"ServiceResultCidAggregateResolver",0],[5,"FoldSubTraceLoreResolver",0],[5,"SubTraceDescResolver",0],[5,"FoldResultResolver",0],[5,"ApResultResolver",0],[5,"CanonResultCidAggregateResolver",0],[5,"CanonCidAggregateResolver",0],[5,"GenerationIdxResolver",0],[5,"InterpreterDataResolver",0],[5,"RawValueResolver",0],[5,"ExecutionTraceResolver",0],[5,"TracePosResolver",0],[15,"ServiceResult",2918],[15,"Canon",2918],[15,"PeerIdWithCallId",2920],[15,"Stream",2922],[15,"CallParamsArgsDeFailed",2924],[15,"CallParamsTetrapletsDeFailed",2924],[15,"CallResultsSeFailed",2924],[15,"CallRequestsDeError",2924],[15,"MissingReference",2932],[15,"ServiceResult",2935],[15,"Canon",2935],[15,"ServiceResult",2937],[15,"Canon",2937],[15,"InvalidAIRPath",2939],[15,"PeerIdWithCallId",2942],[15,"PeerIdWithCallId",2944],[15,"Stream",2946],[15,"Stream",2948],[15,"SignatureMismatch",3503],[15,"MalformedKey",3503],[15,"MergeMismatch",3503]],"r":[[0,3561],[1,3623],[2,3647],[3,3567],[4,3588],[5,3566],[6,3647],[7,3588],[8,3586],[13,3573],[14,3573],[15,3588],[16,3573],[17,3573],[18,3573],[19,3573],[20,3573],[21,3573],[22,3575],[23,3578],[24,3573],[25,3582],[26,3573],[27,3573],[28,3579],[29,3580],[30,3573],[31,3573],[32,3581],[33,3573],[34,3573],[35,3573],[36,3557],[37,3573],[45,3563],[51,3587],[52,3587],[54,3573],[55,3573],[56,3563],[58,3602],[61,3573],[62,3573],[63,3563],[70,3573],[71,3573],[72,3573],[73,3573],[74,3573],[75,3573],[76,3575],[77,3575],[78,3578],[79,3578],[80,3578],[81,3578],[84,3580],[85,3586],[91,3566],[98,3573],[99,3573],[100,3582],[101,3582],[112,3573],[113,3573],[114,3573],[115,3573],[116,3573],[117,3579],[118,3579],[119,3648],[120,3648],[121,3603],[126,3589],[127,3591],[129,3580],[130,3580],[131,3595],[132,3595],[133,3580],[153,3573],[154,3573],[155,3562],[162,3557],[163,3573],[164,3573],[165,3583],[166,3581],[167,3581],[177,3567],[179,3647],[191,3558],[192,3573],[193,3573],[197,3573],[198,3573],[199,3559],[205,3573],[206,3573],[207,3582],[208,3557],[209,3557],[223,3573],[224,3573],[225,3580],[252,3647],[608,3649],[1836,3563],[1951,3650],[2180,3602],[2821,3580],[2950,3588],[2951,3583],[3138,3638],[3179,3601],[3289,3651],[3306,3583],[3348,3115],[3349,3511],[3353,3511],[3450,3646],[3451,3645]],"b":[[227,"impl-Add%3Cu32%3E-for-TracePos"],[228,"impl-Add-for-TracePos"],[229,"impl-AddAssign%3Cu32%3E-for-TracePos"],[230,"impl-AddAssign-for-TracePos"],[909,"impl-Deserialize%3C\'de%3E-for-SecurityTetraplet"],[910,"impl-Deserialize%3CSecurityTetraplet,+__D%3E-for-%3CSecurityTetraplet+as+Archive%3E::Archived"],[931,"impl-Deserialize%3C\'de%3E-for-CidInfo"],[932,"impl-Deserialize%3CCidInfo,+__D%3E-for-%3CCidInfo+as+Archive%3E::Archived"],[936,"impl-Deserialize%3C\'de%3E-for-CidStore%3CVal%3E"],[937,"impl-Deserialize%3CCidStore%3CVal%3E,+__D%3E-for-%3CCidStore%3CVal%3E+as+Archive%3E::Archived"],[949,"impl-Deserialize%3CSender,+__D%3E-for-%3CSender+as+Archive%3E::Archived"],[950,"impl-Deserialize%3C\'de%3E-for-Sender"],[955,"impl-Deserialize%3C\'de%3E-for-CallResult"],[956,"impl-Deserialize%3CCallResult,+__D%3E-for-%3CCallResult+as+Archive%3E::Archived"],[959,"impl-Deserialize%3CValueRef,+__D%3E-for-%3CValueRef+as+Archive%3E::Archived"],[961,"impl-Deserialize%3C\'de%3E-for-ValueRef"],[964,"impl-Deserialize%3C\'de%3E-for-CallServiceFailed"],[966,"impl-Deserialize%3CCallServiceFailed,+__D%3E-for-%3CCallServiceFailed+as+Archive%3E::Archived"],[969,"impl-Deserialize%3C\'de%3E-for-ServiceResultCidAggregate"],[970,"impl-Deserialize%3CServiceResultCidAggregate,+__D%3E-for-%3CServiceResultCidAggregate+as+Archive%3E::Archived"],[974,"impl-Deserialize%3C\'de%3E-for-FoldSubTraceLore"],[976,"impl-Deserialize%3CFoldSubTraceLore,+__D%3E-for-%3CFoldSubTraceLore+as+Archive%3E::Archived"],[980,"impl-Deserialize%3CSubTraceDesc,+__D%3E-for-%3CSubTraceDesc+as+Archive%3E::Archived"],[981,"impl-Deserialize%3C\'de%3E-for-SubTraceDesc"],[985,"impl-Deserialize%3C\'de%3E-for-FoldResult"],[986,"impl-Deserialize%3CFoldResult,+__D%3E-for-%3CFoldResult+as+Archive%3E::Archived"],[990,"impl-Deserialize%3C\'de%3E-for-ApResult"],[991,"impl-Deserialize%3CApResult,+__D%3E-for-%3CApResult+as+Archive%3E::Archived"],[995,"impl-Deserialize%3C\'de%3E-for-CanonResult"],[996,"impl-Deserialize%3CCanonResult,+__D%3E-for-%3CCanonResult+as+Archive%3E::Archived"],[999,"impl-Deserialize%3CCanonResultCidAggregate,+__D%3E-for-%3CCanonResultCidAggregate+as+Archive%3E::Archived"],[1001,"impl-Deserialize%3C\'de%3E-for-CanonResultCidAggregate"],[1005,"impl-Deserialize%3CCanonCidAggregate,+__D%3E-for-%3CCanonCidAggregate+as+Archive%3E::Archived"],[1006,"impl-Deserialize%3C\'de%3E-for-CanonCidAggregate"],[1009,"impl-Deserialize%3CProvenance,+__D%3E-for-%3CProvenance+as+Archive%3E::Archived"],[1011,"impl-Deserialize%3C\'de%3E-for-Provenance"],[1014,"impl-Deserialize%3CExecutedState,+__D%3E-for-%3CExecutedState+as+Archive%3E::Archived"],[1015,"impl-Deserialize%3C\'de%3E-for-ExecutedState"],[1019,"impl-Deserialize%3C\'de%3E-for-GenerationIdx"],[1020,"impl-Deserialize%3CGenerationIdx,+__D%3E-for-%3CGenerationIdx+as+Archive%3E::Archived"],[1029,"impl-Deserialize%3C\'de%3E-for-InterpreterData"],[1030,"impl-Deserialize%3CInterpreterData,+__D%3E-for-%3CInterpreterData+as+Archive%3E::Archived"],[1036,"impl-Deserialize%3CRawValue,+__D%3E-for-%3CRawValue+as+Archive%3E::Archived"],[1038,"impl-Deserialize%3C\'de%3E-for-RawValue"],[1041,"impl-Deserialize%3C\'de%3E-for-ExecutionTrace"],[1042,"impl-Deserialize%3CExecutionTrace,+__D%3E-for-%3CExecutionTrace+as+Archive%3E::Archived"],[1047,"impl-Deserialize%3C\'de%3E-for-TracePos"],[1048,"impl-Deserialize%3CTracePos,+__D%3E-for-%3CTracePos+as+Archive%3E::Archived"],[1168,"impl-PartialEq%3Cusize%3E-for-GenerationIdx"],[1169,"impl-PartialEq-for-GenerationIdx"],[1171,"impl-PartialEq%3CVec%3CExecutedState%3E%3E-for-ExecutionTrace"],[1172,"impl-PartialEq-for-ExecutionTrace"],[1336,"impl-Debug-for-SecurityTetraplet"],[1337,"impl-Display-for-SecurityTetraplet"],[1338,"impl-Display-for-CallServiceResult"],[1339,"impl-Debug-for-CallServiceResult"],[1340,"impl-Debug-for-AVMError%3CE%3E"],[1341,"impl-Display-for-AVMError%3CE%3E"],[1342,"impl-Display-for-RunnerError"],[1343,"impl-Debug-for-RunnerError"],[1350,"impl-Debug-for-CallSeDeErrors"],[1351,"impl-Display-for-CallSeDeErrors"],[1354,"impl-Display-for-CidStoreVerificationError"],[1355,"impl-Debug-for-CidStoreVerificationError"],[1358,"impl-Debug-for-HostImportError"],[1359,"impl-Display-for-HostImportError"],[1361,"impl-Display-for-Sender"],[1362,"impl-Debug-for-Sender"],[1364,"impl-Display-for-ValueRef"],[1365,"impl-Debug-for-ValueRef"],[1376,"impl-Display-for-ExecutedState"],[1377,"impl-Debug-for-ExecutedState"],[1378,"impl-Display-for-GenerationIdx"],[1379,"impl-Debug-for-GenerationIdx"],[1381,"impl-Debug-for-DataDeserializationError"],[1382,"impl-Display-for-DataDeserializationError"],[1388,"impl-Display-for-TracePos"],[1389,"impl-Debug-for-TracePos"],[1401,"impl-From%3CCallSeDeErrors%3E-for-RunnerError"],[1403,"impl-From%3CMarineError%3E-for-RunnerError"],[1404,"impl-From%3CAVMRuntimeLimits%3E-for-AquaVMRuntimeLimits"],[1405,"impl-From%3CTestInitParameters%3E-for-AquaVMRuntimeLimits"],[1428,"impl-From%3CVec%3Cu8%3E%3E-for-IValue"],[1429,"impl-From%3Ci32%3E-for-IValue"],[1431,"impl-From%3Cf32%3E-for-IValue"],[1432,"impl-From%3Cu32%3E-for-IValue"],[1433,"impl-From%3Ci8%3E-for-IValue"],[1434,"impl-From%3Cu16%3E-for-IValue"],[1435,"impl-From%3Ci16%3E-for-IValue"],[1436,"impl-From%3CString%3E-for-IValue"],[1437,"impl-From%3Ci64%3E-for-IValue"],[1438,"impl-From%3Cu8%3E-for-IValue"],[1439,"impl-From%3Cu64%3E-for-IValue"],[1440,"impl-From%3Cf64%3E-for-IValue"],[1441,"impl-From%3CLoError%3E-for-HostImportError"],[1442,"impl-From%3CRecordResolvableError%3E-for-HostImportError"],[1444,"impl-From%3CFromUtf8Error%3E-for-HostImportError"],[1445,"impl-From%3CLiError%3E-for-HostImportError"],[2070,"impl-PartialOrd%3Cusize%3E-for-GenerationIdx"],[2071,"impl-PartialOrd-for-GenerationIdx"],[2245,"impl-Serialize%3C__S%3E-for-SecurityTetraplet"],[2246,"impl-Serialize-for-SecurityTetraplet"],[2253,"impl-Serialize-for-CidInfo"],[2254,"impl-Serialize%3C__S%3E-for-CidInfo"],[2255,"impl-Serialize-for-CidStore%3CVal%3E"],[2256,"impl-Serialize%3C__S%3E-for-CidStore%3CVal%3E"],[2258,"impl-Serialize%3C__S%3E-for-Sender"],[2259,"impl-Serialize-for-Sender"],[2260,"impl-Serialize%3C__S%3E-for-CallResult"],[2261,"impl-Serialize-for-CallResult"],[2262,"impl-Serialize-for-ValueRef"],[2263,"impl-Serialize%3C__S%3E-for-ValueRef"],[2264,"impl-Serialize%3C__S%3E-for-CallServiceFailed"],[2265,"impl-Serialize-for-CallServiceFailed"],[2266,"impl-Serialize%3C__S%3E-for-ServiceResultCidAggregate"],[2267,"impl-Serialize-for-ServiceResultCidAggregate"],[2268,"impl-Serialize%3C__S%3E-for-FoldSubTraceLore"],[2269,"impl-Serialize-for-FoldSubTraceLore"],[2270,"impl-Serialize%3C__S%3E-for-SubTraceDesc"],[2271,"impl-Serialize-for-SubTraceDesc"],[2272,"impl-Serialize-for-FoldResult"],[2273,"impl-Serialize%3C__S%3E-for-FoldResult"],[2274,"impl-Serialize%3C__S%3E-for-ApResult"],[2275,"impl-Serialize-for-ApResult"],[2276,"impl-Serialize-for-CanonResult"],[2277,"impl-Serialize%3C__S%3E-for-CanonResult"],[2278,"impl-Serialize%3C__S%3E-for-CanonResultCidAggregate"],[2279,"impl-Serialize-for-CanonResultCidAggregate"],[2280,"impl-Serialize-for-CanonCidAggregate"],[2281,"impl-Serialize%3C__S%3E-for-CanonCidAggregate"],[2282,"impl-Serialize%3C__S%3E-for-Provenance"],[2283,"impl-Serialize-for-Provenance"],[2284,"impl-Serialize%3C__S%3E-for-ExecutedState"],[2285,"impl-Serialize-for-ExecutedState"],[2286,"impl-Serialize-for-GenerationIdx"],[2287,"impl-Serialize%3C__S%3E-for-GenerationIdx"],[2288,"impl-InterpreterDataEnvelope%3C\'_%3E"],[2289,"impl-Serialize-for-InterpreterDataEnvelope%3C\'a%3E"],[2290,"impl-Serialize%3C__S%3E-for-InterpreterData"],[2291,"impl-InterpreterData"],[2292,"impl-Serialize-for-InterpreterData"],[2294,"impl-Serialize%3C__S%3E-for-RawValue"],[2295,"impl-Serialize-for-RawValue"],[2296,"impl-Serialize%3C__S%3E-for-ExecutionTrace"],[2297,"impl-Serialize-for-ExecutionTrace"],[2298,"impl-Serialize-for-TracePos"],[2299,"impl-Serialize%3C__S%3E-for-TracePos"],[2456,"impl-Sub%3Cu32%3E-for-TracePos"],[2457,"impl-Sub-for-TracePos"],[3207,"impl-PartialEq%3Ci16%3E-for-%26JValue"],[3208,"impl-PartialEq%3Ci32%3E-for-%26JValue"],[3209,"impl-PartialEq%3Cusize%3E-for-JValue"],[3210,"impl-PartialEq%3Cf32%3E-for-%26JValue"],[3211,"impl-PartialEq%3Cf32%3E-for-JValue"],[3212,"impl-PartialEq%3Cf64%3E-for-%26JValue"],[3213,"impl-PartialEq%3Cu64%3E-for-JValue"],[3214,"impl-PartialEq%3Ci8%3E-for-JValue"],[3215,"impl-PartialEq%3Cusize%3E-for-%26JValue"],[3216,"impl-PartialEq%3Cu32%3E-for-JValue"],[3217,"impl-PartialEq%3Cbool%3E-for-%26JValue"],[3218,"impl-PartialEq%3Cu32%3E-for-%26JValue"],[3219,"impl-PartialEq%3Cbool%3E-for-JValue"],[3220,"impl-PartialEq%3Cu16%3E-for-JValue"],[3221,"impl-PartialEq%3C%26str%3E-for-JValue"],[3222,"impl-PartialEq%3Cstr%3E-for-JValue"],[3223,"impl-PartialEq%3Cisize%3E-for-JValue"],[3224,"impl-PartialEq%3Ci32%3E-for-JValue"],[3225,"impl-PartialEq-for-JValue"],[3226,"impl-PartialEq%3Cu8%3E-for-JValue"],[3227,"impl-PartialEq%3Ci64%3E-for-JValue"],[3228,"impl-PartialEq%3Ci16%3E-for-JValue"],[3229,"impl-PartialEq%3CString%3E-for-JValue"],[3230,"impl-PartialEq%3Cu64%3E-for-%26JValue"],[3231,"impl-PartialEq%3Ci8%3E-for-%26JValue"],[3232,"impl-PartialEq%3Cu8%3E-for-%26JValue"],[3233,"impl-PartialEq%3Ci64%3E-for-%26JValue"],[3234,"impl-PartialEq%3Cf64%3E-for-JValue"],[3235,"impl-PartialEq%3Cisize%3E-for-%26JValue"],[3236,"impl-PartialEq%3Cu16%3E-for-%26JValue"],[3242,"impl-Display-for-JValue"],[3243,"impl-Debug-for-JValue"],[3244,"impl-From%3CHashMap%3CK,+V%3E%3E-for-JValue"],[3245,"impl-From%3COption%3CT%3E%3E-for-JValue"],[3246,"impl-From%3CVec%3CT%3E%3E-for-JValue"],[3247,"impl-From%3C%26str%3E-for-JValue"],[3248,"impl-From%3Cu64%3E-for-JValue"],[3249,"impl-From%3Cf32%3E-for-JValue"],[3250,"impl-From%3Cf64%3E-for-JValue"],[3251,"impl-From%3Cusize%3E-for-JValue"],[3252,"impl-From%3C%26%5BT%5D%3E-for-JValue"],[3253,"impl-From%3CRc%3Cstr%3E%3E-for-JValue"],[3254,"impl-From%3CCow%3C\'a,+str%3E%3E-for-JValue"],[3255,"impl-From%3Cisize%3E-for-JValue"],[3256,"impl-From%3Cu16%3E-for-JValue"],[3257,"impl-From%3CBTreeMap%3CRc%3Cstr%3E,+JValue%3E%3E-for-JValue"],[3258,"impl-From%3Ci8%3E-for-JValue"],[3259,"impl-From%3Cu32%3E-for-JValue"],[3260,"impl-From%3Cu8%3E-for-JValue"],[3261,"impl-From%3Ci64%3E-for-JValue"],[3262,"impl-From%3Ci16%3E-for-JValue"],[3263,"impl-From%3Cbool%3E-for-JValue"],[3264,"impl-From%3C()%3E-for-JValue"],[3266,"impl-From%3CStreamMapKey%3E-for-JValue"],[3267,"impl-From%3Ci32%3E-for-JValue"],[3268,"impl-From%3CNumber%3E-for-JValue"],[3269,"impl-From%3CString%3E-for-JValue"],[3270,"impl-From%3C%26Number%3E-for-JValue"],[3271,"impl-From%3CValue%3E-for-JValue"],[3272,"impl-From%3C%26Value%3E-for-JValue"],[3273,"impl-FromIterator%3C(K,+V)%3E-for-JValue"],[3274,"impl-FromIterator%3CT%3E-for-JValue"],[3472,"impl-Debug-for-DataVerifierError"],[3473,"impl-Display-for-DataVerifierError"]],"c":"OjAAAAAAAAA=","e":"OzAAAAEAAM0LmQAAAAEAAwABAAYAAwANAAAAEAAAAC4AAAAxAAAANQAAADcAAAA5AAAAOwAAAD0AAQBDAAAARgAAAEoAAABNAAAAUQAEAFgAAABbAAEAYgABAGUAAABwAAAAcgAAAHYAAAB4AAIAhAABAIoAAACMAAAAjwABAJQAAACZAAEAnwAAAKIAAgCnAAAAqwAAALIAAAC0AAAAwQAAAMUAAADQAAEA3gACAOIACgDvAAAA9AAJAAABtgC4AQAAuwEEAMQBGwDkAXgAXgIDAGMCtgEbBA4BKwUIADUFOQB0BQAAdwUBAHoFAAB8BQIAggUAAIoFAACOBQAAkQUAAJUFAQCYBQsApQUBANQFAADgBQAA5AUAAOcFAADpBQkA9QVtAGUGAwBqBmMAKgcHADQHWgCQBwEAkwcAAJcHAACZBwAAnwcCAKMHbAARCAIAFQgGAB4IAAAgCF8AgQgHAIoILgC7CAAAvQgAAL8IawAtCQAAMAlaAI8JCwCfCQAAoQkAAKMJAACpCTQA4QlhAEQKtgD9CgAA/woAAAULBAALC1sAbQsMAHwLBACDCwEAhwsAAIkLCwCWCwEAmQsBAJwLDgCsCwkAtwsBALoLGADUCxkA8QsGAPsLLwAsDAgANgwCADoMCABEDBMAWQwDAF8MAABhDAgAcQwBAHwMLgCsDAAArgwAALEMAAC0DAAAuAwBALsMBADDDAEAxwwCAM0MAADPDAAA2wwDAOAMAwDlDAUA7AwUAAINAgAGDRAAGA0qAEYNCwBVDSUAfA0WAJUNAwCbDQEAng0OAK4NCQC5DRAAzA0FANQNEQA="}],\ +["air_trace_handler",{"t":"EPPPPGGGPPPEPPPPPPPPPPPGPGFGIPPPNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOGPGPGPPPPGPPPGPPPPPPPPPGGGGGFFPPFFPPGPPPPFFPPGPONNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNOOONONNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNOOOOOOOO","n":["DataType","Err","FoldFSMNotFound","FoldLenUnderflow","FoldPosOverflow","GenerationCompactificationError","IntConversionError","KeeperError","KeeperError","KeeperError","Left","MergeError","MergeError","NoElementAtPosition","NoStreamState","Ok","ParLenOverflow","ParLenUnderflow","ParPosOverflow","ParQueueIsEmpty","Right","SetSubtraceLenAndPosFailed","SetSubtraceLenFailed","StateFSMError","StateFSMError","SubgraphType","TraceHandler","TraceHandlerError","TraceHandlerResult","TracePosPointsToInvalidState","TracePosPointsToNowhere","TryIntoTracePosError","as_error","as_error","as_error","as_error","as_error","as_result_trace","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","clone","clone_into","clone_to_uninit","clone_to_uninit","default","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","eq","eq","equivalent","equivalent","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","from","from","from","from_trace","into","into","into","into","into","into","into","into_result_trace","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","meet_ap_end","meet_ap_start","meet_back_iterator","meet_call_end","meet_call_start","meet_canon_end","meet_canon_start","meet_fold_end","meet_fold_start","meet_generation_end","meet_iteration_end","meet_iteration_start","meet_par_start","meet_par_subgraph_end","merger","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","points_to_invalid_state","points_to_nowhere","source","source","subgraph_sizes","to_owned","to_string","to_string","to_string","to_string","to_string","to_string","trace_pos","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","type_id","update_generation","vzip","vzip","vzip","vzip","vzip","vzip","vzip","position","state","position","requested_pos","requested_subtrace_len","requested_subtrace_len","state","trace_len","trace_len","trace_len","trace_position","ApResultError","Both","CallResultError","CanonResult","CanonResultError","Current","Current","Current","CurrentData","DataType","DifferentExecutedStateExpected","Empty","FoldIncorrectSubtracesCount","FoldResultError","IncompatibleCallResults","IncompatibleExecutedStates","IncompatibleState","IncorrectApResult","IncorrectCallResult","IncorrectCanonResult","IncorrectFoldResult","InvalidDstGenerations","KeeperError","MergeCtxType","MergeError","MergerApResult","MergerCallResult","MergerCanonResult","MergerFoldResult","MergerParResult","Met","Met","MetApResult","MetCallResult","NotMet","NotMet","PreparationScheme","Previous","Previous","Previous","PreviousData","ResolvedFold","ResolvedSubTraceDescs","SeveralRecordsWithSamePos","SubtraceLenOverflow","ValueSource","ValuesNotEqual","after_subtrace","as_error","as_error","as_error","as_error","as_error","before_subtrace","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","current_fold_lore","current_par","default","default","default","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","eq","eq","equivalent","equivalent","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fold_states_count","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","generation","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","lore","new","new","new","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","prev_fold_lore","prev_par","result","source","source","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_string","to_string","to_string","to_string","to_string","to_string","to_string","trace_pos","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","value_source","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","current_call","current_value","prev_call","prev_value","current_canon_result","prev_canon_result","count","fold_result"],"q":[[0,"air_trace_handler"],[172,"air_trace_handler::GenerationCompactificationError"],[174,"air_trace_handler::KeeperError"],[183,"air_trace_handler::merger"],[552,"air_trace_handler::merger::CallResultError"],[556,"air_trace_handler::merger::CanonResultError"],[558,"air_trace_handler::merger::FoldResultError"],[560,"core::error"],[561,"air_trace_handler::handler"],[562,"air_interpreter_data::trace"],[563,"air_trace_handler::state_automata::par_fsm"],[564,"rkyv::with"],[565,"core::result"],[566,"air_trace_handler::data_keeper::errors"],[567,"core::fmt"],[568,"air_trace_handler::errors"],[569,"air_trace_handler::state_automata::errors"],[570,"air_trace_handler::merger::errors"],[571,"core::alloc::layout"],[572,"air_interpreter_data::executed_state"],[573,"air_trace_handler::merger::ap_merger"],[574,"air_trace_handler::merger::call_merger"],[575,"air_trace_handler::merger::canon_merger"],[576,"air_interpreter_data::trace_pos"],[577,"core::option"],[578,"alloc::string"],[579,"core::any"],[580,"air_interpreter_data::generation_idx"],[581,"air_trace_handler::merger::fold_merger::fold_lore_resolver"],[582,"air_trace_handler::merger::fold_merger"],[583,"air_trace_handler::merger::par_merger"],[584,"air_trace_handler::merger::position_mapping"],[585,"std::collections::hash::map"]],"i":[0,23,17,17,17,0,0,0,14,17,6,0,14,10,10,23,17,17,17,17,6,10,10,0,14,0,0,0,0,15,15,16,10,14,15,16,17,3,10,14,15,16,3,17,6,10,14,15,16,3,17,6,6,6,6,6,3,10,14,15,16,3,17,6,10,6,10,6,10,10,14,14,15,15,16,16,3,17,17,6,6,10,14,14,14,14,15,16,3,17,17,6,3,10,14,15,16,3,17,6,3,10,14,15,16,3,17,6,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,10,14,15,16,3,17,6,15,15,14,17,3,6,10,14,15,16,17,6,3,10,14,15,16,3,17,6,10,14,15,16,3,17,6,10,14,15,16,3,17,6,3,10,14,15,16,3,17,6,53,53,54,55,56,55,57,56,55,54,56,0,44,0,28,0,39,44,45,46,0,18,28,50,0,48,18,49,18,18,18,18,47,18,0,0,0,0,0,0,0,22,26,0,0,22,26,0,39,44,45,46,0,0,50,50,0,48,41,18,47,48,49,50,41,22,37,26,38,28,18,47,48,49,50,39,40,41,42,43,44,45,46,22,37,26,38,28,18,47,48,49,50,39,40,41,42,43,44,45,46,22,37,26,38,28,39,40,41,42,43,44,45,46,22,37,26,38,28,39,40,41,42,43,44,45,46,22,37,26,38,28,39,39,40,41,42,43,43,44,44,45,45,46,46,42,43,40,42,43,22,37,26,38,28,18,47,48,49,50,39,40,41,42,43,44,45,46,40,41,40,41,22,37,26,38,28,18,18,47,47,48,48,49,49,50,50,39,39,40,41,42,43,44,45,45,46,40,22,37,26,38,28,18,18,18,18,18,18,47,48,49,50,39,40,41,42,43,44,45,46,46,37,22,37,26,38,28,18,47,48,49,50,39,40,41,42,43,44,45,46,22,37,26,38,28,18,47,48,49,50,39,40,41,42,43,44,45,46,40,38,40,41,22,37,26,38,28,18,47,48,49,50,39,40,41,42,43,44,45,46,42,43,38,18,38,22,37,26,38,28,39,40,41,42,43,44,45,46,18,47,48,49,50,39,45,38,22,37,26,38,28,18,47,48,49,50,39,40,41,42,43,44,45,46,22,37,26,38,28,18,47,48,49,50,39,40,41,42,43,44,45,46,22,37,26,38,28,18,47,48,49,50,39,40,41,42,43,44,45,46,37,22,37,26,38,28,18,47,48,49,50,39,40,41,42,43,44,45,46,58,59,58,59,60,60,61,61],"f":"````````````````````````````````{{{b{c}}}{{b{d}}}{}}0000{{{b{f}}}{{b{h}}}}{{{b{c}}}{{b{e}}}{}{}}000000{{{b{jc}}}{{b{je}}}{}{}}000000{{{b{l}}}l}{{{b{c}}{b{je}}}n{}{}}{{{b{c}}}n{}}0{{}f}{{{b{c}}{b{je}}}{{Ab{{A`{gi}}}}}{}{}{}{}}000000{{{b{Ad}}{b{Ad}}}Af}{{{b{l}}{b{l}}}Af}{{{b{c}}{b{e}}}Af{}{}}0{{{b{Ad}}{b{jAh}}}Aj}0{{{b{Al}}{b{jAh}}}Aj}0{{{b{An}}{b{jAh}}}Aj}0{{{b{B`}}{b{jAh}}}Aj}0{{{b{f}}{b{jAh}}}Aj}{{{b{Bb}}{b{jAh}}}Aj}0{{{b{l}}{b{jAh}}}Aj}0{cc{}}{AdAl}1{BbAl}{BdAl}3333{AdBb}4{{hh}f}{ce{}{}}000000{fh}{{}{{Ab{BfBh}}}}000000{{{b{jf}}Bj}n}{{{b{jf}}}{{Bn{Bl}}}}{{{b{jf}}C`}{{Bn{n}}}}{{{b{jf}}Cb}n}{{{b{jf}}}{{Bn{Cd}}}}{{{b{jf}}Cf}n}{{{b{jf}}}{{Bn{Ch}}}}4444{{{b{jf}}C`Cj}{{Bn{n}}}}{{{b{jf}}}{{Bn{n}}}}{{{b{jf}}l}{{Bn{n}}}}`{b}000000{{CjCl}An}{CjAn}{{{b{Al}}}{{Cn{{b{d}}}}}}{{{b{Bb}}}{{Cn{{b{d}}}}}}{{{b{f}}}{{Db{D`D`}}}}{{{b{c}}}e{}{}}{{{b{c}}}Dd{}}00000{{{b{f}}}{{Ab{CjB`}}}}{c{{Ab{e}}}{}{}}0000000000000{{{b{c}}}Df{}}000000{{{b{jf}}CjDh}{{Ab{nAn}}}}{ce{}{}}000000```````````````````````````````````````````````````````````{{{b{c}}}{{b{d}}}{}}0000`{{{b{c}}}{{b{e}}}{}{}}00000000000000000{{{b{jc}}}{{b{je}}}{}{}}00000000000000000{{{b{Bl}}}Bl}{{{b{Dj}}}Dj}{{{b{Cd}}}Cd}{{{b{Dl}}}Dl}{{{b{Ch}}}Ch}{{{b{Dn}}}Dn}{{{b{E`}}}E`}{{{b{Eb}}}Eb}{{{b{Ed}}}Ed}{{{b{Ef}}}Ef}{{{b{Eh}}}Eh}{{{b{Ej}}}Ej}{{{b{El}}}El}{{{b{c}}{b{je}}}n{}{}}000000000000{{{b{c}}}n{}}00000000000000000``{{}E`}{{}Ed}{{}Ef}{{{b{c}}{b{je}}}{{Ab{{A`{gi}}}}}{}{}{}{}}00000000000000000{{{b{E`}}{b{E`}}}Af}{{{b{Eb}}{b{Eb}}}Af}{{{b{c}}{b{e}}}Af{}{}}0{{{b{Bl}}{b{jAh}}}Aj}{{{b{Dj}}{b{jAh}}}Aj}{{{b{Cd}}{b{jAh}}}Aj}{{{b{Dl}}{b{jAh}}}Aj}{{{b{Ch}}{b{jAh}}}Aj}{{{b{Bd}}{b{jAh}}}Aj}0{{{b{En}}{b{jAh}}}Aj}0{{{b{F`}}{b{jAh}}}Aj}0{{{b{Fb}}{b{jAh}}}Aj}0{{{b{Fd}}{b{jAh}}}Aj}0{{{b{Dn}}{b{jAh}}}Aj}0{{{b{E`}}{b{jAh}}}Aj}{{{b{Eb}}{b{jAh}}}Aj}{{{b{Ed}}{b{jAh}}}Aj}{{{b{Ef}}{b{jAh}}}Aj}{{{b{Eh}}{b{jAh}}}Aj}{{{b{Ej}}{b{jAh}}}Aj}0{{{b{El}}{b{jAh}}}Aj}`{cc{}}0000{AdBd}1{FdBd}{EnBd}{FbBd}{F`Bd}555555555555{EhEl}`{ce{}{}}00000000000000000{{}{{Ab{BfBh}}}}00000000000000000`{{CbCjEl}Dl}{{{Ff{CjEb}}C`}E`}{{FhFh}Eb}{b}00000000000000000```{{{b{Bd}}}{{Cn{{b{d}}}}}}`{{{b{c}}}e{}{}}000000000000{{{b{c}}}Dd{}}000000`{c{{Ab{e}}}{}{}}00000000000000000000000000000000000{{{b{c}}}Df{}}00000000000000000`::::::::::::::::::````````","D":"Jf","p":[[1,"reference"],[10,"Error",560],[5,"TraceHandler",0,561],[5,"ExecutionTrace",562],[0,"mut"],[6,"SubgraphType",0,563],[1,"unit"],[5,"With",564],[6,"Result",565],[6,"KeeperError",0,566],[1,"bool"],[5,"Formatter",567],[8,"Result",567],[6,"TraceHandlerError",0,568],[6,"GenerationCompactificationError",0,568],[6,"IntConversionError",0,568],[6,"StateFSMError",0,569],[6,"MergeError",183,570],[5,"Layout",571],[5,"LayoutError",571],[5,"ApResult",572],[6,"MergerApResult",183,573],[8,"TraceHandlerResult",0],[1,"u32"],[6,"CallResult",572],[6,"MergerCallResult",183,574],[6,"CanonResult",572],[6,"MergerCanonResult",183,575],[5,"TracePos",576],[6,"ExecutedState",572],[6,"Option",577],[8,"TraceLen",562],[1,"tuple"],[5,"String",578],[5,"TypeId",579],[5,"GenerationIdx",580],[5,"MetApResult",183,573],[5,"MetCallResult",183,574],[6,"DataType",183,570],[5,"ResolvedFold",183,581],[5,"ResolvedSubTraceDescs",183,581],[5,"MergerFoldResult",183,582],[5,"MergerParResult",183,583],[6,"PreparationScheme",183,584],[6,"MergeCtxType",183],[6,"ValueSource",183],[6,"ApResultError",183,570],[6,"CallResultError",183,570],[6,"CanonResultError",183,570],[6,"FoldResultError",183,570],[5,"HashMap",585],[5,"SubTraceDesc",572],[15,"TracePosPointsToInvalidState",172],[15,"NoElementAtPosition",174],[15,"SetSubtraceLenAndPosFailed",174],[15,"SetSubtraceLenFailed",174],[15,"NoStreamState",174],[15,"IncompatibleCallResults",552],[15,"ValuesNotEqual",552],[15,"IncompatibleState",556],[15,"SubtraceLenOverflow",558]],"r":[[0,570],[5,568],[6,568],[7,566],[11,570],[23,569],[25,563],[26,561],[27,568],[183,570],[185,570],[187,570],[192,570],[196,570],[207,570],[208,573],[209,574],[210,575],[211,582],[212,583],[215,573],[216,574],[219,584],[224,581],[225,581]],"b":[[68,"impl-Debug-for-KeeperError"],[69,"impl-Display-for-KeeperError"],[70,"impl-Display-for-TraceHandlerError"],[71,"impl-Debug-for-TraceHandlerError"],[72,"impl-Debug-for-GenerationCompactificationError"],[73,"impl-Display-for-GenerationCompactificationError"],[74,"impl-Display-for-IntConversionError"],[75,"impl-Debug-for-IntConversionError"],[77,"impl-Display-for-StateFSMError"],[78,"impl-Debug-for-StateFSMError"],[79,"impl-Display-for-SubgraphType"],[80,"impl-Debug-for-SubgraphType"],[82,"impl-From%3CKeeperError%3E-for-TraceHandlerError"],[84,"impl-From%3CStateFSMError%3E-for-TraceHandlerError"],[85,"impl-From%3CMergeError%3E-for-TraceHandlerError"],[349,"impl-Debug-for-MergeError"],[350,"impl-Display-for-MergeError"],[351,"impl-Display-for-ApResultError"],[352,"impl-Debug-for-ApResultError"],[353,"impl-Debug-for-CallResultError"],[354,"impl-Display-for-CallResultError"],[355,"impl-Display-for-CanonResultError"],[356,"impl-Debug-for-CanonResultError"],[357,"impl-Display-for-FoldResultError"],[358,"impl-Debug-for-FoldResultError"],[359,"impl-Debug-for-DataType"],[360,"impl-Display-for-DataType"],[366,"impl-Debug-for-MergeCtxType"],[367,"impl-Display-for-MergeCtxType"],[375,"impl-From%3CKeeperError%3E-for-MergeError"],[377,"impl-From%3CFoldResultError%3E-for-MergeError"],[378,"impl-From%3CApResultError%3E-for-MergeError"],[379,"impl-From%3CCanonResultError%3E-for-MergeError"],[380,"impl-From%3CCallResultError%3E-for-MergeError"]],"c":"OjAAAAAAAAA=","e":"OzAAAAEAAN0BGgAAAAEABgABAAkAAAALAAIAFQAAABkAAgAdADQAUwAAAFUAAQBbAAAAXQAAAGUACgByABwAkAAqALwABQDFAAAAyAAEAM4AAQDRAAQA2AABANwABgDkAI4AeAEAAHoBAwCKAQEAngGSAA=="}],\ +["air_utils",{"t":"QQQ","n":["auto_checked_add","farewell_if_fail","measure"],"q":[[0,"air_utils"]],"i":[0,0,0],"f":"```","D":"`","p":[],"r":[],"b":[],"c":"OjAAAAAAAAA=","e":"OjAAAAEAAAAAAAMAEAAAAAAAAQACAAMA"}],\ +["avm_data_store",{"t":"FKROONNOMNNNMONNMNNONNMNNONONOMNMNNNN","n":["AnomalyData","DataStore","Error","air_script","avm_outcome","borrow","borrow_mut","call_results","cleanup_data","clone","clone_into","clone_to_uninit","collect_anomaly_data","current_data","deserialize","deserialize","detect_anomaly","eq","equivalent","execution_time","fmt","from","initialize","into","layout_raw","memory_delta","new","particle","pointer_metadata","prev_data","read_data","serialize","store_data","to_owned","try_from","try_into","type_id"],"q":[[0,"avm_data_store"],[37,"core::result"],[38,"serde::de"],[39,"rkyv::with"],[40,"core::time"],[41,"avm_interface::raw_outcome"],[42,"core::fmt"],[43,"core::alloc::layout"],[44,"alloc::vec"],[45,"serde::ser"],[46,"core::any"]],"i":[0,0,4,8,8,8,8,8,4,8,8,8,4,8,8,8,4,8,8,8,8,8,4,8,8,8,8,8,8,8,4,8,4,8,8,8,8],"f":"`````{{{b{c}}}{{b{e}}}{}{}}{{{b{dc}}}{{b{de}}}{}{}}`{{{b{d{h{}{{f{c}}}}}}{b{j}}{b{j}}}{{n{lc}}}{}}{{{b{A`}}}A`}{{{b{c}}{b{de}}}l{}{}}{{{b{c}}}l{}}{{{b{d{h{}{{f{c}}}}}}{b{j}}{b{j}}A`}{{n{lc}}}{}}`{c{{n{A`}}}Ab}{{{b{c}}{b{de}}}{{n{{Ad{gi}}}}}{}{}{}{}}{{{b{{h{}{{f{c}}}}}}AfAh{b{Aj}}}Al{}}{{{b{A`}}{b{A`}}}Al}{{{b{c}}{b{e}}}Al{}{}}`{{{b{A`}}{b{dAn}}}B`}{cc{}}{{{b{d{h{}{{f{c}}}}}}}{{n{lc}}}{}}{ce{}{}}{{}{{n{BbBd}}}}`{{{b{j}}{b{{Bh{Bf}}}}{b{{Bh{Bf}}}}{b{{Bh{Bf}}}}{b{{Bh{Bf}}}}{b{{Bh{Bf}}}}AfAh}A`}`{b}`{{{b{d{h{}{{f{c}}}}}}{b{j}}{b{j}}}{{n{{Bj{Bf}}c}}}{}}{{{b{A`}}c}nBl}{{{b{d{h{}{{f{c}}}}}}{b{{Bh{Bf}}}}{b{j}}{b{j}}}{{n{lc}}}{}}{{{b{c}}}e{}{}}{c{{n{e}}}{}{}}0{{{b{c}}}Bn{}}","D":"j","p":[[1,"reference"],[0,"mut"],[17,"Error"],[10,"DataStore",0],[1,"str"],[1,"unit"],[6,"Result",37],[5,"AnomalyData",0],[10,"Deserializer",38],[5,"With",39],[5,"Duration",40],[1,"usize"],[5,"RawAVMOutcome",41],[1,"bool"],[5,"Formatter",42],[8,"Result",42],[5,"Layout",43],[5,"LayoutError",43],[1,"u8"],[1,"slice"],[5,"Vec",44],[10,"Serializer",45],[5,"TypeId",46]],"r":[],"b":[],"c":"OjAAAAAAAAA=","e":"OzAAAAEAACAABgAAAAEAAwAFAAoABgASAAMAFwAAABkADAA="}],\ +["avm_interface",{"t":"FSPPFIPIPGFFFFONONNNNNNNNNNNNNNNOONNNNNNNNNNNNNNNNNNNOONNNNNNNNNNNNNNNNNNNNNNNNNNOOONNNNNNNNNNNNNNNNNOONNNNNNNNHNNNNNNNONNNONOOONNNNNNNCOONNNNNNOOOONNNNNNNNNNNNNNNNNNNNNNONNNNNNNOOOOOOOOFNNONNNONNNNONNNNNONONONNNN","n":["AVMOutcome","CALL_SERVICE_SUCCESS","CallParamsArgsDeFailed","CallParamsTetrapletsDeFailed","CallRequestParams","CallRequests","CallRequestsDeError","CallResults","CallResultsSeFailed","CallSeDeErrors","CallServiceResult","ErrorAVMOutcome","ParticleParameters","SoftLimitsTriggering","air_size_limit_exceeded","are_limits_exceeded","arguments","as_error","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","call_requests","call_result_size_limit_exceeded","clone","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","current_peer_id","data","default","default","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","eq","eq","eq","eq","eq","equivalent","equivalent","equivalent","equivalent","equivalent","err","error_code","error_message","execution_time","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from_raw_outcome","function_name","init_peer_id","into","into","into","into","into","into","into","into_raw","into_raw_result","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","memory_delta","new","new","new","next_peer_pks","ok","outcome","particle_id","particle_size_limit_exceeded","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","raw_outcome","result","ret_code","serialize","serialize","serialize","serialize","serialize","serialize","service_id","soft_limits_triggering","tetraplets","timestamp","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_string","to_string","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","ttl","type_id","type_id","type_id","type_id","type_id","type_id","type_id","call_params","call_params","call_results","de_error","de_error","error","raw_call_request","se_error","RawAVMOutcome","borrow","borrow_mut","call_requests","clone","clone_into","clone_to_uninit","data","deserialize","deserialize","eq","equivalent","error_message","fmt","from","from_interpreter_outcome","into","layout_raw","next_peer_pks","pointer_metadata","ret_code","serialize","soft_limits_triggering","to_owned","try_from","try_into","type_id"],"q":[[0,"avm_interface"],[178,"avm_interface::CallSeDeErrors"],[186,"avm_interface::raw_outcome"],[213,"air_interpreter_interface::interpreter_outcome"],[214,"core::error"],[215,"avm_interface::call_request_parameters"],[216,"avm_interface::call_service_result"],[217,"avm_interface::outcome"],[218,"avm_interface::particle_parameters"],[219,"rkyv::with"],[220,"core::result"],[221,"serde::de"],[222,"serde_json::value"],[223,"core::fmt"],[224,"core::time"],[225,"air_interpreter_interface::call_service_result"],[226,"core::alloc::layout"],[227,"alloc::vec"],[228,"marine_call_parameters"],[229,"alloc::string"],[230,"core::convert"],[231,"alloc::borrow"],[232,"serde::ser"],[233,"core::any"]],"i":[0,0,20,20,0,0,20,0,20,0,0,0,0,0,1,1,6,20,6,7,8,9,10,1,20,6,7,8,9,10,1,20,8,1,6,7,8,9,10,1,6,7,8,9,10,1,6,7,8,9,10,1,1,10,8,7,1,6,6,7,7,8,8,9,9,10,10,1,1,20,6,7,8,9,1,6,7,8,9,1,7,9,9,8,6,7,7,8,9,10,1,20,20,6,7,8,9,10,1,20,8,6,10,6,7,8,9,10,1,20,7,0,6,7,8,9,10,1,20,8,6,10,1,8,7,9,10,1,6,7,8,9,10,1,20,0,7,7,6,7,8,9,10,1,6,8,6,10,6,7,8,9,10,1,7,20,6,7,8,9,10,1,20,6,7,8,9,10,1,20,10,6,7,8,9,10,1,20,40,41,42,40,41,43,43,42,0,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21],"f":"```````````````{{{d{b}}}f}`{{{d{c}}}{{d{h}}}{}}{{{d{c}}}{{d{e}}}{}{}}000000{{{d{jc}}}{{d{je}}}{}{}}000000``{{{d{l}}}l}{{{d{n}}}n}{{{d{A`}}}A`}{{{d{Ab}}}Ab}{{{d{Ad}}}Ad}{{{d{b}}}b}{{{d{c}}{d{je}}}Af{}{}}00000{{{d{c}}}Af{}}000000``{{}n}{{}b}{{{d{c}}{d{je}}}{{Aj{{Ah{gi}}}}}{}{}{}{}}{c{{Aj{l}}}Al}{c{{Aj{n}}}Al}22{c{{Aj{A`}}}Al}{c{{Aj{Ab}}}Al}4{c{{Aj{Ad}}}Al}5{c{{Aj{b}}}Al}66{{{d{l}}{d{l}}}f}{{{d{n}}{d{n}}}f}{{{d{A`}}{d{A`}}}f}{{{d{Ab}}{d{Ab}}}f}{{{d{b}}{d{b}}}f}{{{d{c}}{d{e}}}f{}{}}0000{{AnB`}n}```{{{d{l}}{d{jBb}}}Bd}{{{d{n}}{d{jBb}}}Bd}0{{{d{A`}}{d{jBb}}}Bd}{{{d{Ab}}{d{jBb}}}Bd}{{{d{Ad}}{d{jBb}}}Bd}{{{d{b}}{d{jBb}}}{{Aj{AfBf}}}}{{{d{Bh}}{d{jBb}}}Bd}0{cc{}}000000{{BjBlBn}{{Aj{A`Ab}}}}``{ce{}{}}000000{nC`}{CbCd}{{}{{Aj{CfCh}}}}000000`{{ce{Cj{B`}}{Cj{{Cj{Cl}}}}}l{{D`{Cn}}}{{D`{Cn}}}}{{{Dd{Db}}{Dd{Db}}DfDh{Dd{Db}}}Ad}{{fff}b}`{B`n}```{d}000000```{{{d{l}}c}AjDj}{{{d{n}}c}AjDj}{{{d{A`}}c}AjDj}{{{d{Ab}}c}AjDj}{{{d{Ad}}c}AjDj}{{{d{b}}c}AjDj}````{{{d{c}}}e{}{}}00000{{{d{c}}}Cn{}}0{c{{Aj{e}}}{}{}}0000000000000`{{{d{c}}}Dl{}}000000`````````{{{d{c}}}{{d{e}}}{}{}}{{{d{jc}}}{{d{je}}}{}{}}`{{{d{Bj}}}Bj}{{{d{c}}{d{je}}}Af{}{}}{{{d{c}}}Af{}}`{c{{Aj{Bj}}}Al}{{{d{c}}{d{je}}}{{Aj{{Ah{gi}}}}}{}{}{}{}}{{{d{Bj}}{d{Bj}}}f}{{{d{c}}{d{e}}}f{}{}}`{{{d{Bj}}{d{jBb}}}Bd}{cc{}}{Dn{{Aj{BjBh}}}}{ce{}{}}{{}{{Aj{CfCh}}}}`{d}`{{{d{Bj}}c}AjDj}`{{{d{c}}}e{}{}}{c{{Aj{e}}}{}{}}0{{{d{c}}}Dl{}}","D":"Dj","p":[[5,"SoftLimitsTriggering",0,213],[1,"reference"],[1,"bool"],[10,"Error",214],[0,"mut"],[5,"CallRequestParams",0,215],[5,"CallServiceResult",0,216],[5,"AVMOutcome",0,217],[5,"ErrorAVMOutcome",0,217],[5,"ParticleParameters",0,218],[1,"unit"],[5,"With",219],[6,"Result",220],[10,"Deserializer",221],[1,"i32"],[6,"Value",222],[5,"Formatter",223],[8,"Result",223],[5,"Error",223],[6,"CallSeDeErrors",0],[5,"RawAVMOutcome",186],[1,"usize"],[5,"Duration",224],[5,"CallServiceResult",225],[8,"CallResults",0,216],[8,"CallResults",225],[5,"Layout",226],[5,"LayoutError",226],[5,"Vec",227],[5,"SecurityTetraplet",228],[5,"String",229],[10,"Into",230],[1,"str"],[6,"Cow",231],[1,"u64"],[1,"u32"],[10,"Serializer",232],[5,"TypeId",233],[5,"InterpreterOutcome",213],[15,"CallParamsArgsDeFailed",178],[15,"CallParamsTetrapletsDeFailed",178],[15,"CallResultsSeFailed",178],[15,"CallRequestsDeError",178]],"r":[[0,217],[1,216],[4,215],[5,215],[7,216],[10,216],[11,217],[12,218],[13,213],[111,216]],"b":[[85,"impl-Debug-for-CallServiceResult"],[86,"impl-Display-for-CallServiceResult"],[91,"impl-Display-for-CallSeDeErrors"],[92,"impl-Debug-for-CallSeDeErrors"]],"c":"OjAAAAAAAAA=","e":"OzAAAAEAALAAFAAAAAIABgAAAAgAAAAKAAAADAAAAA8AAQASAA4AIgAUADgAGwBVAAgAZQAAAGcAAABvAAgAeQACAH0ACwCLAAUAlAAmALwADADKAAAAzAAJAA=="}],\ +["avm_server",{"t":"FFIGFFIFFPFPPPPPPPSPPFIPIPGPFKPPPRFPPPPIIGPPPPGGPPPPPPPPPPPPPFPPPGPIPPPPPPPPFFPPPPPPPPPPTTNOOOOOONOONNNNOCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMOOOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOONNNNNNNNNNNNNNNNNNNNNOONNONNNNNNNNNNNNNNNNNNNOMNNNNNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNONOOOOONCNNNNNNNNNNNNNNNNNNNNNNNNNNNONOONOOOOOONNNNNNNNNNNNNNNNNNNOCMNNOONNNNNNNNNNNNOONNNNNNNNNNNNNNNNNNNONNNMOONNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOFFNNNONONNNNNONNNNNNNNONONONNNNNFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNFNNONNNONNNNNNNNNNNNONNNNNNNNONONNONNNNN","n":["AVM","AVMConfig","AVMDataStore","AVMError","AVMMemoryStats","AVMOutcome","AVMResult","AVMRuntimeLimits","AnomalyData","AnomalyDataSeError","AquaVMRuntimeLimits","Array","Array","Aux","Boolean","Boolean","ByteArray","ByteArray","CALL_SERVICE_SUCCESS","CallParamsArgsDeFailed","CallParamsTetrapletsDeFailed","CallRequestParams","CallRequests","CallRequestsDeError","CallResults","CallResultsSeFailed","CallSeDeErrors","CallSeDeErrors","CallServiceResult","DataStore","DataStoreError","Err","Err","Error","ErrorAVMOutcome","F32","F32","F64","F64","HostExportedFunc","HostImportDescriptor","HostImportError","I32","I32","I64","I64","IType","IValue","IncorrectInterpreterResult","InterpreterFailed","InterpreterResultDeError","InvalidAIRPath","InvalidUTF8String","KeyError","LifterError","LowererError","MarineError","MismatchWValues","MismatchWValuesCount","Ok","Ok","ParticleParameters","Record","Record","RecordNotFound","RunnerError","RunnerError","RunnerResult","S16","S16","S32","S32","S64","S64","S8","S8","SecurityTetraplet","SoftLimitsTriggering","String","String","U16","U16","U32","U32","U64","U64","U8","U8","VARIANT_COUNT","VARIANT_COUNT","add_lens","air_script","air_size_limit","air_size_limit","air_size_limit_exceeded","air_wasm_path","allocation_rejects","are_limits_exceeded","argument_types","arguments","as_error","as_error","as_error","as_error","avm_outcome","avm_runner","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","call","call_requests","call_result_size_limit","call_result_size_limit","call_result_size_limit_exceeded","call_results","cleanup_data","cleanup_data","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","collect_anomaly_data","current_data","current_peer_id","data","data_store","debug","debug","debug","debug","debug","debug","debug","debug","debug","debug","debug","debug","debug","debug","debug","debug","debug","debug","debug","default","default","default","default","default","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","detect_anomaly","drop","drop","drop","drop","drop","drop","drop","drop","drop","drop","drop","drop","drop","drop","drop","drop","drop","drop","drop","eq","eq","eq","eq","eq","eq","eq","eq","eq","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","err","error_code","error_handler","error_message","execution_time","execution_time","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from_fd","from_filelike","from_grip","from_into_filelike","from_into_socketlike","from_raw_outcome","from_socketlike","function_name","function_name","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_fd_flags","get_hash","get_hash","hard_limit_enabled","hard_limit_enabled","hash","hash","host_exported_func","init","init","init","init","init","init","init","init","init","init","init","init","init","init","init","init","init","init","init","init_peer_id","initialize","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into_raw","into_raw_result","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","layout_raw","lens","literal_tetraplet","logging_mask","max_heap_size","memory_delta","memory_delta","memory_size","memory_stats","ne_vec","new","new","new","new","new","new","new","new","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","new_set_fd_flags","next_peer_pks","ok","outcome","output_type","parse","particle","particle_id","particle_size_limit","particle_size_limit","particle_size_limit_exceeded","peer_pk","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","pointer_metadata","prev_data","raw_outcome","read_data","resolve","resolve_metadata","result","ret_code","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize_metadata","serialize_unsized","service_id","service_id","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","set_fd_flags","soft_limits_triggering","source","source","source","store_data","tetraplets","timestamp","to_bytes","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_string","to_string","to_string","to_string","to_string","to_string","to_string","total_memory_limit","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","ttl","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","call_params","call_params","call_results","de_error","de_error","error","raw_call_request","se_error","invalid_path","io_error","reason","AVMRunner","RawAVMOutcome","borrow","borrow_mut","call","call_requests","call_tracing","data","debug","deref","deref_mut","deserialize","drop","error_message","from","get_fd_flags","init","into","layout_raw","memory_stats","new","new_set_fd_flags","next_peer_pks","pointer_metadata","ret_code","set_fd_flags","soft_limits_triggering","to_human_readable_data","try_from","try_into","type_id","vzip","NEVec","borrow","borrow_mut","clone","clone_into","clone_to_uninit","debug","default","deref","deref","deref_mut","deserialize","deserialize","drop","eq","equivalent","equivalent","equivalent","equivalent","equivalent","fmt","from","get_fd_flags","get_hash","hash","init","into","into_vec","layout_raw","new","new_set_fd_flags","pointer_metadata","serialize","set_fd_flags","to_owned","try_from","try_into","type_id","vzip","RawAVMOutcome","borrow","borrow_mut","call_requests","clone","clone_into","clone_to_uninit","data","debug","deref","deref_mut","deserialize","deserialize","drop","eq","equivalent","equivalent","equivalent","equivalent","equivalent","error_message","fmt","from","from_interpreter_outcome","get_fd_flags","init","into","layout_raw","new_set_fd_flags","next_peer_pks","pointer_metadata","ret_code","serialize","set_fd_flags","soft_limits_triggering","to_owned","try_from","try_into","type_id","vzip"],"q":[[0,"avm_server"],[726,"avm_server::CallSeDeErrors"],[734,"avm_server::RunnerError"],[737,"avm_server::avm_runner"],[769,"avm_server::ne_vec"],[808,"avm_server::raw_outcome"],[848,"marine_call_parameters"],[849,"air_interpreter_interface::interpreter_outcome"],[850,"core::error"],[851,"avm_server::avm"],[852,"avm_interface::particle_parameters"],[853,"avm_interface::call_service_result"],[854,"fluence_keypair::key_pair"],[855,"avm_interface::outcome"],[856,"marine_wasm_backend_traits"],[857,"alloc::string"],[858,"core::convert"],[859,"alloc::vec"],[860,"avm_data_store"],[861,"core::result"],[862,"avm_interface::call_request_parameters"],[863,"avm_server::runner"],[864,"fluence_it_types::types"],[865,"fluence_it_types::values"],[866,"core::fmt"],[867,"serde::de"],[868,"rkyv::with"],[869,"rkyv"],[870,"core::marker"],[871,"core::time"],[872,"avm_interface::raw_outcome"],[873,"serde_json::value"],[874,"avm_server::errors"],[875,"avm_interface"],[876,"marine_core::host_imports::errors"],[877,"polyplets::triplet"],[878,"marine::errors"],[879,"it_lilo::traits::record_resolvable"],[880,"it_lilo::lowerer::error"],[881,"it_lilo::lifter::error"],[882,"std::os::fd::owned"],[883,"io_lifetimes::portability"],[884,"system_interface::fs::fd_flags"],[885,"std::io::error"],[886,"core::hash"],[887,"air_interpreter_interface::call_service_result"],[888,"std::collections::hash::map"],[889,"core::alloc::layout"],[890,"avm_server::config"],[891,"core::option"],[892,"alloc::borrow"],[893,"wast::parser"],[894,"wast"],[895,"serde::ser"],[896,"std::io"],[897,"core::any"],[898,"std::path"],[899,"fluence_it_types::ne_vec"],[900,"core::clone"],[901,"core::default"],[902,"core::cmp"],[903,"marine_core::wasmtime"],[904,"marine_core"]],"i":[0,0,0,0,0,0,0,0,0,42,0,28,29,46,28,29,28,29,0,47,47,0,0,47,0,47,0,46,0,0,42,14,89,21,0,28,29,28,29,0,0,0,28,29,28,29,0,0,46,42,46,46,48,46,48,48,46,48,48,14,89,0,28,29,48,0,42,0,28,29,28,29,28,29,28,29,0,0,28,29,28,29,28,29,28,29,28,29,28,29,2,23,26,32,6,78,76,6,99,24,42,46,47,48,23,0,23,9,78,24,76,2,25,42,46,26,13,32,27,10,28,6,47,29,48,23,9,78,24,76,2,25,42,46,26,13,32,27,10,28,6,47,29,48,9,13,26,32,6,23,21,9,23,24,2,25,26,13,27,10,28,6,29,23,24,2,25,26,13,27,10,28,6,29,23,24,2,25,26,26,13,27,10,28,6,6,29,21,23,10,13,78,23,9,78,24,76,2,25,42,46,26,13,32,27,10,28,6,47,29,48,2,25,32,6,29,23,9,78,24,76,2,25,42,46,26,13,32,27,10,28,6,47,29,48,23,9,78,24,76,2,25,42,46,26,13,32,27,10,28,6,47,29,48,23,23,9,78,24,24,76,2,2,2,25,25,42,46,26,13,13,32,27,27,10,10,28,28,6,6,47,29,48,21,23,9,78,24,76,2,25,42,46,26,13,32,27,10,28,6,47,29,48,23,24,2,25,13,27,28,6,29,23,23,23,23,23,24,24,24,24,24,2,2,2,2,2,25,25,25,25,25,13,13,13,13,13,27,27,27,27,27,28,28,28,28,28,6,6,6,6,6,25,27,99,27,23,13,23,24,2,2,25,25,42,42,46,46,26,13,27,10,28,6,47,47,29,48,48,23,9,78,24,76,2,2,25,42,42,42,46,46,46,26,26,13,32,27,10,28,6,47,29,29,29,29,29,29,29,29,29,29,29,29,29,48,48,48,48,48,42,42,42,42,42,13,42,24,2,23,9,78,24,76,2,25,42,46,26,13,32,27,10,28,6,47,29,48,2,28,26,32,2,28,99,23,9,78,24,76,2,25,42,46,26,13,32,27,10,28,6,47,29,48,10,21,23,9,78,24,76,2,25,42,46,26,13,32,27,10,28,6,47,29,48,25,0,23,9,78,24,76,2,25,42,46,26,13,32,27,10,28,6,47,29,48,2,2,78,78,23,13,76,9,0,23,9,24,2,26,32,10,6,23,9,78,24,76,2,25,42,46,26,13,32,27,10,28,6,47,29,48,13,25,27,99,28,23,10,26,32,6,2,23,9,78,24,76,2,25,42,46,26,13,32,27,10,28,6,47,29,48,23,0,21,2,2,25,25,23,24,2,2,25,13,27,10,28,6,2,2,24,2,23,9,78,24,76,2,25,42,46,26,13,32,27,10,28,6,47,29,48,13,42,46,48,21,24,10,28,23,24,2,25,26,13,27,10,28,6,29,2,25,42,46,28,47,48,76,23,9,78,24,76,2,25,42,46,26,13,32,27,10,28,6,47,29,48,23,9,78,24,76,2,25,42,46,26,13,32,27,10,28,6,47,29,48,10,23,9,78,24,76,2,25,42,46,26,13,32,27,10,28,6,47,29,48,23,9,78,24,76,2,25,42,46,26,13,32,27,10,28,6,47,29,48,100,101,102,100,101,103,103,102,104,104,104,0,0,88,88,88,39,88,39,88,88,88,88,88,39,88,88,88,88,88,88,88,88,39,88,39,88,39,88,88,88,88,88,0,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,0,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39],"f":"``````````````````````````````````````````````````````````````````````````````````````````{{{f{bd}}{f{h}}}j}``````{{{f{l}}}n}``{{{f{c}}}{{f{A`}}}{}}000``{{{f{c}}}{{f{e}}}{}{}}000000000000000000{{{f{bc}}}{{f{be}}}{}{}}000000000000000000{{{f{b{Ab{ce}}}}giAdAf{f{Ah}}}{{Al{Ajc}}}{}An{{Bb{B`}}}{{Bb{{Bf{Bd}}}}}}`````{{{f{b{Bj{}{{Bh{c}}}}}}{f{h}}{f{h}}}{{Bl{jc}}}{}}{{{f{b{Ab{ce}}}}{f{h}}{f{h}}}{{Al{jc}}}{}An}{{{f{Bn}}}Bn}{{{f{C`}}}C`}{{{f{d}}}d}{{{f{Cb}}}Cb}{{{f{Cd}}}Cd}{{{f{Aj}}}Aj}{{{f{Cf}}}Cf}{{{f{Ad}}}Ad}{{{f{Ch}}}Ch}{{{f{l}}}l}{{{f{Cj}}}Cj}{{{f{c}}{f{be}}}j{}{}}0000000000{{{f{c}}}j{}}000000000000{{{f{b{Bj{}{{Bh{c}}}}}}{f{h}}{f{h}}Bn}{{Bl{jc}}}{}}````{{{f{bCl}}}{{Bl{jCn}}}}000000000000000000{{}d}{{}Cb}{{}D`}{{}l}{{}Cj}{Db{{f{c}}}{}}000000000000000000{Db{{f{bc}}}{}}000000000000000000{c{{Bl{Bn}}}Dd}{{{f{c}}{f{be}}}{{Bl{{Df{gi}}}}}{}{}{}{}}00{c{{Bl{C`}}}Dd}11{c{{Bl{d}}}Dd}{{f{f{bc}}}{{Bl{d}}}{DhDj}}3{c{{Bl{Cb}}}Dd}4444{c{{Bl{Aj}}}Dd}55{c{{Bl{Cf}}}Dd}66{c{{Bl{Ad}}}Dd}7{c{{Bl{Ch}}}Dd}8{c{{Bl{l}}}Dd}999{{{f{{Bj{}{{Bh{c}}}}}}DlDb{f{Dn}}}n{}}{Dbj}000000000000000000{{{f{Bn}}{f{Bn}}}n}{{{f{C`}}{f{C`}}}n}{{{f{d}}{f{d}}}n}{{{f{Cb}}{f{Cb}}}n}{{{f{Aj}}{f{Aj}}}n}{{{f{Cf}}{f{Cf}}}n}{{{f{Ch}}{f{Ch}}}n}{{{f{l}}{f{l}}}n}{{{f{Cj}}{f{Cj}}}n}{{{f{c}}{f{e}}}n{}{}}000000000000000000000000000000000000000{{E`Eb}Cb}`````{{{f{Bn}}{f{bCl}}}{{Bl{jCn}}}}{{{f{C`}}{f{bCl}}}{{Bl{jCn}}}}{{{f{d}}{f{bCl}}}{{Bl{jCn}}}}0{{{f{Cb}}{f{bCl}}}{{Bl{jCn}}}}0{{{f{{Ed{c}}}}{f{bCl}}}EfEh}{{{f{{Ed{c}}}}{f{bCl}}}EfEj}{{{f{El}}{f{bCl}}}Ef}0{{{f{Cd}}{f{bCl}}}Ef}{{{f{Aj}}{f{bCl}}}{{Bl{jCn}}}}{{{f{Cf}}{f{bCl}}}{{Bl{jCn}}}}{{{f{Ad}}{f{bCl}}}{{Bl{jCn}}}}{{{f{Ch}}{f{bCl}}}{{Bl{jCn}}}}{{{f{l}}{f{bCl}}}{{Bl{jCn}}}}{{{f{En}}{f{bCl}}}{{Bl{jCn}}}}0{{{f{Cj}}{f{bCl}}}{{Bl{jCn}}}}{{{f{F`}}{f{bCl}}}{{Bl{jCn}}}}0{cc{}}0000{Fbd}11{Fdc{}}{c{{Ed{c}}}{}}3{EnEl}{FfEl}55{D`Cd}6666666{FhCj}{FjCj}{FlCj}9{FnCj}{{{Bf{Bd}}}Cj}{G`Cj}{GbCj}{E`Cj}{GdCj}{GfCj}{B`Cj}{BdCj}{GhF`}{GjF`}{cc{}}{GlF`}{GnF`}{H`c{}}00{ceHb{}}{ceHd{}}{{DnDbDl}{{Bl{AjCf}}}}3``{{{f{c}}}{{Bl{HfHh}}}{}}000000000000000000{{{f{c}}{f{e}}}Gf{HjDj}Hl}0``{{{f{d}}{f{bc}}}jHn}{{{f{Ch}}{f{bc}}}jHn}`{{}Db}000000000000000000`{{{f{b{Bj{}{{Bh{c}}}}}}}{{Bl{jc}}}{}}{ce{}{}}000000000000000000{CbI`}{{{Ib{G`Cb}}}{{Ib{B`I`}}}}{{}{{Bl{IdIf}}}}000000000000000000`{cd{{Bb{B`}}}}`````{{{f{{Ab{ce}}}}}Ih{}An}`{{{f{h}}{f{{Ij{Bd}}}}{f{{Ij{Bd}}}}{f{{Ij{Bd}}}}{f{{Ij{Bd}}}}{f{{Ij{Bd}}}}DlDb}Bn}{{{Il{c}}e}{{Al{{Ab{ce}}c}}}{}An}{{ce{Bf{Eb}}{Bf{{Bf{d}}}}}C`{{Bb{B`}}}{{Bb{B`}}}}{{cegi}d{{Bb{B`}}}{{Bb{B`}}}{{Bb{B`}}}{{Bb{B`}}}}{{GfGfGfn}Cd}{{{In{Gf}}{In{Gf}}{In{Gf}}n}D`}{{{J`{h}}{J`{h}}GfG`{J`{h}}}Ad}{{nnn}l}{{{f{c}}Hf}{{Bl{{Jb{e}}Hh}}}{}Jd}000000000000000000`{EbCb}``{Jf{{Bl{ChJh}}}}``````{f}000000000000000000``{{{f{b{Bj{}{{Bh{c}}}}}}{f{h}}{f{h}}}{{Bl{{Bf{Bd}}c}}}{}}{{{f{d}}Db}j}{{{f{c}}Db}j{}}``{{{f{Bn}}c}BlJj}{{{f{C`}}c}BlJj}{{{f{d}}c}BlJj}{{{f{d}}{f{bc}}}Bl{DhDj}}{{{f{Cb}}c}BlJj}{{{f{Aj}}c}BlJj}{{{f{Cf}}c}BlJj}{{{f{Ad}}c}BlJj}{{{f{Ch}}c}BlJj}{{{f{l}}c}BlJj}{{{f{c}}{f{be}}}{{Bl{j}}}{}{}}{{{f{c}}{f{be}}}{{Bl{Db}}}{}{}}``{{{f{bc}}{Jb{e}}}{{Bl{jHh}}}{}Jd}000000000000000000`{{{f{{Ed{c}}}}}{{In{{f{A`}}}}}A`}{{{f{El}}}{{In{{f{A`}}}}}}{{{f{F`}}}{{In{{f{A`}}}}}}{{{f{b{Bj{}{{Bh{c}}}}}}{f{{Ij{Bd}}}}{f{h}}{f{h}}}{{Bl{jc}}}{}}``{{{f{Ch}}{f{bc}}}{{Bl{jHh}}}Jl}{{{f{c}}}e{}{}}0000000000{{{f{c}}}B`{}}000{{{f{{f{Ch}}}}}B`}11`{c{{Bl{e}}}{}{}}0000000000000000000000000000000000000`{{{f{c}}}Jn{}}000000000000000000{ce{}{}}000000000000000000`````````````{{{f{c}}}{{f{e}}}{}{}}{{{f{bc}}}{{f{be}}}{}{}}{{{f{b{K`{c}}}}egikGfG`mAf{f{Ah}}B`}{{Kb{Dn}}}An{{Bb{B`}}}{{Bb{{Bf{Bd}}}}}{{Bb{{Bf{Bd}}}}}{{Bb{B`}}}{{Bb{B`}}}}`{{{f{b{K`{c}}}}egikGfG`mAfB`BdBd{Bf{Bd}}B`}{{Kb{Dn}}}An{{Bb{B`}}}{{Bb{{Bf{Bd}}}}}{{Bb{{Bf{Bd}}}}}{{Bb{B`}}}{{Bb{B`}}}}`{{{f{bCl}}}{{Bl{jCn}}}}{Db{{f{c}}}{}}{Db{{f{bc}}}{}}{{{f{c}}{f{be}}}{{Bl{{Df{gi}}}}}{}{}{}{}}{Dbj}`{cc{}}{{{f{c}}}{{Bl{HfHh}}}{}}{{}Db}<{{}{{Bl{IdIf}}}}{{{f{{K`{c}}}}}IhAn}{{Kd{In{Gf}}D`E`c}{{Kb{{K`{c}}}}}An}{{{f{c}}Hf}{{Bl{{Jb{e}}Hh}}}{}Jd}`{f}`{{{f{bc}}{Jb{e}}}{{Bl{jHh}}}{}Jd}`{{{f{b{K`{c}}}}{Bf{Bd}}}{{Kb{B`}}}An}{c{{Bl{e}}}{}{}}0{{{f{c}}}Jn{}}{ce{}{}}`{{{f{c}}}{{f{e}}}{}{}}{{{f{bc}}}{{f{be}}}{}{}}{{{f{{Kf{c}}}}}{{Kf{c}}}{KhEh}}{{{f{c}}{f{be}}}j{}{}}{{{f{c}}}j{}}{{{f{bCl}}}{{Bl{jCn}}}}{{}{{Kf{c}}}{KjEh}}{Db{{f{c}}}{}}{{{f{{Kf{c}}}}}fEh}{Db{{f{bc}}}{}}{{{f{c}}{f{be}}}{{Bl{{Df{gi}}}}}{}{}{}{}}{c{{Bl{{Kf{e}}}}}Dd{EhKl}}{Dbj}{{{f{{Kf{c}}}}{f{{Kf{c}}}}}n{KnEh}}{{{f{c}}{f{e}}}n{}{}}0000{{{f{{Kf{c}}}}{f{bCl}}}{{Bl{jCn}}}Eh}{cc{}}{{{f{c}}}{{Bl{HfHh}}}{}}{{{f{c}}{f{e}}}Gf{HjDj}Hl}{{{f{{Kf{c}}}}{f{be}}}j{HjEh}Hn}{{}Db}{ce{}{}}{{{Kf{c}}}{{Bf{c}}}Eh}{{}{{Bl{IdIf}}}}{{{Bf{c}}}{{Bl{{Kf{c}}L`}}}Eh}{{{f{c}}Hf}{{Bl{{Jb{e}}Hh}}}{}Jd}{f}{{{f{{Kf{c}}}}e}Bl{EhLb}Jj}{{{f{bc}}{Jb{e}}}{{Bl{jHh}}}{}Jd}{{{f{c}}}e{}{}}{c{{Bl{e}}}{}{}}0{{{f{c}}}Jn{}}:`{{{f{c}}}{{f{e}}}{}{}}{{{f{bc}}}{{f{be}}}{}{}}`{{{f{Dn}}}Dn}{{{f{c}}{f{be}}}j{}{}}{{{f{c}}}j{}}`{{{f{bCl}}}{{Bl{jCn}}}}{Db{{f{c}}}{}}{Db{{f{bc}}}{}}{{{f{c}}{f{be}}}{{Bl{{Df{gi}}}}}{}{}{}{}}{c{{Bl{Dn}}}Dd}{Dbj}{{{f{Dn}}{f{Dn}}}n}{{{f{c}}{f{e}}}n{}{}}0000`{{{f{Dn}}{f{bCl}}}{{Bl{jCn}}}}{cc{}}{Ld{{Bl{DnEn}}}}{{{f{c}}}{{Bl{HfHh}}}{}}{{}Db}{ce{}{}}{{}{{Bl{IdIf}}}}{{{f{c}}Hf}{{Bl{{Jb{e}}Hh}}}{}Jd}`{f}`{{{f{Dn}}c}BlJj}{{{f{bc}}{Jb{e}}}{{Bl{jHh}}}{}Jd}`{{{f{c}}}e{}{}}{c{{Bl{e}}}{}{}}0{{{f{c}}}Jn{}}8","D":"ACb","p":[[0,"mut"],[5,"SecurityTetraplet",0,848],[1,"reference"],[1,"str"],[1,"unit"],[5,"SoftLimitsTriggering",0,849],[1,"bool"],[10,"Error",850],[5,"AVM",0,851],[5,"ParticleParameters",0,852],[8,"CallResults",0,853],[6,"KeyPair",854],[5,"AVMOutcome",0,855],[8,"AVMResult",0],[10,"WasmBackend",856],[5,"String",857],[10,"Into",858],[1,"u8"],[5,"Vec",859],[17,"Error"],[10,"DataStore",0,860],[6,"Result",861],[5,"AnomalyData",0,860],[5,"CallRequestParams",0,862],[5,"CallServiceResult",0,853],[5,"AquaVMRuntimeLimits",0,863],[5,"ErrorAVMOutcome",0,855],[6,"IType",0,864],[6,"IValue",0,865],[5,"Formatter",866],[5,"Error",866],[5,"AVMRuntimeLimits",0,863],[1,"usize"],[10,"Deserializer",867],[5,"With",868],[10,"Fallible",869],[10,"Sized",870],[5,"Duration",871],[5,"RawAVMOutcome",808,872],[1,"i32"],[6,"Value",873],[6,"AVMError",0,874],[8,"Result",866],[10,"Debug",866],[10,"Display",866],[6,"RunnerError",0,874],[6,"CallSeDeErrors",0,875],[6,"HostImportError",0,876],[5,"ResolvedTriplet",877],[1,"never"],[6,"MarineError",878],[1,"i64"],[1,"i8"],[1,"u16"],[1,"f64"],[1,"u32"],[1,"i16"],[1,"f32"],[1,"u64"],[6,"RecordResolvableError",879],[6,"LoError",880],[5,"FromUtf8Error",857],[6,"LiError",881],[5,"OwnedFd",882],[10,"IntoFilelike",883],[10,"IntoSocketlike",883],[5,"FdFlags",884],[5,"Error",885],[10,"Hash",886],[10,"BuildHasher",886],[10,"Hasher",886],[5,"CallServiceResult",887],[5,"HashMap",888],[5,"Layout",889],[5,"LayoutError",889],[5,"AVMMemoryStats",0,863],[1,"slice"],[5,"AVMConfig",0,890],[6,"Option",891],[6,"Cow",892],[5,"SetFdFlags",884],[10,"AsFilelike",883],[5,"Parser",893],[5,"Error",894],[10,"Serializer",895],[10,"Write",896],[5,"TypeId",897],[5,"AVMRunner",737,863],[8,"RunnerResult",0],[5,"PathBuf",898],[5,"NEVec",769,899],[10,"Clone",900],[10,"Default",901],[10,"Deserialize",867],[10,"PartialEq",902],[5,"EmptyVec",899],[10,"Serialize",895],[5,"InterpreterOutcome",849],[8,"HostImportDescriptor",0],[15,"CallParamsArgsDeFailed",726],[15,"CallParamsTetrapletsDeFailed",726],[15,"CallResultsSeFailed",726],[15,"CallRequestsDeError",726],[15,"InvalidAIRPath",734]],"r":[[0,851],[1,890],[3,874],[4,863],[5,855],[7,863],[8,860],[10,863],[18,853],[21,862],[22,862],[24,853],[26,875],[28,853],[29,860],[34,855],[39,903],[40,903],[41,876],[46,864],[47,865],[61,852],[65,874],[76,848],[77,849],[496,853],[524,904],[583,875],[737,863],[738,872],[769,899],[808,872]],"b":[[261,"impl-Deserialize%3C\'de%3E-for-SecurityTetraplet"],[262,"impl-Deserialize%3CSecurityTetraplet,+__D%3E-for-%3CSecurityTetraplet+as+Archive%3E::Archived"],[360,"impl-Debug-for-SecurityTetraplet"],[361,"impl-Display-for-SecurityTetraplet"],[362,"impl-Display-for-CallServiceResult"],[363,"impl-Debug-for-CallServiceResult"],[364,"impl-Debug-for-AVMError%3CE%3E"],[365,"impl-Display-for-AVMError%3CE%3E"],[366,"impl-Debug-for-RunnerError"],[367,"impl-Display-for-RunnerError"],[374,"impl-Debug-for-CallSeDeErrors"],[375,"impl-Display-for-CallSeDeErrors"],[377,"impl-Display-for-HostImportError"],[378,"impl-Debug-for-HostImportError"],[390,"impl-From%3CCallSeDeErrors%3E-for-RunnerError"],[391,"impl-From%3CMarineError%3E-for-RunnerError"],[402,"impl-From%3Ci64%3E-for-IValue"],[403,"impl-From%3Ci8%3E-for-IValue"],[404,"impl-From%3Cu16%3E-for-IValue"],[406,"impl-From%3Cf64%3E-for-IValue"],[407,"impl-From%3CVec%3Cu8%3E%3E-for-IValue"],[408,"impl-From%3Cu32%3E-for-IValue"],[409,"impl-From%3Ci16%3E-for-IValue"],[410,"impl-From%3Ci32%3E-for-IValue"],[411,"impl-From%3Cf32%3E-for-IValue"],[412,"impl-From%3Cu64%3E-for-IValue"],[413,"impl-From%3CString%3E-for-IValue"],[414,"impl-From%3Cu8%3E-for-IValue"],[415,"impl-From%3CRecordResolvableError%3E-for-HostImportError"],[416,"impl-From%3CLoError%3E-for-HostImportError"],[418,"impl-From%3CFromUtf8Error%3E-for-HostImportError"],[419,"impl-From%3CLiError%3E-for-HostImportError"],[591,"impl-Serialize-for-SecurityTetraplet"],[592,"impl-Serialize%3C__S%3E-for-SecurityTetraplet"]],"c":"OjAAAAAAAAA=","e":"OzAAAAEAALcCOQAAAAEAAwABAAYAAwALAAAAEwAAABcAAAAZAAAAGwAAACIAAQAoAAIANQAAADcAAQBBAAEARAAAAFkABgBiAAAAZQAsAJUAAQCZACUAwABbAB0BRQBkAQEAZwEUAIEBAACEAQEAhwEBAIsBAACTAQIAlwEKAKMBCACuARQAxQEBAMgBFADwARQACQIAAA0CAQAQAhgAKgIBAC0CAgAyAgAANAIXAE4CCwBcAhIAcAIDAHUCEwCKAlgA5AILAPECAQD0AgEA9wIKAAMDEwAYAwMAHgMAACADCAAqAxQAQAMCAEQDDAA="}],\ +["polyplets",{"t":"FFNNNNNNNNNNNNNNNNNNNNNNNNNNNNOONNNNNNNNONNOONNNNNNNNNOONNNNNNNNN","n":["ResolvedTriplet","SecurityTetraplet","add_lens","borrow","borrow","borrow_mut","borrow_mut","clone","clone","clone_into","clone_into","clone_to_uninit","clone_to_uninit","default","default","deserialize","deserialize","deserialize","deserialize","deserialize","eq","eq","equivalent","equivalent","fmt","fmt","fmt","from","from","from","function_name","function_name","get_hash","get_hash","hash","hash","into","into","layout_raw","layout_raw","lens","literal_tetraplet","new","peer_pk","peer_pk","pointer_metadata","pointer_metadata","resolve","resolve_metadata","serialize","serialize","serialize","serialize_metadata","serialize_unsized","service_id","service_id","to_owned","to_owned","to_string","try_from","try_from","try_into","try_into","type_id","type_id"],"q":[[0,"polyplets"],[65,"marine_call_parameters"],[66,"polyplets::triplet"],[67,"rkyv::with"],[68,"core::result"],[69,"serde::de"],[70,"rkyv"],[71,"core::marker"],[72,"core::fmt"],[73,"core::hash"],[74,"core::alloc::layout"],[75,"alloc::string"],[76,"core::convert"],[77,"serde::ser"],[78,"core::any"]],"i":[0,0,2,6,2,6,2,6,2,6,2,6,2,6,2,6,6,2,2,2,6,2,6,2,6,2,2,6,2,2,6,2,6,2,6,2,6,2,6,2,2,2,2,6,2,6,2,2,2,6,2,2,2,2,6,2,6,2,2,6,2,6,2,6,2],"f":"``{{{f{bd}}{f{h}}}j}{{{f{c}}}{{f{e}}}{}{}}0{{{f{bc}}}{{f{be}}}{}{}}0{{{f{l}}}l}{{{f{d}}}d}{{{f{c}}{f{be}}}j{}{}}0{{{f{c}}}j{}}0{{}l}{{}d}{{{f{c}}{f{be}}}{{A`{{n{gi}}}}}{}{}{}{}}{c{{A`{l}}}Ab}{c{{A`{d}}}Ab}2{{f{f{bc}}}{{A`{d}}}{AdAf}}{{{f{l}}{f{l}}}Ah}{{{f{d}}{f{d}}}Ah}{{{f{c}}{f{e}}}Ah{}{}}0{{{f{l}}{f{bAj}}}Al}{{{f{d}}{f{bAj}}}{{A`{jAn}}}}0{cc{}}{ld}1``{{{f{c}}{f{e}}}B`{BbAf}Bd}0{{{f{l}}{f{bc}}}jBf}{{{f{d}}{f{bc}}}jBf}{ce{}{}}0{{}{{A`{BhBj}}}}0`{cd{{Bn{Bl}}}}{{cegi}d{{Bn{Bl}}}{{Bn{Bl}}}{{Bn{Bl}}}{{Bn{Bl}}}}``{f}0{{{f{d}}C`}j}{{{f{c}}C`}j{}}{{{f{l}}c}A`Cb}{{{f{d}}c}A`Cb}{{{f{d}}{f{bc}}}A`{AdAf}}{{{f{c}}{f{be}}}{{A`{j}}}{}{}}{{{f{c}}{f{be}}}{{A`{C`}}}{}{}}``{{{f{c}}}e{}{}}0{{{f{c}}}Bl{}}{c{{A`{e}}}{}{}}000{{{f{c}}}Cd{}}0","D":"Af","p":[[0,"mut"],[5,"SecurityTetraplet",0,65],[1,"reference"],[1,"str"],[1,"unit"],[5,"ResolvedTriplet",0,66],[5,"With",67],[6,"Result",68],[10,"Deserializer",69],[10,"Fallible",70],[10,"Sized",71],[1,"bool"],[5,"Formatter",72],[8,"Result",72],[5,"Error",72],[1,"u64"],[10,"Hash",73],[10,"BuildHasher",73],[10,"Hasher",73],[5,"Layout",74],[5,"LayoutError",74],[5,"String",75],[10,"Into",76],[1,"usize"],[10,"Serializer",77],[5,"TypeId",78]],"r":[[0,66],[1,65]],"b":[[17,"impl-Deserialize%3C\'de%3E-for-SecurityTetraplet"],[19,"impl-Deserialize%3CSecurityTetraplet,+__D%3E-for-%3CSecurityTetraplet+as+Archive%3E::Archived"],[25,"impl-Display-for-SecurityTetraplet"],[26,"impl-Debug-for-SecurityTetraplet"],[50,"impl-Serialize-for-SecurityTetraplet"],[51,"impl-Serialize%3C__S%3E-for-SecurityTetraplet"]],"c":"OjAAAAAAAAA=","e":"OzAAAAEAADYACQAAAAAAAwAYAB0AAAAfAAAAIQADACcAAQArAAEALgAJADkACAA="}]\ +]')); +if (typeof exports !== 'undefined') exports.searchIndex = searchIndex; +else if (window.initSearch) window.initSearch(searchIndex); diff --git a/search.desc/air/air-desc-0-.js b/search.desc/air/air-desc-0-.js new file mode 100644 index 00000000..9ad36bad --- /dev/null +++ b/search.desc/air/air-desc-0-.js @@ -0,0 +1 @@ +searchState.loadedDescShard("air", 0, "Returns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nReturns the argument unchanged.\nCalls U::from(self).\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nReturns the argument unchanged.\nCalls U::from(self).\nReturns the argument unchanged.\nCalls U::from(self).\nReturns the argument unchanged.\nCalls U::from(self).\nReturns the argument unchanged.\nCalls U::from(self).\nThis struct is used to set limits for the test runner …\nReturns the argument unchanged.\nCalls U::from(self).\nReturns the argument unchanged.\nCalls U::from(self).\nReturns the argument unchanged.\nCalls U::from(self).\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nReturns the argument unchanged.\nCalls U::from(self).") \ No newline at end of file diff --git a/search.desc/air_beautifier/air_beautifier-desc-0-.js b/search.desc/air_beautifier/air_beautifier-desc-0-.js new file mode 100644 index 00000000..c29007b7 --- /dev/null +++ b/search.desc/air_beautifier/air_beautifier-desc-0-.js @@ -0,0 +1 @@ +searchState.loadedDescShard("air_beautifier", 0, "AIR beautifier.\nError produced by the Beautifier.\nBeautify the air_script with default settings to the output…\nEmit beautified code for the air_script.\nEmit beautified code for the ast.\nBeautify the air_script to a string with default settings. …\nEnable all patterns in the emited code.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nUnwrap the Beautifier into the underlying writer.\nBeautifier for the output with default indentation step.\nBeautifier for the output with custom indentation step.") \ No newline at end of file diff --git a/search.desc/air_beautify_wasm/air_beautify_wasm-desc-0-.js b/search.desc/air_beautify_wasm/air_beautify_wasm-desc-0-.js new file mode 100644 index 00000000..a6712200 --- /dev/null +++ b/search.desc/air_beautify_wasm/air_beautify_wasm-desc-0-.js @@ -0,0 +1 @@ +searchState.loadedDescShard("air_beautify_wasm", 0, "") \ No newline at end of file diff --git a/search.desc/air_execution_info_collector/air_execution_info_collector-desc-0-.js b/search.desc/air_execution_info_collector/air_execution_info_collector-desc-0-.js new file mode 100644 index 00000000..e54a54a3 --- /dev/null +++ b/search.desc/air_execution_info_collector/air_execution_info_collector-desc-0-.js @@ -0,0 +1 @@ +searchState.loadedDescShard("air_execution_info_collector", 0, "Intended to track a number of executed instruction of each …\nMapping from a new instruction position in a script to a …\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).") \ No newline at end of file diff --git a/search.desc/air_interpreter_cid/air_interpreter_cid-desc-0-.js b/search.desc/air_interpreter_cid/air_interpreter_cid-desc-0-.js new file mode 100644 index 00000000..830b72ae --- /dev/null +++ b/search.desc/air_interpreter_cid/air_interpreter_cid-desc-0-.js @@ -0,0 +1 @@ +searchState.loadedDescShard("air_interpreter_cid", 0, "An archived CID\nThe resolver for an archived CID\nShould-be-opaque type for the inner representation of CID. …\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalculate a CID of JSON-serialized value.") \ No newline at end of file diff --git a/search.desc/air_interpreter_client/air_interpreter_client-desc-0-.js b/search.desc/air_interpreter_client/air_interpreter_client-desc-0-.js new file mode 100644 index 00000000..00df192a --- /dev/null +++ b/search.desc/air_interpreter_client/air_interpreter_client-desc-0-.js @@ -0,0 +1 @@ +searchState.loadedDescShard("air_interpreter_client", 0, "") \ No newline at end of file diff --git a/search.desc/air_interpreter_data/air_interpreter_data-desc-0-.js b/search.desc/air_interpreter_data/air_interpreter_data-desc-0-.js new file mode 100644 index 00000000..9c6d559f --- /dev/null +++ b/search.desc/air_interpreter_data/air_interpreter_data-desc-0-.js @@ -0,0 +1 @@ +searchState.loadedDescShard("air_interpreter_data", 0, "The resolver for ExecutedState::Ap\nThe archived counterpart of ExecutedState::Ap\nDescribes result of applying functor apply to streams.\nThe resolver for an archived ApResult\nAn archived ApResult\nAn archived CallResult\nAn archived CallServiceFailed\nAn archived CanonCidAggregate\nAn archived CanonResult\nAn archived CanonResultCidAggregate\nAn archived CidInfo\nAn archived CidStore\nAn archived ExecutedState\nAn archived ExecutionTrace\nAn archived FoldResult\nAn archived FoldSubTraceLore\nAn archived GenerationIdx\nAn archived InterpreterData\nAn archived ParResult\nAn archived Provenance\nAn archived RawValue\nAn archived Sender\nAn archived ServiceResultCidAggregate\nAn archived SubTraceDesc\nAn archived TracePos\nAn archived ValueRef\nThe resolver for ExecutedState::Call\nThe archived counterpart of ExecutedState::Call\nThe resolver for an archived CallResult\nThe resolver for an archived CallServiceFailed\nThe resolver for Provenance::Canon\nThe archived counterpart of Provenance::Canon\nThe resolver for ExecutedState::Canon\nThe archived counterpart of ExecutedState::Canon\nThe type Canon trace CID refers to.\nThe resolver for an archived CanonCidAggregate\nContains ids of element that were on a stream at the …\nThe resolver for an archived CanonResultCidAggregate\nThe resolver for an archived CanonResult\nThe resolver for an archived CidInfo\nStores CID to Value corresponance.\nThe resolver for an archived CidStore\nThe resolver for CallResult::Executed\nThe archived counterpart of CallResult::Executed\nA corresponding call’s been already executed with such …\nThe resolver for CanonResult::Executed\nThe archived counterpart of CanonResult::Executed\nThe resolver for an archived ExecutedState\nThe resolver for an archived ExecutionTrace\nThe resolver for CallResult::Failed\nThe archived counterpart of CallResult::Failed\nThe call returned a service error.\nThe resolver for ExecutedState::Fold\nThe archived counterpart of ExecutedState::Fold\nThis type represents all information in an execution trace …\nThe resolver for an archived FoldResult\nLet’s consider an example of trace that could be …\nThe resolver for an archived FoldSubTraceLore\nThe resolver for an archived GenerationIdx\nThe AIR interpreter could be considered as a function …\nAn envelope for the AIR interpreter data that makes AIR …\nThe resolver for an archived InterpreterData\nThe resolver for Provenance::Literal\nThe archived counterpart of Provenance::Literal\nThe resolver for ExecutedState::Par\nThe archived counterpart of ExecutedState::Par\nThe resolver for an archived ParResult\nThe resolver for Sender::PeerId\nThe archived counterpart of Sender::PeerId\nThe resolver for Sender::PeerIdWithCallId\nThe archived counterpart of Sender::PeerIdWithCallId\nThe resolver for an archived Provenance\nThe resolver for an archived RawValue\nThe resolver for CallResult::RequestSentBy\nThe archived counterpart of CallResult::RequestSentBy\nRequest was sent to a target node by node with such public …\nThe resolver for CanonResult::RequestSentBy\nThe archived counterpart of CanonResult::RequestSentBy\nRequest was sent to a target node by node with such public …\nThe resolver for ValueRef::Scalar\nThe archived counterpart of ValueRef::Scalar\nThe call value is stored to a scalar variable.\nThe resolver for an archived Sender\nThe resolver for Provenance::ServiceResult\nThe archived counterpart of Provenance::ServiceResult\nA proof of service result execution result.\nThe resolver for an archived ServiceResultCidAggregate\nThe resolver for ValueRef::Stream\nThe archived counterpart of ValueRef::Stream\nThe call value is stored to a stream variable.\nDescriptor of a subtrace inside execution trace.\nThe resolver for an archived SubTraceDesc\nThe resolver for an archived TracePos\nThe resolver for ValueRef::Unused\nThe archived counterpart of ValueRef::Unused\nThe call value is not stored.\nThe resolver for an archived ValueRef\nThe archived counterpart of …\nHash of the call arguments.\nThe archived counterpart of SubTraceDesc::begin_pos\nStart position in a trace of this subtrace.\nThe archived counterpart of CidInfo::canon_element_store\nMap CID to a canon element value.\nThe archived counterpart of CidInfo::canon_result_store\nMap CID to a canon result.\nThe archived counterpart of InterpreterData::cid_info\nCID-to-somethings mappings.\nVersion of this data format.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nVersion of an interpreter produced this data.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nThe archived counterpart of …\nLast exposed to a peer call request id. All next call …\nThe archived counterpart of ParResult::left_size\nThe archived counterpart of FoldResult::lore\nThe archived counterpart of CallServiceFailed::message\nThis field contains a JSON-serialized value, not a plain …\nThe archived counterpart of CanonCidAggregate::provenance\nThe archived counterpart of ApResult::res_generations\nThe archived counterpart of CallServiceFailed::ret_code\nThe archived counterpart of ParResult::right_size\nThe archived counterpart of CidInfo::service_result_store\nMap CID to a service result aggregate.\nThe archived counterpart of InterpreterData::signatures\nSignature store.\nReturns a size of subtrace that this par describes in …\nThe archived counterpart of SubTraceDesc::subtrace_len\nLength of the subtrace.\nThe archived counterpart of …\nDescriptors of a subtrace that are corresponded to the …\nThe archived counterpart of …\nThe archived counterpart of CanonCidAggregate::tetraplet\nThe archived counterpart of …\nThe tetraplet of the call result.\nThe archived counterpart of CidInfo::tetraplet_store\nMap CID to a tetraplet.\nThe archived counterpart of InterpreterData::trace\nTrace of AIR execution, which contains executed call, par, …\nTries to de InterpreterData from slice according to the …\nThe archived counterpart of CanonCidAggregate::value\nThe archived counterpart of …\nThe archived counterpart of FoldSubTraceLore::value_pos\nPosition of current value in a trace.\nThe archived counterpart of CidInfo::value_store\nMap CID to value.\nThe archived counterpart of CanonResultCidAggregate::values\nVersions of data and an interpreter produced this data.\nThe archived counterpart of Provenance::ServiceResult::cid\nThe archived counterpart of Provenance::Canon::cid\nThe archived counterpart of …\nThe archived counterpart of …\nThe archived counterpart of ValueRef::Stream::cid\nThe archived counterpart of ValueRef::Stream::generation\nThe resolver for Provenance::ServiceResult::cid\nThe resolver for Provenance::Canon::cid\nThe resolver for Sender::PeerIdWithCallId::call_id\nThe resolver for Sender::PeerIdWithCallId::peer_id\nThe resolver for ValueRef::Stream::cid\nThe resolver for ValueRef::Stream::generation\nAn util for verificating particular data’s signatures.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nFor each peer, merge previous and current CID multisets by …\nVerify each peers’ signatures.") \ No newline at end of file diff --git a/search.desc/air_interpreter_interface/air_interpreter_interface-desc-0-.js b/search.desc/air_interpreter_interface/air_interpreter_interface-desc-0-.js new file mode 100644 index 00000000..701a9c53 --- /dev/null +++ b/search.desc/air_interpreter_interface/air_interpreter_interface-desc-0-.js @@ -0,0 +1 @@ +searchState.loadedDescShard("air_interpreter_interface", 0, "Contains arguments of a call instruction and all other …\nThis is a map from a String to a service result for …\nRepresents an executed host function result.\nDescribes a result returned at the end of the interpreter …\nThese are RAM consumption related limits to be enforced by …\nParameters that a host side should pass to an interpreter …\nThis stores soft limits triggering flags.\nThe AIR script size limit.\nThis flag signals that AIR script size exceeds the limit.\nSerialized to JSON string Vec of arguments that should be …\nCollected parameters of all met call instructions that …\nThis is the limit for the size of service call result.\nThis flag signals that call result size exceeds the limit.\nPeer id of a current peer.\nContains script data that should be preserved in an …\nContains error message if ret_code != INTERPRETER_SUCCESS.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nName of a function from service identified by service_id …\nThis knob controls hard RAM limits behavior for AVMRunner.\nPeer id of a peer that start this particle.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nA key format.\nPublic keys of peers that should receive data.\nUnique particle ID.\nThe particle data size limit.\nThis flag signals that particle data size exceeds the …\nResulted JValue serialized to a string. It’s impossible …\nA error code service or builtin returned, where …\nA return code, where INTERPRETER_SUCCESS means success.\nA secret key material.\nId of a service that should be called.\nSerialized to JSON string Vec<Vec> that should be passed …\nUnix timestamp from a particle in milliseconds. It …\nTTL set by init peer id in milliseconds.") \ No newline at end of file diff --git a/search.desc/air_interpreter_sede/air_interpreter_sede-desc-0-.js b/search.desc/air_interpreter_sede/air_interpreter_sede-desc-0-.js new file mode 100644 index 00000000..8ad5046b --- /dev/null +++ b/search.desc/air_interpreter_sede/air_interpreter_sede-desc-0-.js @@ -0,0 +1 @@ +searchState.loadedDescShard("air_interpreter_sede", 0, "Borrow deserialization trait restricted to for particular …\nOwned deserialization trait restricted to for particular …\nA formatter intended for particular type, a base type that …\nSerialization trait restricted to for particular type.\nWriting deserialization trait restricted to for particular …\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).") \ No newline at end of file diff --git a/search.desc/air_interpreter_server/air_interpreter_server-desc-0-.js b/search.desc/air_interpreter_server/air_interpreter_server-desc-0-.js new file mode 100644 index 00000000..c7c87a36 --- /dev/null +++ b/search.desc/air_interpreter_server/air_interpreter_server-desc-0-.js @@ -0,0 +1 @@ +searchState.loadedDescShard("air_interpreter_server", 0, "Like ast, this function is intended to be run localy by …\nParse AIR script and return it as minified JSON") \ No newline at end of file diff --git a/search.desc/air_interpreter_signatures/air_interpreter_signatures-desc-0-.js b/search.desc/air_interpreter_signatures/air_interpreter_signatures-desc-0-.js new file mode 100644 index 00000000..3a12a2d8 --- /dev/null +++ b/search.desc/air_interpreter_signatures/air_interpreter_signatures-desc-0-.js @@ -0,0 +1 @@ +searchState.loadedDescShard("air_interpreter_signatures", 0, "An archived PublicKey\nAn archived Signature\nAn archived SignatureStore\nIdentity keypair of a node.\nThe tracker that collect current peer’s CIDs only.\nAn opaque serializable representation of a public key.\nThe resolver for an archived PublicKey\nAn opaque serializable representation of signature key.\nThe resolver for an archived Signature\nA dictionary-like structure that stores peer public keys …\nThe resolver for an archived SignatureStore\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).") \ No newline at end of file diff --git a/search.desc/air_interpreter_value/air_interpreter_value-desc-0-.js b/search.desc/air_interpreter_value/air_interpreter_value-desc-0-.js new file mode 100644 index 00000000..74c6ac86 --- /dev/null +++ b/search.desc/air_interpreter_value/air_interpreter_value-desc-0-.js @@ -0,0 +1 @@ +searchState.loadedDescShard("air_interpreter_value", 0, "Represents a JSON array.\nRepresents a JSON boolean.\nRepresents any valid JSON value with a cheap to clone …\nRepresents a JSON null value.\nRepresents a JSON number, whether integer or floating …\nRepresents a JSON object.\nRepresents a JSON string.\nIf the JValue is an Array, returns the associated vector. …\nIf the JValue is a Boolean, returns the associated bool. …\nIf the JValue is a number, represent it as f64 if …\nIf the JValue is an integer, represent it as i64 if …\nIf the JValue is a Null, returns (). Returns None …\nIf the JValue is a Number, returns the associated Number. …\nIf the JValue is an Object, returns the associated Map. …\nIf the JValue is a string, returns the associated str. …\nIf the JValue is an integer, represent it as u64 if …\nDisplay a JSON value as a string.\nReturns the argument unchanged.\nConvert map (with string keys) to JValue::Object.\nConvert serde_json::Number to JValue::Number.\nConvert String to JValue::String.\nConvert map (with string keys) to JValue::Object.\nConvert boolean to JValue::Bool.\nConvert a slice to JValue::Array.\nConvert copy-on-write string to JValue::String.\nConvert 64-bit floating point number to JValue::Number, or …\nConvert a Vec to JValue::Array.\nConvert 32-bit floating point number to JValue::Number, or …\nConvert string slice to JValue::String.\nConvert () to JValue::Null.\nConvert JsonString to JValue::String.\nCreate a JValue::Object by collecting an iterator of …\nCreate a JValue::Array by collecting an iterator of array …\nIndex into a JSON array or map. A string index can be used …\nIndex into a air_interpreter_value::JValue using the …\nCalls U::from(self).\nReturns true if the JValue is an Array. Returns false …\nReturns true if the JValue is a Boolean. Returns false …\nReturns true if the JValue is a number that can be …\nReturns true if the JValue is an integer between i64::MIN …\nReturns true if the JValue is a Null. Returns false …\nReturns true if the JValue is a Number. Returns false …\nReturns true if the JValue is an Object. Returns false …\nReturns true if the JValue is a String. Returns false …\nReturns true if the JValue is an integer between zero and …\nLooks up a value by a JSON Pointer.\nTakes the value out of the JValue, leaving a Null in its …") \ No newline at end of file diff --git a/search.desc/air_lambda_ast/air_lambda_ast-desc-0-.js b/search.desc/air_lambda_ast/air_lambda_ast-desc-0-.js new file mode 100644 index 00000000..3c936e55 --- /dev/null +++ b/search.desc/air_lambda_ast/air_lambda_ast-desc-0-.js @@ -0,0 +1 @@ +searchState.loadedDescShard("air_lambda_ast", 0, "Various functors that could applied to a value.\nReturns a length of a value if this value has array type …\nEach value in AIR could be represented as a tree and this …\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).") \ No newline at end of file diff --git a/search.desc/air_lambda_parser/air_lambda_parser-desc-0-.js b/search.desc/air_lambda_parser/air_lambda_parser-desc-0-.js new file mode 100644 index 00000000..3bcc8aa6 --- /dev/null +++ b/search.desc/air_lambda_parser/air_lambda_parser-desc-0-.js @@ -0,0 +1 @@ +searchState.loadedDescShard("air_lambda_parser", 0, "Various functors that could applied to a value.\nReturns a length of a value if this value has array type …\nEach value in AIR could be represented as a tree and this …\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nParse AIR lambda ast to LambdaAST") \ No newline at end of file diff --git a/search.desc/air_log_targets/air_log_targets-desc-0-.js b/search.desc/air_log_targets/air_log_targets-desc-0-.js new file mode 100644 index 00000000..f9109e33 --- /dev/null +++ b/search.desc/air_log_targets/air_log_targets-desc-0-.js @@ -0,0 +1 @@ +searchState.loadedDescShard("air_log_targets", 0, "Print out data cache at the beginning of each instruction …\nPrint out state of data cache at the beginning of each …\nPrint out logs at the executed states merging stage.\nPrint out each instruction name at the beginning of its …\nPrint log if call is postponed due the join behaviour.\nPrint out state of data cache at the beginning of each …\nPrint out next_peer_pks at the beginning of each …\nPrint out running arguments and params of a script.\nPrint out subgraph_complete value at the beginning of each …\nPrint out count of element in the current subgraph at the …\nThis map should be used by rust-sdk logger that allows …") \ No newline at end of file diff --git a/search.desc/air_parser/air_parser-desc-0-.js b/search.desc/air_parser/air_parser-desc-0-.js new file mode 100644 index 00000000..a27bbcb0 --- /dev/null +++ b/search.desc/air_parser/air_parser-desc-0-.js @@ -0,0 +1 @@ +searchState.loadedDescShard("air_parser", 0, "Character position in the AIR script text.\nIntermediate implementation of variable validator.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nParse AIR source_code to Box<Instruction>\n(ap argument result)\n(ap key value %map)\n(call (peer part of a triplet: PeerPart) (function part of …\n(canon peer_id $stream #canon_stream)\n(canon peer_id %stream_map #%canon_stream_map)\nA canonicalized stream without a lambda.\nA canonicalized stream map without a lambda.\n(canon peer_id %stream_map scalar)\nA canonicalized stream map with a lambda.\nA canonicalized stream with a lambda.\n(fail 1337 “error message”) (fail %last_error%) (fail …\n(fold scalar_iterable iterator instruction)\n(fold stream_iterable iterator instruction)\n(fold stream_map_iterable iterator instruction)\nRepresents all immutable values that is possible to set in …\nA variable that could be either scalar or stream without …\nA variable that could be either scalar or stream with …\nAn error wrapper with an optional lens.\n(match left_value right_value instruction)\n(mismatch left_value right_value instruction)\n(never)\n(new variable instruction)\n(fold stream_iterable iterator instruction)\n(null)\n(par instruction instruction)\nContains all variable variants that could be resolved to a …\nContains all variable variants that could be resolved to a …\nA scalar value without a lambda.\nA scalar value with a lambda expression.\n(seq instruction instruction)\nA stream without a lambda.\nA map based on top of a stream.\nTriplet represents a location of the executable code in …\n(xor instruction instruction)\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).") \ No newline at end of file diff --git a/search.desc/air_test_framework/air_test_framework-desc-0-.js b/search.desc/air_test_framework/air_test_framework-desc-0-.js new file mode 100644 index 00000000..29c3af0f --- /dev/null +++ b/search.desc/air_test_framework/air_test_framework-desc-0-.js @@ -0,0 +1 @@ +searchState.loadedDescShard("air_test_framework", 0, "Some known service by name: “echo”, “unit” (more …\nSome known service by name: “echo”, “unit” (more …\nSame services as defined by the enum element above with …\nSame services as defined by the enum element above with …\nSimple service that returns same call result (i.e. may …\nSimple service that returns same call result (i.e. may …\nMaps first argument to a value\nMaps first argument to a value\nSimple service that returns same value\nSimple service that returns same value\nService that may return a new value on subsequent call. …\nService that may return a new value on subsequent call. …\nService definition in the testing framework comment DSL.\nAuto-generated discriminant enum variants\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nAdd a peer with default neighborhood.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nNeighbors of particular node, including set of nodes …\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nA executor for an AIR script. Several executors may share …\nPush data into peer’s queue.\nProcess all queued datas, panicing on error.\nProcess one queued data, panicing if it is unavalable or …\nReturn Iterator for handling all the queued datas for …\nReturns the argument unchanged.\nSimple constructor where everything is generated from the …\nCalls U::from(self).\nCreate execution from the annotated air script.\nRepresents a JSON array.\nRepresents a JSON boolean.\nSomewhat modified type from fluence. The Duration defines …\nA mocked Marine service.\nRepresents a JSON null value.\nRepresents a JSON number, whether integer or floating …\nRepresents a JSON object.\nRepresents a JSON string.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nTransformed script represents transformed script’s …\nReturns the argument unchanged.\nCalls U::from(self).") \ No newline at end of file diff --git a/search.desc/air_test_utils/air_test_utils-desc-0-.js b/search.desc/air_test_utils/air_test_utils-desc-0-.js new file mode 100644 index 00000000..93735e5f --- /dev/null +++ b/search.desc/air_test_utils/air_test_utils-desc-0-.js @@ -0,0 +1 @@ +searchState.loadedDescShard("air_test_utils", 0, "Describes behaviour of the AVM.\nReturn statistic of AVM server Wasm module heap footprint.\nThis errors are encountered from serialization of data …\nThe resolver for ExecutedState::Ap\nThe archived counterpart of ExecutedState::Ap\nDescribes result of applying functor apply to streams.\nThe resolver for an archived ApResult\nAn archived ApResult\nAn archived CallResult\nAn archived CallServiceFailed\nAn archived CanonCidAggregate\nAn archived CanonResult\nAn archived CanonResultCidAggregate\nAn archived CidInfo\nAn archived CidStore\nAn archived ExecutedState\nAn archived ExecutionTrace\nAn archived FoldResult\nAn archived FoldSubTraceLore\nAn archived GenerationIdx\nAn archived InterpreterData\nAn archived ParResult\nAn archived Provenance\nAn archived RawValue\nAn archived Sender\nAn archived ServiceResultCidAggregate\nAn archived SubTraceDesc\nAn archived TracePos\nAn archived ValueRef\nAn array of values of the same type.\nA byte array.\nErrors from auxiliary calls.\nBoolean.\nBoolean value.\nSpecialization of arrays for byte vector.\nSpecialization of array type for byte vector.\nThe resolver for ExecutedState::Call\nThe archived counterpart of ExecutedState::Call\nErrors encountered while trying to deserialize arguments …\nErrors encountered while trying to deserialize tetraplets …\nContains arguments of a call instruction and all other …\nThis error is encountered when deserialization pof call …\nThe resolver for an archived CallResult\nErrors encountered while trying to serialize call results.\nThis errors are encountered from an call results/params …\nThe resolver for an archived CallServiceFailed\nRepresents an executed host function result.\nThe resolver for Provenance::Canon\nThe archived counterpart of Provenance::Canon\nThe resolver for ExecutedState::Canon\nThe archived counterpart of ExecutedState::Canon\nThe type Canon trace CID refers to.\nThe resolver for an archived CanonCidAggregate\nContains ids of element that were on a stream at the …\nThe resolver for an archived CanonResultCidAggregate\nThe resolver for an archived CanonResult\nThe resolver for an archived CidInfo\nStores CID to Value corresponance.\nThe resolver for an archived CidStore\nThis trait is used for\nThis errors are encountered from a data store object.\nContains the error value\nContains the error value\nThe resolver for CallResult::Executed\nThe archived counterpart of CallResult::Executed\nA corresponding call’s been already executed with such …\nThe resolver for CanonResult::Executed\nThe archived counterpart of CanonResult::Executed\nThe resolver for an archived ExecutedState\nThe resolver for an archived ExecutionTrace\nA 32-bits float.\nA 32-bits float.\nA 64-bits float.\nA 64-bits float.\nThe resolver for CallResult::Failed\nThe archived counterpart of CallResult::Failed\nThe call returned a service error.\nThe resolver for ExecutedState::Fold\nThe archived counterpart of ExecutedState::Fold\nThis type represents all information in an execution trace …\nThe resolver for an archived FoldResult\nLet’s consider an example of trace that could be …\nThe resolver for an archived FoldSubTraceLore\nThe resolver for an archived GenerationIdx\nA 32-bits integer (as defined in WebAssembly core).\nA 32-bits integer (as defined in WebAssembly core).\nA 64-bits integer (as defined in WebAssembly core).\nA 64-bits integer (as defined in WebAssembly core).\nRepresents the types supported by WIT.\nA WIT value.\nMarine call returns Vec to support multi-value in a future,\nThe AIR interpreter could be considered as a function …\nAn envelope for the AIR interpreter data that makes AIR …\nThe resolver for an archived InterpreterData\nThis error contains interpreter outcome in case when …\nAIR interpreter result deserialization errors.\nSpecified path to AIR interpreter .wasm file was invalid\nInvalid secret key.\nThe resolver for Provenance::Literal\nThe archived counterpart of Provenance::Literal\nThis errors are encountered from FaaS.\nAn error occurred when host functions tries to lift …\nAn error occurred when a host functions tries to lift …\nContains the success value\nContains the success value\nThe resolver for ExecutedState::Par\nThe archived counterpart of ExecutedState::Par\nThe resolver for an archived ParResult\nRepresents parameters obtained from a particle.\nThe resolver for Sender::PeerId\nThe archived counterpart of Sender::PeerId\nThe resolver for Sender::PeerIdWithCallId\nThe archived counterpart of Sender::PeerIdWithCallId\nThe resolver for an archived Provenance\nThis struct is very similar to AVMOutcome, but keeps …\nThe resolver for an archived RawValue\nA record contains record index from interfaces AST.\nA record.\nThe resolver for CallResult::RequestSentBy\nThe archived counterpart of CallResult::RequestSentBy\nRequest was sent to a target node by node with such public …\nThe resolver for CanonResult::RequestSentBy\nThe archived counterpart of CanonResult::RequestSentBy\nRequest was sent to a target node by node with such public …\nThis errors are encountered from an AVM runner.\nA 16-bits signed integer.\nA 16-bits signed integer.\nA 32-bits signed integer.\nA 32-bits signed integer.\nA 64-bits signed integer.\nA 64-bits signed integer.\nA 8-bits signed integer.\nA 8-bits signed integer.\nThe resolver for ValueRef::Scalar\nThe archived counterpart of ValueRef::Scalar\nThe call value is stored to a scalar variable.\nDescribes an origin that set corresponding value.\nThe resolver for an archived Sender\nThe resolver for Provenance::ServiceResult\nThe archived counterpart of Provenance::ServiceResult\nA proof of service result execution result.\nThe resolver for an archived ServiceResultCidAggregate\nThis stores soft limits triggering flags.\nThe resolver for ValueRef::Stream\nThe archived counterpart of ValueRef::Stream\nThe call value is stored to a stream variable.\nA string.\nA string.\nDescriptor of a subtrace inside execution trace.\nThe resolver for an archived SubTraceDesc\nThe resolver for an archived TracePos\nA 16-bits unsigned integer.\nA 16-bits unsigned integer.\nA 32-bits unsigned integer.\nA 32-bits unsigned integer.\nA 64-bits unsigned integer.\nA 64-bits unsigned integer.\nA 8-bits unsigned integer.\nA 8-bits unsigned integer.\nThe resolver for ValueRef::Unused\nThe archived counterpart of ValueRef::Unused\nThe call value is not stored.\nThe resolver for an archived ValueRef\nPath to a AIR interpreter Wasm file.\nNumber of allocations rejected due to memory limit. May be …\nThe archived counterpart of …\nHash of the call arguments.\nType of the closure arguments.\nArguments that should be passed to the function.\nThe archived counterpart of SubTraceDesc::begin_pos\nStart position in a trace of this subtrace.\nCollected parameters of all met call instructions that …\nThis is the limit for the size of service call result.\nThis is the limit for the size of service call result.\nThe archived counterpart of CidInfo::canon_element_store\nMap CID to a canon element value.\nThe archived counterpart of CidInfo::canon_result_store\nMap CID to a canon result.\nThe archived counterpart of InterpreterData::cid_info\nCID-to-somethings mappings.\nCleanup data that become obsolete.\nCleanup data that become obsolete.\nContains script data that should be preserved in an …\nVersion of this data format.\nReturns true if an anomaly happened and it’s necessary …\nIf Some, this closure is called with error when errors is …\nTime of a particle execution (it counts only execution …\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nName of a function from service identified by service_id …\nName of a function that returned corresponding value.\nThis knob controls hard RAM limits behavior for AVMRunner.\nThis knob controls hard RAM limits behavior for AVMRunner.\nThis closure will be invoked for corresponding import.\nVersion of an interpreter produced this data.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nThe archived counterpart of …\nLast exposed to a peer call request id. All next call …\nThe archived counterpart of ParResult::left_size\nValue was produced by applying this lens to the output …\nCreate a tetraplet for string literals defined in the …\nMask used to filter logs, for details see log_utf8_string …\nThe archived counterpart of FoldResult::lore\nMaximum heap size in bytes available for the interpreter.\nMemory in bytes AVM linear heap was extended during …\nSize of currently used linear memory in bytes. Please note …\nReturn memory stat of an interpreter heap.\nThe archived counterpart of CallServiceFailed::message\nThis field contains a JSON-serialized value, not a plain …\nCreate AVM with provided config.\nPublic keys of peers that should receive data.\nTypes of output of the closure.\nThe particle data size limit.\nThe particle data size limit.\nId of a peer where corresponding value was set.\nThe archived counterpart of CanonCidAggregate::provenance\nThe archived counterpart of ApResult::res_generations\nResulted JValue returned by a service string.\nA error code service or builtin returned, where …\nThe archived counterpart of CallServiceFailed::ret_code\nThe archived counterpart of ParResult::right_size\nId of a service that should be called.\nId of a service that set corresponding value.\nThe archived counterpart of CidInfo::service_result_store\nMap CID to a service result aggregate.\nThe archived counterpart of InterpreterData::signatures\nSignature store.\nReturns a size of subtrace that this par describes in …\nTo store and convey soft limits triggering flags.\nThe archived counterpart of SubTraceDesc::subtrace_len\nLength of the subtrace.\nThe archived counterpart of …\nDescriptors of a subtrace that are corresponded to the …\nThe archived counterpart of …\nThe archived counterpart of CanonCidAggregate::tetraplet\nThe archived counterpart of …\nThe tetraplet of the call result.\nThe archived counterpart of CidInfo::tetraplet_store\nMap CID to a tetraplet.\nTetraplets that should be passed to the service.\nPossibly set max memory size for AVM server.\nThe archived counterpart of InterpreterData::trace\nTrace of AIR execution, which contains executed call, par, …\nTries to de InterpreterData from slice according to the …\nPlease note that unused_tracked does not exist as unused …\nThe archived counterpart of CanonCidAggregate::value\nThe archived counterpart of …\nThe archived counterpart of FoldSubTraceLore::value_pos\nPosition of current value in a trace.\nThe archived counterpart of CidInfo::value_store\nMap CID to value.\nThe archived counterpart of CanonResultCidAggregate::values\nVersions of data and an interpreter produced this data.\nThe archived counterpart of Provenance::ServiceResult::cid\nThe archived counterpart of Provenance::Canon::cid\nThe archived counterpart of …\nThe archived counterpart of …\nThe archived counterpart of ValueRef::Stream::cid\nThe archived counterpart of ValueRef::Stream::generation\nThe resolver for Provenance::ServiceResult::cid\nThe resolver for Provenance::Canon::cid\nThe resolver for Sender::PeerIdWithCallId::call_id\nThe resolver for Sender::PeerIdWithCallId::peer_id\nThe resolver for ValueRef::Stream::cid\nThe resolver for ValueRef::Stream::generation\nThis struct is very similar to AVMOutcome, but keeps …\nReturns the argument unchanged.\nCalls U::from(self).\nCreate AVM with the provided config.\nManages which source will be used to choose a variable.\nReturns the argument unchanged.\nCalls U::from(self).\nThis function takes a JSON DSL-like struct for …\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nDerive fake keypair for testing proposes.\nReturns the argument unchanged.\nCalls U::from(self).\nNEVec<T> represents a non-empty Vec<T>. It derefs to Vec<T>\nReturns the argument unchanged.\nCalls U::from(self).\nConverts this NEVec into Vec\nCreates a new non-empty vector, based on an inner Vec<T>. …\nRepresents a JSON array.\nRepresents a JSON boolean.\nRepresents any valid JSON value with a cheap to clone …\nRepresents a JSON null value.\nRepresents a JSON number, whether integer or floating …\nRepresents a JSON object.\nRepresents a JSON string.\nIf the JValue is an Array, returns the associated vector. …\nIf the JValue is a Boolean, returns the associated bool. …\nIf the JValue is a number, represent it as f64 if …\nIf the JValue is an integer, represent it as i64 if …\nIf the JValue is a Null, returns (). Returns None …\nIf the JValue is a Number, returns the associated Number. …\nIf the JValue is an Object, returns the associated Map. …\nIf the JValue is a string, returns the associated str. …\nIf the JValue is an integer, represent it as u64 if …\nDisplay a JSON value as a string.\nConvert map (with string keys) to JValue::Object.\nConvert a Vec to JValue::Array.\nConvert string slice to JValue::String.\nConvert 32-bit floating point number to JValue::Number, or …\nConvert 64-bit floating point number to JValue::Number, or …\nConvert a slice to JValue::Array.\nConvert JsonString to JValue::String.\nConvert copy-on-write string to JValue::String.\nConvert map (with string keys) to JValue::Object.\nConvert boolean to JValue::Bool.\nConvert () to JValue::Null.\nReturns the argument unchanged.\nConvert serde_json::Number to JValue::Number.\nConvert String to JValue::String.\nCreate a JValue::Object by collecting an iterator of …\nCreate a JValue::Array by collecting an iterator of array …\nIndex into a JSON array or map. A string index can be used …\nIndex into a air_interpreter_value::JValue using the …\nCalls U::from(self).\nReturns true if the JValue is an Array. Returns false …\nReturns true if the JValue is a Boolean. Returns false …\nReturns true if the JValue is a number that can be …\nReturns true if the JValue is an integer between i64::MIN …\nReturns true if the JValue is a Null. Returns false …\nReturns true if the JValue is a Number. Returns false …\nReturns true if the JValue is an Object. Returns false …\nReturns true if the JValue is a String. Returns false …\nReturns true if the JValue is an integer between zero and …\nConstruct a serde_json::Value from a JSON literal.\nLooks up a value by a JSON Pointer.\nTakes the value out of the JValue, leaving a Null in its …\nThis struct is very similar to AVMOutcome, but keeps …\nReturns the argument unchanged.\nCalls U::from(self).\nThis struct is used to set limits for the test runner …\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nAn util for verificating particular data’s signatures.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nFor each peer, merge previous and current CID multisets by …\nVerify each peers’ signatures.\nWASM runner that runs release build form benchmarking.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).") \ No newline at end of file diff --git a/search.desc/air_trace_handler/air_trace_handler-desc-0-.js b/search.desc/air_trace_handler/air_trace_handler-desc-0-.js new file mode 100644 index 00000000..dfc8da18 --- /dev/null +++ b/search.desc/air_trace_handler/air_trace_handler-desc-0-.js @@ -0,0 +1 @@ +searchState.loadedDescShard("air_trace_handler", 0, "Contains the error value\nErrors occurred while trying to access or pop elements …\nErrors occurred when {1} - 1{0}.fold_states_count …\nErrors occurred when {0}.fold_states_count + {1} overflows.\nErrors arose out while accessing various interpreter data.\nErrors bubbled from DataKeeper.\nErrors occurred when Fold FSM tries to obtain stream …\nErrors occurred when Fold FSM tries to obtain stream …\nContains the success value\nErrors occurred when ParResult.0 + ParResult.1 overflows.\nErrors occurred when ParResult.0 + ParResult.1 value is …\nErrors occurred when slider.position() + ParResult.0 + …\nError occurred while trying to access or pop elements from …\nErrors occurred when requested_subtrace_len != 0 && …\nErrors occurred when trace_len - trace_position < …\nErrors arose out of merging previous data with a new.\nErrors arose out of merging previous data with a new.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nShould be called when a call instruction was executed …\nShould be called at the beginning of a call execution.\nReturns size of elements inside result trace and intended …\nThere was a state in at least one of the contexts. If …\nMerger was expected to see other state that was obtained …\nThere is no corresponding state in a trace for this call.\nErrors occurred when one of the fold subtrace lore doesn’…\nErrors occurred when previous and current call results are …\nErrors occurred when previous and current executed states …\nError occurred when Ap results contains not 1 generation …\nErrors arose out of merging previous data with a new.\nThere was a state in at least one of the contexts. If …\nThere was a state in at least one of the contexts. If …\nThere is no corresponding state in a trace for this call.\nThere is no corresponding state in a trace for this call.\nThere are several lores with the same value_pos.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).") \ No newline at end of file diff --git a/search.desc/air_utils/air_utils-desc-0-.js b/search.desc/air_utils/air_utils-desc-0-.js new file mode 100644 index 00000000..30c52224 --- /dev/null +++ b/search.desc/air_utils/air_utils-desc-0-.js @@ -0,0 +1 @@ +searchState.loadedDescShard("air_utils", 0, "") \ No newline at end of file diff --git a/search.desc/avm_data_store/avm_data_store-desc-0-.js b/search.desc/avm_data_store/avm_data_store-desc-0-.js new file mode 100644 index 00000000..dfc67131 --- /dev/null +++ b/search.desc/avm_data_store/avm_data_store-desc-0-.js @@ -0,0 +1 @@ +searchState.loadedDescShard("avm_data_store", 0, "This trait is used for\nCleanup data that become obsolete.\nReturns true if an anomaly happened and it’s necessary …\nReturns the argument unchanged.\nCalls U::from(self).") \ No newline at end of file diff --git a/search.desc/avm_interface/avm_interface-desc-0-.js b/search.desc/avm_interface/avm_interface-desc-0-.js new file mode 100644 index 00000000..a62a6690 --- /dev/null +++ b/search.desc/avm_interface/avm_interface-desc-0-.js @@ -0,0 +1 @@ +searchState.loadedDescShard("avm_interface", 0, "Errors encountered while trying to deserialize arguments …\nErrors encountered while trying to deserialize tetraplets …\nContains arguments of a call instruction and all other …\nThis error is encountered when deserialization pof call …\nErrors encountered while trying to serialize call results.\nRepresents an executed host function result.\nRepresents parameters obtained from a particle.\nThis stores soft limits triggering flags.\nArguments that should be passed to the function.\nCollected parameters of all met call instructions that …\nContains script data that should be preserved in an …\nTime of a particle execution (it counts only execution …\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nName of a function from service identified by service_id …\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nMemory in bytes AVM linear heap was extended during …\nPublic keys of peers that should receive data.\nResulted JValue returned by a service string.\nA error code service or builtin returned, where …\nId of a service that should be called.\nTo store and convey soft limits triggering flags.\nTetraplets that should be passed to the service.\nThis struct is very similar to AVMOutcome, but keeps …\nReturns the argument unchanged.\nCalls U::from(self).") \ No newline at end of file diff --git a/search.desc/avm_server/avm_server-desc-0-.js b/search.desc/avm_server/avm_server-desc-0-.js new file mode 100644 index 00000000..ed462bed --- /dev/null +++ b/search.desc/avm_server/avm_server-desc-0-.js @@ -0,0 +1 @@ +searchState.loadedDescShard("avm_server", 0, "Describes behaviour of the AVM.\nReturn statistic of AVM server Wasm module heap footprint.\nThis errors are encountered from serialization of data …\nAn array of values of the same type.\nA byte array.\nErrors from auxiliary calls.\nBoolean.\nBoolean value.\nSpecialization of arrays for byte vector.\nSpecialization of array type for byte vector.\nErrors encountered while trying to deserialize arguments …\nErrors encountered while trying to deserialize tetraplets …\nContains arguments of a call instruction and all other …\nThis error is encountered when deserialization pof call …\nErrors encountered while trying to serialize call results.\nThis errors are encountered from an call results/params …\nRepresents an executed host function result.\nThis trait is used for\nThis errors are encountered from a data store object.\nContains the error value\nContains the error value\nA 32-bits float.\nA 32-bits float.\nA 64-bits float.\nA 64-bits float.\nA 32-bits integer (as defined in WebAssembly core).\nA 32-bits integer (as defined in WebAssembly core).\nA 64-bits integer (as defined in WebAssembly core).\nA 64-bits integer (as defined in WebAssembly core).\nRepresents the types supported by WIT.\nA WIT value.\nMarine call returns Vec to support multi-value in a future,\nThis error contains interpreter outcome in case when …\nAIR interpreter result deserialization errors.\nSpecified path to AIR interpreter .wasm file was invalid\nInvalid secret key.\nThis errors are encountered from FaaS.\nAn error occurred when host functions tries to lift …\nAn error occurred when a host functions tries to lift …\nContains the success value\nContains the success value\nRepresents parameters obtained from a particle.\nA record contains record index from interfaces AST.\nA record.\nThis errors are encountered from an AVM runner.\nA 16-bits signed integer.\nA 16-bits signed integer.\nA 32-bits signed integer.\nA 32-bits signed integer.\nA 64-bits signed integer.\nA 64-bits signed integer.\nA 8-bits signed integer.\nA 8-bits signed integer.\nDescribes an origin that set corresponding value.\nThis stores soft limits triggering flags.\nA string.\nA string.\nA 16-bits unsigned integer.\nA 16-bits unsigned integer.\nA 32-bits unsigned integer.\nA 32-bits unsigned integer.\nA 64-bits unsigned integer.\nA 64-bits unsigned integer.\nA 8-bits unsigned integer.\nA 8-bits unsigned integer.\nPath to a AIR interpreter Wasm file.\nNumber of allocations rejected due to memory limit. May be …\nType of the closure arguments.\nArguments that should be passed to the function.\nCollected parameters of all met call instructions that …\nThis is the limit for the size of service call result.\nThis is the limit for the size of service call result.\nCleanup data that become obsolete.\nCleanup data that become obsolete.\nContains script data that should be preserved in an …\nReturns true if an anomaly happened and it’s necessary …\nIf Some, this closure is called with error when errors is …\nTime of a particle execution (it counts only execution …\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nName of a function from service identified by service_id …\nName of a function that returned corresponding value.\nThis knob controls hard RAM limits behavior for AVMRunner.\nThis knob controls hard RAM limits behavior for AVMRunner.\nThis closure will be invoked for corresponding import.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nValue was produced by applying this lens to the output …\nCreate a tetraplet for string literals defined in the …\nMask used to filter logs, for details see log_utf8_string …\nMaximum heap size in bytes available for the interpreter.\nMemory in bytes AVM linear heap was extended during …\nSize of currently used linear memory in bytes. Please note …\nReturn memory stat of an interpreter heap.\nCreate AVM with provided config.\nPublic keys of peers that should receive data.\nTypes of output of the closure.\nThe particle data size limit.\nThe particle data size limit.\nId of a peer where corresponding value was set.\nResulted JValue returned by a service string.\nA error code service or builtin returned, where …\nId of a service that should be called.\nId of a service that set corresponding value.\nTo store and convey soft limits triggering flags.\nTetraplets that should be passed to the service.\nPossibly set max memory size for AVM server.\nThis struct is very similar to AVMOutcome, but keeps …\nReturns the argument unchanged.\nCalls U::from(self).\nCreate AVM with the provided config.\nNEVec<T> represents a non-empty Vec<T>. It derefs to Vec<T>\nReturns the argument unchanged.\nCalls U::from(self).\nConverts this NEVec into Vec\nCreates a new non-empty vector, based on an inner Vec<T>. …\nThis struct is very similar to AVMOutcome, but keeps …\nReturns the argument unchanged.\nCalls U::from(self).") \ No newline at end of file diff --git a/search.desc/polyplets/polyplets-desc-0-.js b/search.desc/polyplets/polyplets-desc-0-.js new file mode 100644 index 00000000..5dacea28 --- /dev/null +++ b/search.desc/polyplets/polyplets-desc-0-.js @@ -0,0 +1 @@ +searchState.loadedDescShard("polyplets", 0, "ResolvedTriplet represents peer network location with all …\nDescribes an origin that set corresponding value.\nReturns the argument unchanged.\nReturns the argument unchanged.\nName of a function that returned corresponding value.\nCalls U::from(self).\nCalls U::from(self).\nValue was produced by applying this lens to the output …\nCreate a tetraplet for string literals defined in the …\nId of a peer where corresponding value was set.\nId of a service that set corresponding value.") \ No newline at end of file diff --git a/settings.html b/settings.html new file mode 100644 index 00000000..9388fe48 --- /dev/null +++ b/settings.html @@ -0,0 +1 @@ +Settings

Rustdoc settings

Back
\ No newline at end of file diff --git a/src-files.js b/src-files.js new file mode 100644 index 00000000..9135a6b1 --- /dev/null +++ b/src-files.js @@ -0,0 +1,27 @@ +var srcIndex = new Map(JSON.parse('[\ +["air",["",[["beautify",[],["mod.rs"]],["trace",[["run",[["data",[],["anomaly.rs","mod.rs","plain.rs"]]],["native.rs","runner.rs","wasm.rs"]],["stats",[],["log_data.rs","report.rs"]]],["mod.rs","run.rs","stats.rs","utils.rs"]]],["data.rs","main.rs"]]],\ +["air_beautifier",["",[],["beautifier.rs","lib.rs","virtual.rs"]]],\ +["air_beautify_wasm",["",[],["lib.rs"]]],\ +["air_execution_info_collector",["",[],["instructions_tracker.rs","lib.rs"]]],\ +["air_interpreter_cid",["",[],["lib.rs","verify.rs"]]],\ +["air_interpreter_client",["",[],["ast.rs","logger.rs","wasm_bindgen.rs"]]],\ +["air_interpreter_data",["",[["executed_state",[],["impls.rs","se_de.rs"]],["interpreter_data",[],["errors.rs","repr.rs","verification.rs"]]],["cid_info.rs","cid_store.rs","executed_state.rs","generation_idx.rs","interpreter_data.rs","lib.rs","raw_value.rs","rkyv.rs","trace.rs","trace_pos.rs"]]],\ +["air_interpreter_interface",["",[],["call_request_parameters.rs","call_service_result.rs","interpreter_outcome.rs","lib.rs","run_args_memory_limits.rs","run_parameters.rs"]]],\ +["air_interpreter_sede",["",[],["format.rs","lib.rs","multiformat.rs","representation.rs","rmp_serde.rs","serialized_type.rs"]]],\ +["air_interpreter_server",["",[],["ast.rs","logger.rs","marine.rs"]]],\ +["air_interpreter_signatures",["",[],["lib.rs","sede.rs","stores.rs","trackers.rs"]]],\ +["air_interpreter_value",["",[["value",[],["de.rs","from.rs","index.rs","mod.rs","partial_eq.rs","ser.rs"]]],["lib.rs"]]],\ +["air_lambda_ast",["",[["ast",[],["impls.rs","traits.rs"]]],["ast.rs","lib.rs"]]],\ +["air_lambda_parser",["",[["parser",[["lexer",[],["errors.rs","lambda_ast_lexer.rs","mod.rs","token.rs","utils.rs"]]],["errors.rs","lambda_parser.rs","mod.rs","va_lambda.rs"]]],["lib.rs"]]],\ +["air_log_targets",["",[],["lib.rs"]]],\ +["air_parser",["",[["ast",[["instruction_arguments",[],["impls.rs","traits.rs"]],["instructions",[],["impls.rs","traits.rs"]],["values",[],["impls.rs","traits.rs"]]],["instruction_arguments.rs","instructions.rs","mod.rs","values.rs"]],["parser",[["air_utils",[],["mod.rs"]],["lexer",[],["air_lexer.rs","call_variable_parser.rs","errors.rs","mod.rs","text_pos.rs","token.rs","utils.rs"]]],["air.rs","air_parser.rs","errors.rs","mod.rs","span.rs","validator.rs"]]],["lib.rs"]]],\ +["air_test_framework",["",[["asserts",[],["behavior.rs","json.rs","mod.rs","parser.rs"]],["ephemeral",[],["mod.rs","neighborhood.rs"]],["execution",[],["mod.rs"]],["services",[],["mod.rs","results.rs"]],["transform",[],["mod.rs","parser.rs","walker.rs"]]],["lib.rs","queue.rs"]]],\ +["air_test_utils",["",[],["call_services.rs","executed_state.rs","key_utils.rs","lib.rs","native_test_runner.rs","test_runner.rs","wasm_test_runner.rs"]]],\ +["air_trace_handler",["",[["data_keeper",[],["errors.rs","keeper.rs","merge_ctx.rs","mod.rs","trace_slider.rs"]],["merger",[["call_merger",[],["utils.rs"]],["fold_merger",[],["fold_lore_resolver.rs"]]],["ap_merger.rs","call_merger.rs","canon_merger.rs","errors.rs","fold_merger.rs","mod.rs","par_merger.rs","position_mapping.rs"]],["state_automata",[["fold_fsm",[],["lore_applier.rs","lore_ctor.rs","lore_ctor_queue.rs","state_handler.rs"]],["par_fsm",[["state_handler",[],["new_states_calculation.rs"]]],["par_builder.rs","state_handler.rs"]]],["errors.rs","fold_fsm.rs","fsm_queue.rs","mod.rs","par_fsm.rs","state_inserter.rs","utils.rs"]]],["errors.rs","handler.rs","lib.rs"]]],\ +["air_utils",["",[],["lib.rs"]]],\ +["avm_data_store",["",[],["lib.rs"]]],\ +["avm_interface",["",[],["call_request_parameters.rs","call_service_result.rs","lib.rs","outcome.rs","particle_parameters.rs","raw_outcome.rs"]]],\ +["avm_server",["",[],["avm.rs","config.rs","errors.rs","lib.rs","runner.rs"]]],\ +["polyplets",["",[],["lib.rs","triplet.rs"]]]\ +]')); +createSrcSidebar(); diff --git a/src/air/beautify/mod.rs.html b/src/air/beautify/mod.rs.html new file mode 100644 index 00000000..58b6f1e9 --- /dev/null +++ b/src/air/beautify/mod.rs.html @@ -0,0 +1,163 @@ +mod.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use air_beautifier::Beautifier;
+use clap::Parser;
+use eyre::{Context, Result};
+
+use std::{io, path::PathBuf};
+
+#[derive(Parser)]
+#[clap(about = "Pretty-print an AIR script to Python-like representation")]
+pub(crate) struct Args {
+    #[clap(short, long, default_value_t = air_beautifier::DEFAULT_INDENT_STEP)]
+    indent_step: usize,
+    #[clap(short, long, help = "Recognize virtual instruction patterns")]
+    patterns: bool,
+    #[clap(short, long)]
+    output: Option<PathBuf>,
+    input: Option<PathBuf>,
+}
+
+fn read_script(args: &Args) -> Result<String> {
+    use std::io::Read;
+
+    let air_script = match &args.input {
+        Some(in_path) => std::fs::read_to_string(in_path)?,
+        None => {
+            let mut buffer = String::new();
+            let mut stdin = io::stdin().lock();
+
+            stdin.read_to_string(&mut buffer)?;
+            buffer
+        }
+    };
+
+    Ok(air_script)
+}
+
+fn build_output(args: &Args) -> Result<Box<dyn io::Write>> {
+    let output: Box<dyn io::Write> = match &args.output {
+        Some(out_path) => {
+            let file = std::fs::File::create(out_path)?;
+            Box::new(file)
+        }
+        None => {
+            let stdout = io::stdout().lock();
+            Box::new(stdout)
+        }
+    };
+    Ok(output)
+}
+
+pub(crate) fn beautify(args: Args) -> Result<()> {
+    let air_script = read_script(&args).context("failed to read the input")?;
+    let output = build_output(&args).context("failed to open the output")?;
+
+    let mut beautifier = Beautifier::new_with_indent(output, args.indent_step);
+
+    if args.patterns {
+        beautifier = beautifier.enable_all_patterns();
+    }
+
+    beautifier.beautify(&air_script)?;
+    Ok(())
+}
+
\ No newline at end of file diff --git a/src/air/data.rs.html b/src/air/data.rs.html new file mode 100644 index 00000000..372f1689 --- /dev/null +++ b/src/air/data.rs.html @@ -0,0 +1,257 @@ +data.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use clap::Parser;
+use eyre::Context;
+use std::path::Path;
+use std::path::PathBuf;
+
+use crate::trace::run::load_data;
+use crate::trace::run::runner::DataToHumanReadable;
+use crate::trace::run::runner::TestInitParameters;
+
+#[derive(clap::Args, Debug, Copy, Clone)]
+#[group(multiple = false)]
+struct ModeArgs {
+    #[arg(long)]
+    native: bool,
+
+    #[cfg(feature = "wasm")]
+    #[arg(long)]
+    wasm: bool,
+}
+
+enum Mode {
+    Native,
+
+    #[cfg(feature = "wasm")]
+    Wasm,
+}
+
+impl From<ModeArgs> for Option<Mode> {
+    fn from(value: ModeArgs) -> Self {
+        if value.native {
+            return Some(Mode::Native);
+        }
+
+        #[cfg(feature = "wasm")]
+        if value.wasm {
+            return Some(Mode::Wasm);
+        }
+
+        None
+    }
+}
+
+#[derive(Parser)]
+#[clap(about = "Print human-readable AquaVM data")]
+pub(crate) struct Args {
+    #[clap(
+        long = "interpreter",
+        env = "AIR_INTERPRETER_WASM_PATH",
+        default_value = "target/wasm32-wasi/release/air_interpreter_server.wasm"
+    )]
+    air_interpreter_path: PathBuf,
+
+    #[clap(flatten)]
+    mode: ModeArgs,
+    // TODO be able to read from stdin
+    #[arg(help = "Input path")]
+    input: PathBuf,
+}
+
+pub(crate) async fn to_human_readable_data(args: Args) -> Result<(), Box<dyn std::error::Error>> {
+    init_tracing("warn");
+
+    let data: Vec<u8> = load_data(&args.input)?;
+
+    if data.is_empty() {
+        Err(eyre::eyre!("empty input data: {:?}", args.input))?;
+    }
+
+    let mut runner =
+        create_runner(args.mode.into(), &args.air_interpreter_path, <_>::default()).await?;
+    let out = { runner.to_human_readable(data).await? };
+    println!("{out}");
+
+    Ok(())
+}
+
+fn init_tracing(tracing_params: &str) {
+    let builder = tracing_subscriber::fmt()
+        .with_env_filter(tracing_params)
+        .with_writer(std::io::stderr);
+    builder.init();
+}
+
+async fn create_runner(
+    mode: Option<Mode>,
+    _air_interpreter_wasm_path: &Path,
+    _test_init_parameters: TestInitParameters,
+) -> eyre::Result<Box<dyn DataToHumanReadable>> {
+    #[cfg(not(feature = "wasm"))]
+    let default_mode = Mode::Native;
+    #[cfg(feature = "wasm")]
+    let default_mode = Mode::Wasm;
+
+    let mode = mode.unwrap_or(default_mode);
+    let runner = match mode {
+        Mode::Native => crate::trace::run::native::create_native_avm_runner(_test_init_parameters)
+            .context("Failed to instantiate a native AVM")? as _,
+        #[cfg(feature = "wasm")]
+        Mode::Wasm => crate::trace::run::wasm::create_wasm_avm_runner(
+            _air_interpreter_wasm_path,
+            None,
+            <_>::default(),
+        )
+        .await
+        .context("Failed to instantiate WASM AVM")? as _,
+    };
+
+    Ok(runner)
+}
+
\ No newline at end of file diff --git a/src/air/execution_step/errors/catchable_errors.rs.html b/src/air/execution_step/errors/catchable_errors.rs.html new file mode 100644 index 00000000..1238ed47 --- /dev/null +++ b/src/air/execution_step/errors/catchable_errors.rs.html @@ -0,0 +1,319 @@ +catchable_errors.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::ErrorAffectable;
+use super::Joinable;
+use crate::execution_step::execution_context::errors::StreamMapError;
+use crate::execution_step::execution_context::ErrorObjectError;
+use crate::execution_step::lambda_applier::LambdaError;
+use crate::JValue;
+use crate::ToErrorCode;
+
+use strum::IntoEnumIterator;
+use strum_macros::EnumDiscriminants;
+use strum_macros::EnumIter;
+use thiserror::Error as ThisError;
+
+use std::rc::Rc;
+
+/// Catchable errors arisen during AIR script execution. Catchable here means that these errors
+/// could be handled by a xor instruction and their error_code could be used in a match
+/// instruction.
+#[derive(ThisError, EnumDiscriminants, Debug, Clone)]
+#[strum_discriminants(derive(EnumIter))]
+pub enum CatchableError {
+    /// An error is occurred while calling local service via call_service.
+    #[error("Local service error, ret_code is {0}, error message is '{1}'")]
+    LocalServiceError(i32, Rc<String>),
+
+    /// This error type is produced by a match to notify xor that compared values aren't equal.
+    #[error("compared values do not match")]
+    MatchValuesNotEqual,
+
+    /// This error type is produced by a mismatch to notify xor that compared values aren't equal.
+    #[error("compared values do not mismatch")]
+    MismatchValuesEqual,
+
+    /// Variable with such a name wasn't defined during AIR script execution.
+    /// This error type is used in order to support the join behaviour and
+    /// it's ok if some variable hasn't been defined yet, due to the par nature of AIR.
+    #[error("variable with name '{0}' wasn't defined during script execution")]
+    VariableNotFound(String),
+
+    /// Provided JValue has incompatible type with a requested one.
+    #[error(
+        "expected JValue type '{expected_value_type}' for the variable `{variable_name}`, but got '{actual_value}'"
+    )]
+    IncompatibleJValueType {
+        variable_name: String,
+        actual_value: JValue,
+        expected_value_type: &'static str,
+    },
+
+    /// A fold instruction must iterate over array value.
+    #[error("expression '{1}' returned non-array value '{0}' for fold iterable")]
+    FoldIteratesOverNonArray(JValue, String),
+
+    /// This error type is produced by a fail instruction.
+    #[error("fail with '{error}' is used without corresponding xor")]
+    UserError { error: JValue },
+
+    /// An error occurred while trying to apply lambda to a value.
+    #[error(transparent)]
+    LambdaApplierError(#[from] LambdaError),
+
+    /// This error type is produced by a fail instruction that tries to throw a scalar that have inappropriate type.
+    #[error(transparent)]
+    InvalidErrorObjectError(#[from] ErrorObjectError),
+
+    /// A new with this variable name was met and right after that it was accessed
+    /// that is prohibited.
+    #[error("variable with name '{0}' was cleared by new and then wasn't set")]
+    VariableWasNotInitializedAfterNew(String),
+
+    /// This error type is occurred when the length functor applied to a value of non-array type.
+    #[error("the length functor could applied only to an array-like value, but it's applied to '{0}'")]
+    LengthFunctorAppliedToNotArray(JValue),
+
+    /// Call gets non-string JValue resolving triplet parts.
+    #[error("call cannot resolve non-String triplet variable part `{variable_name}` with value '{actual_value}'")]
+    NonStringValueInTripletResolution {
+        variable_name: String,
+        actual_value: JValue,
+    },
+
+    /// Stream map related errors.
+    #[error(transparent)]
+    StreamMapError(#[from] StreamMapError),
+}
+
+impl From<LambdaError> for Rc<CatchableError> {
+    fn from(e: LambdaError) -> Self {
+        Rc::new(CatchableError::LambdaApplierError(e))
+    }
+}
+
+impl ToErrorCode for Rc<CatchableError> {
+    fn to_error_code(&self) -> i64 {
+        self.as_ref().to_error_code()
+    }
+}
+
+impl ToErrorCode for CatchableError {
+    fn to_error_code(&self) -> i64 {
+        use crate::utils::CATCHABLE_ERRORS_START_ID;
+        crate::generate_to_error_code!(self, CatchableError, CATCHABLE_ERRORS_START_ID)
+    }
+}
+
+impl ErrorAffectable for CatchableError {
+    fn affects_last_error(&self) -> bool {
+        !matches!(
+            self,
+            CatchableError::MatchValuesNotEqual | CatchableError::MismatchValuesEqual
+        )
+    }
+
+    fn affects_error(&self) -> bool {
+        true
+    }
+}
+
+macro_rules! log_join {
+    ($($args:tt)*) => {
+        log::trace!(target: air_log_targets::JOIN_BEHAVIOUR, $($args)*)
+    }
+}
+
+#[rustfmt::skip::macros(log_join)]
+impl Joinable for CatchableError {
+    /// Returns true, if supplied error is related to variable not found errors type.
+    /// Print log if this is joinable error type.
+    fn is_joinable(&self) -> bool {
+        use CatchableError::*;
+
+        match self {
+            VariableNotFound(var_name) => {
+                log_join!("  waiting for an argument with name '{}'", var_name);
+                true
+            }
+            _ => false,
+        }
+    }
+}
+
\ No newline at end of file diff --git a/src/air/execution_step/errors/error_effectable.rs.html b/src/air/execution_step/errors/error_effectable.rs.html new file mode 100644 index 00000000..948e599b --- /dev/null +++ b/src/air/execution_step/errors/error_effectable.rs.html @@ -0,0 +1,53 @@ +error_effectable.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+/// This trait controls whether to set %last_error% and :error: or not.
+pub(crate) trait ErrorAffectable {
+    /// Return true, if this error type affects last error
+    /// (meaning that it should be set after occurring such an error).
+    fn affects_last_error(&self) -> bool;
+    fn affects_error(&self) -> bool;
+}
+
\ No newline at end of file diff --git a/src/air/execution_step/errors/execution_errors.rs.html b/src/air/execution_step/errors/execution_errors.rs.html new file mode 100644 index 00000000..7cbbb827 --- /dev/null +++ b/src/air/execution_step/errors/execution_errors.rs.html @@ -0,0 +1,223 @@ +execution_errors.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::CatchableError;
+use super::ErrorAffectable;
+use super::Joinable;
+use super::UncatchableError;
+use crate::ToErrorCode;
+
+use strum_macros::EnumDiscriminants;
+use strum_macros::EnumIter;
+use thiserror::Error as ThisError;
+
+use std::rc::Rc;
+
+// TODO: add tests for all execution errors
+/// Errors arisen while executing AIR script.
+/// This enum is pub since it's used in tests.
+#[derive(ThisError, EnumDiscriminants, Debug)]
+#[strum_discriminants(derive(EnumIter))]
+pub enum ExecutionError {
+    #[error(transparent)]
+    Catchable(#[from] Rc<CatchableError>),
+
+    #[error(transparent)]
+    Uncatchable(#[from] UncatchableError),
+}
+
+impl ExecutionError {
+    pub fn is_catchable(&self) -> bool {
+        matches!(self, ExecutionError::Catchable(_))
+    }
+
+    pub fn is_match_or_mismatch(&self) -> bool {
+        match self {
+            ExecutionError::Catchable(catchable) => matches!(
+                catchable.as_ref(),
+                CatchableError::MatchValuesNotEqual | CatchableError::MismatchValuesEqual
+            ),
+            _ => false,
+        }
+    }
+}
+
+impl From<CatchableError> for ExecutionError {
+    fn from(catchable: CatchableError) -> Self {
+        Self::Catchable(std::rc::Rc::new(catchable))
+    }
+}
+
+#[macro_export]
+macro_rules! trace_to_exec_err {
+    ($trace_expr: expr, $instruction: ident) => {
+        $trace_expr.map_err(|trace_error| {
+            $crate::execution_step::ExecutionError::Uncatchable($crate::execution_step::UncatchableError::TraceError {
+                trace_error,
+                instruction: $instruction.to_string(),
+            })
+        })
+    };
+}
+
+impl ToErrorCode for ExecutionError {
+    fn to_error_code(&self) -> i64 {
+        match self {
+            ExecutionError::Catchable(err) => err.to_error_code(),
+            ExecutionError::Uncatchable(err) => err.to_error_code(),
+        }
+    }
+}
+
+impl Joinable for ExecutionError {
+    fn is_joinable(&self) -> bool {
+        match self {
+            ExecutionError::Catchable(err) => err.is_joinable(),
+            ExecutionError::Uncatchable(_) => false,
+        }
+    }
+}
+
+impl ErrorAffectable for ExecutionError {
+    fn affects_last_error(&self) -> bool {
+        match self {
+            ExecutionError::Catchable(err) => err.affects_last_error(),
+            ExecutionError::Uncatchable(_) => false,
+        }
+    }
+
+    fn affects_error(&self) -> bool {
+        match self {
+            ExecutionError::Catchable(_) => true,
+            ExecutionError::Uncatchable(_) => false,
+        }
+    }
+}
+
\ No newline at end of file diff --git a/src/air/execution_step/errors/joinable.rs.html b/src/air/execution_step/errors/joinable.rs.html new file mode 100644 index 00000000..76f60520 --- /dev/null +++ b/src/air/execution_step/errors/joinable.rs.html @@ -0,0 +1,61 @@ +joinable.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+/// This trait is intended to differentiate between joinable and non-joinable objects.
+/// Joinable objects are those that interpreter should wait on. F.e. if at least one of
+/// arguments of a call instructions is joinable, the interpreter won't execute such
+/// call and won't write any state for it in data. This is needed to handle collecting
+/// variable from different peers in parallel.
+///
+/// At the moment, this trait's applied only to errors.
+pub(crate) trait Joinable {
+    /// Return true, if supplied object is joinable.
+    fn is_joinable(&self) -> bool;
+}
+
\ No newline at end of file diff --git a/src/air/execution_step/errors/mod.rs.html b/src/air/execution_step/errors/mod.rs.html new file mode 100644 index 00000000..184cd684 --- /dev/null +++ b/src/air/execution_step/errors/mod.rs.html @@ -0,0 +1,67 @@ +mod.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+mod catchable_errors;
+mod error_effectable;
+mod execution_errors;
+mod joinable;
+mod uncatchable_errors;
+
+pub use catchable_errors::CatchableError;
+pub use execution_errors::ExecutionError;
+pub use uncatchable_errors::UncatchableError;
+
+pub(crate) use error_effectable::ErrorAffectable;
+pub(crate) use joinable::Joinable;
+
+use super::Stream;
+
\ No newline at end of file diff --git a/src/air/execution_step/errors/uncatchable_errors.rs.html b/src/air/execution_step/errors/uncatchable_errors.rs.html new file mode 100644 index 00000000..556788d3 --- /dev/null +++ b/src/air/execution_step/errors/uncatchable_errors.rs.html @@ -0,0 +1,307 @@ +uncatchable_errors.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::Stream;
+use crate::execution_step::Generation;
+use crate::execution_step::STREAM_MAX_SIZE;
+use crate::CanonStreamMapError;
+use crate::StreamMapError;
+use crate::StreamMapKeyError;
+use crate::ToErrorCode;
+
+use air_interpreter_cid::CidCalculationError;
+use air_interpreter_cid::CidRef;
+use air_interpreter_data::ValueRef;
+use air_interpreter_interface::CallArgumentsRepr;
+use air_interpreter_interface::TetrapletsRepr;
+use air_interpreter_sede::Representation;
+use air_trace_handler::GenerationCompactificationError;
+use air_trace_handler::IntConversionError;
+use air_trace_handler::TraceHandlerError;
+
+use strum::IntoEnumIterator;
+use strum_macros::EnumDiscriminants;
+use strum_macros::EnumIter;
+use thiserror::Error as ThisError;
+
+use std::rc::Rc;
+
+/// Uncatchable errors arisen during AIR script execution. Uncatchable here means that these errors
+/// couldn't be handled by a xor instruction and their error_code couldn't be used in a match
+/// instruction. They are similar to JVM runtime errors and some of them could be caught only
+/// while execution of AIR script, others (FoldStateNotFound and MultipleVariablesFound) are
+/// checked additionally on the validation step, and presence here for convenience.
+#[derive(ThisError, EnumDiscriminants, Debug)]
+#[strum_discriminants(derive(EnumIter))]
+pub enum UncatchableError {
+    /// Errors bubbled from a trace handler.
+    #[error("on instruction '{instruction}' trace handler encountered an error: {trace_error}")]
+    TraceError {
+        trace_error: TraceHandlerError,
+        instruction: String,
+    },
+
+    /// These errors are related to internal bug in the interpreter when result trace is corrupted.
+    #[error(transparent)]
+    GenerationCompactificationError(#[from] GenerationCompactificationError),
+
+    /// Integer casts, e.g. usize(=u64) to u32, might trigger such errors.
+    #[error(transparent)]
+    IntConversionError(#[from] IntConversionError),
+
+    /// Fold state wasn't found for such iterator name.
+    #[error("fold state not found for this iterable '{0}'")]
+    FoldStateNotFound(String),
+
+    /// Errors encountered while shadowing non-scalar values.
+    #[error("variable with name '{0}' can't be shadowed, shadowing isn't supported for iterables")]
+    IterableShadowing(String),
+
+    /// Multiple fold states found for such iterator name.
+    #[error("multiple iterable values found for iterable name '{0}'")]
+    MultipleIterableValues(String),
+
+    /// Errors occurred when result from data doesn't match to a call instruction, f.e. a call
+    /// could be applied to a stream, but result doesn't contain generation in a source position.
+    #[error("call result value {0:?} doesn't match with corresponding instruction")]
+    CallResultNotCorrespondToInstr(ValueRef),
+
+    /// Variable shadowing is not allowed, usually it's thrown when a AIR tries to assign value
+    /// for a variable not in a fold block or in a global scope but not right after new.
+    #[error("trying to shadow variable '{0}', but shadowing is allowed only inside fold blocks")]
+    ShadowingIsNotAllowed(String),
+
+    /// This error occurred when new tries to pop up a variable at the end, but scalar state doesn't
+    /// contain an appropriate variable. It should be considered as an internal error and shouldn't
+    /// be caught by a xor instruction.
+    #[error("new end block tries to pop up a variable '{scalar_name}' that wasn't defined at depth {depth}")]
+    ScalarsStateCorrupted { scalar_name: String, depth: usize },
+
+    #[error("failed to calculate value's CID")]
+    CidError(#[from] CidCalculationError),
+
+    /// We consider now that every CID should present in the data;
+    /// and not having any CID is considered a non-catching error.
+    #[error("{0} for CID {1:?} not found")]
+    ValueForCidNotFound(&'static str, Rc<CidRef>),
+
+    /// Errors occurred while insertion of a value inside stream that doesn't have corresponding generation.
+    #[error(
+        "stream doesn't have generation with number {generation}, supplied to the interpreter data is corrupted,\n\
+             stream is {stream:?}"
+    )]
+    StreamDontHaveSuchGeneration { stream: Stream, generation: Generation },
+
+    #[error("failed to deserialize to CallServiceFailed: {0}")]
+    MalformedCallServiceFailed(serde_json::Error),
+
+    /// Stream size estimate goes over a hardcoded limit.
+    #[error("stream size goes over the allowed limit of {STREAM_MAX_SIZE}")]
+    StreamSizeLimitExceeded,
+
+    /// CanonStreamMapKey related errors.
+    #[error(transparent)]
+    StreamMapKeyError(#[from] StreamMapKeyError),
+
+    /// Stream map related errors.
+    #[error(transparent)]
+    StreamMapError(#[from] StreamMapError),
+
+    /// CanonStreamMap related errors.
+    #[error(transparent)]
+    CanonStreamMapError(#[from] CanonStreamMapError),
+
+    /// Argument hash or tetraplet mismatch in a call/canon merged from current_data with an evaluated value.
+    #[error("{param} doesn't match expected parameters: expected {expected_value}, got {stored_value} ")]
+    InstructionParametersMismatch {
+        param: &'static str,
+        expected_value: String,
+        stored_value: String,
+    },
+
+    #[error("failed to sign data: {0}")]
+    SigningError(#[from] fluence_keypair::error::SigningError),
+
+    #[error("failed to serialize tetraplets {0}")]
+    TetrapletSerializationFailed(<TetrapletsRepr as Representation>::SerializeError),
+
+    #[error("failed to serialize call arguments {0}")]
+    CallArgumentsSerializationFailed(<CallArgumentsRepr as Representation>::SerializeError),
+}
+
+impl ToErrorCode for UncatchableError {
+    fn to_error_code(&self) -> i64 {
+        use crate::utils::UNCATCHABLE_ERRORS_START_ID;
+        crate::generate_to_error_code!(self, UncatchableError, UNCATCHABLE_ERRORS_START_ID)
+    }
+}
+
\ No newline at end of file diff --git a/src/air/execution_step/execution_context/cid_state.rs.html b/src/air/execution_step/execution_context/cid_state.rs.html new file mode 100644 index 00000000..af6d00b2 --- /dev/null +++ b/src/air/execution_step/execution_context/cid_state.rs.html @@ -0,0 +1,379 @@ +cid_state.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use crate::execution_step::RcSecurityTetraplet;
+use crate::execution_step::ValueAggregate;
+use crate::JValue;
+use crate::UncatchableError;
+
+use air_interpreter_cid::CID;
+use air_interpreter_data::CanonCidAggregate;
+use air_interpreter_data::CanonResultCidAggregate;
+use air_interpreter_data::CidInfo;
+use air_interpreter_data::CidTracker;
+use air_interpreter_data::RawValue;
+use air_interpreter_data::ServiceResultCidAggregate;
+use air_interpreter_data::TracePos;
+use polyplets::SecurityTetraplet;
+
+use std::rc::Rc;
+
+#[derive(Debug, Default, Clone)]
+pub struct ExecutionCidState {
+    pub value_tracker: CidTracker<RawValue>,
+    pub tetraplet_tracker: CidTracker<SecurityTetraplet>,
+    pub canon_element_tracker: CidTracker<CanonCidAggregate>,
+    pub canon_result_tracker: CidTracker<CanonResultCidAggregate>,
+    pub service_result_agg_tracker: CidTracker<ServiceResultCidAggregate>,
+}
+
+impl ExecutionCidState {
+    pub fn new() -> Self {
+        Self::default()
+    }
+
+    pub(crate) fn from_cid_info(prev_cid_info: CidInfo, current_cid_info: CidInfo) -> Self {
+        let value_tracker = CidTracker::from_cid_stores(prev_cid_info.value_store, current_cid_info.value_store);
+        let tetraplet_tracker =
+            CidTracker::from_cid_stores(prev_cid_info.tetraplet_store, current_cid_info.tetraplet_store);
+        let canon_element_tracker =
+            CidTracker::from_cid_stores(prev_cid_info.canon_element_store, current_cid_info.canon_element_store);
+        let canon_result_tracker =
+            CidTracker::from_cid_stores(prev_cid_info.canon_result_store, current_cid_info.canon_result_store);
+        let service_result_agg_tracker = CidTracker::from_cid_stores(
+            prev_cid_info.service_result_store,
+            current_cid_info.service_result_store,
+        );
+
+        Self {
+            value_tracker,
+            tetraplet_tracker,
+            canon_element_tracker,
+            canon_result_tracker,
+            service_result_agg_tracker,
+        }
+    }
+
+    pub fn track_service_result(
+        &mut self,
+        value: JValue,
+        tetraplet: RcSecurityTetraplet,
+        argument_hash: Rc<str>,
+    ) -> Result<CID<ServiceResultCidAggregate>, UncatchableError> {
+        let vm_value = RawValue::from_value(value);
+        let value_cid = self.value_tracker.track_raw_value(vm_value);
+        let tetraplet_cid = self.tetraplet_tracker.track_value(tetraplet)?;
+        let service_result_agg = ServiceResultCidAggregate::new(value_cid, argument_hash, tetraplet_cid);
+
+        self.service_result_agg_tracker
+            .track_value(service_result_agg)
+            .map_err(UncatchableError::from)
+    }
+
+    pub(crate) fn track_canon_value(
+        &mut self,
+        canon_value: &ValueAggregate,
+    ) -> Result<CID<CanonCidAggregate>, UncatchableError> {
+        let vm_value = RawValue::from_value(canon_value.get_result().clone());
+        let value_cid = self.value_tracker.track_raw_value(vm_value);
+        let tetraplet = self.tetraplet_tracker.track_value(canon_value.get_tetraplet())?;
+
+        let canon_value_aggregate = CanonCidAggregate::new(value_cid, tetraplet, canon_value.get_provenance());
+        self.canon_element_tracker
+            .track_value(canon_value_aggregate)
+            .map_err(UncatchableError::from)
+    }
+
+    pub(crate) fn get_value_by_cid(&self, cid: &CID<RawValue>) -> Result<JValue, UncatchableError> {
+        self.value_tracker
+            .get(cid)
+            .ok_or_else(|| UncatchableError::ValueForCidNotFound("value", cid.get_inner()))
+            .map(|vm_value| vm_value.get_value())
+    }
+
+    pub(crate) fn get_tetraplet_by_cid(
+        &self,
+        cid: &CID<SecurityTetraplet>,
+    ) -> Result<RcSecurityTetraplet, UncatchableError> {
+        self.tetraplet_tracker
+            .get(cid)
+            .ok_or_else(|| UncatchableError::ValueForCidNotFound("tetraplet", cid.get_inner()))
+    }
+
+    pub(crate) fn get_canon_value_by_cid(
+        &self,
+        cid: &CID<CanonCidAggregate>,
+    ) -> Result<ValueAggregate, UncatchableError> {
+        let canon_aggregate = self
+            .canon_element_tracker
+            .get(cid)
+            .ok_or_else(|| UncatchableError::ValueForCidNotFound("canon aggregate", cid.get_inner()))?;
+        let result = self.get_value_by_cid(&canon_aggregate.value)?;
+        let tetraplet = self.get_tetraplet_by_cid(&canon_aggregate.tetraplet)?;
+
+        let fake_trace_pos = TracePos::default();
+        Ok(ValueAggregate::new(
+            result,
+            tetraplet,
+            fake_trace_pos,
+            canon_aggregate.provenance.clone(),
+        ))
+    }
+
+    pub(crate) fn get_canon_result_by_cid(
+        &self,
+        cid: &CID<CanonResultCidAggregate>,
+    ) -> Result<Rc<CanonResultCidAggregate>, UncatchableError> {
+        self.canon_result_tracker
+            .get(cid)
+            .ok_or_else(|| UncatchableError::ValueForCidNotFound("canon result aggregate", cid.get_inner()))
+    }
+
+    pub(crate) fn get_service_result_agg_by_cid(
+        &self,
+        cid: &CID<ServiceResultCidAggregate>,
+    ) -> Result<Rc<ServiceResultCidAggregate>, UncatchableError> {
+        self.service_result_agg_tracker
+            .get(cid)
+            .ok_or_else(|| UncatchableError::ValueForCidNotFound("service result aggregate", cid.get_inner()))
+    }
+
+    pub(crate) fn resolve_service_info(
+        &self,
+        service_result_agg_cid: &CID<ServiceResultCidAggregate>,
+    ) -> Result<ResolvedServiceInfo, UncatchableError> {
+        let service_result_aggregate = self.get_service_result_agg_by_cid(service_result_agg_cid)?;
+        let value = self.get_value_by_cid(&service_result_aggregate.value_cid)?;
+        let tetraplet = self.get_tetraplet_by_cid(&service_result_aggregate.tetraplet_cid)?;
+
+        Ok(ResolvedServiceInfo {
+            value,
+            tetraplet,
+            service_result_aggregate,
+        })
+    }
+}
+
+pub(crate) struct ResolvedServiceInfo {
+    pub(crate) value: JValue,
+    pub(crate) tetraplet: RcSecurityTetraplet,
+    pub(crate) service_result_aggregate: Rc<ServiceResultCidAggregate>,
+}
+
+impl From<ExecutionCidState> for CidInfo {
+    fn from(value: ExecutionCidState) -> Self {
+        Self {
+            value_store: value.value_tracker.into(),
+            tetraplet_store: value.tetraplet_tracker.into(),
+            canon_element_store: value.canon_element_tracker.into(),
+            canon_result_store: value.canon_result_tracker.into(),
+            service_result_store: value.service_result_agg_tracker.into(),
+        }
+    }
+}
+
\ No newline at end of file diff --git a/src/air/execution_step/execution_context/context.rs.html b/src/air/execution_step/execution_context/context.rs.html new file mode 100644 index 00000000..debce9a6 --- /dev/null +++ b/src/air/execution_step/execution_context/context.rs.html @@ -0,0 +1,531 @@ +context.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::ErrorDescriptor;
+use super::ExecutionCidState;
+use super::InstructionError;
+use super::LastErrorDescriptor;
+use super::Scalars;
+use super::StreamMaps;
+use super::Streams;
+use crate::execution_step::ErrorAffectable;
+use crate::execution_step::RcSecurityTetraplet;
+use crate::ToErrorCode;
+
+use air_execution_info_collector::InstructionTracker;
+use air_interpreter_cid::CID;
+use air_interpreter_data::CanonResultCidAggregate;
+use air_interpreter_data::CidInfo;
+use air_interpreter_data::ServiceResultCidAggregate;
+use air_interpreter_interface::*;
+use air_interpreter_signatures::PeerCidTracker;
+use air_interpreter_signatures::SignatureStore;
+
+use std::rc::Rc;
+
+/// Contains all necessary state needed to execute AIR script.
+pub(crate) struct ExecutionCtx<'i> {
+    /// Contains all scalars.
+    pub(crate) scalars: Scalars<'i>,
+
+    /// Contains all streams.
+    pub(crate) streams: Streams,
+
+    /// Contains all stream maps.
+    pub(crate) stream_maps: StreamMaps,
+
+    /// Set of peer public keys that should receive resulted data.
+    pub(crate) next_peer_pks: Vec<String>,
+
+    /// Parameters passed from a host that describes host and contains info from a particle.
+    pub(crate) run_parameters: RcRunParameters,
+
+    /// Last error produced by local service.
+    /// There is the special not-an-error value means there was no error.
+    pub(crate) last_error_descriptor: LastErrorDescriptor,
+
+    /// Error produced by some instructions, e.g. call, match, fail.
+    pub(crate) error_descriptor: ErrorDescriptor,
+
+    /// Indicates that previous executed subgraph is complete.
+    /// A subgraph treats as a complete if all subgraph elements satisfy the following rules:
+    ///   - at least one of par subgraphs is completed
+    ///   - at least one of xor subgraphs is completed without an error
+    ///   - all of seq subgraphs are completed
+    ///   - call executed successfully (executed state is Executed)
+    subgraph_completeness: bool,
+
+    /// Tracker of all met instructions.
+    pub(crate) tracker: InstructionTracker,
+
+    /// Last call request id that was used as an id for call request in outcome.
+    pub(crate) last_call_request_id: u32,
+
+    /// Contains all executed results from a host side.
+    pub(crate) call_results: CallResults,
+
+    /// Tracks all functions that should be called from services.
+    pub(crate) call_requests: CallRequests,
+
+    /// CID-to-something trackers.
+    pub(crate) cid_state: ExecutionCidState,
+
+    /// Signatures' store.
+    ///
+    /// It contains peers' signatures for verification.
+    pub(crate) signature_store: SignatureStore,
+
+    /// Current peer's CID tracker.
+    ///
+    /// It gathers current peer's CIDs (call results and canon results) for further signing.
+    pub(crate) peer_cid_tracker: PeerCidTracker,
+}
+
+impl<'i> ExecutionCtx<'i> {
+    pub(crate) fn new(
+        prev_ingredients: ExecCtxIngredients,
+        current_ingredients: ExecCtxIngredients,
+        call_results: CallResults,
+        signature_store: SignatureStore,
+        run_parameters: &RunParameters,
+    ) -> Self {
+        let run_parameters = RcRunParameters::from_run_parameters(run_parameters);
+        let streams = Streams::new();
+
+        let cid_state = ExecutionCidState::from_cid_info(prev_ingredients.cid_info, current_ingredients.cid_info);
+
+        let peer_cid_tracker = PeerCidTracker::new(run_parameters.current_peer_id.clone());
+
+        Self {
+            run_parameters,
+            subgraph_completeness: true,
+            last_call_request_id: prev_ingredients.last_call_request_id,
+            call_results,
+            streams,
+            stream_maps: <_>::default(),
+            cid_state,
+            signature_store,
+            peer_cid_tracker,
+            scalars: <_>::default(),
+            next_peer_pks: <_>::default(),
+            last_error_descriptor: <_>::default(),
+            error_descriptor: <_>::default(),
+            tracker: <_>::default(),
+            call_requests: <_>::default(),
+        }
+    }
+
+    pub(crate) fn last_error(&self) -> &InstructionError {
+        self.last_error_descriptor.error()
+    }
+
+    pub(crate) fn error(&self) -> &InstructionError {
+        self.error_descriptor.error()
+    }
+
+    pub(crate) fn next_call_request_id(&mut self) -> u32 {
+        self.last_call_request_id += 1;
+        self.last_call_request_id
+    }
+
+    pub(crate) fn record_call_cid(&mut self, peer_id: &str, cid: &CID<ServiceResultCidAggregate>) {
+        self.peer_cid_tracker.register(peer_id, cid);
+    }
+
+    pub(crate) fn record_canon_cid(&mut self, peer_id: &str, cid: &CID<CanonResultCidAggregate>) {
+        self.peer_cid_tracker.register(peer_id, cid);
+    }
+}
+
+impl ExecutionCtx<'_> {
+    pub(crate) fn make_subgraph_incomplete(&mut self) {
+        self.subgraph_completeness = false;
+    }
+
+    pub(crate) fn is_subgraph_complete(&self) -> bool {
+        self.subgraph_completeness
+    }
+
+    pub(crate) fn set_subgraph_completeness(&mut self, subgraph_complete: bool) {
+        self.subgraph_completeness = subgraph_complete;
+    }
+
+    pub(crate) fn flush_subgraph_completeness(&mut self) {
+        self.subgraph_completeness = true;
+    }
+
+    // This routine sets %last_error% and :error:.
+    // Most instructions, except Call, Canon, CanonMapScalar does not set :error:.$.peer_id b/c
+    // it would be a non-deterministic peer_id.
+    pub(crate) fn set_errors(
+        &mut self,
+        error: &(impl ErrorAffectable + ToErrorCode + ToString),
+        instruction: &str,
+        tetraplet: Option<RcSecurityTetraplet>,
+        use_tetraplet_and_log_peer_id: bool,
+    ) {
+        let last_error_peer_id = match &tetraplet {
+            // use tetraplet if they set, because an error could be propagated from data
+            // (from CallServiceFailed state) and exec_ctx.run_parameters.current_peer_id won't mean
+            // a peer where the error was occurred
+            Some(tetraplet) if use_tetraplet_and_log_peer_id => Some(tetraplet.peer_pk.as_str()),
+            _ => Some(self.run_parameters.current_peer_id.as_str()),
+        };
+
+        self.last_error_descriptor.try_to_set_last_error_from_exec_error(
+            error,
+            instruction,
+            last_error_peer_id,
+            tetraplet.clone(),
+        );
+
+        let peer_id = if use_tetraplet_and_log_peer_id {
+            last_error_peer_id
+        } else {
+            None
+        };
+
+        self.error_descriptor
+            .try_to_set_error_from_exec_error(error, instruction, peer_id, tetraplet.clone());
+
+        self.error_descriptor.disable_error_setting();
+    }
+}
+
+/// Helper struct for ExecCtx construction.
+#[derive(Debug, Clone)]
+pub(crate) struct ExecCtxIngredients {
+    pub(crate) last_call_request_id: u32,
+    pub(crate) cid_info: CidInfo,
+}
+
+use serde::Deserialize;
+use serde::Serialize;
+use std::fmt::Display;
+use std::fmt::Formatter;
+
+/// It reflects RunParameters structure due to limitation of the marine macro to support Rc.
+#[derive(Debug, Clone, Eq, PartialEq, Serialize, Deserialize)]
+pub(crate) struct RcRunParameters {
+    pub(crate) init_peer_id: Rc<str>,
+    pub(crate) current_peer_id: Rc<String>,
+    // TODO use [u8]
+    pub(crate) salt: Rc<str>,
+    pub(crate) timestamp: u64,
+    pub(crate) ttl: u32,
+}
+
+impl RcRunParameters {
+    pub(crate) fn from_run_parameters(run_parameters: &RunParameters) -> Self {
+        Self {
+            init_peer_id: run_parameters.init_peer_id.as_str().into(),
+            current_peer_id: Rc::new(run_parameters.current_peer_id.clone()),
+            salt: run_parameters.particle_id.as_str().into(),
+            timestamp: run_parameters.timestamp,
+            ttl: run_parameters.ttl,
+        }
+    }
+}
+
+impl<'i> Display for ExecutionCtx<'i> {
+    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
+        writeln!(f, "scalars:")?;
+        writeln!(f, "  {}", self.scalars)?;
+
+        writeln!(f, "streams:")?;
+        writeln!(f, "  {}", self.streams)?;
+
+        writeln!(f, "stream_maps:")?;
+        writeln!(f, "  {}", self.stream_maps)?;
+
+        writeln!(f, "current peer id: {}", self.run_parameters.current_peer_id)?;
+        writeln!(f, "init peer id: {}", self.run_parameters.init_peer_id)?;
+        writeln!(f, "timestamp: {}", self.run_parameters.timestamp)?;
+        writeln!(f, "subgraph complete: {}", self.subgraph_completeness)?;
+        writeln!(f, "next peer public keys: {:?}", self.next_peer_pks)?;
+
+        Ok(())
+    }
+}
+
\ No newline at end of file diff --git a/src/air/execution_step/execution_context/instruction_error/error_descriptor.rs.html b/src/air/execution_step/execution_context/instruction_error/error_descriptor.rs.html new file mode 100644 index 00000000..5b56799f --- /dev/null +++ b/src/air/execution_step/execution_context/instruction_error/error_descriptor.rs.html @@ -0,0 +1,173 @@ +error_descriptor.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::no_error;
+use super::InstructionError;
+use crate::execution_step::ErrorAffectable;
+use crate::execution_step::RcSecurityTetraplet;
+use crate::ExecutionError;
+use crate::ToErrorCode;
+
+pub(crate) struct ErrorDescriptor {
+    error: InstructionError,
+    error_can_be_set: bool,
+}
+
+impl ErrorDescriptor {
+    pub(crate) fn try_to_set_error_from_exec_error(
+        &mut self,
+        error: &(impl ErrorAffectable + ToErrorCode + ToString),
+        instruction: &str,
+        peer_id_option: Option<&str>,
+        tetraplet: Option<RcSecurityTetraplet>,
+    ) {
+        use super::get_instruction_error_from_exec_error;
+
+        // returns early if there is an error to bubble up or the error is Uncatchable.
+        if !self.error_can_be_set || !error.affects_error() {
+            return;
+        }
+
+        self.error = get_instruction_error_from_exec_error(error, instruction, peer_id_option, tetraplet);
+    }
+
+    pub(crate) fn error(&self) -> &InstructionError {
+        &self.error
+    }
+
+    pub(crate) fn clear_error_object_if_needed(&mut self) {
+        if self.error_can_be_set {
+            self.error = no_error();
+        }
+    }
+
+    pub(crate) fn set_original_execution_error(&mut self, e: &ExecutionError) {
+        self.error.orig_catchable = match e {
+            ExecutionError::Catchable(err) => Some(err.as_ref().clone()),
+            _ => None,
+        };
+    }
+
+    pub(crate) fn enable_error_setting(&mut self) {
+        self.error_can_be_set = true;
+    }
+
+    pub(crate) fn disable_error_setting(&mut self) {
+        self.error_can_be_set = false;
+    }
+}
+
+impl Default for ErrorDescriptor {
+    fn default() -> Self {
+        let error = no_error();
+        let error_can_be_set = true;
+
+        Self {
+            error,
+            error_can_be_set,
+        }
+    }
+}
+
\ No newline at end of file diff --git a/src/air/execution_step/execution_context/instruction_error/errors.rs.html b/src/air/execution_step/execution_context/instruction_error/errors.rs.html new file mode 100644 index 00000000..e1e2d0eb --- /dev/null +++ b/src/air/execution_step/execution_context/instruction_error/errors.rs.html @@ -0,0 +1,85 @@ +errors.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use crate::JValue;
+
+use thiserror::Error as ThisError;
+
+/// Describes errors related to converting a scalar into error object.
+#[derive(Debug, Clone, ThisError)]
+pub enum ErrorObjectError {
+    #[error("scalar should have an object type to be converted into error object, but '{0}' doesn't have")]
+    ScalarMustBeObject(JValue),
+
+    #[error("scalar '{scalar}' must have field with name '{field_name}'")]
+    ScalarMustContainField { scalar: JValue, field_name: &'static str },
+
+    #[error("{field_name} of scalar '{scalar}' must have {expected_type} type")]
+    ScalarFieldIsWrongType {
+        scalar: JValue,
+        field_name: &'static str,
+        expected_type: &'static str,
+    },
+
+    #[error("error code must be non-zero, but it is zero")]
+    ErrorCodeMustBeNonZero,
+}
+
\ No newline at end of file diff --git a/src/air/execution_step/execution_context/instruction_error/errors_utils.rs.html b/src/air/execution_step/execution_context/instruction_error/errors_utils.rs.html new file mode 100644 index 00000000..ea527b1a --- /dev/null +++ b/src/air/execution_step/execution_context/instruction_error/errors_utils.rs.html @@ -0,0 +1,153 @@ +errors_utils.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use air_interpreter_data::Provenance;
+
+use super::instruction_error_definition::error_from_raw_fields;
+use super::instruction_error_definition::error_from_raw_fields_w_peerid;
+use super::InstructionError;
+use crate::execution_step::ErrorAffectable;
+use crate::execution_step::RcSecurityTetraplet;
+use crate::JValue;
+use crate::ToErrorCode;
+
+pub(crate) fn get_instruction_error_from_exec_error(
+    error: &(impl ErrorAffectable + ToErrorCode + ToString),
+    instruction: &str,
+    peer_id_option: Option<&str>,
+    tetraplet: Option<RcSecurityTetraplet>,
+) -> InstructionError {
+    // it is not a call result, but generated from a limited set of unjoinable errors
+    let provenance = Provenance::literal();
+
+    get_instruction_error_from_ingredients(
+        error.to_error_code(),
+        &error.to_string(),
+        instruction,
+        peer_id_option,
+        tetraplet,
+        provenance,
+    )
+}
+
+pub(crate) fn get_instruction_error_from_ingredients(
+    error_code: i64,
+    error_message: &str,
+    instruction: &str,
+    peer_id_option: Option<&str>,
+    tetraplet: Option<RcSecurityTetraplet>,
+    provenance: Provenance,
+) -> InstructionError {
+    let error_object = match peer_id_option {
+        Some(peer_id) => error_from_raw_fields_w_peerid(error_code, error_message, instruction, peer_id),
+        None => error_from_raw_fields(error_code, error_message, instruction),
+    };
+    get_instruction_error_from_error_object(error_object, tetraplet, provenance)
+}
+
+pub(crate) fn get_instruction_error_from_error_object(
+    error: JValue,
+    tetraplet: Option<RcSecurityTetraplet>,
+    provenance: Provenance,
+) -> InstructionError {
+    let orig_catchable = None;
+    InstructionError {
+        error,
+        tetraplet,
+        provenance,
+        orig_catchable,
+    }
+}
+
\ No newline at end of file diff --git a/src/air/execution_step/execution_context/instruction_error/instruction_error_definition.rs.html b/src/air/execution_step/execution_context/instruction_error/instruction_error_definition.rs.html new file mode 100644 index 00000000..0bb926b6 --- /dev/null +++ b/src/air/execution_step/execution_context/instruction_error/instruction_error_definition.rs.html @@ -0,0 +1,317 @@ +instruction_error_definition.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::ErrorObjectError;
+use crate::execution_step::RcSecurityTetraplet;
+use crate::CatchableError;
+use crate::JValue;
+
+use air_interpreter_data::Provenance;
+use maplit::hashmap;
+
+pub const ERROR_CODE_FIELD_NAME: &str = "error_code";
+pub const MESSAGE_FIELD_NAME: &str = "message";
+pub const INSTRUCTION_FIELD_NAME: &str = "instruction";
+pub const PEER_ID_FIELD_NAME: &str = "peer_id";
+pub const NO_ERROR_MESSAGE: &str = "";
+pub const NO_ERROR_ERROR_CODE: i64 = 0;
+
+/// This struct tracks the last arisen error.
+/// :error: and %last_error% are special scalar values that support lenses.
+/// There are some differences b/w mentioned errors and an ordinary scalar:
+///  - they are set to not-an-error value by default
+///  - these are global scalars, meaning that fold and new scopes do not apply for it
+#[derive(Debug, Clone)]
+pub struct InstructionError {
+    /// Error object that represents the last occurred error.
+    pub error: JValue,
+
+    /// Tetraplet that identify host where the error occurred.
+    pub tetraplet: Option<RcSecurityTetraplet>,
+
+    /// Value provenance.
+    pub provenance: Provenance,
+
+    /// This is an original Catchable that is used to bubble an original error up,
+    /// when `fail :error:` is called in the right branch of `xor`.
+    pub orig_catchable: Option<CatchableError>,
+}
+
+pub(crate) fn error_from_raw_fields_w_peerid(
+    error_code: i64,
+    error_message: &str,
+    instruction: &str,
+    peer_id: &str,
+) -> JValue {
+    hashmap! {
+        ERROR_CODE_FIELD_NAME => JValue::from(error_code),
+        MESSAGE_FIELD_NAME => error_message.into(),
+        INSTRUCTION_FIELD_NAME => instruction.into(),
+        PEER_ID_FIELD_NAME => peer_id.into(),
+    }
+    .into()
+}
+
+pub(crate) fn error_from_raw_fields(error_code: i64, error_message: &str, instruction: &str) -> JValue {
+    hashmap! {
+        ERROR_CODE_FIELD_NAME => JValue::from(error_code),
+        MESSAGE_FIELD_NAME => error_message.into(),
+        INSTRUCTION_FIELD_NAME => instruction.into(),
+    }
+    .into()
+}
+
+/// Checks that a scalar is a value of an object types that contains at least two fields:
+///  - error_code != 0
+///  - message
+pub(crate) fn check_error_object(scalar: &JValue) -> Result<(), ErrorObjectError> {
+    let fields = match scalar {
+        JValue::Object(fields) => fields,
+        _ => return Err(ErrorObjectError::ScalarMustBeObject(scalar.clone())),
+    };
+
+    let check_field = |field_name| {
+        fields
+            .get(field_name)
+            .ok_or_else(|| ErrorObjectError::ScalarMustContainField {
+                scalar: scalar.clone(),
+                field_name,
+            })
+    };
+
+    let error_code = check_field(ERROR_CODE_FIELD_NAME)?;
+    ensure_error_code_correct(scalar, error_code, ERROR_CODE_FIELD_NAME)?;
+
+    let message = check_field(MESSAGE_FIELD_NAME)?;
+    ensure_jvalue_is_string(scalar, message, MESSAGE_FIELD_NAME)?;
+
+    Ok(())
+}
+
+fn ensure_error_code_correct(
+    scalar: &JValue,
+    value: &JValue,
+    field_name: &'static str,
+) -> Result<(), ErrorObjectError> {
+    match value {
+        JValue::Number(number) if number.is_i64() | number.is_u64() => {
+            ensure_error_code_is_error(number.as_i64().unwrap())
+        }
+        _ => Err(ErrorObjectError::ScalarFieldIsWrongType {
+            scalar: scalar.clone(),
+            field_name,
+            expected_type: "integer",
+        }),
+    }
+}
+
+fn ensure_error_code_is_error(number: i64) -> Result<(), ErrorObjectError> {
+    if number == NO_ERROR_ERROR_CODE {
+        Err(ErrorObjectError::ErrorCodeMustBeNonZero)
+    } else {
+        Ok(())
+    }
+}
+
+fn ensure_jvalue_is_string(scalar: &JValue, value: &JValue, field_name: &'static str) -> Result<(), ErrorObjectError> {
+    match value.as_str() {
+        Some(_) => Ok(()),
+        None => Err(ErrorObjectError::ScalarFieldIsWrongType {
+            scalar: scalar.clone(),
+            field_name,
+            expected_type: "string",
+        }),
+    }
+}
+
+pub fn no_error_object() -> JValue {
+    hashmap! {
+        ERROR_CODE_FIELD_NAME => JValue::from(NO_ERROR_ERROR_CODE),
+        MESSAGE_FIELD_NAME => NO_ERROR_MESSAGE.into(),
+    }
+    .into()
+}
+
+pub fn no_error() -> InstructionError {
+    InstructionError {
+        error: no_error_object(),
+        tetraplet: None,
+        provenance: Provenance::literal(),
+        orig_catchable: None,
+    }
+}
+
\ No newline at end of file diff --git a/src/air/execution_step/execution_context/instruction_error/last_error_descriptor.rs.html b/src/air/execution_step/execution_context/instruction_error/last_error_descriptor.rs.html new file mode 100644 index 00000000..55a4f40f --- /dev/null +++ b/src/air/execution_step/execution_context/instruction_error/last_error_descriptor.rs.html @@ -0,0 +1,185 @@ +last_error_descriptor.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use air_interpreter_data::Provenance;
+
+use super::no_error;
+use super::InstructionError;
+use crate::execution_step::ErrorAffectable;
+use crate::execution_step::RcSecurityTetraplet;
+use crate::JValue;
+use crate::ToErrorCode;
+
+pub(crate) struct LastErrorDescriptor {
+    error: InstructionError,
+
+    /// True, if last error could be set. This flag is used to distinguish
+    /// whether an error is being bubbled up from the bottom or just encountered.
+    /// This allows to write a simple code to handle bubbling error up.
+    error_can_be_set: bool,
+}
+
+impl LastErrorDescriptor {
+    pub(crate) fn try_to_set_last_error_from_exec_error(
+        &mut self,
+        error: &(impl ErrorAffectable + ToErrorCode + ToString),
+        instruction: &str,
+        peer_id_option: Option<&str>,
+        tetraplet: Option<RcSecurityTetraplet>,
+    ) {
+        use super::get_instruction_error_from_exec_error;
+
+        // This check is an optimization to prevent creation of an error object in case if error
+        // must not be set.
+        if !self.error_can_be_set || !error.affects_last_error() {
+            return;
+        }
+
+        self.error = get_instruction_error_from_exec_error(error, instruction, peer_id_option, tetraplet);
+        self.error_can_be_set = false;
+    }
+
+    pub(crate) fn set_from_error_object(
+        &mut self,
+        error: JValue,
+        tetraplet: Option<RcSecurityTetraplet>,
+        provenance: Provenance,
+    ) {
+        use super::get_instruction_error_from_error_object;
+
+        self.error = get_instruction_error_from_error_object(error, tetraplet, provenance);
+        self.error_can_be_set = false;
+    }
+
+    pub(crate) fn error(&self) -> &InstructionError {
+        &self.error
+    }
+
+    pub(crate) fn meet_xor_right_branch(&mut self) {
+        self.error_can_be_set = true;
+    }
+
+    pub(crate) fn meet_par_successed_end(&mut self) {
+        self.error_can_be_set = true;
+    }
+}
+
+impl Default for LastErrorDescriptor {
+    fn default() -> Self {
+        let error = no_error();
+
+        Self {
+            error,
+            error_can_be_set: true,
+        }
+    }
+}
+
\ No newline at end of file diff --git a/src/air/execution_step/execution_context/instruction_error/mod.rs.html b/src/air/execution_step/execution_context/instruction_error/mod.rs.html new file mode 100644 index 00000000..e1fedaa9 --- /dev/null +++ b/src/air/execution_step/execution_context/instruction_error/mod.rs.html @@ -0,0 +1,81 @@ +mod.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+mod error_descriptor;
+mod errors;
+mod errors_utils;
+mod instruction_error_definition;
+mod last_error_descriptor;
+
+pub use errors::ErrorObjectError;
+pub use instruction_error_definition::no_error;
+pub use instruction_error_definition::no_error_object;
+pub use instruction_error_definition::InstructionError;
+pub use instruction_error_definition::ERROR_CODE_FIELD_NAME;
+pub use instruction_error_definition::INSTRUCTION_FIELD_NAME;
+pub use instruction_error_definition::MESSAGE_FIELD_NAME;
+pub use instruction_error_definition::NO_ERROR_ERROR_CODE;
+pub use instruction_error_definition::NO_ERROR_MESSAGE;
+
+pub(crate) use error_descriptor::ErrorDescriptor;
+pub(super) use errors_utils::*;
+pub(crate) use instruction_error_definition::check_error_object;
+pub(crate) use instruction_error_definition::error_from_raw_fields_w_peerid;
+pub(crate) use last_error_descriptor::LastErrorDescriptor;
+
\ No newline at end of file diff --git a/src/air/execution_step/execution_context/mod.rs.html b/src/air/execution_step/execution_context/mod.rs.html new file mode 100644 index 00000000..16667e7a --- /dev/null +++ b/src/air/execution_step/execution_context/mod.rs.html @@ -0,0 +1,69 @@ +mod.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+mod cid_state;
+mod context;
+mod instruction_error;
+mod scalar_variables;
+mod stream_maps_variables;
+mod streams_variables;
+
+pub use instruction_error::*;
+
+pub use cid_state::ExecutionCidState;
+pub(crate) use cid_state::ResolvedServiceInfo;
+pub(crate) use context::*;
+pub(crate) use scalar_variables::*;
+pub(crate) use stream_maps_variables::*;
+pub(crate) use streams_variables::*;
+
\ No newline at end of file diff --git a/src/air/execution_step/execution_context/scalar_variables.rs.html b/src/air/execution_step/execution_context/scalar_variables.rs.html new file mode 100644 index 00000000..e7878f40 --- /dev/null +++ b/src/air/execution_step/execution_context/scalar_variables.rs.html @@ -0,0 +1,547 @@ +scalar_variables.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+mod values_sparse_matrix;
+
+use crate::execution_step::errors_prelude::*;
+use crate::execution_step::value_types::CanonStreamMapWithProvenance;
+use crate::execution_step::value_types::CanonStreamWithProvenance;
+use crate::execution_step::value_types::ScalarRef;
+use crate::execution_step::ExecutionResult;
+use crate::execution_step::FoldState;
+use crate::execution_step::ValueAggregate;
+use values_sparse_matrix::ValuesSparseMatrix;
+
+use std::collections::HashMap;
+
+// TODO: move this code snippet to documentation when it's ready
+
+/// There are two scopes for variable scalars in AIR: global and local. A local scope
+/// is a scope inside every fold block, other scope is a global. It means that scalar
+/// in an upper fold block could be shadowed by a scalar with the same name in a lower
+/// fold block, it works "as expected". Let's consider the following example:
+/// (seq
+///   (seq
+///     (call ... local) ;; (1)
+///     (fold iterable_1 iterator_1
+///       (seq
+///         (seq
+///           (seq
+///             (call ... local) ;; (2)
+///             (fold iterable_2 iterator_2
+///               (seq
+///                 (seq
+///                    (call ... local) ;; (3)
+///                    (call ... [local]) ;; local set by (3) will be used
+///                  )
+///                  (next iterator_2)
+///               )
+///             )
+///           )
+///           (call ... [local]) ;; local set by (2) will be used
+///         )
+///         (next iterator_1)
+///       )
+///     )
+///   )
+///   (seq
+///     (call ... [local]) ;; local set by (1) will be used
+///     (call ... local) ;; error will be occurred because, it's impossible to set variable twice
+///                      ;; in a global scope
+///   )
+/// )
+///
+/// Although there could be only one iterable value for a fold block, because of CRDT rules.
+/// This struct is intended to provide abilities to work with scalars as it was described.
+pub(crate) struct Scalars<'i> {
+    // TODO: use Rc<String> to avoid copying
+    /// Terminology used here (mainly to resolve concerns re difference between scalars and values):
+    ///  - scalar is an AIR scalar, iterable and non iterable. A scalar is addressed by a name.
+    ///  - value is concrete value assigned to scalar on certain depth
+    ///  - scope is a variable scope where variable is visible. If we consider fold as a graph where
+    ///     each next produces a new level, then scope is a level in this tree. Please note that it
+    ///     includes variable defined after next instruction.
+    ///  - depth is a count of seen scopes (or a depth in a tree met in the previous definition)
+    ///
+    /// Non iterable variables hash map could be recognized as a sparse matrix, where a row
+    /// corresponds to a variable name and contains all its values were set with respect to a depth.
+    /// A column corresponds to a depth and contains all values were set at current depth.
+    ///
+    /// This matrix follows these invariants:
+    ///   - all rows are non empty
+    ///   - global variables have 0 depth
+    ///   - cells in a row are sorted by depth
+    ///   - all depths in cell in one row are unique
+    pub(crate) non_iterable_variables: ValuesSparseMatrix<ValueAggregate>,
+
+    pub(crate) canon_streams: ValuesSparseMatrix<CanonStreamWithProvenance>,
+
+    pub(crate) canon_maps: ValuesSparseMatrix<CanonStreamMapWithProvenance>,
+
+    pub(crate) iterable_variables: HashMap<String, FoldState<'i>>,
+}
+
+impl<'i> Scalars<'i> {
+    pub fn new() -> Self {
+        Self {
+            non_iterable_variables: ValuesSparseMatrix::new(),
+            canon_streams: ValuesSparseMatrix::new(),
+            canon_maps: ValuesSparseMatrix::new(),
+            iterable_variables: HashMap::new(),
+        }
+    }
+
+    /// Returns true if there was a previous value for the provided key on the same
+    /// fold block.
+    pub(crate) fn set_scalar_value(&mut self, name: impl Into<String>, value: ValueAggregate) -> ExecutionResult<bool> {
+        self.non_iterable_variables.set_value(name, value)
+    }
+
+    /// Returns true if there was a previous value for the provided key on the same
+    /// fold block.
+    pub(crate) fn set_canon_value(
+        &mut self,
+        name: impl Into<String>,
+        value: CanonStreamWithProvenance,
+    ) -> ExecutionResult<bool> {
+        self.canon_streams.set_value(name, value)
+    }
+
+    /// Returns true if there was a previous value for the provided key on the same
+    /// fold block.
+    pub(crate) fn set_canon_map_value(
+        &mut self,
+        name: impl Into<String>,
+        value: CanonStreamMapWithProvenance,
+    ) -> ExecutionResult<bool> {
+        self.canon_maps.set_value(name, value)
+    }
+
+    pub(crate) fn set_iterable_value(
+        &mut self,
+        name: impl Into<String>,
+        fold_state: FoldState<'i>,
+    ) -> ExecutionResult<()> {
+        use std::collections::hash_map::Entry::{Occupied, Vacant};
+
+        match self.iterable_variables.entry(name.into()) {
+            Vacant(entry) => {
+                entry.insert(fold_state);
+                Ok(())
+            }
+            Occupied(entry) => Err(UncatchableError::MultipleIterableValues(entry.key().clone()).into()),
+        }
+    }
+
+    pub(crate) fn remove_iterable_value(&mut self, name: &str) {
+        self.iterable_variables.remove(name);
+    }
+
+    pub(crate) fn get_non_iterable_scalar(&'i self, name: &str) -> ExecutionResult<Option<&'i ValueAggregate>> {
+        self.non_iterable_variables.get_value(name)
+    }
+
+    pub(crate) fn get_iterable(&mut self, name: &str) -> ExecutionResult<&FoldState<'i>> {
+        self.iterable_variables
+            .get(name)
+            .ok_or_else(|| UncatchableError::FoldStateNotFound(name.to_string()).into())
+    }
+
+    pub(crate) fn get_iterable_mut(&mut self, name: &str) -> ExecutionResult<&mut FoldState<'i>> {
+        self.iterable_variables
+            .get_mut(name)
+            .ok_or_else(|| UncatchableError::FoldStateNotFound(name.to_string()).into())
+    }
+
+    pub(crate) fn get_canon_stream(&'i self, name: &str) -> ExecutionResult<&'i CanonStreamWithProvenance> {
+        self.canon_streams
+            .get_value(name)?
+            .ok_or_else(|| CatchableError::VariableWasNotInitializedAfterNew(name.to_string()).into())
+    }
+
+    pub(crate) fn get_canon_map(&'i self, name: &str) -> ExecutionResult<&'i CanonStreamMapWithProvenance> {
+        self.canon_maps
+            .get_value(name)?
+            .ok_or_else(|| CatchableError::VariableWasNotInitializedAfterNew(name.to_string()).into())
+    }
+
+    pub(crate) fn get_value(&'i self, name: &str) -> ExecutionResult<ScalarRef<'i>> {
+        let value = self.get_non_iterable_scalar(name);
+        let iterable_value_with_prov = self.iterable_variables.get(name);
+
+        match (value, iterable_value_with_prov) {
+            (Err(_), None) => Err(CatchableError::VariableNotFound(name.to_string()).into()),
+            (Ok(None), _) => Err(CatchableError::VariableWasNotInitializedAfterNew(name.to_string()).into()),
+            (Ok(Some(value)), None) => Ok(ScalarRef::Value(value)),
+            (Err(_), Some(iterable_value)) => Ok(ScalarRef::IterableValue(iterable_value)),
+            (Ok(_), Some(_)) => unreachable!("this is checked on the parsing stage"),
+        }
+    }
+
+    pub(crate) fn variable_could_be_set(&self, variable_name: &str) -> bool {
+        self.non_iterable_variables.variable_could_be_set(variable_name)
+            || self.canon_streams.variable_could_be_set(variable_name)
+    }
+
+    pub(crate) fn meet_fold_start(&mut self) {
+        self.non_iterable_variables.meet_fold_start();
+        self.canon_streams.meet_fold_start();
+        self.canon_maps.meet_fold_start();
+    }
+
+    // meet next before recursion
+    pub(crate) fn meet_next_before(&mut self) {
+        self.non_iterable_variables.meet_next_before();
+        self.canon_streams.meet_next_before();
+        self.canon_maps.meet_next_before();
+    }
+
+    // meet next after recursion
+    pub(crate) fn meet_next_after(&mut self) {
+        self.non_iterable_variables.meet_next_after();
+        self.canon_streams.meet_next_after();
+        self.canon_maps.meet_next_after();
+    }
+
+    pub(crate) fn meet_fold_end(&mut self) {
+        self.non_iterable_variables.meet_fold_end();
+        self.canon_streams.meet_fold_end();
+        self.canon_maps.meet_fold_end();
+    }
+
+    pub(crate) fn meet_new_start_scalar(&mut self, scalar_name: String) {
+        self.non_iterable_variables.meet_new_start(scalar_name);
+    }
+
+    pub(crate) fn meet_new_start_canon_stream(&mut self, canon_stream_name: String) {
+        self.canon_streams.meet_new_start(canon_stream_name);
+    }
+
+    pub(crate) fn meet_new_start_canon_stream_map(&mut self, canon_stream_map_name: String) {
+        self.canon_maps.meet_new_start(canon_stream_map_name);
+    }
+
+    pub(crate) fn meet_new_end_scalar(&mut self, scalar_name: &str) -> ExecutionResult<()> {
+        self.non_iterable_variables.meet_new_end(scalar_name)
+    }
+
+    pub(crate) fn meet_new_end_canon_stream(&mut self, canon_name: &str) -> ExecutionResult<()> {
+        self.canon_streams.meet_new_end(canon_name)
+    }
+
+    pub(crate) fn meet_new_end_canon_stream_map(&mut self, canon_stream_map_name: &str) -> ExecutionResult<()> {
+        self.canon_maps.meet_new_end(canon_stream_map_name)
+    }
+}
+
+impl Default for Scalars<'_> {
+    fn default() -> Self {
+        Scalars::new()
+    }
+}
+
+use std::fmt;
+
+impl<'i> fmt::Display for Scalars<'i> {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        writeln!(f, "scalars:\n{}", self.non_iterable_variables)?;
+        writeln!(f, "canon_streams:\n{}", self.canon_streams)?;
+
+        for (name, _) in self.iterable_variables.iter() {
+            // it's impossible to print an iterable value for now
+            writeln!(f, "{name} => iterable")?;
+        }
+
+        Ok(())
+    }
+}
+
\ No newline at end of file diff --git a/src/air/execution_step/execution_context/scalar_variables/values_sparse_matrix.rs.html b/src/air/execution_step/execution_context/scalar_variables/values_sparse_matrix.rs.html new file mode 100644 index 00000000..c5d08e8f --- /dev/null +++ b/src/air/execution_step/execution_context/scalar_variables/values_sparse_matrix.rs.html @@ -0,0 +1,641 @@ +values_sparse_matrix.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use crate::execution_step::CatchableError;
+use crate::execution_step::ExecutionError;
+use crate::execution_step::ExecutionResult;
+use crate::execution_step::UncatchableError;
+
+use non_empty_vec::NonEmpty;
+
+use std::collections::HashMap;
+use std::collections::HashSet;
+use std::rc::Rc;
+
+/// Depth of a global scope.
+const GLOBAL_DEPTH: usize = 0;
+
+pub(crate) struct ValuesSparseMatrix<T> {
+    cells: HashMap<String, NonEmpty<SparseCell<T>>>,
+
+    /// This set contains depths were invalidated at the certain moment of script execution.
+    /// They are needed for careful isolation of scopes produced by iterations in fold blocks,
+    /// precisely to limit access of non iterable variables defined on one depths to ones
+    /// defined on another.
+    allowed_depths: HashSet<usize>,
+
+    /// Count of met scopes at the particular moment of execution.
+    current_depth: usize,
+}
+
+impl<T> ValuesSparseMatrix<T> {
+    pub(super) fn new() -> Self {
+        let allowed_depths = maplit::hashset! { GLOBAL_DEPTH };
+
+        Self {
+            cells: HashMap::new(),
+            allowed_depths,
+            current_depth: GLOBAL_DEPTH,
+        }
+    }
+
+    pub(super) fn set_value(&mut self, name: impl Into<String>, value: T) -> ExecutionResult<bool> {
+        use std::collections::hash_map::Entry::{Occupied, Vacant};
+
+        let name = name.into();
+        let variable_could_be_set = self.variable_could_be_set(&name);
+        match self.cells.entry(name) {
+            Vacant(entry) => {
+                let cell = SparseCell::from_value(self.current_depth, value);
+                let cells = NonEmpty::new(cell);
+                entry.insert(cells);
+
+                Ok(false)
+            }
+            Occupied(entry) => {
+                if !variable_could_be_set {
+                    return Err(UncatchableError::ShadowingIsNotAllowed(entry.key().clone()).into());
+                }
+
+                let values = entry.into_mut();
+                let last_cell = values.last_mut();
+                if last_cell.depth == self.current_depth {
+                    // just rewrite a value if fold level is the same
+                    last_cell.value = Some(value);
+                    Ok(true)
+                } else {
+                    let new_cell = SparseCell::from_value(self.current_depth, value);
+                    values.push(new_cell);
+                    Ok(false)
+                }
+            }
+        }
+    }
+
+    pub(super) fn get_value(&self, name: &str) -> ExecutionResult<Option<&T>> {
+        self.cells
+            .get(name)
+            .and_then(|values| {
+                let last_cell = values.last();
+                let depth_allowed = self.allowed_depths.contains(&last_cell.depth);
+
+                if depth_allowed {
+                    Some(last_cell.value.as_ref())
+                } else {
+                    None
+                }
+            })
+            .ok_or_else(|| ExecutionError::Catchable(Rc::new(CatchableError::VariableNotFound(name.to_string()))))
+    }
+
+    pub(super) fn meet_fold_start(&mut self) {
+        self.current_depth += 1;
+        self.allowed_depths.insert(self.current_depth);
+    }
+
+    // meet next before recursion
+    pub(super) fn meet_next_before(&mut self) {
+        self.allowed_depths.remove(&self.current_depth);
+        self.current_depth += 1;
+        self.allowed_depths.insert(self.current_depth);
+    }
+
+    // meet next after recursion
+    pub(super) fn meet_next_after(&mut self) {
+        self.allowed_depths.remove(&self.current_depth);
+        self.current_depth -= 1;
+        self.allowed_depths.insert(self.current_depth);
+
+        self.cleanup_obsolete_values();
+    }
+
+    pub(super) fn meet_fold_end(&mut self) {
+        self.allowed_depths.remove(&self.current_depth);
+        self.current_depth -= 1;
+        self.cleanup_obsolete_values();
+    }
+
+    pub(super) fn meet_new_start(&mut self, scalar_name: String) {
+        use std::collections::hash_map::Entry::{Occupied, Vacant};
+
+        let new_cell = SparseCell::from_met_new(self.current_depth);
+        match self.cells.entry(scalar_name) {
+            Vacant(entry) => {
+                let ne_vec = NonEmpty::new(new_cell);
+                entry.insert(ne_vec);
+            }
+            Occupied(entry) => {
+                let entry = entry.into_mut();
+                entry.push(new_cell);
+            }
+        }
+    }
+
+    pub(super) fn meet_new_end(&mut self, scalar_name: &str) -> ExecutionResult<()> {
+        let current_depth = self.current_depth;
+        let should_remove_values = self
+            .cells
+            .get_mut(scalar_name)
+            .and_then(|values| {
+                // carefully check that we're popping up an appropriate value,
+                // returning None means an error here
+                match values.pop() {
+                    Some(value) if value.depth == current_depth => Some(false),
+                    Some(_) => None,
+                    // None means that the value was last in a row
+                    None if values.last().depth == current_depth => Some(true),
+                    None => None,
+                }
+            })
+            .ok_or_else(|| UncatchableError::ScalarsStateCorrupted {
+                scalar_name: scalar_name.to_string(),
+                depth: self.current_depth,
+            })
+            .map_err(Into::<ExecutionError>::into)?;
+
+        if should_remove_values {
+            self.cells.remove(scalar_name);
+        }
+        Ok(())
+    }
+
+    pub(super) fn variable_could_be_set(&self, variable_name: &str) -> bool {
+        if self.shadowing_allowed() {
+            return true;
+        }
+
+        match self.cells.get(variable_name) {
+            Some(values) => values.last().value.is_none(),
+            None => false,
+        }
+    }
+
+    pub(super) fn shadowing_allowed(&self) -> bool {
+        // shadowing is allowed only inside a fold block, 0 here means that execution flow
+        // is in a global scope
+        self.current_depth != 0
+    }
+
+    fn cleanup_obsolete_values(&mut self) {
+        // TODO: it takes O(N) where N is a count of all scalars, but it could be optimized
+        // by maintaining array of value indices that should be removed on each depth level
+        let mut values_to_delete = Vec::new();
+        for (name, values) in self.cells.iter_mut() {
+            let value_depth = values.last().depth;
+            if !is_global_value(value_depth) && is_value_obsolete(value_depth, self.current_depth) {
+                // it can't be empty, so it returns None if it contains 1 element
+                if values.pop().is_none() {
+                    // TODO: optimize this cloning in next PR
+                    values_to_delete.push(name.to_string());
+                }
+            }
+        }
+
+        for value_name in values_to_delete {
+            self.cells.remove(&value_name);
+        }
+    }
+}
+
+impl<T> Default for ValuesSparseMatrix<T> {
+    fn default() -> Self {
+        Self::new()
+    }
+}
+
+fn is_global_value(value_depth: usize) -> bool {
+    value_depth == GLOBAL_DEPTH
+}
+
+fn is_value_obsolete(value_depth: usize, current_scope_depth: usize) -> bool {
+    value_depth > current_scope_depth
+}
+
+#[derive(Debug)]
+pub(crate) struct SparseCell<T> {
+    /// Scope depth where the value was set.
+    pub(crate) depth: usize,
+    pub(crate) value: Option<T>,
+}
+
+impl<T> SparseCell<T> {
+    pub(crate) fn from_value(depth: usize, value: T) -> Self {
+        Self {
+            depth,
+            value: Some(value),
+        }
+    }
+
+    pub(crate) fn from_met_new(depth: usize) -> Self {
+        Self { depth, value: None }
+    }
+}
+
+use std::fmt;
+
+impl<T> fmt::Display for SparseCell<T>
+where
+    T: fmt::Display,
+{
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        match &self.value {
+            Some(value) => write!(f, "{value}"),
+            None => write!(f, "none"),
+        }
+    }
+}
+
+impl<T> fmt::Display for ValuesSparseMatrix<T>
+where
+    T: fmt::Debug,
+{
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        writeln!(f, "current_depth: {}", self.current_depth)?;
+
+        for (name, values) in self.cells.iter() {
+            write!(f, "{name}: ")?;
+
+            for value in values.iter() {
+                write!(f, "{value:?} ")?;
+            }
+            writeln!(f)?;
+        }
+
+        Ok(())
+    }
+}
+
+#[cfg(test)]
+mod test {
+    use super::*;
+    use crate::execution_step::{LiteralAggregate, ValueAggregate};
+
+    use std::num::NonZeroUsize;
+
+    #[test]
+    fn test_local_cleanup() {
+        let mut scalars = ValuesSparseMatrix::new();
+
+        let value = 1u64;
+        let value_aggregate =
+            ValueAggregate::from_literal_result(LiteralAggregate::new(value.into(), "".into(), 1.into()));
+        let value_1_name = "name_1";
+        scalars.set_value(value_1_name, value_aggregate.clone()).unwrap();
+
+        let value_2_name = "name_2";
+        scalars.meet_fold_start();
+        scalars.set_value(value_2_name, value_aggregate.clone()).unwrap();
+        scalars.meet_fold_start();
+        scalars.set_value(value_2_name, value_aggregate).unwrap();
+
+        let expected_values_count = scalars.cells.get(value_2_name).unwrap().len();
+        assert_eq!(expected_values_count, NonZeroUsize::new(2).unwrap());
+
+        scalars.meet_fold_end();
+        let expected_values_count = scalars.cells.get(value_2_name).unwrap().len();
+        assert_eq!(expected_values_count, NonZeroUsize::new(1).unwrap());
+
+        scalars.meet_fold_end();
+        assert!(scalars.cells.get(value_2_name).is_none());
+
+        let expected_values_count = scalars.cells.get(value_1_name).unwrap().len();
+        assert_eq!(expected_values_count, NonZeroUsize::new(1).unwrap());
+    }
+}
+
\ No newline at end of file diff --git a/src/air/execution_step/execution_context/stream_maps_variables.rs.html b/src/air/execution_step/execution_context/stream_maps_variables.rs.html new file mode 100644 index 00000000..6986519f --- /dev/null +++ b/src/air/execution_step/execution_context/stream_maps_variables.rs.html @@ -0,0 +1,403 @@ +stream_maps_variables.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+pub(crate) mod errors;
+pub(crate) mod stream_map_key;
+
+use self::stream_map_key::StreamMapKey;
+use crate::execution_step::value_types::StreamMap;
+use crate::execution_step::ExecutionResult;
+use crate::execution_step::Generation;
+use crate::execution_step::ValueAggregate;
+
+use air_parser::ast::Span;
+use air_parser::AirPos;
+use air_trace_handler::TraceHandler;
+
+use std::collections::hash_map::Entry::{Occupied, Vacant};
+use std::collections::HashMap;
+use std::fmt;
+
+// TODO This module should be unified with its Stream counterpart.
+pub(crate) struct StreamMapValueDescriptor<'stream_name> {
+    pub value: ValueAggregate,
+    pub name: &'stream_name str,
+    pub generation: Generation,
+    pub position: AirPos,
+}
+
+impl<'stream_name> StreamMapValueDescriptor<'stream_name> {
+    pub fn new(value: ValueAggregate, name: &'stream_name str, generation: Generation, position: AirPos) -> Self {
+        Self {
+            value,
+            name,
+            generation,
+            position,
+        }
+    }
+}
+
+pub(crate) struct StreamMapDescriptor {
+    pub(super) span: Span,
+    pub(super) stream_map: StreamMap,
+}
+
+impl StreamMapDescriptor {
+    pub(super) fn global(stream_map: StreamMap) -> Self {
+        Self {
+            span: Span::new(0.into(), usize::MAX.into()),
+            stream_map,
+        }
+    }
+
+    pub(super) fn restricted(stream_map: StreamMap, span: Span) -> Self {
+        Self { span, stream_map }
+    }
+}
+
+impl fmt::Display for StreamMapDescriptor {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        write!(f, " <{}> - <{}>: {}", self.span.left, self.span.right, self.stream_map)
+    }
+}
+
+pub(super) fn find_closest<'d>(
+    descriptors: impl DoubleEndedIterator<Item = &'d StreamMapDescriptor>,
+    position: AirPos,
+) -> Option<&'d StreamMap> {
+    // descriptors are placed in a order of decreasing scopes, so it's enough to get the latest suitable
+    descriptors
+        .rev()
+        .find(|d| d.span.contains_position(position))
+        .map(|d| &d.stream_map)
+}
+
+pub(super) fn find_closest_mut<'d>(
+    descriptors: impl DoubleEndedIterator<Item = &'d mut StreamMapDescriptor>,
+    position: AirPos,
+) -> Option<&'d mut StreamMap> {
+    // descriptors are placed in a order of decreasing scopes, so it's enough to get the latest suitable
+    descriptors
+        .rev()
+        .find(|d| d.span.contains_position(position))
+        .map(|d| &mut d.stream_map)
+}
+#[derive(Default)]
+pub(crate) struct StreamMaps {
+    // this one is optimized for speed (not for memory), because it's unexpected
+    // that a script could have a lot of new.
+    // TODO: use shared string (Rc<String>) to avoid copying.
+    stream_maps: HashMap<String, Vec<StreamMapDescriptor>>,
+}
+
+impl StreamMaps {
+    pub(crate) fn get(&self, name: &str, position: AirPos) -> Option<&StreamMap> {
+        self.stream_maps
+            .get(name)
+            .and_then(|descriptors| find_closest(descriptors.iter(), position))
+    }
+
+    pub(crate) fn get_mut(&mut self, name: &str, position: AirPos) -> Option<&mut StreamMap> {
+        self.stream_maps
+            .get_mut(name)
+            .and_then(|descriptors| find_closest_mut(descriptors.iter_mut(), position))
+    }
+
+    pub(crate) fn add_stream_map_value(
+        &mut self,
+        key: StreamMapKey,
+        value_descriptor: StreamMapValueDescriptor<'_>,
+    ) -> ExecutionResult<()> {
+        let StreamMapValueDescriptor {
+            value,
+            name,
+            generation,
+            position,
+        } = value_descriptor;
+
+        match self.get_mut(name, position) {
+            Some(stream_map) => stream_map.insert(key, &value, generation),
+            None => {
+                // streams could be created in three ways:
+                //  - after met new instruction with stream name that isn't present in streams
+                //    (it's the only way to create restricted streams)
+                //  - by calling add_global_stream with generation that come from data
+                //    for global streams
+                //  - and by this function, and if there is no such a streams in streams,
+                //    it means that a new global one should be created.
+                let mut stream_map = StreamMap::new();
+                stream_map.insert(key, &value, generation)?;
+                let descriptor = StreamMapDescriptor::global(stream_map);
+                self.stream_maps.insert(name.to_string(), vec![descriptor]);
+                Ok(())
+            }
+        }
+    }
+
+    pub(crate) fn meet_scope_start(&mut self, name: impl Into<String>, span: Span) {
+        let name = name.into();
+
+        let new_stream_map = StreamMap::new();
+        let new_descriptor = StreamMapDescriptor::restricted(new_stream_map, span);
+        match self.stream_maps.entry(name) {
+            Occupied(mut entry) => {
+                entry.get_mut().push(new_descriptor);
+            }
+            Vacant(entry) => {
+                entry.insert(vec![new_descriptor]);
+            }
+        }
+    }
+
+    pub(crate) fn meet_scope_end(&mut self, name: String, trace_ctx: &mut TraceHandler) -> ExecutionResult<()> {
+        // unwraps are safe here because met_scope_end must be called after met_scope_start
+        let stream_map_descriptors = self.stream_maps.get_mut(&name).unwrap();
+        // delete a stream after exit from a scope
+        let mut last_descriptor = stream_map_descriptors.pop().unwrap();
+        if stream_map_descriptors.is_empty() {
+            // streams should contain only non-empty stream embodiments
+            self.stream_maps.remove(&name);
+        }
+
+        last_descriptor.stream_map.compactify(trace_ctx)
+    }
+
+    pub(crate) fn compactify(&mut self, trace_ctx: &mut TraceHandler) -> ExecutionResult<()> {
+        for (_, descriptors) in self.stream_maps.iter_mut() {
+            for descriptor in descriptors.iter_mut() {
+                descriptor.stream_map.compactify(trace_ctx)?;
+            }
+        }
+
+        Ok(())
+    }
+}
+
+impl fmt::Display for StreamMaps {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        for (name, descriptors) in self.stream_maps.iter() {
+            if let Some(last_descriptor) = descriptors.last() {
+                writeln!(f, "{name} => {last_descriptor}")?;
+            }
+        }
+        Ok(())
+    }
+}
+
\ No newline at end of file diff --git a/src/air/execution_step/execution_context/stream_maps_variables/errors.rs.html b/src/air/execution_step/execution_context/stream_maps_variables/errors.rs.html new file mode 100644 index 00000000..f55d11ee --- /dev/null +++ b/src/air/execution_step/execution_context/stream_maps_variables/errors.rs.html @@ -0,0 +1,105 @@ +errors.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use thiserror::Error as ThisError;
+
+/// Describes errors related to applying lambdas to values.
+#[derive(Debug, Clone, ThisError)]
+pub enum StreamMapError {
+    #[error("unsupported type for {variable_name} map's key")]
+    UnsupportedMapKeyType { variable_name: String },
+}
+
+/// CanonStreamMap related errors.
+#[derive(Debug, Clone, ThisError)]
+pub enum CanonStreamMapError {
+    #[error("can not find JValue to produce scalar from")]
+    NoDataToProduceScalar,
+}
+
+#[derive(Debug, Clone, ThisError)]
+pub enum StreamMapKeyError {
+    #[error("the value must be an object with key and value fields")]
+    NotAnObject,
+
+    #[error("there must be a \"value\" field in kvpair object")]
+    ValueFieldIsAbsent,
+
+    #[error("unsupported kvpair object or map key type")]
+    UnsupportedKVPairObjectOrMapKeyType,
+}
+
+pub fn unsupported_map_key_type(variable_name: &str) -> StreamMapError {
+    StreamMapError::UnsupportedMapKeyType {
+        variable_name: variable_name.to_string(),
+    }
+}
+
\ No newline at end of file diff --git a/src/air/execution_step/execution_context/stream_maps_variables/stream_map_key.rs.html b/src/air/execution_step/execution_context/stream_maps_variables/stream_map_key.rs.html new file mode 100644 index 00000000..1fe5810c --- /dev/null +++ b/src/air/execution_step/execution_context/stream_maps_variables/stream_map_key.rs.html @@ -0,0 +1,251 @@ +stream_map_key.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use crate::execution_step::ValueAggregate;
+use crate::JValue;
+
+use air_interpreter_value::JsonString;
+use std::fmt::Display;
+use std::fmt::Formatter;
+
+pub(crate) static KEY_FIELD_NAME: &str = "key";
+
+// TODO refactor the keys so that integer and string
+// value domains overlap would become impossible or less harmful.
+#[derive(Clone, PartialEq, Debug, Eq, Hash)]
+pub(crate) enum StreamMapKey {
+    Str(JsonString),
+    U64(u64),
+    I64(i64),
+}
+
+impl StreamMapKey {
+    pub fn from_value(value: JValue) -> Option<Self> {
+        match value {
+            JValue::String(s) => Some(StreamMapKey::Str(s)),
+            JValue::Number(n) if n.is_i64() => Some(StreamMapKey::I64(n.as_i64().unwrap())),
+            JValue::Number(n) if n.is_u64() => Some(StreamMapKey::U64(n.as_u64().unwrap())),
+            _ => None,
+        }
+    }
+
+    pub fn from_value_ref(value: &JValue) -> Option<Self> {
+        match value {
+            JValue::String(s) => Some(StreamMapKey::Str(s.clone())),
+            JValue::Number(n) if n.is_i64() => Some(StreamMapKey::I64(n.as_i64().unwrap())),
+            JValue::Number(n) if n.is_u64() => Some(StreamMapKey::U64(n.as_u64().unwrap())),
+            _ => None,
+        }
+    }
+
+    pub(crate) fn from_kvpair_owned(value: &ValueAggregate) -> Option<Self> {
+        let object = value.get_result().as_object()?;
+        let key = object.get(KEY_FIELD_NAME)?.clone();
+        StreamMapKey::from_value(key)
+    }
+
+    pub(crate) fn to_key(&self) -> JsonString {
+        match self {
+            StreamMapKey::Str(s) => s.clone(),
+            StreamMapKey::U64(n) => format!("{n}").into(),
+            StreamMapKey::I64(n) => format!("{n}").into(),
+        }
+    }
+}
+
+impl From<i64> for StreamMapKey {
+    fn from(value: i64) -> Self {
+        StreamMapKey::I64(value)
+    }
+}
+
+impl From<u64> for StreamMapKey {
+    fn from(value: u64) -> Self {
+        StreamMapKey::U64(value)
+    }
+}
+
+// TODO unify all types.
+// This conversion is used to cast from numeric lambda accessor that leverages u32
+// however larpop parser grammar uses i64 for numeric keys inserting into a stream map.
+impl From<u32> for StreamMapKey {
+    fn from(value: u32) -> Self {
+        StreamMapKey::I64(value.into())
+    }
+}
+
+impl From<&str> for StreamMapKey {
+    fn from(value: &str) -> Self {
+        StreamMapKey::Str(value.into())
+    }
+}
+
+impl From<JsonString> for StreamMapKey {
+    fn from(value: JsonString) -> Self {
+        StreamMapKey::Str(value)
+    }
+}
+
+impl From<StreamMapKey> for JValue {
+    fn from(value: StreamMapKey) -> Self {
+        match value {
+            StreamMapKey::Str(s) => JValue::string(s),
+            StreamMapKey::U64(n) => n.into(),
+            StreamMapKey::I64(n) => n.into(),
+        }
+    }
+}
+
+// This trait impl proposefully prints numbers the same way as strings
+// to use it in map-to-scalar cast.
+impl Display for StreamMapKey {
+    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
+        match self {
+            StreamMapKey::Str(s) => write!(f, "{}", s),
+            StreamMapKey::U64(n) => write!(f, "{}", n),
+            StreamMapKey::I64(n) => write!(f, "{}", n),
+        }
+    }
+}
+
\ No newline at end of file diff --git a/src/air/execution_step/execution_context/streams_variables.rs.html b/src/air/execution_step/execution_context/streams_variables.rs.html new file mode 100644 index 00000000..743e55d2 --- /dev/null +++ b/src/air/execution_step/execution_context/streams_variables.rs.html @@ -0,0 +1,275 @@ +streams_variables.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+mod stream_descriptor;
+mod stream_value_descriptor;
+
+use crate::execution_step::ExecutionResult;
+use crate::execution_step::Stream;
+
+use stream_descriptor::*;
+pub(crate) use stream_value_descriptor::StreamValueDescriptor;
+
+use air_parser::ast::Span;
+use air_parser::AirPos;
+use air_trace_handler::TraceHandler;
+
+use std::collections::hash_map::Entry::Occupied;
+use std::collections::hash_map::Entry::Vacant;
+use std::collections::HashMap;
+
+#[derive(Default)]
+pub(crate) struct Streams {
+    // this one is optimized for speed (not for memory), because it's unexpected
+    // that a script could have a lot of new.
+    // TODO: use shared string (Rc<String>) to avoid copying.
+    streams: HashMap<String, Vec<StreamDescriptor>>,
+}
+
+impl Streams {
+    pub(crate) fn new() -> Self {
+        Self {
+            streams: <_>::default(),
+        }
+    }
+
+    pub(crate) fn get(&self, name: &str, position: AirPos) -> Option<&Stream> {
+        self.streams
+            .get(name)
+            .and_then(|descriptors| find_closest(descriptors.iter(), position))
+    }
+
+    pub(crate) fn get_mut(&mut self, name: &str, position: AirPos) -> Option<&mut Stream> {
+        self.streams
+            .get_mut(name)
+            .and_then(|descriptors| find_closest_mut(descriptors.iter_mut(), position))
+    }
+
+    pub(crate) fn add_stream_value(&mut self, value_descriptor: StreamValueDescriptor<'_>) -> ExecutionResult<()> {
+        let StreamValueDescriptor {
+            value,
+            name,
+            generation,
+            position,
+        } = value_descriptor;
+
+        match self.get_mut(name, position) {
+            Some(stream) => stream.add_value(value, generation)?,
+            None => {
+                // streams are created:
+                //  - when meet_scope_start is called by `new` instruction to create a restricted stream
+                //  - when this f() is called and there is no global stream with the same name in ExecCtx.
+                let mut stream = Stream::new();
+                stream.add_value(value, generation)?;
+                let descriptor = StreamDescriptor::global(stream);
+                self.streams.insert(name.to_string(), vec![descriptor]);
+            }
+        }
+        Ok(())
+    }
+
+    pub(crate) fn meet_scope_start(&mut self, name: impl Into<String>, span: Span) {
+        let name = name.into();
+
+        let new_stream = Stream::new();
+        let new_descriptor = StreamDescriptor::restricted(new_stream, span);
+        match self.streams.entry(name) {
+            Occupied(mut entry) => {
+                entry.get_mut().push(new_descriptor);
+            }
+            Vacant(entry) => {
+                entry.insert(vec![new_descriptor]);
+            }
+        }
+    }
+
+    pub(crate) fn meet_scope_end(&mut self, name: String, trace_ctx: &mut TraceHandler) -> ExecutionResult<()> {
+        // unwraps are safe here because met_scope_end must be called after met_scope_start
+        let stream_descriptors = self.streams.get_mut(&name).unwrap();
+        // delete a stream after exit from a scope
+        let mut last_descriptor = stream_descriptors.pop().unwrap();
+        if stream_descriptors.is_empty() {
+            // streams should contain only non-empty stream embodiments
+            self.streams.remove(&name);
+        }
+
+        last_descriptor.stream.compactify(trace_ctx)
+    }
+
+    pub(crate) fn compactify(&mut self, trace_ctx: &mut TraceHandler) -> ExecutionResult<()> {
+        for (_, descriptors) in self.streams.iter_mut() {
+            for descriptor in descriptors {
+                descriptor.stream.compactify(trace_ctx)?;
+            }
+        }
+
+        Ok(())
+    }
+}
+
+use std::fmt;
+
+impl fmt::Display for Streams {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        for (name, descriptors) in self.streams.iter() {
+            if let Some(last_descriptor) = descriptors.last() {
+                writeln!(f, "{name} => {last_descriptor}")?;
+            }
+        }
+        Ok(())
+    }
+}
+
\ No newline at end of file diff --git a/src/air/execution_step/execution_context/streams_variables/stream_descriptor.rs.html b/src/air/execution_step/execution_context/streams_variables/stream_descriptor.rs.html new file mode 100644 index 00000000..95448146 --- /dev/null +++ b/src/air/execution_step/execution_context/streams_variables/stream_descriptor.rs.html @@ -0,0 +1,155 @@ +stream_descriptor.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use crate::execution_step::Stream;
+
+use air_parser::ast::Span;
+use air_parser::AirPos;
+
+use std::fmt;
+
+pub(super) struct StreamDescriptor {
+    pub(super) span: Span,
+    pub(super) stream: Stream,
+}
+
+impl StreamDescriptor {
+    pub(super) fn global(stream: Stream) -> Self {
+        Self {
+            span: Span::new(0.into(), usize::MAX.into()),
+            stream,
+        }
+    }
+
+    pub(super) fn restricted(stream: Stream, span: Span) -> Self {
+        Self { span, stream }
+    }
+}
+
+impl fmt::Display for StreamDescriptor {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        write!(f, " <{}> - <{}>: {}", self.span.left, self.span.right, self.stream)
+    }
+}
+
+pub(super) fn find_closest<'d>(
+    descriptors: impl DoubleEndedIterator<Item = &'d StreamDescriptor>,
+    position: AirPos,
+) -> Option<&'d Stream> {
+    // descriptors are placed in a order of decreasing scopes, so it's enough to get the latest suitable
+    for descriptor in descriptors.rev() {
+        if descriptor.span.contains_position(position) {
+            return Some(&descriptor.stream);
+        }
+    }
+
+    None
+}
+
+pub(super) fn find_closest_mut<'d>(
+    descriptors: impl DoubleEndedIterator<Item = &'d mut StreamDescriptor>,
+    position: AirPos,
+) -> Option<&'d mut Stream> {
+    // descriptors are placed in a order of decreasing scopes, so it's enough to get the latest suitable
+    for descriptor in descriptors.rev() {
+        if descriptor.span.contains_position(position) {
+            return Some(&mut descriptor.stream);
+        }
+    }
+
+    None
+}
+
\ No newline at end of file diff --git a/src/air/execution_step/execution_context/streams_variables/stream_value_descriptor.rs.html b/src/air/execution_step/execution_context/streams_variables/stream_value_descriptor.rs.html new file mode 100644 index 00000000..64aba26c --- /dev/null +++ b/src/air/execution_step/execution_context/streams_variables/stream_value_descriptor.rs.html @@ -0,0 +1,83 @@ +stream_value_descriptor.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use crate::execution_step::Generation;
+use crate::execution_step::ValueAggregate;
+
+use air_parser::AirPos;
+
+pub(crate) struct StreamValueDescriptor<'stream_name> {
+    pub value: ValueAggregate,
+    pub name: &'stream_name str,
+    pub generation: Generation,
+    pub position: AirPos,
+}
+
+impl<'stream_name> StreamValueDescriptor<'stream_name> {
+    pub fn new(value: ValueAggregate, name: &'stream_name str, generation: Generation, position: AirPos) -> Self {
+        Self {
+            value,
+            name,
+            generation,
+            position,
+        }
+    }
+}
+
\ No newline at end of file diff --git a/src/air/execution_step/instructions/ap.rs.html b/src/air/execution_step/instructions/ap.rs.html new file mode 100644 index 00000000..aaae65a6 --- /dev/null +++ b/src/air/execution_step/instructions/ap.rs.html @@ -0,0 +1,199 @@ +ap.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+pub(super) mod apply_to_arguments;
+pub(super) mod utils;
+
+use super::ExecutionCtx;
+use super::ExecutionResult;
+use super::TraceHandler;
+use crate::execution_step::Joinable;
+use crate::execution_step::ValueAggregate;
+use crate::joinable;
+use crate::log_instruction;
+use crate::trace_to_exec_err;
+use crate::JValue;
+
+use apply_to_arguments::apply_to_arg;
+use utils::*;
+
+use air_parser::ast;
+use air_parser::ast::Ap;
+use air_trace_handler::merger::MergerApResult;
+
+impl<'i> super::ExecutableInstruction<'i> for Ap<'i> {
+    #[tracing::instrument(level = "debug", skip(exec_ctx, trace_ctx))]
+    fn execute(&self, exec_ctx: &mut ExecutionCtx<'i>, trace_ctx: &mut TraceHandler) -> ExecutionResult<()> {
+        log_instruction!(ap, exec_ctx, trace_ctx);
+        let should_touch_trace = should_touch_trace(self);
+        // this applying should be at the very beginning of this function,
+        // because it's necessary to check argument lambda, for more details see
+        // https://github.com/fluencelabs/aquavm/issues/216
+        let result = joinable!(
+            apply_to_arg(&self.argument, exec_ctx, trace_ctx, should_touch_trace),
+            exec_ctx,
+            ()
+        )?;
+
+        let merger_ap_result = to_merger_ap_result(self, trace_ctx)?;
+        populate_context(&self.result, &merger_ap_result, result, exec_ctx)?;
+        maybe_update_trace(should_touch_trace, trace_ctx);
+
+        Ok(())
+    }
+}
+
+/// This function is intended to check whether a Ap instruction should produce
+/// a new state in data.
+fn should_touch_trace(ap: &Ap<'_>) -> bool {
+    matches!(ap.result, ast::ApResult::Stream(_))
+}
+
+fn to_merger_ap_result(instr: &Ap<'_>, trace_ctx: &mut TraceHandler) -> ExecutionResult<MergerApResult> {
+    match instr.result {
+        ast::ApResult::Scalar(_) => Ok(MergerApResult::NotMet),
+        ast::ApResult::Stream(_) => {
+            let merger_ap_result = trace_to_exec_err!(trace_ctx.meet_ap_start(), instr)?;
+            Ok(merger_ap_result)
+        }
+    }
+}
+
+fn populate_context<'ctx>(
+    ap_result: &ast::ApResult<'ctx>,
+    merger_ap_result: &MergerApResult,
+    result: ValueAggregate,
+    exec_ctx: &mut ExecutionCtx<'ctx>,
+) -> ExecutionResult<()> {
+    match ap_result {
+        ast::ApResult::Scalar(scalar) => exec_ctx.scalars.set_scalar_value(scalar.name, result).map(|_| ()),
+        ast::ApResult::Stream(stream) => {
+            let value_descriptor = generate_value_descriptor(result, stream, merger_ap_result);
+            exec_ctx.streams.add_stream_value(value_descriptor)
+        }
+    }
+}
+
+fn maybe_update_trace(should_touch_trace: bool, trace_ctx: &mut TraceHandler) {
+    use air_interpreter_data::ApResult;
+
+    if should_touch_trace {
+        trace_ctx.meet_ap_end(ApResult::stub());
+    }
+}
+
\ No newline at end of file diff --git a/src/air/execution_step/instructions/ap/apply_to_arguments.rs.html b/src/air/execution_step/instructions/ap/apply_to_arguments.rs.html new file mode 100644 index 00000000..2985fb2f --- /dev/null +++ b/src/air/execution_step/instructions/ap/apply_to_arguments.rs.html @@ -0,0 +1,433 @@ +apply_to_arguments.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::*;
+use crate::execution_step::resolver::Resolvable;
+use crate::execution_step::value_types::TracePosOperate;
+use crate::execution_step::CanonResultAggregate;
+use crate::execution_step::LiteralAggregate;
+use crate::execution_step::PEEK_ALLOWED_ON_NON_EMPTY;
+use crate::UncatchableError;
+
+use air_interpreter_data::Provenance;
+use air_lambda_ast::LambdaAST;
+use air_parser::ast;
+use air_parser::ast::InstructionErrorAST;
+
+pub(crate) fn apply_to_arg(
+    argument: &ast::ApArgument<'_>,
+    exec_ctx: &ExecutionCtx<'_>,
+    trace_ctx: &TraceHandler,
+    should_touch_trace: bool,
+) -> ExecutionResult<ValueAggregate> {
+    use ast::ApArgument::*;
+
+    let result = match argument {
+        InitPeerId => apply_const(exec_ctx.run_parameters.init_peer_id.as_ref(), exec_ctx, trace_ctx),
+        Error(instruction_error) => apply_error(instruction_error, exec_ctx, trace_ctx),
+        LastError(error_accessor) => apply_last_error(error_accessor, exec_ctx, trace_ctx),
+        Literal(value) => apply_const(value.clone(), exec_ctx, trace_ctx),
+        Timestamp => apply_const(exec_ctx.run_parameters.timestamp, exec_ctx, trace_ctx),
+        TTL => apply_const(exec_ctx.run_parameters.ttl, exec_ctx, trace_ctx),
+        Number(value) => apply_const(value, exec_ctx, trace_ctx),
+        Boolean(value) => apply_const(*value, exec_ctx, trace_ctx),
+        EmptyArray => apply_const(vec![(); 0], exec_ctx, trace_ctx),
+        Scalar(scalar) => apply_scalar(scalar, exec_ctx, trace_ctx, should_touch_trace),
+        ScalarWithLambda(scalar) => apply_scalar_wl(scalar, exec_ctx, trace_ctx),
+        CanonStream(canon_stream) => apply_canon_stream(canon_stream, exec_ctx, trace_ctx),
+        CanonStreamWithLambda(canon_stream) => apply_canon_stream_wl(canon_stream, exec_ctx, trace_ctx),
+        CanonStreamMap(canon_stream_map) => apply_canon_stream_map(canon_stream_map, exec_ctx, trace_ctx),
+        CanonStreamMapWithLambda(canon_stream_map) => apply_canon_stream_map_wl(canon_stream_map, exec_ctx, trace_ctx),
+    }?;
+
+    Ok(result)
+}
+
+fn apply_const(
+    value: impl Into<JValue>,
+    exec_ctx: &ExecutionCtx<'_>,
+    trace_ctx: &TraceHandler,
+) -> ExecutionResult<ValueAggregate> {
+    let value = value.into();
+    let position = trace_ctx.trace_pos().map_err(UncatchableError::from)?;
+
+    let value = ValueAggregate::from_literal_result(LiteralAggregate::new(
+        value,
+        exec_ctx.run_parameters.init_peer_id.clone(),
+        position,
+    ));
+    Ok(value)
+}
+
+fn apply_error<'ctx>(
+    instruction_error: &InstructionErrorAST<'ctx>,
+    exec_ctx: &ExecutionCtx<'ctx>,
+    trace_ctx: &TraceHandler,
+) -> ExecutionResult<ValueAggregate> {
+    let (value, mut tetraplets, provenance) = instruction_error.resolve(exec_ctx)?;
+    // removing is safe because prepare_last_error always returns a vec with one element.
+    let tetraplet = tetraplets.remove(0);
+    let position = trace_ctx.trace_pos().map_err(UncatchableError::from)?;
+
+    let result = ValueAggregate::new(value, tetraplet, position, provenance);
+    Ok(result)
+}
+
+fn apply_last_error<'i>(
+    error_accessor: &Option<LambdaAST<'i>>,
+    exec_ctx: &ExecutionCtx<'i>,
+    trace_ctx: &TraceHandler,
+) -> ExecutionResult<ValueAggregate> {
+    let (value, mut tetraplets, provenance) = error_accessor.resolve(exec_ctx)?;
+    // removing is safe because prepare_last_error always returns a vec with one element.
+    let tetraplet = tetraplets.remove(0);
+    let position = trace_ctx.trace_pos().map_err(UncatchableError::from)?;
+
+    let result = ValueAggregate::new(value, tetraplet, position, provenance);
+    Ok(result)
+}
+
+fn apply_scalar(
+    ast_scalar: &ast::Scalar<'_>,
+    exec_ctx: &ExecutionCtx<'_>,
+    trace_ctx: &TraceHandler,
+    should_touch_trace: bool,
+) -> ExecutionResult<ValueAggregate> {
+    use crate::execution_step::ScalarRef;
+
+    let scalar = exec_ctx.scalars.get_value(ast_scalar.name)?;
+
+    let mut result = match scalar {
+        ScalarRef::Value(result) => result.clone(),
+        ScalarRef::IterableValue(iterator) => {
+            let result = iterator.iterable.peek().expect(PEEK_ALLOWED_ON_NON_EMPTY);
+            result.into_resolved_result()
+        }
+    };
+
+    if should_touch_trace {
+        result.set_trace_pos(trace_ctx.trace_pos().map_err(UncatchableError::from)?);
+    }
+
+    Ok(result)
+}
+
+fn apply_scalar_wl(
+    ast_scalar: &ast::ScalarWithLambda<'_>,
+    exec_ctx: &ExecutionCtx<'_>,
+    trace_ctx: &TraceHandler,
+) -> ExecutionResult<ValueAggregate> {
+    let (value, mut tetraplets, provenance) = ast_scalar.resolve(exec_ctx)?;
+    let position = trace_ctx.trace_pos().map_err(UncatchableError::from)?;
+    let result = ValueAggregate::new(value, tetraplets.remove(0), position, provenance);
+
+    Ok(result)
+}
+
+fn apply_canon_stream(
+    ast_stream: &ast::CanonStream<'_>,
+    exec_ctx: &ExecutionCtx<'_>,
+    trace_ctx: &TraceHandler,
+) -> ExecutionResult<ValueAggregate> {
+    // TODO: refactor this code after boxed value
+    use crate::execution_step::value_types::JValuable;
+
+    let canon_stream = exec_ctx.scalars.get_canon_stream(ast_stream.name)?;
+    let value = JValuable::as_jvalue(&&canon_stream.canon_stream);
+    let tetraplet = canon_stream.tetraplet().clone();
+    let position = trace_ctx.trace_pos().map_err(UncatchableError::from)?;
+    let value = CanonResultAggregate::new(value, tetraplet.peer_pk.as_str().into(), &tetraplet.lens, position);
+    let result = ValueAggregate::from_canon_result(value, canon_stream.cid.clone());
+    Ok(result)
+}
+
+fn apply_canon_stream_wl(
+    ast_stream: &ast::CanonStreamWithLambda<'_>,
+    exec_ctx: &ExecutionCtx<'_>,
+    trace_ctx: &TraceHandler,
+) -> ExecutionResult<ValueAggregate> {
+    // TODO: refactor this code after boxed value
+    use crate::execution_step::value_types::JValuable;
+
+    let canon_stream = exec_ctx.scalars.get_canon_stream(ast_stream.name)?;
+    let canon_stream_value = &canon_stream.canon_stream;
+    let (result, tetraplet, provenance) = JValuable::apply_lambda_with_tetraplets(
+        &canon_stream_value,
+        &ast_stream.lambda,
+        exec_ctx,
+        &Provenance::canon(canon_stream.cid.clone()),
+    )?;
+    let position = trace_ctx.trace_pos().map_err(UncatchableError::from)?;
+
+    let result = ValueAggregate::new(result, tetraplet.into(), position, provenance);
+    Ok(result)
+}
+
+fn apply_canon_stream_map(
+    ast_canon_stream_map: &ast::CanonStreamMap<'_>,
+    exec_ctx: &ExecutionCtx<'_>,
+    trace_ctx: &TraceHandler,
+) -> ExecutionResult<ValueAggregate> {
+    use crate::execution_step::value_types::JValuable;
+
+    let canon_stream_map = exec_ctx.scalars.get_canon_map(ast_canon_stream_map.name)?;
+    let value = JValuable::as_jvalue(&&canon_stream_map.canon_stream_map);
+    let tetraplet = canon_stream_map.tetraplet();
+    let position = trace_ctx.trace_pos().map_err(UncatchableError::from)?;
+    let value = CanonResultAggregate::new(value, tetraplet.peer_pk.as_str().into(), &tetraplet.lens, position);
+    let result = ValueAggregate::from_canon_result(value, canon_stream_map.cid.clone());
+    Ok(result)
+}
+
+fn apply_canon_stream_map_wl(
+    ast_canon_stream_map: &ast::CanonStreamMapWithLambda<'_>,
+    exec_ctx: &ExecutionCtx<'_>,
+    trace_ctx: &TraceHandler,
+) -> ExecutionResult<ValueAggregate> {
+    use crate::execution_step::value_types::JValuable;
+
+    let canon_stream_map = exec_ctx.scalars.get_canon_map(ast_canon_stream_map.name)?;
+    let cid = canon_stream_map.cid.clone();
+    let lambda = &ast_canon_stream_map.lambda;
+    let canon_stream_map = &canon_stream_map.canon_stream_map;
+
+    let (result, tetraplet, provenance) =
+        JValuable::apply_lambda_with_tetraplets(&canon_stream_map, lambda, exec_ctx, &Provenance::canon(cid))?;
+    let position = trace_ctx.trace_pos().map_err(UncatchableError::from)?;
+
+    let result = ValueAggregate::new(result, tetraplet.into(), position, provenance);
+    Ok(result)
+}
+
\ No newline at end of file diff --git a/src/air/execution_step/instructions/ap/utils.rs.html b/src/air/execution_step/instructions/ap/utils.rs.html new file mode 100644 index 00000000..f64b571b --- /dev/null +++ b/src/air/execution_step/instructions/ap/utils.rs.html @@ -0,0 +1,117 @@ +utils.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use crate::execution_step::execution_context::StreamMapValueDescriptor;
+use crate::execution_step::execution_context::StreamValueDescriptor;
+use crate::execution_step::Generation;
+use crate::execution_step::ValueAggregate;
+
+use air_parser::ast;
+use air_trace_handler::merger::MergerApResult;
+
+pub(super) fn generate_value_descriptor<'stream>(
+    value: ValueAggregate,
+    stream: &'stream ast::Stream<'_>,
+    ap_result: &MergerApResult,
+) -> StreamValueDescriptor<'stream> {
+    match ap_result {
+        MergerApResult::NotMet => StreamValueDescriptor::new(value, stream.name, Generation::New, stream.position),
+        MergerApResult::Met(met_result) => StreamValueDescriptor::new(
+            value,
+            stream.name,
+            Generation::from_met_result(met_result),
+            stream.position,
+        ),
+    }
+}
+
+pub(crate) fn generate_map_value_descriptor<'stream>(
+    value: ValueAggregate,
+    stream: &'stream ast::StreamMap<'_>,
+    ap_result: &MergerApResult,
+) -> StreamMapValueDescriptor<'stream> {
+    match ap_result {
+        MergerApResult::NotMet => StreamMapValueDescriptor::new(value, stream.name, Generation::New, stream.position),
+        MergerApResult::Met(met_result) => StreamMapValueDescriptor::new(
+            value,
+            stream.name,
+            Generation::from_met_result(met_result),
+            stream.position,
+        ),
+    }
+}
+
\ No newline at end of file diff --git a/src/air/execution_step/instructions/ap_map.rs.html b/src/air/execution_step/instructions/ap_map.rs.html new file mode 100644 index 00000000..16a50ecc --- /dev/null +++ b/src/air/execution_step/instructions/ap_map.rs.html @@ -0,0 +1,197 @@ +ap_map.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::ap::utils::generate_map_value_descriptor;
+use super::ExecutionCtx;
+use super::ExecutionResult;
+use super::TraceHandler;
+use crate::execution_step::execution_context::stream_map_key::StreamMapKey;
+use crate::execution_step::instructions::ap::apply_to_arguments::apply_to_arg;
+use crate::execution_step::resolver::Resolvable;
+use crate::execution_step::ValueAggregate;
+use crate::log_instruction;
+use crate::trace_to_exec_err;
+use crate::unsupported_map_key_type;
+use crate::CatchableError;
+use crate::ExecutionError;
+
+use air_interpreter_data::ApResult;
+use air_parser::ast::ApMap;
+use air_parser::ast::StreamMap;
+use air_parser::ast::StreamMapKeyClause;
+use air_trace_handler::merger::MergerApResult;
+
+impl<'i> super::ExecutableInstruction<'i> for ApMap<'i> {
+    #[tracing::instrument(level = "debug", skip(exec_ctx, trace_ctx))]
+    fn execute(&self, exec_ctx: &mut ExecutionCtx<'i>, trace_ctx: &mut TraceHandler) -> ExecutionResult<()> {
+        use crate::execution_step::Joinable;
+        use crate::joinable;
+
+        log_instruction!(ap, exec_ctx, trace_ctx);
+        // this applying should be at the very beginning of this function,
+        // because it's necessary to check argument lambda, for more details see
+        // https://github.com/fluencelabs/aquavm/issues/216
+        let result = joinable!(apply_to_arg(&self.value, exec_ctx, trace_ctx, true), exec_ctx, ())?;
+
+        let merger_ap_result = to_merger_ap_map_result(&self, trace_ctx)?;
+        let key = joinable!(resolve_key_if_needed(&self.key, exec_ctx, self.map.name), exec_ctx, ())?;
+        populate_context(key, &self.map, &merger_ap_result, result, exec_ctx)?;
+        trace_ctx.meet_ap_end(ApResult::stub());
+
+        Ok(())
+    }
+}
+
+fn to_merger_ap_map_result(instr: &impl ToString, trace_ctx: &mut TraceHandler) -> ExecutionResult<MergerApResult> {
+    let merger_ap_result = trace_to_exec_err!(trace_ctx.meet_ap_start(), instr)?;
+    Ok(merger_ap_result)
+}
+
+fn populate_context<'ctx>(
+    key: StreamMapKey,
+    ap_map_result: &StreamMap<'ctx>,
+    merger_ap_result: &MergerApResult,
+    result: ValueAggregate,
+    exec_ctx: &mut ExecutionCtx<'ctx>,
+) -> ExecutionResult<()> {
+    let value_descriptor = generate_map_value_descriptor(result, ap_map_result, merger_ap_result);
+    exec_ctx.stream_maps.add_stream_map_value(key, value_descriptor)
+}
+
+fn resolve_key_if_needed<'ctx>(
+    key: &StreamMapKeyClause<'ctx>,
+    exec_ctx: &ExecutionCtx<'ctx>,
+    map_name: &str,
+) -> Result<StreamMapKey, ExecutionError> {
+    match key {
+        StreamMapKeyClause::Literal(s) => Ok(s.clone().into()),
+        StreamMapKeyClause::Int(i) => Ok(i.to_owned().into()),
+        StreamMapKeyClause::Scalar(s) => resolve(s, exec_ctx, map_name),
+        StreamMapKeyClause::ScalarWithLambda(s) => resolve(s, exec_ctx, map_name),
+        StreamMapKeyClause::CanonStreamWithLambda(c) => resolve(c, exec_ctx, map_name),
+    }
+}
+
+fn resolve(
+    resolvable: &impl Resolvable,
+    exec_ctx: &ExecutionCtx<'_>,
+    map_name: &str,
+) -> Result<StreamMapKey, ExecutionError> {
+    let (value, _, _) = resolvable.resolve(exec_ctx)?;
+    StreamMapKey::from_value(value).ok_or(CatchableError::StreamMapError(unsupported_map_key_type(map_name)).into())
+}
+
\ No newline at end of file diff --git a/src/air/execution_step/instructions/call.rs.html b/src/air/execution_step/instructions/call.rs.html new file mode 100644 index 00000000..e659239f --- /dev/null +++ b/src/air/execution_step/instructions/call.rs.html @@ -0,0 +1,175 @@ +call.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+pub(crate) mod call_result_setter;
+mod prev_result_handler;
+mod resolved_call;
+pub(crate) mod triplet;
+mod verifier;
+
+use resolved_call::ResolvedCall;
+
+use super::ExecutionCtx;
+use super::ExecutionError;
+use super::ExecutionResult;
+use super::TraceHandler;
+use crate::execution_step::Joinable;
+use crate::execution_step::RcSecurityTetraplet;
+use crate::joinable;
+use crate::log_instruction;
+
+use air_parser::ast::Call;
+
+use std::rc::Rc;
+
+impl<'i> super::ExecutableInstruction<'i> for Call<'i> {
+    #[tracing::instrument(level = "debug", skip(exec_ctx, trace_ctx))]
+    fn execute(&self, exec_ctx: &mut ExecutionCtx<'i>, trace_ctx: &mut TraceHandler) -> ExecutionResult<()> {
+        log_instruction!(call, exec_ctx, trace_ctx);
+        exec_ctx.tracker.meet_call();
+
+        let resolved_call = joinable!(ResolvedCall::new(self, exec_ctx), exec_ctx, ())
+            .map_err(|e| set_errors(self, exec_ctx, e, None))?;
+
+        let tetraplet = resolved_call.as_tetraplet();
+        joinable!(resolved_call.execute(self, exec_ctx, trace_ctx), exec_ctx, ())
+            .map_err(|e| set_errors(self, exec_ctx, e, Some(tetraplet)))
+    }
+}
+
+fn set_errors<'i>(
+    call: &Call<'i>,
+    exec_ctx: &mut ExecutionCtx<'i>,
+    execution_error: ExecutionError,
+    tetraplet: Option<RcSecurityTetraplet>,
+) -> ExecutionError {
+    use air_parser::ast::PeerIDErrorLogable;
+
+    let catchable_error = match execution_error {
+        ExecutionError::Catchable(catchable) => catchable,
+        ExecutionError::Uncatchable(_) => return execution_error,
+    };
+
+    exec_ctx.set_errors(
+        catchable_error.as_ref(),
+        &call.to_string(),
+        tetraplet.clone(),
+        call.log_errors_with_peer_id(),
+    );
+
+    let peer_id = match &tetraplet {
+        // use tetraplet if it is set, because an error could be propagated from data
+        // (from CallServiceFailed state) and exec_ctx.run_parameters.current_peer_id won't mean
+        // a peer where the error was occurred
+        Some(tetraplet) => tetraplet.peer_pk.as_str(),
+        None => exec_ctx.run_parameters.current_peer_id.as_str(),
+    };
+
+    log::debug!("call failed with an error `{}`, peerId `{}`", catchable_error, peer_id);
+
+    ExecutionError::Catchable(catchable_error)
+}
+
\ No newline at end of file diff --git a/src/air/execution_step/instructions/call/call_result_setter.rs.html b/src/air/execution_step/instructions/call/call_result_setter.rs.html new file mode 100644 index 00000000..d881b49e --- /dev/null +++ b/src/air/execution_step/instructions/call/call_result_setter.rs.html @@ -0,0 +1,289 @@ +call_result_setter.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::*;
+use crate::execution_step::execution_context::*;
+use crate::execution_step::Generation;
+use crate::execution_step::ServiceResultAggregate;
+use crate::execution_step::ValueAggregate;
+use crate::UncatchableError;
+
+use air_interpreter_cid::value_to_json_cid;
+use air_interpreter_data::CallResult;
+use air_interpreter_data::TracePos;
+use air_interpreter_data::ValueRef;
+use air_parser::ast::CallOutputValue;
+use air_trace_handler::merger::ValueSource;
+use air_trace_handler::TraceHandler;
+
+pub(crate) fn populate_context_from_peer_service_result<'i>(
+    executed_result: ServiceResultAggregate,
+    output: &CallOutputValue<'i>,
+    tetraplet: RcSecurityTetraplet,
+    argument_hash: Rc<str>,
+    exec_ctx: &mut ExecutionCtx<'i>,
+) -> ExecutionResult<CallResult> {
+    match output {
+        CallOutputValue::Scalar(scalar) => {
+            let peer_id = tetraplet.peer_pk.clone();
+            let service_result_agg_cid =
+                exec_ctx
+                    .cid_state
+                    .track_service_result(executed_result.result.clone(), tetraplet, argument_hash)?;
+            let executed_result = ValueAggregate::from_service_result(executed_result, service_result_agg_cid.clone());
+
+            exec_ctx.scalars.set_scalar_value(scalar.name, executed_result)?;
+            exec_ctx.record_call_cid(&peer_id, &service_result_agg_cid);
+            Ok(CallResult::executed_scalar(service_result_agg_cid))
+        }
+        CallOutputValue::Stream(stream) => {
+            let peer_id = tetraplet.peer_pk.clone();
+            let service_result_agg_cid =
+                exec_ctx
+                    .cid_state
+                    .track_service_result(executed_result.result.clone(), tetraplet, argument_hash)?;
+
+            let executed_result = ValueAggregate::from_service_result(executed_result, service_result_agg_cid.clone());
+
+            let value_descriptor =
+                StreamValueDescriptor::new(executed_result, stream.name, Generation::New, stream.position);
+            exec_ctx.streams.add_stream_value(value_descriptor)?;
+            exec_ctx.record_call_cid(&peer_id, &service_result_agg_cid);
+            Ok(CallResult::executed_stream_stub(service_result_agg_cid))
+        }
+        CallOutputValue::None => {
+            let value_cid = value_to_json_cid(&executed_result.result).map_err(UncatchableError::from)?;
+
+            Ok(CallResult::executed_unused(value_cid))
+        }
+    }
+}
+
+pub(crate) fn populate_context_from_data<'i>(
+    value: ValueRef,
+    argument_hash: &str,
+    tetraplet: RcSecurityTetraplet,
+    trace_pos: TracePos,
+    value_source: ValueSource,
+    output: &CallOutputValue<'i>,
+    exec_ctx: &mut ExecutionCtx<'i>,
+) -> ExecutionResult<()> {
+    match (output, value) {
+        (CallOutputValue::Scalar(scalar), ValueRef::Scalar(cid)) => {
+            let ResolvedServiceInfo {
+                value,
+                tetraplet: current_tetraplet,
+                service_result_aggregate,
+            } = exec_ctx.cid_state.resolve_service_info(&cid)?;
+
+            verifier::verify_call(
+                argument_hash,
+                &tetraplet,
+                &service_result_aggregate.argument_hash,
+                &current_tetraplet,
+            )?;
+
+            let result = ServiceResultAggregate::new(value, tetraplet, trace_pos);
+            let result = ValueAggregate::from_service_result(result, cid);
+            exec_ctx.scalars.set_scalar_value(scalar.name, result)?;
+        }
+        (CallOutputValue::Stream(stream), ValueRef::Stream { cid, generation }) => {
+            let ResolvedServiceInfo {
+                value,
+                tetraplet: current_tetraplet,
+                service_result_aggregate,
+            } = exec_ctx.cid_state.resolve_service_info(&cid)?;
+
+            verifier::verify_call(
+                argument_hash,
+                &tetraplet,
+                &service_result_aggregate.argument_hash,
+                &current_tetraplet,
+            )?;
+
+            let result = ServiceResultAggregate::new(value, tetraplet, trace_pos);
+            let result = ValueAggregate::from_service_result(result, cid);
+            let generation = Generation::from_data(value_source, generation);
+            let value_descriptor = StreamValueDescriptor::new(result, stream.name, generation, stream.position);
+            exec_ctx.streams.add_stream_value(value_descriptor)?;
+        }
+        (CallOutputValue::None, ValueRef::Unused(_)) => {}
+        (_, value) => {
+            return Err(ExecutionError::Uncatchable(
+                UncatchableError::CallResultNotCorrespondToInstr(value),
+            ))
+        }
+    }
+
+    Ok(())
+}
+
+/// Writes an executed state of a particle being sent to remote node.
+pub(crate) fn handle_remote_call(peer_pk: String, exec_ctx: &mut ExecutionCtx<'_>, trace_ctx: &mut TraceHandler) {
+    exec_ctx.next_peer_pks.push(peer_pk);
+    exec_ctx.make_subgraph_incomplete();
+
+    let new_call_result = CallResult::sent_peer_id(exec_ctx.run_parameters.current_peer_id.clone());
+    trace_ctx.meet_call_end(new_call_result);
+}
+
\ No newline at end of file diff --git a/src/air/execution_step/instructions/call/prev_result_handler.rs.html b/src/air/execution_step/instructions/call/prev_result_handler.rs.html new file mode 100644 index 00000000..ff9248fb --- /dev/null +++ b/src/air/execution_step/instructions/call/prev_result_handler.rs.html @@ -0,0 +1,575 @@ +prev_result_handler.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::*;
+use crate::execution_step::execution_context::ResolvedServiceInfo;
+use crate::execution_step::instructions::call::call_result_setter::populate_context_from_data;
+use crate::execution_step::CatchableError;
+use crate::execution_step::RcSecurityTetraplet;
+use crate::UncatchableError;
+
+use air_interpreter_data::CallResult;
+use air_interpreter_data::CallServiceFailed;
+use air_interpreter_data::Sender;
+use air_interpreter_interface::CallServiceResult;
+use air_parser::ast::CallOutputValue;
+use air_trace_handler::merger::MetCallResult;
+use air_trace_handler::TraceHandler;
+
+#[derive(Debug, Clone, PartialEq, Eq)]
+pub(crate) struct StateDescriptor {
+    should_execute: bool,
+    prev_state: Option<CallResult>,
+}
+
+/// This function looks at the existing call state, validates it,
+/// and returns Ok(true) if the call should be executed further.
+pub(super) fn handle_prev_state<'i>(
+    met_result: MetCallResult,
+    tetraplet: &RcSecurityTetraplet,
+    argument_hash: Option<&Rc<str>>,
+    output: &CallOutputValue<'i>,
+    exec_ctx: &mut ExecutionCtx<'i>,
+    trace_ctx: &mut TraceHandler,
+) -> ExecutionResult<StateDescriptor> {
+    use CallResult::*;
+
+    match met_result.result {
+        // this call was failed on one of the previous executions,
+        // here it's needed to bubble this special error up
+        Failed(ref failed_cid) => {
+            let ResolvedServiceInfo {
+                value: err_value,
+                tetraplet: current_tetraplet,
+                service_result_aggregate,
+            } = exec_ctx
+                .cid_state
+                .resolve_service_info(failed_cid)
+                .map_err(UncatchableError::from)?;
+
+            verifier::verify_call(
+                argument_hash.as_ref().unwrap(),
+                tetraplet,
+                &service_result_aggregate.argument_hash,
+                &current_tetraplet,
+            )?;
+
+            let call_service_failed: CallServiceFailed =
+                serde_json::from_value(serde_json::to_value(err_value).expect("serde_json serializer shouldn't fail"))
+                    .map_err(UncatchableError::MalformedCallServiceFailed)?;
+
+            exec_ctx.make_subgraph_incomplete();
+            exec_ctx.record_call_cid(&tetraplet.peer_pk, failed_cid);
+            trace_ctx.meet_call_end(met_result.result);
+
+            let err_msg = call_service_failed.message;
+            Err(CatchableError::LocalServiceError(call_service_failed.ret_code, err_msg).into())
+        }
+        RequestSentBy(Sender::PeerIdWithCallId { ref peer_id, call_id })
+            if peer_id.as_str() == exec_ctx.run_parameters.current_peer_id.as_str() =>
+        {
+            // call results are identified by call_id that is saved in data;
+            // for compatiblity with JavaScript with binary formats, string IDs are used
+            let call_id = call_id.to_string();
+            match exec_ctx.call_results.remove(&call_id) {
+                Some(call_result) => {
+                    update_state_with_service_result(
+                        tetraplet.clone(),
+                        argument_hash.expect("Result for joinable error").clone(),
+                        output,
+                        call_result,
+                        exec_ctx,
+                        trace_ctx,
+                    )?;
+                    Ok(StateDescriptor::executed())
+                }
+                // result hasn't been prepared yet
+                None => {
+                    exec_ctx.make_subgraph_incomplete();
+                    Ok(StateDescriptor::not_ready(met_result.result))
+                }
+            }
+        }
+        RequestSentBy(..) => {
+            // check whether current node can execute this call
+            let is_current_peer = tetraplet.peer_pk.as_str() == exec_ctx.run_parameters.current_peer_id.as_str();
+            if is_current_peer {
+                return Ok(StateDescriptor::can_execute_now(met_result.result));
+            }
+
+            exec_ctx.make_subgraph_incomplete();
+            Ok(StateDescriptor::cant_execute_now(met_result.result))
+        }
+        // this instruction's been already executed
+        Executed(value) => {
+            use air_interpreter_data::ValueRef;
+
+            populate_context_from_data(
+                value.clone(),
+                argument_hash.as_ref().unwrap(),
+                tetraplet.clone(),
+                met_result.trace_pos,
+                met_result.source,
+                output,
+                exec_ctx,
+            )?;
+
+            match &value {
+                ValueRef::Scalar(ref cid) | ValueRef::Stream { ref cid, .. } => {
+                    exec_ctx.record_call_cid(&tetraplet.peer_pk, cid);
+                }
+                ValueRef::Unused(_) => {}
+            }
+
+            let call_result = CallResult::Executed(value);
+            trace_ctx.meet_call_end(call_result);
+
+            Ok(StateDescriptor::executed())
+        }
+    }
+}
+
+use super::call_result_setter::*;
+use crate::execution_step::ServiceResultAggregate;
+use crate::JValue;
+
+fn update_state_with_service_result<'i>(
+    tetraplet: RcSecurityTetraplet,
+    argument_hash: Rc<str>,
+    output: &CallOutputValue<'i>,
+    service_result: CallServiceResult,
+    exec_ctx: &mut ExecutionCtx<'i>,
+    trace_ctx: &mut TraceHandler,
+) -> ExecutionResult<()> {
+    // check that service call succeeded
+    let service_result = handle_service_error(
+        service_result,
+        argument_hash.clone(),
+        tetraplet.clone(),
+        exec_ctx,
+        trace_ctx,
+    )?;
+
+    // try to get service result from call service result
+    let result = try_to_service_result(service_result, &argument_hash, &tetraplet, exec_ctx, trace_ctx)?;
+
+    let trace_pos = trace_ctx.trace_pos().map_err(UncatchableError::from)?;
+
+    let executed_result = ServiceResultAggregate::new(result, tetraplet.clone(), trace_pos);
+    let new_call_result =
+        populate_context_from_peer_service_result(executed_result, output, tetraplet, argument_hash, exec_ctx)?;
+    trace_ctx.meet_call_end(new_call_result);
+
+    Ok(())
+}
+
+fn handle_service_error(
+    service_result: CallServiceResult,
+    argument_hash: Rc<str>,
+    tetraplet: RcSecurityTetraplet,
+    exec_ctx: &mut ExecutionCtx<'_>,
+    trace_ctx: &mut TraceHandler,
+) -> ExecutionResult<CallServiceResult> {
+    use air_interpreter_interface::CALL_SERVICE_SUCCESS;
+    use CallResult::Failed;
+
+    if service_result.ret_code == CALL_SERVICE_SUCCESS {
+        return Ok(service_result);
+    }
+
+    let error_message = Rc::new(service_result.result.clone());
+    let error = CatchableError::LocalServiceError(service_result.ret_code, error_message.clone());
+
+    let failed_value = CallServiceFailed::new(service_result.ret_code, error_message).to_value();
+
+    let peer_id = tetraplet.peer_pk.clone();
+    let service_result_agg_cid = exec_ctx
+        .cid_state
+        .track_service_result(failed_value, tetraplet, argument_hash)?;
+
+    exec_ctx.record_call_cid(&peer_id, &service_result_agg_cid);
+    trace_ctx.meet_call_end(Failed(service_result_agg_cid));
+
+    Err(error.into())
+}
+
+fn try_to_service_result(
+    service_result: CallServiceResult,
+    argument_hash: &Rc<str>,
+    tetraplet: &RcSecurityTetraplet,
+    exec_ctx: &mut ExecutionCtx<'_>,
+    trace_ctx: &mut TraceHandler,
+) -> ExecutionResult<JValue> {
+    match serde_json::from_str(&service_result.result) {
+        Ok(result) => Ok(result),
+        Err(e) => {
+            let error_msg = format!(
+                "call_service result '{service_result}' can't be serialized or deserialized with an error: {e}"
+            );
+            let error_msg = Rc::new(error_msg);
+
+            let failed_value = CallServiceFailed::new(i32::MAX, error_msg.clone()).to_value();
+
+            let service_result_agg_cid =
+                exec_ctx
+                    .cid_state
+                    .track_service_result(failed_value, tetraplet.clone(), argument_hash.clone())?;
+            let error = CallResult::failed(service_result_agg_cid);
+
+            trace_ctx.meet_call_end(error);
+
+            Err(CatchableError::LocalServiceError(i32::MAX, error_msg).into())
+        }
+    }
+}
+
+impl StateDescriptor {
+    pub(crate) fn executed() -> Self {
+        Self {
+            should_execute: false,
+            prev_state: None,
+        }
+    }
+
+    pub(crate) fn not_ready(prev_state: CallResult) -> Self {
+        Self {
+            should_execute: false,
+            prev_state: Some(prev_state),
+        }
+    }
+
+    pub(crate) fn can_execute_now(prev_state: CallResult) -> Self {
+        Self {
+            should_execute: true,
+            prev_state: Some(prev_state),
+        }
+    }
+
+    pub(crate) fn cant_execute_now(prev_state: CallResult) -> Self {
+        Self {
+            should_execute: false,
+            prev_state: Some(prev_state),
+        }
+    }
+
+    pub(crate) fn no_previous_state() -> Self {
+        Self {
+            should_execute: true,
+            prev_state: None,
+        }
+    }
+
+    pub(crate) fn should_execute(&self) -> bool {
+        self.should_execute
+    }
+
+    pub(crate) fn maybe_set_prev_state(self, trace_ctx: &mut TraceHandler) {
+        if let Some(call_result) = self.prev_state {
+            trace_ctx.meet_call_end(call_result);
+        }
+    }
+}
+
\ No newline at end of file diff --git a/src/air/execution_step/instructions/call/resolved_call.rs.html b/src/air/execution_step/instructions/call/resolved_call.rs.html new file mode 100644 index 00000000..bf5ae697 --- /dev/null +++ b/src/air/execution_step/instructions/call/resolved_call.rs.html @@ -0,0 +1,537 @@ +resolved_call.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#![allow(unused_unsafe)] // for wasm_bindgen target where calling FFI is safe
+
+use super::call_result_setter::*;
+use super::prev_result_handler::*;
+use super::triplet::resolve;
+use super::*;
+use crate::execution_step::resolver::Resolvable;
+use crate::execution_step::RcSecurityTetraplet;
+use crate::execution_step::RcSecurityTetraplets;
+use crate::execution_step::UncatchableError;
+use crate::trace_to_exec_err;
+use crate::JValue;
+use crate::SecurityTetraplet;
+
+use air_interpreter_cid::value_to_json_cid;
+use air_interpreter_cid::CidRef;
+use air_interpreter_data::CallResult;
+use air_interpreter_interface::CallArgumentsRepr;
+use air_interpreter_interface::CallRequestParams;
+use air_interpreter_interface::SerializedCallArguments;
+use air_interpreter_interface::TetrapletsRepr;
+use air_parser::ast;
+use air_trace_handler::merger::MergerCallResult;
+use air_trace_handler::TraceHandler;
+
+use std::rc::Rc;
+
+/// Represents Call instruction with resolved internal parts.
+#[derive(Debug, Clone, PartialEq)]
+pub(super) struct ResolvedCall<'i> {
+    tetraplet: RcSecurityTetraplet,
+    function_arg_paths: Rc<Vec<ast::ImmutableValue<'i>>>,
+    output: ast::CallOutputValue<'i>,
+}
+
+#[derive(Debug, Clone, PartialEq)]
+struct ResolvedArguments {
+    call_arguments: SerializedCallArguments,
+    tetraplets: Vec<RcSecurityTetraplets>,
+}
+
+#[derive(Debug)]
+enum CheckArgsResult<T> {
+    Ok(T),
+    Joinable(#[allow(dead_code)] ExecutionError),
+}
+
+impl<T> CheckArgsResult<T> {
+    fn new(result: ExecutionResult<T>) -> ExecutionResult<Self> {
+        match result {
+            Ok(nested) => Ok(CheckArgsResult::Ok(nested)),
+            Err(err) if err.is_joinable() => Ok(CheckArgsResult::Joinable(err)),
+            Err(err) => Err(err),
+        }
+    }
+}
+
+impl<'i> ResolvedCall<'i> {
+    /// Build `ResolvedCall` from `Call` by transforming `PeerPart` & `FunctionPart` into `ResolvedTriplet`.
+    #[tracing::instrument(level = "trace", skip_all)]
+    pub(super) fn new(raw_call: &Call<'i>, exec_ctx: &ExecutionCtx<'i>) -> ExecutionResult<Self> {
+        let triplet = resolve(&raw_call.triplet, exec_ctx)?;
+        let tetraplet = triplet.into();
+        let tetraplet = Rc::new(tetraplet);
+
+        check_output_name(&raw_call.output, exec_ctx)?;
+
+        Ok(Self {
+            tetraplet,
+            function_arg_paths: raw_call.args.clone(),
+            output: raw_call.output.clone(),
+        })
+    }
+
+    /// Executes resolved instruction, updates contexts based on a execution_step result.
+    #[tracing::instrument(level = "trace", skip_all)]
+    pub(super) fn execute(
+        &self,
+        raw_call: &Call<'i>,
+        exec_ctx: &mut ExecutionCtx<'i>,
+        trace_ctx: &mut TraceHandler,
+    ) -> ExecutionResult<()> {
+        // it's necessary to check arguments before accessing state,
+        // because it would be undeterministic otherwise, for more details see
+        // https://github.com/fluencelabs/aquavm/issues/214
+        // also note that if there is a non-join error then the corresponding state
+        // won't be saved to data
+        let checked_args = match self.check_args(exec_ctx)? {
+            CheckArgsResult::Ok(args) => Some(args),
+            CheckArgsResult::Joinable(_) => None,
+        };
+        let argument_hash: Option<Rc<CidRef>> =
+            checked_args.map(|args| value_to_json_cid(&args).expect("serializer shouldn't fail").get_inner());
+
+        let state = self.prepare_current_executed_state(raw_call, argument_hash.as_ref(), exec_ctx, trace_ctx)?;
+
+        if !state.should_execute() {
+            state.maybe_set_prev_state(trace_ctx);
+            return Ok(());
+        }
+
+        // call can be executed only on peers with such peer_id
+        let tetraplet = &self.tetraplet;
+        if tetraplet.peer_pk.as_str() != exec_ctx.run_parameters.current_peer_id.as_str() {
+            handle_remote_call(tetraplet.peer_pk.clone(), exec_ctx, trace_ctx);
+            return Ok(());
+        }
+
+        // TODO we are recalculating params here for the second time.
+        // we might extend the `checked_args`, but we have to proove that the value is same.
+        let request_params = match self.prepare_request_params(exec_ctx, tetraplet) {
+            Ok(params) => params,
+            Err(e) if e.is_joinable() => {
+                // to keep states on join behaviour
+                state.maybe_set_prev_state(trace_ctx);
+                return Err(e);
+            }
+            Err(e) => {
+                return Err(e);
+            }
+        };
+
+        let call_id = exec_ctx.next_call_request_id();
+
+        exec_ctx.call_requests.insert(call_id, request_params);
+
+        exec_ctx.make_subgraph_incomplete();
+        trace_ctx.meet_call_end(CallResult::sent_peer_id_with_call_id(
+            exec_ctx.run_parameters.current_peer_id.clone(),
+            call_id,
+        ));
+
+        Ok(())
+    }
+
+    pub(super) fn as_tetraplet(&self) -> RcSecurityTetraplet {
+        self.tetraplet.clone()
+    }
+
+    #[tracing::instrument(level = "trace", skip_all)]
+    fn prepare_request_params(
+        &self,
+        exec_ctx: &ExecutionCtx<'_>,
+        tetraplet: &SecurityTetraplet,
+    ) -> ExecutionResult<CallRequestParams> {
+        use air_interpreter_sede::ToSerialized;
+
+        let ResolvedArguments {
+            call_arguments,
+            tetraplets,
+        } = self.resolve_args(exec_ctx)?;
+
+        let serialized_tetraplets = TetrapletsRepr
+            .serialize(&tetraplets)
+            .map_err(UncatchableError::TetrapletSerializationFailed)?;
+
+        let request_params = CallRequestParams::new(
+            tetraplet.service_id.to_string(),
+            tetraplet.function_name.to_string(),
+            call_arguments,
+            serialized_tetraplets,
+        );
+
+        Ok(request_params)
+    }
+
+    /// Determine whether this call should be really called and adjust prev executed trace accordingly.
+    fn prepare_current_executed_state(
+        &self,
+        raw_call: &Call<'i>,
+        argument_hash: Option<&Rc<str>>,
+        exec_ctx: &mut ExecutionCtx<'i>,
+        trace_ctx: &mut TraceHandler,
+    ) -> ExecutionResult<StateDescriptor> {
+        let prev_result = trace_ctx.meet_call_start();
+        match trace_to_exec_err!(prev_result, raw_call)? {
+            MergerCallResult::Met(call_result) => handle_prev_state(
+                call_result,
+                &self.tetraplet,
+                argument_hash,
+                &self.output,
+                exec_ctx,
+                trace_ctx,
+            ),
+            MergerCallResult::NotMet => Ok(StateDescriptor::no_previous_state()),
+        }
+    }
+
+    /// Prepare arguments of this call instruction by resolving and preparing their security tetraplets.
+    fn resolve_args(&self, exec_ctx: &ExecutionCtx<'i>) -> ExecutionResult<ResolvedArguments> {
+        use air_interpreter_sede::ToSerialized;
+
+        let (call_arguments, tetraplets) = self.collect_args(exec_ctx)?;
+
+        let call_arguments = CallArgumentsRepr
+            .serialize(&call_arguments)
+            .map_err(UncatchableError::CallArgumentsSerializationFailed)?;
+
+        let resolved_arguments = ResolvedArguments {
+            call_arguments,
+            tetraplets,
+        };
+
+        Ok(resolved_arguments)
+    }
+
+    /// A version of `resolve_args` that supresses joinable errors.
+    fn check_args(&self, exec_ctx: &ExecutionCtx<'i>) -> ExecutionResult<CheckArgsResult<Vec<JValue>>> {
+        let fun_result = self.collect_args(exec_ctx);
+
+        CheckArgsResult::new(fun_result.map(|values| values.0))
+    }
+
+    fn collect_args(&self, exec_ctx: &ExecutionCtx<'i>) -> ExecutionResult<(Vec<JValue>, Vec<RcSecurityTetraplets>)> {
+        let function_args = self.function_arg_paths.iter();
+        let mut call_arguments = Vec::with_capacity(function_args.len());
+        let mut tetraplets = Vec::with_capacity(function_args.len());
+
+        for instruction_value in function_args {
+            let (arg, tetraplet, _) = instruction_value.resolve(exec_ctx)?;
+            call_arguments.push(arg);
+            tetraplets.push(tetraplet);
+        }
+        Ok((call_arguments, tetraplets))
+    }
+}
+
+/// Check output type name for being already in execution context.
+// TODO: this check should be moved on a parsing stage
+fn check_output_name(output: &ast::CallOutputValue<'_>, exec_ctx: &ExecutionCtx<'_>) -> ExecutionResult<()> {
+    use crate::execution_step::value_types::ScalarRef;
+
+    let scalar_name = match output {
+        ast::CallOutputValue::Scalar(scalar) => scalar.name,
+        _ => return Ok(()),
+    };
+
+    match exec_ctx.scalars.get_value(scalar_name) {
+        Ok(ScalarRef::Value(_)) => {
+            if exec_ctx.scalars.variable_could_be_set(scalar_name) {
+                Ok(())
+            } else {
+                Err(UncatchableError::ShadowingIsNotAllowed(scalar_name.to_string()).into())
+            }
+        }
+        Ok(ScalarRef::IterableValue(_)) => Err(UncatchableError::IterableShadowing(scalar_name.to_string()).into()),
+        Err(_) => Ok(()),
+    }
+}
+
\ No newline at end of file diff --git a/src/air/execution_step/instructions/call/triplet.rs.html b/src/air/execution_step/instructions/call/triplet.rs.html new file mode 100644 index 00000000..705477c1 --- /dev/null +++ b/src/air/execution_step/instructions/call/triplet.rs.html @@ -0,0 +1,197 @@ +triplet.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::ExecutionCtx;
+use super::ExecutionResult;
+use crate::execution_step::resolver::Resolvable;
+use crate::execution_step::CatchableError;
+use crate::JValue;
+
+use air_parser::ast;
+use polyplets::ResolvedTriplet;
+
+/// Resolve variables, literals, etc in the `Triplet`, and build a `ResolvedTriplet`.
+pub(crate) fn resolve<'i>(triplet: &ast::Triplet<'i>, ctx: &ExecutionCtx<'i>) -> ExecutionResult<ResolvedTriplet> {
+    let ast::Triplet {
+        peer_id: peer_pk,
+        service_id,
+        function_name,
+    } = triplet;
+
+    let peer_pk = resolve_peer_id_to_string(peer_pk, ctx)?;
+    let service_id = resolve_to_string(service_id, ctx)?;
+    let function_name = resolve_to_string(function_name, ctx)?;
+
+    Ok(ResolvedTriplet {
+        peer_pk,
+        service_id,
+        function_name,
+    })
+}
+
+/// Resolve peer id to string by either resolving variable from `ExecutionCtx`, taking literal value, or etc.
+// TODO: return Rc<String> to avoid excess cloning
+// TODO: move this function into resolve in boxed value PR
+pub(crate) fn resolve_peer_id_to_string<'i>(
+    value: &ast::ResolvableToPeerIdVariable<'i>,
+    exec_ctx: &ExecutionCtx<'i>,
+) -> ExecutionResult<String> {
+    use ast::ResolvableToPeerIdVariable::*;
+
+    let ((jvalue, _, _), name) = match value {
+        InitPeerId => return Ok(exec_ctx.run_parameters.init_peer_id.to_string()),
+        Literal(value) => return Ok(value.to_string()),
+        Scalar(scalar) => (scalar.resolve(exec_ctx)?, scalar.name),
+        ScalarWithLambda(scalar) => (scalar.resolve(exec_ctx)?, scalar.name),
+        CanonStreamWithLambda(canon_stream) => (canon_stream.resolve(exec_ctx)?, canon_stream.name),
+        CanonStreamMapWithLambda(canon_stream_map) => (canon_stream_map.resolve(exec_ctx)?, canon_stream_map.name),
+    };
+
+    try_jvalue_to_string(jvalue, name)
+}
+
+/// Resolve value to string by either resolving variable from `ExecutionCtx`, taking literal value, or etc.
+// TODO: return Rc<String> to avoid excess cloning
+// TODO: move this function into resolve in boxed value PR
+pub(crate) fn resolve_to_string<'i>(
+    value: &ast::ResolvableToStringVariable<'i>,
+    exec_ctx: &ExecutionCtx<'i>,
+) -> ExecutionResult<String> {
+    use ast::ResolvableToStringVariable::*;
+
+    let ((jvalue, _, _), name) = match value {
+        Literal(value) => return Ok(value.to_string()),
+        Scalar(scalar) => (scalar.resolve(exec_ctx)?, scalar.name),
+        ScalarWithLambda(scalar) => (scalar.resolve(exec_ctx)?, scalar.name),
+        CanonStreamWithLambda(canon_stream) => (canon_stream.resolve(exec_ctx)?, canon_stream.name),
+        CanonStreamMapWithLambda(canon_stream_map) => (canon_stream_map.resolve(exec_ctx)?, canon_stream_map.name),
+    };
+
+    try_jvalue_to_string(jvalue, name)
+}
+
+fn try_jvalue_to_string(jvalue: JValue, variable_name: impl Into<String>) -> ExecutionResult<String> {
+    match jvalue {
+        JValue::String(s) => Ok(s.to_string()),
+        _ => Err(CatchableError::NonStringValueInTripletResolution {
+            variable_name: variable_name.into(),
+            actual_value: jvalue,
+        }
+        .into()),
+    }
+}
+
\ No newline at end of file diff --git a/src/air/execution_step/instructions/call/verifier.rs.html b/src/air/execution_step/instructions/call/verifier.rs.html new file mode 100644 index 00000000..27c7df16 --- /dev/null +++ b/src/air/execution_step/instructions/call/verifier.rs.html @@ -0,0 +1,93 @@ +verifier.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use crate::UncatchableError;
+
+use polyplets::SecurityTetraplet;
+
+/// Check that computed call parameters match the parameters from current data.
+pub(crate) fn verify_call(
+    expected_argument_hash: &str,
+    expected_tetraplet: &SecurityTetraplet,
+    stored_argument_hash: &str,
+    stored_tetraplet: &SecurityTetraplet,
+) -> Result<(), UncatchableError> {
+    if expected_argument_hash != stored_argument_hash {
+        return Err(UncatchableError::InstructionParametersMismatch {
+            param: "call argument_hash",
+            expected_value: expected_argument_hash.to_owned(),
+            stored_value: stored_argument_hash.to_owned(),
+        });
+    }
+    if expected_tetraplet != stored_tetraplet {
+        return Err(UncatchableError::InstructionParametersMismatch {
+            param: "call tetraplet",
+            expected_value: format!("{expected_tetraplet:?}"),
+            stored_value: format!("{stored_tetraplet:?}"),
+        });
+    }
+    Ok(())
+}
+
\ No newline at end of file diff --git a/src/air/execution_step/instructions/canon.rs.html b/src/air/execution_step/instructions/canon.rs.html new file mode 100644 index 00000000..02dde49f --- /dev/null +++ b/src/air/execution_step/instructions/canon.rs.html @@ -0,0 +1,201 @@ +canon.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::canon_utils::handle_seen_canon;
+use super::canon_utils::handle_unseen_canon;
+use super::canon_utils::CanonEpilogClosure;
+use super::canon_utils::CreateCanonStreamClosure;
+use super::ExecutionCtx;
+use super::ExecutionResult;
+use super::TraceHandler;
+use crate::execution_step::value_types::CanonStream;
+use crate::execution_step::value_types::CanonStreamWithProvenance;
+use crate::log_instruction;
+use crate::trace_to_exec_err;
+
+use air_interpreter_cid::CID;
+use air_interpreter_data::CanonResult;
+use air_interpreter_data::CanonResultCidAggregate;
+use air_parser::ast;
+use air_parser::AirPos;
+use air_trace_handler::merger::MergerCanonResult;
+
+use std::borrow::Cow;
+
+impl<'i> super::ExecutableInstruction<'i> for ast::Canon<'i> {
+    #[tracing::instrument(level = "debug", skip(exec_ctx, trace_ctx))]
+    fn execute(&self, exec_ctx: &mut ExecutionCtx<'i>, trace_ctx: &mut TraceHandler) -> ExecutionResult<()> {
+        log_instruction!(canon, exec_ctx, trace_ctx);
+        let epilog = &epilog_closure(self.canon_stream.name);
+        let canon_result = trace_to_exec_err!(trace_ctx.meet_canon_start(), self)?;
+
+        // TODO return some command instead to create producer or insert command or ...
+        let create_canon_producer = create_canon_stream_producer(self.stream.name, self.stream.position);
+        match canon_result {
+            MergerCanonResult::CanonResult(canon_result) => handle_seen_canon(
+                &self.peer_id,
+                epilog,
+                &create_canon_producer,
+                canon_result,
+                &self.peer_id,
+                exec_ctx,
+                trace_ctx,
+            ),
+            MergerCanonResult::Empty => {
+                handle_unseen_canon(epilog, &create_canon_producer, &self.peer_id, exec_ctx, trace_ctx)
+            }
+        }
+    }
+}
+
+fn epilog_closure(canon_stream_name: &str) -> Box<CanonEpilogClosure<'_>> {
+    Box::new(
+        move |canon_stream: CanonStream,
+              canon_result_cid: CID<CanonResultCidAggregate>,
+              exec_ctx: &mut ExecutionCtx<'_>,
+              trace_ctx: &mut TraceHandler|
+              -> ExecutionResult<()> {
+            let value = CanonStreamWithProvenance::new(canon_stream, canon_result_cid.clone());
+            exec_ctx.scalars.set_canon_value(canon_stream_name, value)?;
+
+            trace_ctx.meet_canon_end(CanonResult::executed(canon_result_cid));
+            Ok(())
+        },
+    )
+}
+
+/// The result closure creates canon stream based on the underlying stream or an empty stream
+/// if no stream created yet. The latter is crucial for deterministic behaviour, for more info see
+/// github.com/fluencelabs/aquavm/issues/346.
+fn create_canon_stream_producer<'closure, 'name: 'closure>(
+    stream_name: &'name str,
+    position: AirPos,
+) -> Box<CreateCanonStreamClosure<'closure>> {
+    Box::new(move |exec_ctx: &mut ExecutionCtx<'_>, peer_pk: String| -> CanonStream {
+        let stream = exec_ctx
+            .streams
+            .get(stream_name, position)
+            .map(Cow::Borrowed)
+            .unwrap_or_default();
+
+        let values = stream.iter().cloned().collect::<Vec<_>>();
+        CanonStream::from_values(values, peer_pk)
+    })
+}
+
\ No newline at end of file diff --git a/src/air/execution_step/instructions/canon_map.rs.html b/src/air/execution_step/instructions/canon_map.rs.html new file mode 100644 index 00000000..de83e487 --- /dev/null +++ b/src/air/execution_step/instructions/canon_map.rs.html @@ -0,0 +1,207 @@ +canon_map.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::canon_utils::handle_seen_canon;
+use super::canon_utils::handle_unseen_canon;
+use super::canon_utils::CanonEpilogClosure;
+use super::canon_utils::CreateCanonStreamClosure;
+use super::ExecutionCtx;
+use super::ExecutionResult;
+use super::TraceHandler;
+use crate::execution_step::value_types::CanonStream;
+use crate::execution_step::value_types::CanonStreamMap;
+use crate::execution_step::value_types::CanonStreamMapWithProvenance;
+use crate::log_instruction;
+use crate::trace_to_exec_err;
+
+use air_interpreter_cid::CID;
+use air_interpreter_data::CanonResult;
+use air_interpreter_data::CanonResultCidAggregate;
+use air_parser::ast;
+use air_parser::AirPos;
+use air_trace_handler::merger::MergerCanonResult;
+
+use std::borrow::Cow;
+
+impl<'i> super::ExecutableInstruction<'i> for ast::CanonMap<'i> {
+    #[tracing::instrument(level = "debug", skip(exec_ctx, trace_ctx))]
+    fn execute(&self, exec_ctx: &mut ExecutionCtx<'i>, trace_ctx: &mut TraceHandler) -> ExecutionResult<()> {
+        log_instruction!(canon, exec_ctx, trace_ctx);
+        let epilog = &epilog_closure(self.canon_stream_map.name);
+        let canon_result = trace_to_exec_err!(trace_ctx.meet_canon_start(), self)?;
+
+        let create_canon_producer = create_canon_stream_producer(self.stream_map.name, self.stream_map.position);
+        match canon_result {
+            MergerCanonResult::CanonResult(canon_result) => handle_seen_canon(
+                &self.peer_id,
+                epilog,
+                &create_canon_producer,
+                canon_result,
+                &self.peer_id,
+                exec_ctx,
+                trace_ctx,
+            ),
+            MergerCanonResult::Empty => {
+                handle_unseen_canon(epilog, &create_canon_producer, &self.peer_id, exec_ctx, trace_ctx)
+            }
+        }
+    }
+}
+
+fn epilog_closure<'closure, 'name: 'closure>(canon_stream_map_name: &'name str) -> Box<CanonEpilogClosure<'closure>> {
+    Box::new(
+        move |canon_stream: CanonStream,
+              canon_result_cid: CID<CanonResultCidAggregate>,
+              exec_ctx: &mut ExecutionCtx<'_>,
+              trace_ctx: &mut TraceHandler|
+              -> ExecutionResult<()> {
+            let canon_stream_map = CanonStreamMap::from_canon_stream(canon_stream)?;
+
+            let canon_stream_map_with_provenance =
+                CanonStreamMapWithProvenance::new(canon_stream_map, canon_result_cid.clone());
+            exec_ctx
+                .scalars
+                .set_canon_map_value(canon_stream_map_name, canon_stream_map_with_provenance)?;
+
+            trace_ctx.meet_canon_end(CanonResult::executed(canon_result_cid));
+
+            Ok(())
+        },
+    )
+}
+
+fn create_canon_stream_producer<'closure, 'name: 'closure>(
+    stream_map_name: &'name str,
+    position: AirPos,
+) -> Box<CreateCanonStreamClosure<'closure>> {
+    Box::new(move |exec_ctx: &mut ExecutionCtx<'_>, peer_pk: String| -> CanonStream {
+        let stream_map = exec_ctx
+            .stream_maps
+            .get_mut(stream_map_name, position)
+            .map(|stream_map| Cow::Borrowed(stream_map))
+            .unwrap_or_default();
+
+        let values = stream_map.iter().cloned().collect::<Vec<_>>();
+        CanonStream::from_values(values, peer_pk)
+    })
+}
+
\ No newline at end of file diff --git a/src/air/execution_step/instructions/canon_stream_map_scalar.rs.html b/src/air/execution_step/instructions/canon_stream_map_scalar.rs.html new file mode 100644 index 00000000..2aa73c8c --- /dev/null +++ b/src/air/execution_step/instructions/canon_stream_map_scalar.rs.html @@ -0,0 +1,257 @@ +canon_stream_map_scalar.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::canon_utils::handle_seen_canon;
+use super::canon_utils::handle_unseen_canon;
+use super::canon_utils::CanonEpilogClosure;
+use super::canon_utils::CreateCanonStreamClosure;
+use super::ExecutionCtx;
+use super::ExecutionResult;
+use super::TraceHandler;
+use crate::execution_step::value_types::CanonStream;
+use crate::execution_step::CanonResultAggregate;
+use crate::execution_step::LiteralAggregate;
+use crate::execution_step::ValueAggregate;
+use crate::log_instruction;
+use crate::trace_to_exec_err;
+use crate::JValue;
+use crate::UncatchableError;
+
+use air_interpreter_cid::CID;
+use air_interpreter_data::CanonResult;
+use air_interpreter_data::CanonResultCidAggregate;
+use air_parser::ast;
+use air_parser::AirPos;
+use air_trace_handler::merger::MergerCanonResult;
+
+use std::borrow::Cow;
+
+impl<'i> super::ExecutableInstruction<'i> for ast::CanonStreamMapScalar<'i> {
+    #[tracing::instrument(level = "debug", skip(exec_ctx, trace_ctx))]
+    fn execute(&self, exec_ctx: &mut ExecutionCtx<'i>, trace_ctx: &mut TraceHandler) -> ExecutionResult<()> {
+        log_instruction!(canon, exec_ctx, trace_ctx);
+        let epilog = &epilog_closure(self.scalar.name);
+        let canon_result = trace_to_exec_err!(trace_ctx.meet_canon_start(), self)?;
+
+        let create_canon_producer = create_canon_stream_producer(self.stream_map.name, self.stream_map.position);
+        match canon_result {
+            MergerCanonResult::CanonResult(canon_result) => handle_seen_canon(
+                &self.peer_id,
+                epilog,
+                &create_canon_producer,
+                canon_result,
+                &self.peer_id,
+                exec_ctx,
+                trace_ctx,
+            ),
+            MergerCanonResult::Empty => {
+                handle_unseen_canon(epilog, &create_canon_producer, &self.peer_id, exec_ctx, trace_ctx)
+            }
+        }
+    }
+}
+
+fn epilog_closure<'closure, 'name: 'closure>(scalar_name: &'name str) -> Box<CanonEpilogClosure<'closure>> {
+    Box::new(
+        move |canon_stream: CanonStream,
+              canon_result_cid: CID<CanonResultCidAggregate>,
+              exec_ctx: &mut ExecutionCtx<'_>,
+              trace_ctx: &mut TraceHandler|
+              -> ExecutionResult<()> {
+            use crate::CanonStreamMapError::NoDataToProduceScalar;
+
+            let tetraplet = canon_stream.tetraplet().clone();
+            let peer_pk = tetraplet.peer_pk.as_str().into();
+
+            // Here canon_stream is a transport that brings a single JValue rendered
+            // by the producer closure previously.
+            let value = canon_stream
+                .into_values()
+                .first()
+                .ok_or(UncatchableError::CanonStreamMapError(NoDataToProduceScalar))?
+                .get_result()
+                .clone();
+
+            let position = trace_ctx.trace_pos().map_err(UncatchableError::from)?;
+
+            let value = CanonResultAggregate::new(value, peer_pk, &tetraplet.lens, position);
+            let result = ValueAggregate::from_canon_result(value, canon_result_cid.clone());
+
+            exec_ctx.scalars.set_scalar_value(scalar_name, result)?;
+            trace_ctx.meet_canon_end(CanonResult::executed(canon_result_cid));
+            Ok(())
+        },
+    )
+}
+
+/// The result closure creates canon stream based on the underlying stream or an empty stream
+/// if no stream created yet. The latter is crucial for deterministic behaviour, for more info see
+/// github.com/fluencelabs/aquavm/issues/346.
+fn create_canon_stream_producer<'closure, 'name: 'closure>(
+    stream_map_name: &'name str,
+    position: AirPos,
+) -> Box<CreateCanonStreamClosure<'closure>> {
+    Box::new(move |exec_ctx: &mut ExecutionCtx<'_>, peer_pk: String| -> CanonStream {
+        let stream_map = exec_ctx
+            .stream_maps
+            .get_mut(stream_map_name, position)
+            .map(|stream_map| Cow::Borrowed(stream_map))
+            .unwrap_or_default();
+
+        let value_iter = stream_map.iter_unique_key_object();
+
+        let value = ValueAggregate::from_literal_result(LiteralAggregate::new(
+            JValue::object_from_pairs(value_iter),
+            peer_pk.as_str().into(),
+            0.into(),
+        ));
+
+        // This single value is a map of StreamMap unique keys to values.
+        CanonStream::from_values(vec![value], peer_pk)
+    })
+}
+
\ No newline at end of file diff --git a/src/air/execution_step/instructions/canon_utils/mod.rs.html b/src/air/execution_step/instructions/canon_utils/mod.rs.html new file mode 100644 index 00000000..1de0f3f0 --- /dev/null +++ b/src/air/execution_step/instructions/canon_utils/mod.rs.html @@ -0,0 +1,383 @@ +mod.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use crate::execution_step::errors::UncatchableError;
+use crate::execution_step::instructions::resolve_peer_id_to_string;
+use crate::execution_step::value_types::CanonStream;
+use crate::execution_step::ExecutionCtx;
+use crate::execution_step::ExecutionResult;
+use crate::execution_step::TraceHandler;
+
+use air_interpreter_cid::CID;
+use air_interpreter_data::CanonResult;
+use air_interpreter_data::CanonResultCidAggregate;
+use air_parser::ast::ResolvableToPeerIdVariable;
+use polyplets::SecurityTetraplet;
+
+pub(crate) type CanonEpilogClosure<'closure> = dyn Fn(CanonStream, CID<CanonResultCidAggregate>, &mut ExecutionCtx<'_>, &mut TraceHandler) -> ExecutionResult<()>
+    + 'closure;
+
+pub(crate) type CreateCanonStreamClosure<'closure> = dyn Fn(&mut ExecutionCtx<'_>, String) -> CanonStream + 'closure;
+
+pub(crate) fn handle_seen_canon(
+    peer_id_var: &ResolvableToPeerIdVariable<'_>,
+    epilog: &CanonEpilogClosure<'_>,
+    create_canon_stream: &CreateCanonStreamClosure<'_>,
+    canon_result: CanonResult,
+    peer_id: &ResolvableToPeerIdVariable<'_>,
+    exec_ctx: &mut ExecutionCtx<'_>,
+    trace_ctx: &mut TraceHandler,
+) -> ExecutionResult<()> {
+    match canon_result {
+        CanonResult::RequestSentBy(..) => {
+            handle_canon_request_sent_by(epilog, create_canon_stream, peer_id, canon_result, exec_ctx, trace_ctx)
+        }
+        CanonResult::Executed(canon_result_cid) => {
+            handle_canon_executed(peer_id_var, epilog, canon_result_cid, exec_ctx, trace_ctx)
+        }
+    }
+}
+
+pub(crate) fn handle_canon_request_sent_by(
+    epilog: &CanonEpilogClosure<'_>,
+    create_canon_stream: &CreateCanonStreamClosure<'_>,
+    peer_id: &ResolvableToPeerIdVariable<'_>,
+    canon_result: CanonResult,
+    exec_ctx: &mut ExecutionCtx<'_>,
+    trace_ctx: &mut TraceHandler,
+) -> ExecutionResult<()> {
+    // we do not apply join behavior here because if state exists, the variable have been defined;
+    // it cannot become undefined due to INV-1
+    let peer_id = resolve_peer_id_to_string(peer_id, exec_ctx)?;
+
+    if exec_ctx.run_parameters.current_peer_id.as_str() != peer_id {
+        // nothing to execute yet; just leave the canon_result as is
+        exec_ctx.make_subgraph_incomplete();
+        trace_ctx.meet_canon_end(canon_result);
+        Ok(())
+    } else {
+        create_canon_stream_for_first_time(epilog, create_canon_stream, peer_id, exec_ctx, trace_ctx)
+    }
+}
+
+pub(crate) fn handle_canon_executed(
+    peer_id_var: &ResolvableToPeerIdVariable<'_>,
+    epilog: &CanonEpilogClosure<'_>,
+    canon_result_cid: CID<CanonResultCidAggregate>,
+    exec_ctx: &mut ExecutionCtx<'_>,
+    trace_ctx: &mut TraceHandler,
+) -> ExecutionResult<()> {
+    let peer_id = crate::execution_step::instructions::resolve_peer_id_to_string(peer_id_var, exec_ctx)?;
+    let expected_tetraplet = SecurityTetraplet::new(peer_id, "", "", "");
+
+    let canon_result_agg = exec_ctx.cid_state.get_canon_result_by_cid(&canon_result_cid)?;
+    let tetraplet_cid = canon_result_agg.tetraplet.clone();
+    let tetraplet = exec_ctx.cid_state.get_tetraplet_by_cid(&tetraplet_cid)?;
+
+    verify_canon(&expected_tetraplet, &tetraplet)?;
+
+    let value_cids = canon_result_agg.values.clone();
+    let values = value_cids
+        .iter()
+        .map(|canon_value_cid| exec_ctx.cid_state.get_canon_value_by_cid(canon_value_cid))
+        .collect::<Result<Vec<_>, _>>()?;
+
+    populate_seen_cid_context(exec_ctx, &tetraplet.peer_pk, &canon_result_cid);
+
+    let canon_stream = CanonStream::new(values, tetraplet);
+
+    epilog(canon_stream, canon_result_cid, exec_ctx, trace_ctx)
+}
+
+pub(crate) fn handle_unseen_canon(
+    epilog: &CanonEpilogClosure<'_>,
+    create_canon_stream: &CreateCanonStreamClosure<'_>,
+    peer_id: &ResolvableToPeerIdVariable<'_>,
+    exec_ctx: &mut ExecutionCtx<'_>,
+    trace_ctx: &mut TraceHandler,
+) -> ExecutionResult<()> {
+    use crate::execution_step::Joinable;
+    use crate::joinable;
+
+    let peer_id = joinable!(resolve_peer_id_to_string(peer_id, exec_ctx), exec_ctx, ())?;
+
+    if exec_ctx.run_parameters.current_peer_id.as_str() != peer_id {
+        exec_ctx.make_subgraph_incomplete();
+        exec_ctx.next_peer_pks.push(peer_id);
+
+        let canon_result = CanonResult::request_sent_by(exec_ctx.run_parameters.current_peer_id.clone());
+        trace_ctx.meet_canon_end(canon_result);
+        Ok(())
+    } else {
+        create_canon_stream_for_first_time(epilog, create_canon_stream, peer_id, exec_ctx, trace_ctx)
+    }
+}
+
+fn create_canon_stream_for_first_time(
+    epilog: &CanonEpilogClosure<'_>,
+    create_canon_stream: &CreateCanonStreamClosure<'_>,
+    peer_id: String,
+    exec_ctx: &mut ExecutionCtx<'_>,
+    trace_ctx: &mut TraceHandler,
+) -> ExecutionResult<()> {
+    let canon_stream = create_canon_stream(exec_ctx, peer_id);
+    let canon_result_cid = populate_unseen_cid_context(exec_ctx, &canon_stream)?;
+    epilog(canon_stream, canon_result_cid, exec_ctx, trace_ctx)
+}
+
+fn populate_seen_cid_context(
+    exec_ctx: &mut ExecutionCtx<'_>,
+    peer_id: &str,
+    canon_result_cid: &CID<CanonResultCidAggregate>,
+) {
+    exec_ctx.record_canon_cid(peer_id, canon_result_cid)
+}
+
+fn populate_unseen_cid_context(
+    exec_ctx: &mut ExecutionCtx<'_>,
+    canon_stream: &CanonStream,
+) -> ExecutionResult<CID<CanonResultCidAggregate>> {
+    let value_cids = canon_stream
+        .iter()
+        .map(|canon_value| exec_ctx.cid_state.track_canon_value(canon_value))
+        .collect::<Result<_, _>>()?;
+
+    let tetraplet = canon_stream.tetraplet();
+    let tetraplet_cid = exec_ctx
+        .cid_state
+        .tetraplet_tracker
+        .track_value(tetraplet.clone())
+        .map_err(UncatchableError::from)?;
+
+    let canon_result = CanonResultCidAggregate::new(tetraplet_cid, value_cids);
+    let canon_result_cid = exec_ctx
+        .cid_state
+        .canon_result_tracker
+        .track_value(canon_result)
+        .map_err(UncatchableError::from)?;
+
+    exec_ctx.record_canon_cid(&tetraplet.peer_pk, &canon_result_cid);
+    Ok(canon_result_cid)
+}
+
+pub(crate) fn verify_canon(
+    expected_tetraplet: &SecurityTetraplet,
+    stored_tetraplet: &SecurityTetraplet,
+) -> Result<(), UncatchableError> {
+    if expected_tetraplet != stored_tetraplet {
+        return Err(UncatchableError::InstructionParametersMismatch {
+            param: "canon tetraplet",
+            expected_value: format!("{expected_tetraplet:?}"),
+            stored_value: format!("{stored_tetraplet:?}"),
+        });
+    }
+    Ok(())
+}
+
\ No newline at end of file diff --git a/src/air/execution_step/instructions/compare_matchable/mod.rs.html b/src/air/execution_step/instructions/compare_matchable/mod.rs.html new file mode 100644 index 00000000..ece94b02 --- /dev/null +++ b/src/air/execution_step/instructions/compare_matchable/mod.rs.html @@ -0,0 +1,73 @@ +mod.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use crate::execution_step::resolver::Resolvable;
+use crate::execution_step::ExecutionCtx;
+use crate::execution_step::ExecutionResult;
+
+use air_parser::ast;
+
+#[tracing::instrument(skip_all)]
+pub(crate) fn are_matchable_eq<'ctx>(
+    left: &ast::ImmutableValue<'_>,
+    right: &ast::ImmutableValue<'_>,
+    exec_ctx: &'ctx ExecutionCtx<'_>,
+) -> ExecutionResult<bool> {
+    let (left_value, _, _) = left.resolve(exec_ctx)?;
+    let (right_value, _, _) = right.resolve(exec_ctx)?;
+
+    Ok(left_value == right_value)
+}
+
\ No newline at end of file diff --git a/src/air/execution_step/instructions/fail.rs.html b/src/air/execution_step/instructions/fail.rs.html new file mode 100644 index 00000000..2c30e527 --- /dev/null +++ b/src/air/execution_step/instructions/fail.rs.html @@ -0,0 +1,327 @@ +fail.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::ExecutionCtx;
+use super::ExecutionResult;
+use super::TraceHandler;
+use crate::execution_step::execution_context::check_error_object;
+use crate::execution_step::resolver::Resolvable;
+use crate::execution_step::CatchableError;
+use crate::execution_step::RcSecurityTetraplet;
+use crate::log_instruction;
+use crate::ExecutionError;
+use crate::JValue;
+
+use air_interpreter_data::Provenance;
+use air_parser::ast;
+use air_parser::ast::Fail;
+use polyplets::SecurityTetraplet;
+
+use std::rc::Rc;
+
+impl<'i> super::ExecutableInstruction<'i> for Fail<'i> {
+    fn execute(&self, exec_ctx: &mut ExecutionCtx<'i>, trace_ctx: &mut TraceHandler) -> ExecutionResult<()> {
+        log_instruction!(fail, exec_ctx, trace_ctx);
+
+        match self {
+            Fail::Scalar(scalar) => fail_with_scalar(scalar, exec_ctx),
+            Fail::ScalarWithLambda(scalar) => fail_with_scalar_wl(scalar, exec_ctx),
+            &Fail::Literal {
+                ret_code,
+                error_message,
+            } => fail_with_literals(ret_code, error_message, self, exec_ctx),
+            Fail::CanonStreamWithLambda(canon_stream) => fail_with_canon_stream(canon_stream, exec_ctx),
+            // bubble last error up
+            Fail::LastError => fail_with_last_error(exec_ctx),
+            Fail::Error => fail_with_error(exec_ctx),
+        }
+    }
+}
+
+fn fail_with_scalar<'i>(scalar: &ast::Scalar<'i>, exec_ctx: &mut ExecutionCtx<'i>) -> ExecutionResult<()> {
+    let (value, mut tetraplet, provenance) = scalar.resolve(exec_ctx)?;
+    // tetraplets always have one element here and it'll be refactored after boxed value
+    let tetraplet = tetraplet.remove(0);
+    check_error_object(&value).map_err(CatchableError::InvalidErrorObjectError)?;
+
+    fail_with_error_object(exec_ctx, value, Some(tetraplet), provenance)
+}
+
+fn fail_with_scalar_wl<'i>(scalar: &ast::ScalarWithLambda<'i>, exec_ctx: &mut ExecutionCtx<'i>) -> ExecutionResult<()> {
+    let (value, mut tetraplet, provenance) = scalar.resolve(exec_ctx)?;
+    // tetraplets always have one element here and it'll be refactored after boxed value
+    let tetraplet = tetraplet.remove(0);
+    check_error_object(&value).map_err(CatchableError::InvalidErrorObjectError)?;
+
+    fail_with_error_object(exec_ctx, value, Some(tetraplet), provenance)
+}
+
+fn fail_with_literals(
+    error_code: i64,
+    error_message: &str,
+    fail: &Fail<'_>,
+    exec_ctx: &mut ExecutionCtx<'_>,
+) -> ExecutionResult<()> {
+    let error_object = crate::execution_step::execution_context::error_from_raw_fields_w_peerid(
+        error_code,
+        error_message,
+        &fail.to_string(),
+        exec_ctx.run_parameters.init_peer_id.as_ref(),
+    );
+
+    let literal_tetraplet = SecurityTetraplet::literal_tetraplet(exec_ctx.run_parameters.init_peer_id.as_ref());
+    let literal_tetraplet = Rc::new(literal_tetraplet);
+    // in (fail x y), x and y are always literals
+    let provenance = Provenance::literal();
+
+    fail_with_error_object(exec_ctx, error_object, Some(literal_tetraplet), provenance)
+}
+
+fn fail_with_canon_stream(
+    ast_canon: &ast::CanonStreamWithLambda<'_>,
+    exec_ctx: &mut ExecutionCtx<'_>,
+) -> ExecutionResult<()> {
+    let (value, mut tetraplets, provenance) = ast_canon.resolve(exec_ctx)?;
+
+    // tetraplets always have one element here and it'll be refactored after boxed value
+    check_error_object(&value).map_err(CatchableError::InvalidErrorObjectError)?;
+
+    fail_with_error_object(exec_ctx, value, Some(tetraplets.remove(0)), provenance)
+}
+
+fn fail_with_last_error(exec_ctx: &mut ExecutionCtx<'_>) -> ExecutionResult<()> {
+    use crate::execution_step::InstructionError;
+
+    let InstructionError {
+        error,
+        tetraplet,
+        provenance,
+        ..
+    } = exec_ctx.last_error_descriptor.error();
+
+    check_error_object(error).map_err(CatchableError::InvalidErrorObjectError)?;
+
+    // to avoid warnings from https://github.com/rust-lang/rust/issues/59159
+    let error = error.clone();
+    let tetraplet = tetraplet.clone();
+
+    fail_with_error_object(exec_ctx, error, tetraplet, provenance.clone())
+}
+
+fn fail_with_error(exec_ctx: &mut ExecutionCtx<'_>) -> ExecutionResult<()> {
+    use crate::execution_step::InstructionError;
+
+    let InstructionError {
+        error,
+        tetraplet,
+        provenance,
+        orig_catchable,
+    } = exec_ctx.error_descriptor.error();
+
+    check_error_object(error).map_err(CatchableError::InvalidErrorObjectError)?;
+
+    let result = match orig_catchable {
+        Some(orig_catchable) => {
+            let catchable_to_return = orig_catchable.clone();
+            let _ = fail_with_error_object(exec_ctx, error.clone(), tetraplet.clone(), provenance.clone());
+            Err(ExecutionError::Catchable(catchable_to_return.into()))
+        }
+        None => fail_with_error_object(exec_ctx, error.clone(), tetraplet.clone(), provenance.clone()),
+    };
+    exec_ctx.error_descriptor.disable_error_setting();
+    result
+}
+
+fn fail_with_error_object(
+    exec_ctx: &mut ExecutionCtx<'_>,
+    error: JValue,
+    tetraplet: Option<RcSecurityTetraplet>,
+    provenance: Provenance,
+) -> ExecutionResult<()> {
+    exec_ctx
+        .last_error_descriptor
+        .set_from_error_object(error.clone(), tetraplet, provenance);
+    exec_ctx.make_subgraph_incomplete();
+
+    Err(ExecutionError::Catchable(Rc::new(CatchableError::UserError { error })))
+}
+
\ No newline at end of file diff --git a/src/air/execution_step/instructions/fold/fold_state.rs.html b/src/air/execution_step/instructions/fold/fold_state.rs.html new file mode 100644 index 00000000..bcf4a0ef --- /dev/null +++ b/src/air/execution_step/instructions/fold/fold_state.rs.html @@ -0,0 +1,111 @@ +fold_state.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::Instruction;
+use super::IterableValue;
+
+use std::rc::Rc;
+
+pub(crate) struct FoldState<'i> {
+    pub(crate) iterable: IterableValue,
+    pub(crate) iterable_type: IterableType,
+    // true of iterator exhausted and reverse execution started
+    pub(crate) back_iteration_started: bool,
+    pub(crate) instr_head: Rc<Instruction<'i>>,
+    pub(crate) last_instr_head: Option<Rc<Instruction<'i>>>,
+}
+
+#[derive(Debug, Clone, PartialEq, Eq)]
+pub(crate) enum IterableType {
+    Scalar,
+    Stream(u32),
+}
+
+impl<'i> FoldState<'i> {
+    pub(crate) fn from_iterable(
+        iterable: IterableValue,
+        iterable_type: IterableType,
+        instr_head: Rc<Instruction<'i>>,
+        last_instr_head: Option<Rc<Instruction<'i>>>,
+    ) -> Self {
+        Self {
+            iterable,
+            iterable_type,
+            back_iteration_started: false,
+            instr_head,
+            last_instr_head,
+        }
+    }
+}
+
\ No newline at end of file diff --git a/src/air/execution_step/instructions/fold/mod.rs.html b/src/air/execution_step/instructions/fold/mod.rs.html new file mode 100644 index 00000000..faa5360e --- /dev/null +++ b/src/air/execution_step/instructions/fold/mod.rs.html @@ -0,0 +1,63 @@ +mod.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+mod fold_state;
+mod utils;
+
+pub(crate) use fold_state::FoldState;
+pub(crate) use fold_state::IterableType;
+pub(super) use utils::*;
+
+use super::ExecutionCtx;
+use super::ExecutionResult;
+use super::Instruction;
+use super::ScalarRef;
+use crate::execution_step::value_types::*;
+
\ No newline at end of file diff --git a/src/air/execution_step/instructions/fold/utils.rs.html b/src/air/execution_step/instructions/fold/utils.rs.html new file mode 100644 index 00000000..37a4411e --- /dev/null +++ b/src/air/execution_step/instructions/fold/utils.rs.html @@ -0,0 +1,457 @@ +utils.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::*;
+use crate::execution_step::execution_context::stream_map_key::StreamMapKey;
+use crate::execution_step::value_types::populate_tetraplet_with_lambda;
+use crate::execution_step::value_types::IterableValue;
+use crate::execution_step::CatchableError;
+use crate::execution_step::PEEK_ALLOWED_ON_NON_EMPTY;
+use crate::JValue;
+use crate::LambdaAST;
+use crate::SecurityTetraplet;
+
+use air_interpreter_data::Provenance;
+use air_parser::ast;
+
+use std::collections::HashSet;
+use std::ops::Deref;
+use std::rc::Rc;
+
+// TODO: refactor this file after switching to boxed value
+
+pub(crate) enum FoldIterableScalar {
+    Empty,
+    ScalarBased(IterableValue),
+}
+
+/// Creates iterable value for given scalar iterable.
+pub(crate) fn create_scalar_iterable(
+    exec_ctx: &ExecutionCtx<'_>,
+    variable_name: &str,
+) -> ExecutionResult<FoldIterableScalar> {
+    match exec_ctx.scalars.get_value(variable_name)? {
+        ScalarRef::Value(call_result) => from_value(call_result.clone(), variable_name),
+        ScalarRef::IterableValue(fold_state) => {
+            let iterable_value = fold_state.iterable.peek().expect(PEEK_ALLOWED_ON_NON_EMPTY);
+            let call_result = iterable_value.into_resolved_result();
+            from_value(call_result, variable_name)
+        }
+    }
+}
+
+/// Creates iterable value for given scalar with lambda iterable.
+pub(crate) fn create_scalar_wl_iterable<'ctx>(
+    scalar_iterable: &ast::ScalarWithLambda<'ctx>,
+    exec_ctx: &ExecutionCtx<'ctx>,
+) -> ExecutionResult<FoldIterableScalar> {
+    use crate::execution_step::lambda_applier::select_by_lambda_from_scalar;
+    let scalar_name = scalar_iterable.name;
+    let lambda = &scalar_iterable.lambda;
+
+    match exec_ctx.scalars.get_value(scalar_name)? {
+        ScalarRef::Value(variable) => {
+            let jvalues = select_by_lambda_from_scalar(variable.get_result(), lambda, exec_ctx)?;
+            let tetraplet = variable.get_tetraplet().deref().clone();
+            from_jvalue(&jvalues, tetraplet, variable.get_provenance(), lambda)
+        }
+        ScalarRef::IterableValue(fold_state) => {
+            let iterable_value = fold_state.iterable.peek().unwrap();
+            let jvalue = iterable_value.apply_lambda(lambda, exec_ctx)?;
+            let tetraplet = to_tetraplet(&iterable_value);
+            let provenance = to_provenance(&iterable_value);
+
+            from_jvalue(&jvalue, tetraplet, provenance, lambda)
+        }
+    }
+}
+
+/// Creates iterable value for given canon stream.
+pub(crate) fn create_canon_stream_iterable_value<'ctx>(
+    ast_canon_stream: &ast::CanonStream<'ctx>,
+    exec_ctx: &ExecutionCtx<'ctx>,
+) -> ExecutionResult<FoldIterableScalar> {
+    let canon_stream = exec_ctx.scalars.get_canon_stream(ast_canon_stream.name)?;
+    if canon_stream.is_empty() {
+        return Ok(FoldIterableScalar::Empty);
+    }
+
+    // TODO: this one is a relatively long operation and will be refactored in Boxed Value
+    let iterable_ingredients = CanonStreamIterableIngredients::init((**canon_stream).clone());
+    let iterable = Box::new(iterable_ingredients);
+    Ok(FoldIterableScalar::ScalarBased(iterable))
+}
+
+/// Creates iterable value for a canon stream map.
+pub(crate) fn create_canon_stream_map_iterable_value(
+    ast_canon_stream_map: &ast::CanonStreamMap<'_>,
+    exec_ctx: &ExecutionCtx<'_>,
+) -> ExecutionResult<FoldIterableScalar> {
+    let canon_stream_map = exec_ctx.scalars.get_canon_map(ast_canon_stream_map.name)?;
+
+    if canon_stream_map.is_empty() {
+        return Ok(FoldIterableScalar::Empty);
+    }
+
+    // TODO: this one is a relatively heavy operation and will be refactored in Boxed Value
+    // Can not create iterable from existing CanonStreamMap b/c CSM contains a map with
+    // a limited lifetime but the boxed value needs static lifetime.
+    let mut met_keys = HashSet::new();
+    let mut values = vec![];
+
+    for val in canon_stream_map.canon_stream_map.iter().rev() {
+        if let Some(map_key) = StreamMapKey::from_kvpair_owned(val) {
+            if !met_keys.contains(&map_key) {
+                met_keys.insert(map_key);
+                values.push(val.clone());
+            }
+        }
+    }
+    // the reverse iteration of the original data produce `values` in reverse order;
+    // the spec requires direct order of iteration, so reverse it one more time
+    //
+    // it can be solved at O(1) with special handling of reversed iterators in fold,
+    // so this O(n) implementation is just a quick fix
+    values.reverse();
+
+    let iterable_ingredients = CanonStreamMapIterableIngredients::init(values);
+    let iterable = Box::new(iterable_ingredients);
+    Ok(FoldIterableScalar::ScalarBased(iterable))
+}
+
+/// Creates iterable value for a canon stream map with a lens applied.
+pub(crate) fn create_canon_stream_map_wl_iterable_value(
+    ast_canon_stream_map: &ast::CanonStreamMapWithLambda<'_>,
+    exec_ctx: &ExecutionCtx<'_>,
+) -> ExecutionResult<FoldIterableScalar> {
+    let canon_stream_map = exec_ctx.scalars.get_canon_map(ast_canon_stream_map.name)?;
+    // Source canon map provenance is used here to mimic the semantics used for scalar.
+    let provenance = Provenance::canon(canon_stream_map.cid.clone());
+    if canon_stream_map.is_empty() {
+        return Ok(FoldIterableScalar::Empty);
+    }
+
+    let canon_stream_map = &canon_stream_map.canon_stream_map;
+    let tetraplet = canon_stream_map.tetraplet().deref().clone();
+    let lambda = &ast_canon_stream_map.lambda;
+    // Source canon map tetraplet is used here similar with a scalar with lens processing path.
+    let jvalues = JValuable::apply_lambda(&canon_stream_map, lambda, exec_ctx)?;
+
+    from_jvalue(&jvalues, tetraplet, provenance, lambda)
+}
+
+/// Constructs iterable value from resolved call result.
+fn from_value(call_result: ValueAggregate, variable_name: &str) -> ExecutionResult<FoldIterableScalar> {
+    let len = match call_result.get_result() {
+        JValue::Array(array) => {
+            if array.is_empty() {
+                // skip fold if array is empty
+                return Ok(FoldIterableScalar::Empty);
+            }
+            array.len()
+        }
+        v => {
+            return Err(CatchableError::FoldIteratesOverNonArray((*v).clone(), variable_name.to_string()).into());
+        }
+    };
+
+    let foldable = IterableResolvedCall::init(call_result, len);
+    let foldable = Box::new(foldable);
+    let iterable = FoldIterableScalar::ScalarBased(foldable);
+
+    Ok(iterable)
+}
+
+/// Construct IterableValue from the result and given triplet.
+fn from_jvalue(
+    jvalue: &JValue,
+    tetraplet: SecurityTetraplet,
+    provenance: Provenance,
+    lambda: &LambdaAST<'_>,
+) -> ExecutionResult<FoldIterableScalar> {
+    let tetraplet = populate_tetraplet_with_lambda(tetraplet, lambda);
+    let tetraplet = Rc::new(tetraplet);
+
+    let iterable = match jvalue {
+        JValue::Array(array) => array,
+        _ => {
+            return Err(CatchableError::FoldIteratesOverNonArray(jvalue.clone(), lambda.to_string()).into());
+        }
+    };
+
+    if iterable.is_empty() {
+        return Ok(FoldIterableScalar::Empty);
+    }
+
+    let iterable = iterable.to_vec();
+    let foldable = IterableLambdaResult::init(iterable, tetraplet, provenance);
+    let iterable = FoldIterableScalar::ScalarBased(Box::new(foldable));
+    Ok(iterable)
+}
+
+fn to_tetraplet(iterable: &IterableItem<'_>) -> SecurityTetraplet {
+    use IterableItem::*;
+
+    let tetraplet = match iterable {
+        RefValue((_, tetraplet, _, _)) => tetraplet,
+        RcValue((_, tetraplet, _, _)) => tetraplet,
+    };
+
+    (*tetraplet).deref().clone()
+}
+
+fn to_provenance(iterable: &IterableItem<'_>) -> Provenance {
+    use IterableItem::*;
+
+    let provenance = match iterable {
+        RefValue((_, _, _, provenance)) => provenance,
+        RcValue((_, _, _, provenance)) => provenance,
+    };
+
+    provenance.clone()
+}
+
\ No newline at end of file diff --git a/src/air/execution_step/instructions/fold_scalar.rs.html b/src/air/execution_step/instructions/fold_scalar.rs.html new file mode 100644 index 00000000..09945286 --- /dev/null +++ b/src/air/execution_step/instructions/fold_scalar.rs.html @@ -0,0 +1,199 @@ +fold_scalar.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::fold::*;
+use super::ExecutableInstruction;
+use super::ExecutionCtx;
+use super::ExecutionResult;
+use super::TraceHandler;
+use crate::execution_step::value_types::IterableValue;
+use crate::execution_step::Joinable;
+use crate::joinable;
+use crate::log_instruction;
+
+use air_parser::ast::FoldScalar;
+use air_parser::ast::FoldScalarIterable;
+use air_parser::ast::Instruction;
+
+use std::rc::Rc;
+
+impl<'i> ExecutableInstruction<'i> for FoldScalar<'i> {
+    fn execute(&self, exec_ctx: &mut ExecutionCtx<'i>, trace_ctx: &mut TraceHandler) -> ExecutionResult<()> {
+        log_instruction!(fold, exec_ctx, trace_ctx);
+
+        let iterable = match &self.iterable {
+            FoldScalarIterable::Scalar(scalar) => {
+                joinable!(create_scalar_iterable(exec_ctx, scalar.name), exec_ctx, ())?
+            }
+            FoldScalarIterable::ScalarWithLambda(scalar) => {
+                joinable!(create_scalar_wl_iterable(scalar, exec_ctx), exec_ctx, ())?
+            }
+            FoldScalarIterable::CanonStream(canon_stream) => {
+                joinable!(create_canon_stream_iterable_value(canon_stream, exec_ctx), exec_ctx, ())?
+            }
+            FoldScalarIterable::CanonStreamMap(canon_stream_map) => joinable!(
+                create_canon_stream_map_iterable_value(canon_stream_map, exec_ctx),
+                exec_ctx,
+                ()
+            )?,
+            FoldScalarIterable::CanonStreamMapWithLambda(canon_stream_map) => joinable!(
+                create_canon_stream_map_wl_iterable_value(canon_stream_map, exec_ctx),
+                exec_ctx,
+                ()
+            )?,
+            // just do nothing on an empty array
+            FoldScalarIterable::EmptyArray => return Ok(()),
+        };
+
+        match iterable {
+            // just exit on empty iterable
+            FoldIterableScalar::Empty => Ok(()),
+            FoldIterableScalar::ScalarBased(iterable) => fold(
+                iterable,
+                IterableType::Scalar,
+                self.iterator.name,
+                self.instruction.clone(),
+                self.last_instruction.clone(),
+                exec_ctx,
+                trace_ctx,
+            ),
+        }
+    }
+}
+
+pub(super) fn fold<'i>(
+    iterable: IterableValue,
+    iterable_type: IterableType,
+    iterator: &'i str,
+    instruction: Rc<Instruction<'i>>,
+    last_instruction: Option<Rc<Instruction<'i>>>,
+    exec_ctx: &mut ExecutionCtx<'i>,
+    trace_ctx: &mut TraceHandler,
+) -> ExecutionResult<()> {
+    let fold_state = FoldState::from_iterable(iterable, iterable_type, instruction.clone(), last_instruction);
+    exec_ctx.scalars.meet_fold_start();
+    exec_ctx.scalars.set_iterable_value(iterator, fold_state)?;
+
+    let result = instruction.execute(exec_ctx, trace_ctx);
+
+    exec_ctx.scalars.remove_iterable_value(iterator);
+    exec_ctx.scalars.meet_fold_end();
+
+    result
+}
+
\ No newline at end of file diff --git a/src/air/execution_step/instructions/fold_stream.rs.html b/src/air/execution_step/instructions/fold_stream.rs.html new file mode 100644 index 00000000..1d145118 --- /dev/null +++ b/src/air/execution_step/instructions/fold_stream.rs.html @@ -0,0 +1,119 @@ +fold_stream.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+pub(super) mod completeness_updater;
+pub(super) mod stream_execute_helpers;
+
+use super::ExecutableInstruction;
+use super::ExecutionCtx;
+use super::ExecutionResult;
+use super::TraceHandler;
+use crate::execution_step::instructions::fold_stream::stream_execute_helpers::execute_with_stream;
+use crate::execution_step::value_types::Stream;
+use crate::log_instruction;
+
+use air_parser::ast::FoldStream;
+
+impl<'i> ExecutableInstruction<'i> for FoldStream<'i> {
+    fn execute(&self, exec_ctx: &mut ExecutionCtx<'i>, trace_ctx: &mut TraceHandler) -> ExecutionResult<()> {
+        log_instruction!(fold, exec_ctx, trace_ctx);
+
+        let iterable = &self.iterable;
+        if exec_ctx.streams.get(iterable.name, iterable.position).is_none() {
+            // having empty streams means that it haven't been met yet, and it's needed to wait
+            exec_ctx.make_subgraph_incomplete();
+            return Ok(());
+        }
+
+        let get_mut_stream: &dyn for<'ctx> Fn(&'ctx mut ExecutionCtx<'_>) -> &'ctx mut Stream =
+            &|exec_ctx: &mut ExecutionCtx<'_>| -> &mut Stream {
+                exec_ctx.streams.get_mut(iterable.name, iterable.position).unwrap()
+            };
+
+        execute_with_stream(
+            exec_ctx,
+            trace_ctx,
+            get_mut_stream,
+            self,
+            self.iterator.name,
+            self.instruction.clone(),
+            self.last_instruction.clone(),
+        )
+    }
+}
+
\ No newline at end of file diff --git a/src/air/execution_step/instructions/fold_stream/completeness_updater.rs.html b/src/air/execution_step/instructions/fold_stream/completeness_updater.rs.html new file mode 100644 index 00000000..c1e0bca6 --- /dev/null +++ b/src/air/execution_step/instructions/fold_stream/completeness_updater.rs.html @@ -0,0 +1,81 @@ +completeness_updater.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::ExecutionCtx;
+
+pub(super) struct FoldGenerationObserver {
+    subgraph_complete: bool,
+}
+
+impl FoldGenerationObserver {
+    pub(super) fn new() -> Self {
+        Self {
+            subgraph_complete: false,
+        }
+    }
+
+    pub(super) fn observe_completeness(&mut self, completeness: bool) {
+        self.subgraph_complete |= completeness;
+    }
+
+    pub(super) fn update_completeness(self, exec_ctx: &mut ExecutionCtx<'_>) {
+        exec_ctx.set_subgraph_completeness(self.subgraph_complete);
+    }
+}
+
\ No newline at end of file diff --git a/src/air/execution_step/instructions/fold_stream/stream_execute_helpers.rs.html b/src/air/execution_step/instructions/fold_stream/stream_execute_helpers.rs.html new file mode 100644 index 00000000..2b280c94 --- /dev/null +++ b/src/air/execution_step/instructions/fold_stream/stream_execute_helpers.rs.html @@ -0,0 +1,297 @@ +stream_execute_helpers.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::completeness_updater::FoldGenerationObserver;
+use super::ExecutionCtx;
+use super::ExecutionResult;
+use super::TraceHandler;
+use crate::execution_step::instructions::fold::IterableType;
+use crate::execution_step::instructions::fold_scalar::fold;
+use crate::execution_step::value_types::IterableValue;
+use crate::execution_step::value_types::RecursiveCursorState;
+use crate::execution_step::value_types::RecursiveStreamCursor;
+use crate::execution_step::value_types::Stream;
+use crate::trace_to_exec_err;
+
+use air_parser::ast::Instruction;
+
+use std::rc::Rc;
+
+struct FoldStreamIngredients<'i> {
+    iterable_name: &'i str,
+    instruction: Rc<Instruction<'i>>,
+    last_instruction: Option<Rc<Instruction<'i>>>,
+    fold_id: u32,
+}
+
+impl<'i> FoldStreamIngredients<'i> {
+    fn new(
+        iterable_name: &'i str,
+        instruction: Rc<Instruction<'i>>,
+        last_instruction: Option<Rc<Instruction<'i>>>,
+        fold_id: u32,
+    ) -> Self {
+        Self {
+            iterable_name,
+            instruction,
+            last_instruction,
+            fold_id,
+        }
+    }
+}
+
+pub(crate) fn execute_with_stream<'i>(
+    exec_ctx: &mut ExecutionCtx<'i>,
+    trace_ctx: &mut TraceHandler,
+    get_mut_stream: impl for<'ctx> Fn(&'ctx mut ExecutionCtx<'_>) -> &'ctx mut Stream,
+    fold_to_string: &impl ToString,
+    iterable_name: &'i str,
+    instruction: Rc<Instruction<'i>>,
+    last_instruction: Option<Rc<Instruction<'i>>>,
+) -> ExecutionResult<()> {
+    let fold_id = exec_ctx.tracker.meet_fold_stream();
+
+    trace_to_exec_err!(trace_ctx.meet_fold_start(fold_id), fold_to_string)?;
+
+    let mut recursive_stream = RecursiveStreamCursor::new();
+    let mut cursor_state = recursive_stream.met_fold_start(get_mut_stream(exec_ctx));
+    let mut observer = FoldGenerationObserver::new();
+
+    // this cycle manages recursive streams
+    while let RecursiveCursorState::Continue(iterables) = cursor_state {
+        let ingredients =
+            FoldStreamIngredients::new(iterable_name, instruction.clone(), last_instruction.clone(), fold_id);
+        execute_iterations(
+            iterables,
+            fold_to_string,
+            ingredients,
+            &mut observer,
+            exec_ctx,
+            trace_ctx,
+        )?;
+
+        cursor_state = recursive_stream.met_iteration_end(get_mut_stream(exec_ctx));
+    }
+
+    observer.update_completeness(exec_ctx);
+    trace_to_exec_err!(trace_ctx.meet_fold_end(fold_id), fold_to_string)?;
+    Ok(())
+}
+
+/// Executes fold iteration over all generation that stream had at the moment of call.
+/// It must return only uncatchable errors (such as ones from TraceHandler), though
+/// catchable errors are suppressed and not propagated from this function, because of determinism.
+/// The issue with determinism here lies in invariant that all previous executed states
+/// must be met.
+fn execute_iterations<'i>(
+    iterables: Vec<IterableValue>,
+    fold_to_string: &impl ToString,
+    ingredients: FoldStreamIngredients<'i>,
+    generation_observer: &mut FoldGenerationObserver,
+    exec_ctx: &mut ExecutionCtx<'i>,
+    trace_ctx: &mut TraceHandler,
+) -> ExecutionResult<()> {
+    for iterable in iterables {
+        let value = match iterable.peek() {
+            Some(value) => value,
+            // it's ok, because some generation level of a stream on some point inside execution
+            // flow could contain zero values
+            None => continue,
+        };
+        let value_pos = value.pos();
+        trace_to_exec_err!(
+            trace_ctx.meet_iteration_start(ingredients.fold_id, value_pos),
+            fold_to_string
+        )?;
+        let result = fold(
+            iterable,
+            IterableType::Stream(ingredients.fold_id),
+            ingredients.iterable_name,
+            ingredients.instruction.clone(),
+            ingredients.last_instruction.clone(),
+            exec_ctx,
+            trace_ctx,
+        );
+        throw_error_if_not_catchable(result)?;
+        trace_to_exec_err!(trace_ctx.meet_generation_end(ingredients.fold_id), fold_to_string)?;
+
+        generation_observer.observe_completeness(exec_ctx.is_subgraph_complete());
+    }
+
+    Ok(())
+}
+
+/// Fold over streams doesn't throw an error if it's a catchable one, because otherwise it would be
+/// not deterministic.
+pub(super) fn throw_error_if_not_catchable(result: ExecutionResult<()>) -> ExecutionResult<()> {
+    match result {
+        Ok(_) => Ok(()),
+        Err(error) if error.is_catchable() => Ok(()),
+        error @ Err(_) => error,
+    }
+}
+
\ No newline at end of file diff --git a/src/air/execution_step/instructions/fold_stream_map.rs.html b/src/air/execution_step/instructions/fold_stream_map.rs.html new file mode 100644 index 00000000..e8f0cd42 --- /dev/null +++ b/src/air/execution_step/instructions/fold_stream_map.rs.html @@ -0,0 +1,121 @@ +fold_stream_map.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::ExecutableInstruction;
+use super::ExecutionCtx;
+use super::ExecutionResult;
+use super::TraceHandler;
+use crate::execution_step::instructions::fold_stream::stream_execute_helpers::execute_with_stream;
+use crate::execution_step::Stream;
+use crate::log_instruction;
+
+use air_parser::ast::FoldStreamMap;
+
+impl<'i> ExecutableInstruction<'i> for FoldStreamMap<'i> {
+    fn execute(&self, exec_ctx: &mut ExecutionCtx<'i>, trace_ctx: &mut TraceHandler) -> ExecutionResult<()> {
+        log_instruction!(fold, exec_ctx, trace_ctx);
+
+        let iterable = &self.iterable;
+        if exec_ctx.stream_maps.get(iterable.name, iterable.position).is_none() {
+            // having empty streams means that it haven't been met yet, and it's needed to wait
+            exec_ctx.make_subgraph_incomplete();
+            return Ok(());
+        }
+
+        let get_mut_stream: &dyn for<'ctx> Fn(&'ctx mut ExecutionCtx<'_>) -> &'ctx mut Stream =
+            &|exec_ctx: &mut ExecutionCtx<'_>| -> &mut Stream {
+                exec_ctx
+                    .stream_maps
+                    .get_mut(iterable.name, iterable.position)
+                    .unwrap()
+                    .get_mut_stream_ref()
+            };
+
+        execute_with_stream(
+            exec_ctx,
+            trace_ctx,
+            get_mut_stream,
+            self,
+            self.iterator.name,
+            self.instruction.clone(),
+            self.last_instruction.clone(),
+        )
+    }
+}
+
\ No newline at end of file diff --git a/src/air/execution_step/instructions/match_.rs.html b/src/air/execution_step/instructions/match_.rs.html new file mode 100644 index 00000000..59ab15f2 --- /dev/null +++ b/src/air/execution_step/instructions/match_.rs.html @@ -0,0 +1,95 @@ +match_.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::compare_matchable::are_matchable_eq;
+use super::ExecutionCtx;
+use super::ExecutionResult;
+use super::TraceHandler;
+use crate::execution_step::CatchableError;
+use crate::execution_step::Joinable;
+use crate::joinable;
+use crate::log_instruction;
+
+use air_parser::ast::Match;
+
+impl<'i> super::ExecutableInstruction<'i> for Match<'i> {
+    fn execute(&self, exec_ctx: &mut ExecutionCtx<'i>, trace_ctx: &mut TraceHandler) -> ExecutionResult<()> {
+        log_instruction!(match_, exec_ctx, trace_ctx);
+
+        let are_values_equal = joinable!(
+            are_matchable_eq(&self.left_value, &self.right_value, exec_ctx),
+            exec_ctx,
+            ()
+        )?;
+
+        if !are_values_equal {
+            return Err(CatchableError::MatchValuesNotEqual.into());
+        }
+
+        self.instruction.execute(exec_ctx, trace_ctx)
+    }
+}
+
\ No newline at end of file diff --git a/src/air/execution_step/instructions/mismatch.rs.html b/src/air/execution_step/instructions/mismatch.rs.html new file mode 100644 index 00000000..d59b13e4 --- /dev/null +++ b/src/air/execution_step/instructions/mismatch.rs.html @@ -0,0 +1,95 @@ +mismatch.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::compare_matchable::are_matchable_eq;
+use super::ExecutionCtx;
+use super::ExecutionResult;
+use super::TraceHandler;
+use crate::execution_step::CatchableError;
+use crate::execution_step::Joinable;
+use crate::joinable;
+use crate::log_instruction;
+
+use air_parser::ast::MisMatch;
+
+impl<'i> super::ExecutableInstruction<'i> for MisMatch<'i> {
+    fn execute(&self, exec_ctx: &mut ExecutionCtx<'i>, trace_ctx: &mut TraceHandler) -> ExecutionResult<()> {
+        log_instruction!(mismatch_, exec_ctx, trace_ctx);
+
+        let are_values_equal = joinable!(
+            are_matchable_eq(&self.left_value, &self.right_value, exec_ctx),
+            exec_ctx,
+            ()
+        )?;
+
+        if are_values_equal {
+            return Err(CatchableError::MismatchValuesEqual.into());
+        }
+
+        self.instruction.execute(exec_ctx, trace_ctx)
+    }
+}
+
\ No newline at end of file diff --git a/src/air/execution_step/instructions/mod.rs.html b/src/air/execution_step/instructions/mod.rs.html new file mode 100644 index 00000000..cf568b67 --- /dev/null +++ b/src/air/execution_step/instructions/mod.rs.html @@ -0,0 +1,317 @@ +mod.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+mod ap;
+mod ap_map;
+mod call;
+mod canon;
+mod canon_map;
+mod canon_stream_map_scalar;
+mod canon_utils;
+mod compare_matchable;
+mod fail;
+mod fold;
+mod fold_scalar;
+mod fold_stream;
+mod fold_stream_map;
+mod match_;
+mod mismatch;
+mod never;
+mod new;
+mod next;
+mod null;
+mod par;
+mod seq;
+mod xor;
+
+pub(crate) use call::triplet::resolve_peer_id_to_string;
+pub(crate) use fold::FoldState;
+
+use super::value_types::ScalarRef;
+use super::ExecutionCtx;
+use super::ExecutionError;
+use super::ExecutionResult;
+use crate::execution_step::TraceHandler;
+
+use air_parser::ast::Instruction;
+use air_parser::ast::PeerIDErrorLogable;
+
+/// Executes an instruction and updates %last_error% and :error: if necessary.
+macro_rules! execute {
+    ($self:expr, $instr:expr, $exec_ctx:ident, $trace_ctx:ident) => {{
+        match $instr.execute($exec_ctx, $trace_ctx) {
+            Err(e) => {
+                $exec_ctx.set_errors(&e, &$instr.to_string(), None, $instr.log_errors_with_peer_id());
+                Err(e)
+            }
+            v => v,
+        }
+    }};
+}
+
+pub(crate) trait ExecutableInstruction<'i> {
+    fn execute(&self, exec_ctx: &mut ExecutionCtx<'i>, trace_ctx: &mut TraceHandler) -> ExecutionResult<()>;
+}
+
+impl<'i> ExecutableInstruction<'i> for Instruction<'i> {
+    fn execute(&self, exec_ctx: &mut ExecutionCtx<'i>, trace_ctx: &mut TraceHandler) -> ExecutionResult<()> {
+        match self {
+            // call isn't wrapped by the execute macro because
+            // it internally maps some Catchables into %last_error%/:error: using resolved triplet.
+            // Both canons and call set :error:.$.peer_id whilst other instructions do not.
+            Instruction::Call(call) => call.execute(exec_ctx, trace_ctx),
+
+            Instruction::Canon(canon) => execute!(self, canon, exec_ctx, trace_ctx),
+            Instruction::CanonMap(canon_map) => execute!(self, canon_map, exec_ctx, trace_ctx),
+            Instruction::CanonStreamMapScalar(canon) => execute!(self, canon, exec_ctx, trace_ctx),
+            Instruction::Ap(ap) => execute!(self, ap, exec_ctx, trace_ctx),
+            Instruction::ApMap(ap_map) => execute!(self, ap_map, exec_ctx, trace_ctx),
+            Instruction::Fail(fail) => execute!(self, fail, exec_ctx, trace_ctx),
+            Instruction::FoldScalar(fold) => execute!(self, fold, exec_ctx, trace_ctx),
+            Instruction::FoldStream(fold) => execute!(self, fold, exec_ctx, trace_ctx),
+            Instruction::FoldStreamMap(fold) => execute!(self, fold, exec_ctx, trace_ctx),
+            Instruction::Never(never) => execute!(self, never, exec_ctx, trace_ctx),
+            Instruction::New(new) => execute!(self, new, exec_ctx, trace_ctx),
+            Instruction::Next(next) => execute!(self, next, exec_ctx, trace_ctx),
+            Instruction::Null(null) => execute!(self, null, exec_ctx, trace_ctx),
+            Instruction::Par(par) => execute!(self, par, exec_ctx, trace_ctx),
+            Instruction::Seq(seq) => execute!(self, seq, exec_ctx, trace_ctx),
+            Instruction::Xor(xor) => execute!(self, xor, exec_ctx, trace_ctx),
+            Instruction::Match(match_) => execute!(self, match_, exec_ctx, trace_ctx),
+            Instruction::MisMatch(mismatch) => execute!(self, mismatch, exec_ctx, trace_ctx),
+
+            Instruction::Error => unreachable!("should not execute if parsing succeeded. QED."),
+        }
+    }
+}
+
+#[macro_export]
+macro_rules! log_instruction {
+    ($instr_name:expr, $exec_ctx:expr, $trace_ctx:expr) => {
+        log::debug!(
+            target: air_log_targets::INSTRUCTION,
+            "> {}",
+            stringify!($instr_name)
+        );
+
+        log::trace!(
+            target: air_log_targets::DATA_CACHE,
+            "  scalars:
+    {}
+  streams:
+    {}",
+            $exec_ctx.scalars,
+            $exec_ctx.streams
+        );
+        log::trace!(
+            target: air_log_targets::NEXT_PEER_PKS,
+            "  next peers pk: {:?}",
+            $exec_ctx.next_peer_pks
+        );
+        log::trace!(
+            target: air_log_targets::SUBGRAPH_COMPLETE,
+            "  subgraph complete: {}",
+            $exec_ctx.is_subgraph_complete()
+        );
+
+        log::trace!(
+            target: air_log_targets::SUBGRAPH_ELEMENTS,
+            "  subgraph elements count: {:?}",
+            $trace_ctx.subgraph_sizes()
+        );
+        log::debug!(
+            target: air_log_targets::NEW_EXECUTED_TRACE,
+            "  new call executed trace: {:?}",
+            $trace_ctx.as_result_trace()
+        );
+    };
+}
+
+/// This macro converts joinable errors to Ok and sets subgraph complete to false.
+#[macro_export]
+macro_rules! joinable {
+    ($cmd:expr, $exec_ctx:expr, $ok_result:expr) => {
+        match $cmd {
+            Err(e) if e.is_joinable() => {
+                $exec_ctx.make_subgraph_incomplete();
+                return Ok($ok_result);
+            }
+            v => v,
+        }
+    };
+}
+
\ No newline at end of file diff --git a/src/air/execution_step/instructions/never.rs.html b/src/air/execution_step/instructions/never.rs.html new file mode 100644 index 00000000..a2a9b828 --- /dev/null +++ b/src/air/execution_step/instructions/never.rs.html @@ -0,0 +1,69 @@ +never.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::ExecutionCtx;
+use super::ExecutionResult;
+use super::TraceHandler;
+use crate::log_instruction;
+
+use air_parser::ast::Never;
+
+impl<'i> super::ExecutableInstruction<'i> for Never {
+    fn execute(&self, exec_ctx: &mut ExecutionCtx<'i>, trace_ctx: &mut TraceHandler) -> ExecutionResult<()> {
+        log_instruction!(never, exec_ctx, trace_ctx);
+        exec_ctx.make_subgraph_incomplete();
+
+        Ok(())
+    }
+}
+
\ No newline at end of file diff --git a/src/air/execution_step/instructions/new.rs.html b/src/air/execution_step/instructions/new.rs.html new file mode 100644 index 00000000..beb9911c --- /dev/null +++ b/src/air/execution_step/instructions/new.rs.html @@ -0,0 +1,163 @@ +new.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::ExecutionCtx;
+use super::ExecutionResult;
+use super::TraceHandler;
+use crate::log_instruction;
+
+use air_parser::ast::New;
+use air_parser::ast::NewArgument;
+
+impl<'i> super::ExecutableInstruction<'i> for New<'i> {
+    fn execute(&self, exec_ctx: &mut ExecutionCtx<'i>, trace_ctx: &mut TraceHandler) -> ExecutionResult<()> {
+        log_instruction!(new, exec_ctx, trace_ctx);
+
+        prolog(self, exec_ctx);
+        // it should be a lazy error evaluating after execution of epilog block, since it's
+        // necessary to return a restricted variable to it's previous state in case of
+        // any error. It's highly important to distinguish between global and restricted streams
+        // at the end of execution to make a correct data.
+        let instruction_result = self.instruction.execute(exec_ctx, trace_ctx);
+        let epilog_result = epilog(self, exec_ctx, trace_ctx);
+
+        match (instruction_result, epilog_result) {
+            (Ok(()), Ok(())) => Ok(()),
+            // instruction error has higher priority over epilog result error,
+            // because epilog returns "utility" errors that normally (meaning that AquaVM
+            // scalar handling code doesn't contain errors) shouldn't happen,
+            // additionally see test new_with_randomly_set_scalars_in_fold_2
+            (err @ Err(_), _) => err,
+            (_, err @ Err(_)) => err,
+        }
+    }
+}
+
+fn prolog<'i>(new: &New<'i>, exec_ctx: &mut ExecutionCtx<'i>) {
+    let position = new.span.left;
+    match &new.argument {
+        NewArgument::Stream(stream) => exec_ctx.streams.meet_scope_start(stream.name, new.span),
+        NewArgument::StreamMap(stream_map) => exec_ctx.stream_maps.meet_scope_start(stream_map.name, new.span),
+        NewArgument::Scalar(scalar) => exec_ctx.scalars.meet_new_start_scalar(scalar.name.to_string()),
+        NewArgument::CanonStream(canon_stream) => exec_ctx
+            .scalars
+            .meet_new_start_canon_stream(canon_stream.name.to_string()),
+        NewArgument::CanonStreamMap(canon_stream_map) => exec_ctx
+            .scalars
+            .meet_new_start_canon_stream_map(canon_stream_map.name.to_string()),
+    }
+
+    exec_ctx.tracker.meet_new(position);
+}
+
+fn epilog<'i>(new: &New<'i>, exec_ctx: &mut ExecutionCtx<'i>, trace_ctx: &mut TraceHandler) -> ExecutionResult<()> {
+    match &new.argument {
+        NewArgument::Stream(stream) => exec_ctx.streams.meet_scope_end(stream.name.to_string(), trace_ctx),
+        NewArgument::StreamMap(stream_map) => exec_ctx
+            .stream_maps
+            .meet_scope_end(stream_map.name.to_string(), trace_ctx),
+        NewArgument::Scalar(scalar) => exec_ctx.scalars.meet_new_end_scalar(scalar.name),
+        NewArgument::CanonStream(canon_stream) => exec_ctx.scalars.meet_new_end_canon_stream(canon_stream.name),
+        NewArgument::CanonStreamMap(canon_stream_map) => {
+            exec_ctx.scalars.meet_new_end_canon_stream_map(canon_stream_map.name)
+        }
+    }
+}
+
\ No newline at end of file diff --git a/src/air/execution_step/instructions/next.rs.html b/src/air/execution_step/instructions/next.rs.html new file mode 100644 index 00000000..96143469 --- /dev/null +++ b/src/air/execution_step/instructions/next.rs.html @@ -0,0 +1,243 @@ +next.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::fold::IterableType;
+use super::ExecutionCtx;
+use super::ExecutionResult;
+use super::FoldState;
+use super::TraceHandler;
+use crate::execution_step::PEEK_ALLOWED_ON_NON_EMPTY;
+use crate::log_instruction;
+use crate::trace_to_exec_err;
+
+use air_parser::ast::Next;
+
+impl<'i> super::ExecutableInstruction<'i> for Next<'i> {
+    fn execute(&self, exec_ctx: &mut ExecutionCtx<'i>, trace_ctx: &mut TraceHandler) -> ExecutionResult<()> {
+        log_instruction!(next, exec_ctx, trace_ctx);
+
+        let iterator_name = &self.iterator.name;
+        let fold_state = exec_ctx.scalars.get_iterable_mut(iterator_name)?;
+        maybe_meet_iteration_end(self, fold_state, trace_ctx)?;
+
+        // TODO: refactor a body of this if to reduce LOCs count and improve readability
+        if !fold_state.iterable.next() {
+            maybe_meet_back_iterator(self, fold_state, trace_ctx)?;
+
+            let fold_state = exec_ctx.scalars.get_iterable(iterator_name)?;
+            // execute last instruction if any
+            if let Some(last_instr) = &fold_state.last_instr_head {
+                let last_instr = last_instr.clone();
+                exec_ctx.flush_subgraph_completeness(); // it's needed because of determine_subgraph_complete in par
+                last_instr.execute(exec_ctx, trace_ctx)?;
+            } else {
+                // if no last instruction, execute never as a fallback for fold over stream (it'll be removed in future)
+                let fold_state = exec_ctx.scalars.get_iterable_mut(iterator_name)?;
+                if !fold_state.back_iteration_started && matches!(fold_state.iterable_type, IterableType::Stream(_)) {
+                    fold_state.back_iteration_started = true;
+                    // this set the last iteration of a next to not executed for fold over streams
+                    // for more info see https://github.com/fluencelabs/aquavm/issues/333
+                    exec_ctx.make_subgraph_incomplete();
+                }
+            }
+
+            // just do nothing to exit
+            return Ok(());
+        }
+
+        let next_instr = fold_state.instr_head.clone();
+        maybe_meet_iteration_start(self, fold_state, trace_ctx)?;
+        exec_ctx.scalars.meet_next_before();
+
+        let result = next_instr.execute(exec_ctx, trace_ctx);
+        exec_ctx.scalars.meet_next_after();
+        result?;
+
+        // get the same fold state again because of borrow checker
+        let fold_state = exec_ctx.scalars.get_iterable_mut(iterator_name)?;
+        fold_state.iterable.prev();
+        maybe_meet_back_iterator(self, fold_state, trace_ctx)?;
+
+        Ok(())
+    }
+}
+
+fn maybe_meet_iteration_start<'i>(
+    next: &Next<'i>,
+    fold_state: &FoldState<'i>,
+    trace_ctx: &mut TraceHandler,
+) -> ExecutionResult<()> {
+    if let IterableType::Stream(fold_id) = &fold_state.iterable_type {
+        trace_to_exec_err!(
+            trace_ctx.meet_iteration_start(
+                *fold_id,
+                fold_state.iterable.peek().expect(PEEK_ALLOWED_ON_NON_EMPTY).pos()
+            ),
+            next
+        )?;
+    }
+
+    Ok(())
+}
+
+fn maybe_meet_iteration_end<'i>(
+    next: &Next<'i>,
+    fold_state: &FoldState<'i>,
+    trace_ctx: &mut TraceHandler,
+) -> ExecutionResult<()> {
+    if let IterableType::Stream(fold_id) = &fold_state.iterable_type {
+        trace_to_exec_err!(trace_ctx.meet_iteration_end(*fold_id), next)?;
+    }
+
+    Ok(())
+}
+
+fn maybe_meet_back_iterator<'i>(
+    next: &Next<'i>,
+    fold_state: &FoldState<'i>,
+    trace_ctx: &mut TraceHandler,
+) -> ExecutionResult<()> {
+    if let IterableType::Stream(fold_id) = &fold_state.iterable_type {
+        trace_to_exec_err!(trace_ctx.meet_back_iterator(*fold_id), next)?;
+    }
+
+    Ok(())
+}
+
\ No newline at end of file diff --git a/src/air/execution_step/instructions/null.rs.html b/src/air/execution_step/instructions/null.rs.html new file mode 100644 index 00000000..f612a6d9 --- /dev/null +++ b/src/air/execution_step/instructions/null.rs.html @@ -0,0 +1,67 @@ +null.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::ExecutionCtx;
+use super::ExecutionResult;
+use super::TraceHandler;
+use crate::log_instruction;
+
+use air_parser::ast::Null;
+
+impl<'i> super::ExecutableInstruction<'i> for Null {
+    fn execute(&self, exec_ctx: &mut ExecutionCtx<'i>, trace_ctx: &mut TraceHandler) -> ExecutionResult<()> {
+        log_instruction!(null, exec_ctx, trace_ctx);
+
+        Ok(())
+    }
+}
+
\ No newline at end of file diff --git a/src/air/execution_step/instructions/par.rs.html b/src/air/execution_step/instructions/par.rs.html new file mode 100644 index 00000000..4adea6e2 --- /dev/null +++ b/src/air/execution_step/instructions/par.rs.html @@ -0,0 +1,237 @@ +par.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+mod completeness_updater;
+
+use super::ExecutableInstruction;
+use super::ExecutionCtx;
+use super::ExecutionError;
+use super::ExecutionResult;
+use super::Instruction;
+use super::TraceHandler;
+use crate::log_instruction;
+use crate::trace_to_exec_err;
+use completeness_updater::ParCompletenessUpdater;
+
+use air_parser::ast::Par;
+use air_trace_handler::SubgraphType;
+
+#[rustfmt::skip]
+impl<'i> ExecutableInstruction<'i> for Par<'i> {
+    fn execute(&self, exec_ctx: &mut ExecutionCtx<'i>, trace_ctx: &mut TraceHandler) -> ExecutionResult<()> {
+        log_instruction!(par, exec_ctx, trace_ctx);
+
+        let mut completeness_updater = ParCompletenessUpdater::new();
+        trace_to_exec_err!(trace_ctx.meet_par_start(), self)?;
+
+        // execute a left subgraph of par
+        let left_result = execute_subgraph(self, exec_ctx, trace_ctx, &mut completeness_updater, SubgraphType::Left)?;
+
+        // execute a right subgraph of par
+        let right_result = execute_subgraph(self, exec_ctx, trace_ctx, &mut completeness_updater, SubgraphType::Right)?;
+
+        completeness_updater.set_completeness(exec_ctx);
+        prepare_par_result(left_result, right_result, exec_ctx)
+    }
+}
+
+/// Execute provided subgraph and update Par state in trace_ctx.new_trace.
+fn execute_subgraph<'i>(
+    par: &Par<'i>,
+    exec_ctx: &mut ExecutionCtx<'i>,
+    trace_ctx: &mut TraceHandler,
+    completeness_updater: &mut ParCompletenessUpdater,
+    subgraph_type: SubgraphType,
+) -> ExecutionResult<SubgraphResult> {
+    let subgraph = match subgraph_type {
+        SubgraphType::Left => &par.0,
+        SubgraphType::Right => &par.1,
+    };
+    exec_ctx.set_subgraph_completeness(determine_subgraph_complete(subgraph));
+
+    // execute a subgraph
+    let result = match subgraph.execute(exec_ctx, trace_ctx) {
+        Ok(_) => {
+            trace_to_exec_err!(trace_ctx.meet_par_subgraph_end(subgraph_type), par)?;
+            SubgraphResult::Succeeded
+        }
+        Err(e) if e.is_catchable() => {
+            exec_ctx.make_subgraph_incomplete();
+            trace_to_exec_err!(trace_ctx.meet_par_subgraph_end(subgraph_type), par)?;
+            SubgraphResult::Failed(e)
+        }
+        Err(e) => {
+            exec_ctx.make_subgraph_incomplete();
+            return Err(e);
+        }
+    };
+
+    completeness_updater.observe_completeness(exec_ctx, subgraph_type);
+    Ok(result)
+}
+
+enum SubgraphResult {
+    Succeeded,
+    Failed(ExecutionError),
+}
+
+fn prepare_par_result(
+    left_result: SubgraphResult,
+    right_result: SubgraphResult,
+    exec_ctx: &mut ExecutionCtx<'_>,
+) -> ExecutionResult<()> {
+    match (left_result, right_result) {
+        (SubgraphResult::Succeeded, _) | (_, SubgraphResult::Succeeded) => {
+            exec_ctx.last_error_descriptor.meet_par_successed_end();
+            Ok(())
+        }
+        (SubgraphResult::Failed(_), SubgraphResult::Failed(err)) => Err(err),
+    }
+}
+
+fn determine_subgraph_complete(next_instruction: &Instruction<'_>) -> bool {
+    // this is needed to prevent situation when on such pattern
+    // (fold (Iterable i
+    //    (par
+    //       (call ..)
+    //       (next i)
+    //    )
+    // )
+    // par will be completed after the last next that wouldn't change subgraph_complete
+    !matches!(next_instruction, Instruction::Next(_))
+}
+
\ No newline at end of file diff --git a/src/air/execution_step/instructions/par/completeness_updater.rs.html b/src/air/execution_step/instructions/par/completeness_updater.rs.html new file mode 100644 index 00000000..0b40ae6e --- /dev/null +++ b/src/air/execution_step/instructions/par/completeness_updater.rs.html @@ -0,0 +1,99 @@ +completeness_updater.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::ExecutionCtx;
+use super::SubgraphType;
+
+#[derive(Debug, Default, Clone)]
+pub(super) struct ParCompletenessUpdater {
+    left_subgraph_complete: bool,
+    right_subgraph_complete: bool,
+}
+
+impl ParCompletenessUpdater {
+    pub(super) fn new() -> Self {
+        Self {
+            left_subgraph_complete: false,
+            right_subgraph_complete: false,
+        }
+    }
+
+    pub(super) fn observe_completeness(&mut self, exec_ctx: &ExecutionCtx<'_>, subgraph_type: SubgraphType) {
+        match subgraph_type {
+            SubgraphType::Left => self.left_subgraph_complete = exec_ctx.is_subgraph_complete(),
+            SubgraphType::Right => self.right_subgraph_complete = exec_ctx.is_subgraph_complete(),
+        }
+    }
+
+    pub(super) fn set_completeness(self, exec_ctx: &mut ExecutionCtx<'_>) {
+        // par is completed if at least one of its subgraphs is completed
+        let subgraph_complete = self.left_subgraph_complete || self.right_subgraph_complete;
+        exec_ctx.set_subgraph_completeness(subgraph_complete);
+    }
+}
+
\ No newline at end of file diff --git a/src/air/execution_step/instructions/seq.rs.html b/src/air/execution_step/instructions/seq.rs.html new file mode 100644 index 00000000..6a1676fd --- /dev/null +++ b/src/air/execution_step/instructions/seq.rs.html @@ -0,0 +1,81 @@ +seq.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::ExecutionCtx;
+use super::ExecutionResult;
+use super::TraceHandler;
+use crate::log_instruction;
+
+use air_parser::ast::Seq;
+
+impl<'i> super::ExecutableInstruction<'i> for Seq<'i> {
+    fn execute(&self, exec_ctx: &mut ExecutionCtx<'i>, trace_ctx: &mut TraceHandler) -> ExecutionResult<()> {
+        log_instruction!(seq, exec_ctx, trace_ctx);
+
+        exec_ctx.flush_subgraph_completeness();
+        self.0.execute(exec_ctx, trace_ctx)?;
+
+        if exec_ctx.is_subgraph_complete() {
+            self.1.execute(exec_ctx, trace_ctx)?;
+        }
+
+        Ok(())
+    }
+}
+
\ No newline at end of file diff --git a/src/air/execution_step/instructions/xor.rs.html b/src/air/execution_step/instructions/xor.rs.html new file mode 100644 index 00000000..bcc86f3c --- /dev/null +++ b/src/air/execution_step/instructions/xor.rs.html @@ -0,0 +1,141 @@ +xor.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::ExecutionCtx;
+use super::ExecutionError;
+use super::ExecutionResult;
+use super::TraceHandler;
+use crate::log_instruction;
+
+use air_parser::ast::Xor;
+
+impl<'i> super::ExecutableInstruction<'i> for Xor<'i> {
+    fn execute(&self, exec_ctx: &mut ExecutionCtx<'i>, trace_ctx: &mut TraceHandler) -> ExecutionResult<()> {
+        log_instruction!(xor, exec_ctx, trace_ctx);
+
+        exec_ctx.flush_subgraph_completeness();
+        match self.0.execute(exec_ctx, trace_ctx) {
+            Err(e) if e.is_catchable() => {
+                print_xor_log(&e);
+
+                exec_ctx.flush_subgraph_completeness();
+                exec_ctx.last_error_descriptor.meet_xor_right_branch();
+
+                exec_ctx.error_descriptor.set_original_execution_error(&e);
+                exec_ctx.error_descriptor.enable_error_setting();
+
+                let right_subgraph_result = self.1.execute(exec_ctx, trace_ctx);
+                // This sets :error: to a no-error state.
+                // Please note the right_subgraph_result might be an Error that bubbles up to an :error:
+                // above this execute().
+                exec_ctx.error_descriptor.clear_error_object_if_needed();
+
+                if right_subgraph_result.is_ok() {
+                    exec_ctx.error_descriptor.enable_error_setting();
+                }
+
+                right_subgraph_result
+            }
+            res => res,
+        }
+    }
+}
+
+fn print_xor_log(e: &ExecutionError) {
+    if e.is_match_or_mismatch() {
+        // These errors actually aren't real errors, but a way to bubble execution_step up from match
+        // to a corresponding xor. They'll become errors iff there is no such xor and execution_step is
+        // bubble up until the very beginning of current subgraph. So the error message shouldn't
+        // be print out in order not to confuse users.
+        return;
+    }
+
+    log::trace!("xor caught an error: {}", e);
+}
+
\ No newline at end of file diff --git a/src/air/execution_step/lambda_applier/applier.rs.html b/src/air/execution_step/lambda_applier/applier.rs.html new file mode 100644 index 00000000..1b2f5f79 --- /dev/null +++ b/src/air/execution_step/lambda_applier/applier.rs.html @@ -0,0 +1,637 @@ +applier.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::utils::*;
+use super::LambdaError;
+use crate::execution_step::execution_context::stream_map_key::StreamMapKey;
+use crate::execution_step::value_types::CanonStreamMap;
+use crate::execution_step::CatchableError;
+use crate::execution_step::ExecutionCtx;
+use crate::execution_step::ExecutionResult;
+use crate::execution_step::RcSecurityTetraplet;
+use crate::lambda_to_execution_error;
+use crate::ExecutionError;
+use crate::JValue;
+use crate::LambdaAST;
+use crate::SecurityTetraplet;
+
+use air_interpreter_value::JsonString;
+use air_lambda_ast::Functor;
+use air_lambda_parser::ValueAccessor;
+use non_empty_vec::NonEmpty;
+
+use std::rc::Rc;
+
+pub(crate) struct LambdaResult {
+    pub(crate) result: JValue,
+    pub(crate) tetraplet_idx: Option<usize>,
+}
+
+pub(crate) struct MapLensResult {
+    pub(crate) result: JValue,
+    pub(crate) tetraplet: RcSecurityTetraplet,
+}
+
+pub(crate) fn select_by_lambda_from_stream<'value>(
+    stream: impl ExactSizeIterator<Item = &'value JValue> + 'value,
+    lambda: &LambdaAST<'_>,
+    exec_ctx: &ExecutionCtx<'_>,
+) -> ExecutionResult<LambdaResult> {
+    match lambda {
+        LambdaAST::ValuePath(value_path) => select_by_path_from_stream(stream, value_path, exec_ctx),
+        LambdaAST::Functor(functor) => Ok(select_by_functor_from_stream(stream, functor)),
+    }
+}
+
+pub(crate) fn select_by_lambda_from_canon_map(
+    canon_map: &CanonStreamMap,
+    lambda: &LambdaAST<'_>,
+    exec_ctx: &ExecutionCtx<'_>,
+) -> ExecutionResult<MapLensResult> {
+    match lambda {
+        LambdaAST::ValuePath(value_path) => select_by_path_from_canon_map(canon_map, value_path, lambda, exec_ctx),
+        LambdaAST::Functor(functor) => Ok(select_by_functor_from_canon_map(canon_map, exec_ctx, functor)),
+    }
+}
+
+pub(crate) fn select_by_lambda_from_scalar(
+    value: &JValue,
+    lambda: &LambdaAST<'_>,
+    exec_ctx: &ExecutionCtx<'_>,
+) -> ExecutionResult<JValue> {
+    match lambda {
+        LambdaAST::ValuePath(value_path) => select_by_path_from_scalar(value, value_path.iter(), exec_ctx),
+        LambdaAST::Functor(functor) => select_by_functor_from_scalar(value, functor),
+    }
+}
+
+fn select_by_path_from_stream<'value>(
+    stream: impl ExactSizeIterator<Item = &'value JValue> + 'value,
+    lambda: &NonEmpty<ValueAccessor<'_>>,
+    exec_ctx: &ExecutionCtx<'_>,
+) -> ExecutionResult<LambdaResult> {
+    let stream_size = stream.len();
+    let (idx, body) = split_to_idx(lambda, exec_ctx)?;
+
+    let value = lambda_to_execution_error!(stream
+        .peekable()
+        .nth(idx)
+        .ok_or(LambdaError::CanonStreamNotHaveEnoughValues { stream_size, idx }))?;
+
+    let result = select_by_path_from_scalar(value, body.iter(), exec_ctx)?;
+    let select_result = LambdaResult::new(result, idx);
+    Ok(select_result)
+}
+
+fn select_by_path_from_canon_map_stream<'value>(
+    stream: impl ExactSizeIterator<Item = (JValue, RcSecurityTetraplet)> + 'value,
+    lambda: &NonEmpty<ValueAccessor<'_>>,
+    exec_ctx: &ExecutionCtx<'_>,
+) -> ExecutionResult<MapLensResult> {
+    let stream_size = stream.len();
+    let (idx, body) = split_to_idx(lambda, exec_ctx)?;
+
+    let (value, tetraplet) = lambda_to_execution_error!(stream
+        .peekable()
+        .nth(idx)
+        .ok_or(LambdaError::CanonStreamNotHaveEnoughValues { stream_size, idx }))?;
+
+    let select_result = if body.is_empty() {
+        // csm.$.key.[0] case
+        MapLensResult::new(value, tetraplet)
+    } else {
+        // csm.$.key.[0].attribute case
+        let result = select_by_path_from_scalar(&value, body.iter(), exec_ctx)?;
+
+        let joined = body.iter().map(ToString::to_string).collect::<Vec<_>>().join(".");
+        let lambda_suffix = format!(".{}", joined);
+        let prefix_with_path = true;
+        let updated_tetraplet = update_tetraplet_with_path(&tetraplet, &lambda_suffix, prefix_with_path);
+
+        MapLensResult::new(result, updated_tetraplet)
+    };
+    Ok(select_result)
+}
+
+fn select_by_path_from_canon_map(
+    canon_map: &CanonStreamMap,
+    lambda: &NonEmpty<ValueAccessor<'_>>,
+    original_lambda: &LambdaAST<'_>,
+    exec_ctx: &ExecutionCtx<'_>,
+) -> ExecutionResult<MapLensResult> {
+    use crate::execution_step::value_types::CanonStream;
+
+    let (prefix, body) = lambda.split_first();
+
+    // HashMap<'map>::get(key: &'key K) forces key's lifetime 'key to be as good as 'map.
+    // This variance-derived requirement forces StreamMapKey here.
+    // See https://github.com/rust-lang/rust/issues/80389#issuecomment-752067798
+    // for the details.
+    let stream_map_key: StreamMapKey = match prefix {
+        ValueAccessor::ArrayAccess { idx } => (*idx).into(),
+        ValueAccessor::FieldAccessByName { field_name } => JsonString::from(*field_name).to_owned().into(),
+        ValueAccessor::FieldAccessByScalar { scalar_name } => {
+            let scalar = exec_ctx.scalars.get_value(scalar_name)?;
+            lambda_to_execution_error!(try_scalar_ref_as_stream_map_key(scalar))?
+        }
+        ValueAccessor::Error => unreachable!("should not execute if parsing succeeded. QED."),
+    };
+    let canon_stream = canon_map.index(&stream_map_key);
+
+    // There will be an empty canon stream if the key was not found.
+    let result = match (NonEmpty::try_from(body.to_vec()), canon_stream) {
+        (Ok(body_part), Some(canon_stream)) => {
+            // csm.$.key... case
+
+            let canon_stream_iter = canon_stream.iter().map(|v| (v.get_result().clone(), v.get_tetraplet()));
+            select_by_path_from_canon_map_stream(canon_stream_iter, &body_part, exec_ctx)?
+        }
+        (Err(..), Some(canon_stream)) => {
+            // csm.$.key case
+            let prefix_with_path = false;
+            let tetraplet = update_tetraplet_with_path(canon_map.tetraplet(), original_lambda, prefix_with_path);
+            let value = canon_stream.as_jvalue();
+
+            MapLensResult::new(value, tetraplet)
+        }
+        _ => {
+            // csm.$.non_existing_key case
+            let prefix_with_path = false;
+            let tetraplet = update_tetraplet_with_path(canon_map.tetraplet(), original_lambda, prefix_with_path);
+            let value = CanonStream::new(vec![], tetraplet.clone()).as_jvalue();
+
+            MapLensResult::new(value, tetraplet)
+        }
+    };
+    Ok(result)
+}
+
+fn split_to_idx<'lambda>(
+    lambda: &'lambda NonEmpty<ValueAccessor<'_>>,
+    exec_ctx: &ExecutionCtx<'_>,
+) -> ExecutionResult<(usize, &'lambda [ValueAccessor<'lambda>])> {
+    let (prefix, body) = lambda.split_first();
+    let idx = match prefix {
+        ValueAccessor::ArrayAccess { idx } => *idx,
+        ValueAccessor::FieldAccessByName { field_name } => {
+            return lambda_to_execution_error!(Err(LambdaError::FieldAccessorAppliedToStream {
+                field_name: field_name.to_string(),
+            }));
+        }
+        ValueAccessor::FieldAccessByScalar { scalar_name } => {
+            let scalar = exec_ctx.scalars.get_value(scalar_name)?;
+            lambda_to_execution_error!(try_scalar_ref_as_idx(scalar))?
+        }
+        ValueAccessor::Error => unreachable!("should not execute if parsing succeeded. QED."),
+    };
+    Ok((idx as usize, body))
+}
+
+// TODO put this functionality into SecurityTetraplet method.
+fn update_tetraplet_with_path(
+    original_tetraplet: &SecurityTetraplet,
+    original_path: &impl ToString,
+    prefix_with_path: bool,
+) -> RcSecurityTetraplet {
+    let lens_updated = if prefix_with_path {
+        original_tetraplet.lens.to_string() + &original_path.to_string()
+    } else {
+        original_path.to_string()
+    };
+
+    SecurityTetraplet {
+        lens: lens_updated,
+        ..original_tetraplet.clone()
+    }
+    .into()
+}
+
+fn select_by_functor_from_stream<'value>(
+    stream: impl ExactSizeIterator<Item = &'value JValue> + 'value,
+    functor: &Functor,
+) -> LambdaResult {
+    match functor {
+        Functor::Length => {
+            let result = (stream.len()).into();
+            LambdaResult::from_value(result)
+        }
+    }
+}
+
+fn select_by_functor_from_canon_map(
+    canon_map: &CanonStreamMap,
+    exec_ctx: &ExecutionCtx<'_>,
+    functor: &Functor,
+) -> MapLensResult {
+    match functor {
+        Functor::Length => {
+            let result = (canon_map.len()).into();
+            MapLensResult::with_functor(result, exec_ctx, functor)
+        }
+    }
+}
+
+fn select_by_path_from_scalar<'value, 'accessor>(
+    mut value: &'value JValue,
+    lambda: impl Iterator<Item = &'accessor ValueAccessor<'accessor>>,
+    exec_ctx: &ExecutionCtx<'_>,
+) -> ExecutionResult<JValue> {
+    for accessor in lambda {
+        match accessor {
+            ValueAccessor::ArrayAccess { idx } => {
+                value = lambda_to_execution_error!(try_jvalue_with_idx(value, *idx))?;
+            }
+            ValueAccessor::FieldAccessByName { field_name } => {
+                value = lambda_to_execution_error!(try_jvalue_with_field_name(value, field_name))?;
+            }
+            ValueAccessor::FieldAccessByScalar { scalar_name } => {
+                let scalar = exec_ctx.scalars.get_value(scalar_name)?;
+                value = lambda_to_execution_error!(select_by_scalar(value, scalar))?;
+            }
+            ValueAccessor::Error => unreachable!("should not execute if parsing succeeded. QED."),
+        }
+    }
+
+    Ok(value.clone())
+}
+
+fn select_by_functor_from_scalar(value: &JValue, functor: &Functor) -> ExecutionResult<JValue> {
+    match functor {
+        Functor::Length => {
+            let length = value
+                .as_array()
+                .ok_or_else(|| {
+                    ExecutionError::Catchable(Rc::new(CatchableError::LengthFunctorAppliedToNotArray(value.clone())))
+                })?
+                .len();
+            Ok(length.into())
+        }
+    }
+}
+
+impl LambdaResult {
+    fn new(result: JValue, tetraplet_idx: usize) -> Self {
+        Self {
+            result,
+            tetraplet_idx: Some(tetraplet_idx),
+        }
+    }
+
+    fn from_value(result: JValue) -> Self {
+        Self {
+            result,
+            tetraplet_idx: None,
+        }
+    }
+}
+
+impl MapLensResult {
+    fn new(result: JValue, tetraplet: RcSecurityTetraplet) -> Self {
+        Self { result, tetraplet }
+    }
+
+    fn with_functor(result: JValue, exec_ctx: &ExecutionCtx<'_>, functor: &Functor) -> Self {
+        let tetraplet = Rc::new(SecurityTetraplet::new(
+            exec_ctx.run_parameters.current_peer_id.to_string(),
+            "",
+            "",
+            functor.to_string(),
+        ));
+        Self { result, tetraplet }
+    }
+}
+
\ No newline at end of file diff --git a/src/air/execution_step/lambda_applier/errors.rs.html b/src/air/execution_step/lambda_applier/errors.rs.html new file mode 100644 index 00000000..e8b186b0 --- /dev/null +++ b/src/air/execution_step/lambda_applier/errors.rs.html @@ -0,0 +1,127 @@ +errors.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use crate::JValue;
+
+use thiserror::Error as ThisError;
+
+/// Describes errors related to applying lambdas to values.
+#[derive(Debug, Clone, ThisError)]
+pub enum LambdaError {
+    #[error("lambda is applied to a stream that have only '{stream_size}' elements, but '{idx}' requested")]
+    CanonStreamNotHaveEnoughValues { stream_size: usize, idx: usize },
+
+    /// An error occurred while trying to apply lambda to an empty stream.
+    #[error("lambda is applied to an empty stream")]
+    EmptyStream,
+
+    #[error("field accessor (with field name = '{field_name}') can't be applied to a stream")]
+    FieldAccessorAppliedToStream { field_name: String },
+
+    #[error("value '{value}' is not an array-type to match array accessor with idx = '{idx}'")]
+    ArrayAccessorNotMatchValue { value: JValue, idx: u32 },
+
+    #[error("value '{value}' does not contain element for idx = '{idx}'")]
+    ValueNotContainSuchArrayIdx { value: JValue, idx: u32 },
+
+    #[error("value '{value}' does not contain element with field name = '{field_name}'")]
+    ValueNotContainSuchField { value: JValue, field_name: String },
+
+    #[error("value '{value}' is not an map-type to match field accessor with field_name = '{field_name}'")]
+    FieldAccessorNotMatchValue { value: JValue, field_name: String },
+
+    #[error("index accessor `{accessor} can't be converted to u32`")]
+    IndexAccessNotU32 { accessor: serde_json::Number },
+
+    #[error("scalar accessor `{scalar_accessor}` should has number or string type")]
+    ScalarAccessorHasInvalidType { scalar_accessor: JValue },
+
+    #[error("stream accessor `{scalar_accessor}` should has number (u32) type")]
+    StreamAccessorHasInvalidType { scalar_accessor: JValue },
+
+    #[error("canon stream map accessor `{map_accessor}` should be either string or number")]
+    CanonStreamMapAccessorHasInvalidType { map_accessor: JValue },
+
+    #[error("canon stream map accessor must not be iterable")]
+    CanonStreamMapAccessorMustNotBeIterable,
+}
+
\ No newline at end of file diff --git a/src/air/execution_step/lambda_applier/mod.rs.html b/src/air/execution_step/lambda_applier/mod.rs.html new file mode 100644 index 00000000..06bcecb8 --- /dev/null +++ b/src/air/execution_step/lambda_applier/mod.rs.html @@ -0,0 +1,85 @@ +mod.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+mod applier;
+mod errors;
+mod utils;
+
+pub use errors::LambdaError;
+
+pub(crate) type LambdaResult<T> = std::result::Result<T, LambdaError>;
+
+pub(crate) use applier::select_by_lambda_from_canon_map;
+pub(crate) use applier::select_by_lambda_from_scalar;
+pub(crate) use applier::select_by_lambda_from_stream;
+pub(crate) use applier::MapLensResult;
+
+#[macro_export]
+macro_rules! lambda_to_execution_error {
+    ($lambda_expr: expr) => {
+        $lambda_expr.map_err(|lambda_error| {
+            $crate::execution_step::ExecutionError::Catchable(std::rc::Rc::new(
+                $crate::execution_step::CatchableError::LambdaApplierError(lambda_error),
+            ))
+        })
+    };
+}
+
\ No newline at end of file diff --git a/src/air/execution_step/lambda_applier/utils.rs.html b/src/air/execution_step/lambda_applier/utils.rs.html new file mode 100644 index 00000000..058cc2c6 --- /dev/null +++ b/src/air/execution_step/lambda_applier/utils.rs.html @@ -0,0 +1,275 @@ +utils.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::LambdaError;
+use super::LambdaResult;
+use crate::execution_step::execution_context::stream_map_key::StreamMapKey;
+use crate::execution_step::ScalarRef;
+use crate::execution_step::PEEK_ALLOWED_ON_NON_EMPTY;
+use crate::JValue;
+
+pub(super) fn try_jvalue_with_idx(jvalue: &JValue, idx: u32) -> LambdaResult<&JValue> {
+    match jvalue {
+        JValue::Array(values) => values
+            .get(idx as usize)
+            .ok_or_else(|| LambdaError::ValueNotContainSuchArrayIdx {
+                value: jvalue.clone(),
+                idx,
+            }),
+        _ => Err(LambdaError::ArrayAccessorNotMatchValue {
+            value: jvalue.clone(),
+            idx,
+        }),
+    }
+}
+
+pub(super) fn try_jvalue_with_field_name<'value>(
+    jvalue: &'value JValue,
+    field_name: &str,
+) -> LambdaResult<&'value JValue> {
+    match jvalue {
+        JValue::Object(values_map) => values_map
+            .get(field_name)
+            .ok_or_else(|| LambdaError::ValueNotContainSuchField {
+                value: jvalue.clone(),
+                field_name: field_name.to_string(),
+            }),
+        _ => Err(LambdaError::FieldAccessorNotMatchValue {
+            value: jvalue.clone(),
+            field_name: field_name.to_string(),
+        }),
+    }
+}
+
+pub(super) fn select_by_scalar<'value>(
+    value: &'value JValue,
+    scalar_ref: ScalarRef<'_>,
+) -> LambdaResult<&'value JValue> {
+    use ScalarRef::*;
+
+    match scalar_ref {
+        Value(lambda_value) => select_by_jvalue(value, lambda_value.get_result()),
+        IterableValue(fold_state) => {
+            let accessor = fold_state
+                .iterable
+                .peek()
+                .expect(PEEK_ALLOWED_ON_NON_EMPTY)
+                .into_resolved_result();
+            select_by_jvalue(value, accessor.get_result())
+        }
+    }
+}
+
+pub(super) fn try_scalar_ref_as_idx(scalar: ScalarRef<'_>) -> LambdaResult<u32> {
+    match scalar {
+        ScalarRef::Value(accessor) => try_jvalue_as_idx(accessor.get_result()),
+        ScalarRef::IterableValue(accessor) => {
+            let accessor = accessor
+                .iterable
+                .peek()
+                .expect(PEEK_ALLOWED_ON_NON_EMPTY)
+                .into_resolved_result();
+            try_jvalue_as_idx(accessor.get_result())
+        }
+    }
+}
+
+pub(super) fn try_scalar_ref_as_stream_map_key(scalar: ScalarRef<'_>) -> LambdaResult<StreamMapKey> {
+    match scalar {
+        ScalarRef::Value(map_accessor) => {
+            let map_accessor = map_accessor.get_result();
+            let map_key = StreamMapKey::from_value_ref(map_accessor).ok_or(
+                LambdaError::CanonStreamMapAccessorHasInvalidType {
+                    map_accessor: map_accessor.clone(),
+                },
+            )?;
+            Ok(map_key)
+        }
+        ScalarRef::IterableValue(_map_accessor) => Err(LambdaError::CanonStreamMapAccessorMustNotBeIterable),
+    }
+}
+
+fn select_by_jvalue<'value>(value: &'value JValue, accessor: &JValue) -> LambdaResult<&'value JValue> {
+    match accessor {
+        JValue::String(string_accessor) => try_jvalue_with_field_name(value, string_accessor),
+        JValue::Number(number_accessor) => {
+            let idx = try_number_to_u32(number_accessor)?;
+            try_jvalue_with_idx(value, idx)
+        }
+        scalar_accessor => Err(LambdaError::ScalarAccessorHasInvalidType {
+            scalar_accessor: scalar_accessor.clone(),
+        }),
+    }
+}
+
+fn try_jvalue_as_idx(jvalue: &JValue) -> LambdaResult<u32> {
+    match jvalue {
+        JValue::Number(number) => try_number_to_u32(number),
+        scalar_accessor => Err(LambdaError::StreamAccessorHasInvalidType {
+            scalar_accessor: scalar_accessor.clone(),
+        }),
+    }
+}
+
+fn try_number_to_u32(accessor: &serde_json::Number) -> LambdaResult<u32> {
+    accessor
+        .as_u64()
+        .and_then(|v| u32::try_from(v).ok())
+        .ok_or(LambdaError::IndexAccessNotU32 {
+            accessor: accessor.clone(),
+        })
+}
+
\ No newline at end of file diff --git a/src/air/execution_step/mod.rs.html b/src/air/execution_step/mod.rs.html new file mode 100644 index 00000000..648b8b7a --- /dev/null +++ b/src/air/execution_step/mod.rs.html @@ -0,0 +1,129 @@ +mod.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+mod errors;
+pub(crate) mod execution_context;
+mod instructions;
+mod lambda_applier;
+mod resolver;
+mod value_types;
+
+const PEEK_ALLOWED_ON_NON_EMPTY: &str = "peek always return elements inside fold,\
+            this guaranteed by implementation of next and avoiding empty folds";
+
+const TETRAPLET_IDX_CORRECT: &str = "selects always return a correct index inside stream";
+
+pub use errors::CatchableError;
+pub use errors::ExecutionError;
+pub use errors::UncatchableError;
+pub use execution_context::ErrorObjectError;
+pub use lambda_applier::LambdaError;
+
+pub mod errors_prelude {
+    pub use super::CatchableError;
+    pub use super::UncatchableError;
+}
+
+pub(super) use self::instructions::ExecutableInstruction;
+pub(super) use self::instructions::FoldState;
+pub(crate) use errors::ErrorAffectable;
+pub(crate) use errors::Joinable;
+pub(crate) use execution_context::ExecutionCtx;
+pub(crate) use execution_context::InstructionError;
+pub(super) use value_types::CanonResultAggregate;
+pub(super) use value_types::Generation;
+pub(super) use value_types::LiteralAggregate;
+pub(super) use value_types::ScalarRef;
+pub(super) use value_types::ServiceResultAggregate;
+pub(super) use value_types::Stream;
+pub(super) use value_types::ValueAggregate;
+use value_types::STREAM_MAX_SIZE;
+
+pub(crate) use air_trace_handler::TraceHandler;
+
+use std::rc::Rc;
+
+type ExecutionResult<T> = std::result::Result<T, ExecutionError>;
+type RcSecurityTetraplet = Rc<crate::SecurityTetraplet>;
+type RcSecurityTetraplets = Vec<RcSecurityTetraplet>;
+
\ No newline at end of file diff --git a/src/air/execution_step/resolver/mod.rs.html b/src/air/execution_step/resolver/mod.rs.html new file mode 100644 index 00000000..b66e16be --- /dev/null +++ b/src/air/execution_step/resolver/mod.rs.html @@ -0,0 +1,63 @@ +mod.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+mod resolvable_impl;
+
+use crate::execution_step::ExecutionCtx;
+use crate::execution_step::ExecutionResult;
+use crate::execution_step::RcSecurityTetraplets;
+use crate::JValue;
+
+use air_interpreter_data::Provenance;
+
+pub(crate) trait Resolvable {
+    fn resolve(&self, ctx: &ExecutionCtx<'_>) -> ExecutionResult<(JValue, RcSecurityTetraplets, Provenance)>;
+}
+
\ No newline at end of file diff --git a/src/air/execution_step/resolver/resolvable_impl.rs.html b/src/air/execution_step/resolver/resolvable_impl.rs.html new file mode 100644 index 00000000..dd6e4c0b --- /dev/null +++ b/src/air/execution_step/resolver/resolvable_impl.rs.html @@ -0,0 +1,417 @@ +resolvable_impl.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::RcSecurityTetraplets;
+use super::Resolvable;
+use crate::execution_step::execution_context::ExecutionCtx;
+use crate::execution_step::lambda_applier::select_by_lambda_from_scalar;
+use crate::execution_step::value_types::JValuable;
+use crate::execution_step::ExecutionResult;
+use crate::JValue;
+use crate::SecurityTetraplet;
+
+use air_interpreter_data::Provenance;
+use air_lambda_ast::LambdaAST;
+use air_parser::ast;
+
+use air_parser::ast::InstructionErrorAST;
+use std::rc::Rc;
+
+/// Resolve value to called function arguments.
+impl Resolvable for ast::ImmutableValue<'_> {
+    fn resolve(&self, ctx: &ExecutionCtx<'_>) -> ExecutionResult<(JValue, RcSecurityTetraplets, Provenance)> {
+        use ast::ImmutableValue::*;
+
+        match self {
+            InitPeerId => resolve_const(ctx.run_parameters.init_peer_id.as_ref(), ctx),
+            Error(error_accessor) => error_accessor.resolve(ctx),
+            LastError(error_accessor) => error_accessor.resolve(ctx),
+            Literal(value) => resolve_const(value.to_string(), ctx),
+            Timestamp => resolve_const(ctx.run_parameters.timestamp, ctx),
+            TTL => resolve_const(ctx.run_parameters.ttl, ctx),
+            Boolean(value) => resolve_const(*value, ctx),
+            Number(value) => resolve_const(value, ctx),
+            EmptyArray => resolve_const(vec![(); 0], ctx),
+            Variable(variable) => variable.resolve(ctx),
+            VariableWithLambda(variable) => variable.resolve(ctx),
+        }
+    }
+}
+
+pub(crate) fn resolve_const(
+    arg: impl Into<JValue>,
+    ctx: &ExecutionCtx<'_>,
+) -> ExecutionResult<(JValue, RcSecurityTetraplets, Provenance)> {
+    let jvalue = arg.into();
+    let tetraplet = SecurityTetraplet::literal_tetraplet(ctx.run_parameters.init_peer_id.as_ref());
+    let tetraplet = Rc::new(tetraplet);
+
+    Ok((jvalue, vec![tetraplet], Provenance::literal()))
+}
+
+fn resolve_errors(
+    instruction_error: &crate::InstructionError,
+    lens: &Option<LambdaAST<'_>>,
+    ctx: &ExecutionCtx<'_>,
+) -> Result<(JValue, Vec<Rc<SecurityTetraplet>>, Provenance), crate::ExecutionError> {
+    use crate::execution_step::InstructionError;
+
+    let InstructionError {
+        error,
+        tetraplet,
+        provenance,
+        ..
+    } = instruction_error;
+
+    let jvalue = match lens {
+        Some(error_accessor) => select_by_lambda_from_scalar(error, error_accessor, ctx)?,
+        None => error.clone(),
+    };
+
+    let tetraplets = match tetraplet {
+        Some(tetraplet) => vec![tetraplet.clone()],
+        None => {
+            let tetraplet = SecurityTetraplet::literal_tetraplet(ctx.run_parameters.init_peer_id.as_ref());
+            let tetraplet = Rc::new(tetraplet);
+            vec![tetraplet]
+        }
+    };
+
+    Ok((jvalue, tetraplets, provenance.clone()))
+}
+
+impl<'lens> Resolvable for InstructionErrorAST<'lens> {
+    fn resolve(&self, ctx: &ExecutionCtx<'_>) -> ExecutionResult<(JValue, RcSecurityTetraplets, Provenance)> {
+        let instruction_error = ctx.error();
+        resolve_errors(instruction_error, &self.lens, ctx)
+    }
+}
+
+impl Resolvable for Option<LambdaAST<'_>> {
+    fn resolve(&self, ctx: &ExecutionCtx<'_>) -> ExecutionResult<(JValue, RcSecurityTetraplets, Provenance)> {
+        let instruction_error = ctx.last_error();
+        resolve_errors(instruction_error, self, ctx)
+    }
+}
+
+impl Resolvable for ast::Scalar<'_> {
+    fn resolve(&self, ctx: &ExecutionCtx<'_>) -> ExecutionResult<(JValue, RcSecurityTetraplets, Provenance)> {
+        let (value, provenance) = ctx.scalars.get_value(self.name)?.into_jvaluable();
+        let tetraplets = value.as_tetraplets();
+        Ok((value.as_jvalue(), tetraplets, provenance))
+    }
+}
+
+impl Resolvable for ast::CanonStream<'_> {
+    fn resolve(&self, ctx: &ExecutionCtx<'_>) -> ExecutionResult<(JValue, RcSecurityTetraplets, Provenance)> {
+        let canon = ctx.scalars.get_canon_stream(self.name)?;
+        let value: &dyn JValuable = &&canon.canon_stream;
+        let tetraplets = value.as_tetraplets();
+        Ok((value.as_jvalue(), tetraplets, Provenance::canon(canon.cid.clone())))
+    }
+}
+
+impl Resolvable for ast::ImmutableVariable<'_> {
+    fn resolve(&self, ctx: &ExecutionCtx<'_>) -> ExecutionResult<(JValue, RcSecurityTetraplets, Provenance)> {
+        match self {
+            Self::Scalar(scalar) => scalar.resolve(ctx),
+            Self::CanonStream(canon_stream) => canon_stream.resolve(ctx),
+            Self::CanonStreamMap(canon_stream_map) => canon_stream_map.resolve(ctx),
+        }
+    }
+}
+
+impl Resolvable for ast::ScalarWithLambda<'_> {
+    fn resolve(&self, ctx: &ExecutionCtx<'_>) -> ExecutionResult<(JValue, RcSecurityTetraplets, Provenance)> {
+        let (value, root_provenance) = ctx.scalars.get_value(self.name)?.into_jvaluable();
+        let (value, tetraplet, provenance) = value.apply_lambda_with_tetraplets(&self.lambda, ctx, &root_provenance)?;
+        let tetraplet = Rc::new(tetraplet);
+        Ok((value, vec![tetraplet], provenance))
+    }
+}
+
+impl Resolvable for ast::CanonStreamWithLambda<'_> {
+    fn resolve(&self, ctx: &ExecutionCtx<'_>) -> ExecutionResult<(JValue, RcSecurityTetraplets, Provenance)> {
+        let canon = ctx.scalars.get_canon_stream(self.name)?;
+        let value: &dyn JValuable = &&canon.canon_stream;
+        let (value, tetraplet, provenance) =
+            value.apply_lambda_with_tetraplets(&self.lambda, ctx, &Provenance::canon(canon.cid.clone()))?;
+        let tetraplet = Rc::new(tetraplet);
+        Ok((value, vec![tetraplet], provenance))
+    }
+}
+
+impl Resolvable for ast::ImmutableVariableWithLambda<'_> {
+    fn resolve(&self, ctx: &ExecutionCtx<'_>) -> ExecutionResult<(JValue, RcSecurityTetraplets, Provenance)> {
+        match self {
+            Self::Scalar(scalar) => scalar.resolve(ctx),
+            Self::CanonStream(canon_stream) => canon_stream.resolve(ctx),
+            Self::CanonStreamMap(canon_stream_map) => canon_stream_map.resolve(ctx),
+        }
+    }
+}
+
+impl Resolvable for ast::StreamMapKeyClause<'_> {
+    fn resolve(&self, ctx: &ExecutionCtx<'_>) -> ExecutionResult<(JValue, RcSecurityTetraplets, Provenance)> {
+        match self {
+            ast::StreamMapKeyClause::Literal(value) => resolve_const(value.to_string(), ctx),
+            ast::StreamMapKeyClause::Int(value) => resolve_const(*value, ctx),
+            ast::StreamMapKeyClause::Scalar(scalar) => scalar.resolve(ctx),
+            ast::StreamMapKeyClause::ScalarWithLambda(scalar_with_lambda) => scalar_with_lambda.resolve(ctx),
+            ast::StreamMapKeyClause::CanonStreamWithLambda(canon_with_lambda) => canon_with_lambda.resolve(ctx),
+        }
+    }
+}
+
+impl Resolvable for ast::CanonStreamMap<'_> {
+    fn resolve(&self, ctx: &ExecutionCtx<'_>) -> ExecutionResult<(JValue, RcSecurityTetraplets, Provenance)> {
+        let canon_stream_map_name = self.name;
+        let canon_stream_map_with_prov = ctx.scalars.get_canon_map(canon_stream_map_name)?;
+        let canon_stream_map = &canon_stream_map_with_prov.canon_stream_map;
+        let value: &dyn JValuable = &canon_stream_map;
+        let tetraplets = value.as_tetraplets();
+        let provenance = Provenance::canon(canon_stream_map_with_prov.cid.clone());
+
+        Ok((value.as_jvalue(), tetraplets, provenance))
+    }
+}
+
+impl Resolvable for ast::CanonStreamMapWithLambda<'_> {
+    fn resolve(&self, ctx: &ExecutionCtx<'_>) -> ExecutionResult<(JValue, RcSecurityTetraplets, Provenance)> {
+        let canon_stream_map_name = self.name;
+        let canon_stream_map_with_prov = ctx.scalars.get_canon_map(canon_stream_map_name)?;
+        let canon_stream_map = &canon_stream_map_with_prov.canon_stream_map;
+        let root_provenance = Provenance::canon(canon_stream_map_with_prov.cid.clone());
+        let (value, tetraplet, provenance) =
+            canon_stream_map.apply_lambda_with_tetraplets(&self.lambda, ctx, &root_provenance)?;
+
+        let tetraplet = Rc::new(tetraplet);
+
+        Ok((value, vec![tetraplet], provenance))
+    }
+}
+
\ No newline at end of file diff --git a/src/air/execution_step/value_types/canon_stream.rs.html b/src/air/execution_step/value_types/canon_stream.rs.html new file mode 100644 index 00000000..96f12566 --- /dev/null +++ b/src/air/execution_step/value_types/canon_stream.rs.html @@ -0,0 +1,239 @@ +canon_stream.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::ValueAggregate;
+use crate::JValue;
+
+use air_interpreter_cid::CID;
+use air_interpreter_data::CanonResultCidAggregate;
+use polyplets::SecurityTetraplet;
+use serde::Deserialize;
+use serde::Serialize;
+
+use std::ops::Deref;
+use std::rc::Rc;
+
+/// Canon stream is a value type lies between a scalar and a stream, it has the same algebra as
+/// scalars, and represent a stream fixed at some execution point.
+#[derive(Debug, Clone, Deserialize, Serialize)]
+pub struct CanonStream {
+    values: Vec<ValueAggregate>,
+    // tetraplet is needed to handle adding canon streams as a whole to a stream
+    tetraplet: Rc<SecurityTetraplet>,
+}
+
+impl CanonStream {
+    pub(crate) fn new(values: Vec<ValueAggregate>, tetraplet: Rc<SecurityTetraplet>) -> Self {
+        Self { values, tetraplet }
+    }
+
+    pub(crate) fn from_values(values: Vec<ValueAggregate>, peer_pk: String) -> Self {
+        let tetraplet = SecurityTetraplet::new(peer_pk, "", "", "");
+        Self {
+            values,
+            tetraplet: Rc::new(tetraplet),
+        }
+    }
+
+    pub(crate) fn len(&self) -> usize {
+        self.values.len()
+    }
+
+    pub(crate) fn is_empty(&self) -> bool {
+        self.values.is_empty()
+    }
+
+    pub(crate) fn as_jvalue(&self) -> JValue {
+        let jvalue_iter = self.values.iter().map(|r| r.get_result().clone());
+        JValue::array_from_iter(jvalue_iter)
+    }
+
+    pub(crate) fn iter(&self) -> impl ExactSizeIterator<Item = &ValueAggregate> {
+        self.values.iter()
+    }
+
+    pub(crate) fn nth(&self, idx: usize) -> Option<&ValueAggregate> {
+        self.values.get(idx)
+    }
+
+    pub(crate) fn tetraplet(&self) -> &Rc<SecurityTetraplet> {
+        &self.tetraplet
+    }
+
+    pub(crate) fn push(&mut self, value_aggregate: ValueAggregate) {
+        self.values.push(value_aggregate);
+    }
+
+    pub fn into_values(self) -> Vec<ValueAggregate> {
+        self.values
+    }
+}
+
+use std::fmt;
+
+impl fmt::Display for CanonStream {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        write!(f, "[")?;
+        for value in self.values.iter() {
+            // TODO debug? only aggregate? should we drop Display entirely?
+            write!(f, "{value:?}, ")?;
+        }
+        write!(f, "]")
+    }
+}
+
+#[derive(Debug, Clone, Deserialize, Serialize)]
+pub struct CanonStreamWithProvenance {
+    pub(crate) canon_stream: CanonStream,
+    pub(crate) cid: CID<CanonResultCidAggregate>,
+}
+
+impl CanonStreamWithProvenance {
+    pub(crate) fn new(canon_stream: CanonStream, cid: CID<CanonResultCidAggregate>) -> Self {
+        Self { canon_stream, cid }
+    }
+}
+
+impl Deref for CanonStreamWithProvenance {
+    type Target = CanonStream;
+
+    fn deref(&self) -> &Self::Target {
+        &self.canon_stream
+    }
+}
+
\ No newline at end of file diff --git a/src/air/execution_step/value_types/canon_stream_map.rs.html b/src/air/execution_step/value_types/canon_stream_map.rs.html new file mode 100644 index 00000000..8074f89a --- /dev/null +++ b/src/air/execution_step/value_types/canon_stream_map.rs.html @@ -0,0 +1,509 @@ +canon_stream_map.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::stream_map::VALUE_FIELD_NAME;
+use super::CanonStream;
+use super::TracePosOperate;
+use super::ValueAggregate;
+use crate::execution_step::execution_context::stream_map_key::StreamMapKey;
+use crate::execution_step::ExecutionResult;
+use crate::ExecutionError;
+use crate::JValue;
+use crate::StreamMapKeyError::UnsupportedKVPairObjectOrMapKeyType;
+use crate::UncatchableError;
+
+use air_interpreter_cid::CID;
+use air_interpreter_data::CanonResultCidAggregate;
+use air_interpreter_value::JsonString;
+use polyplets::SecurityTetraplet;
+
+use std::collections::HashMap;
+use std::ops::Deref;
+use std::rc::Rc;
+
+/// Canon stream map is a read-only struct that mimics conventional map.
+/// The contents of a map are fixed at a specific peer.
+#[derive(Debug, Clone)]
+pub struct CanonStreamMap {
+    /// Contains all key-value pair objects in this form {"key": key, "value": value}.
+    /// There might be multiple pairs with the same key.
+    values: Vec<ValueAggregate>,
+    /// Index access leverages the map that does key to CanonStream mapping.
+    map: HashMap<StreamMapKey, CanonStream>,
+    /// ap arg processing leverages this tetraplet
+    tetraplet: Rc<SecurityTetraplet>,
+}
+
+impl CanonStreamMap {
+    // The argument's tetraplet is used to produce canon streams for keys so
+    // that the produced canon streams share tetraplets with the original canon stream
+    // rendered by canon instruction.
+    pub(crate) fn from_canon_stream(canon_stream: CanonStream) -> ExecutionResult<CanonStreamMap> {
+        let mut map: HashMap<StreamMapKey, CanonStream> = HashMap::new();
+        let tetraplet = canon_stream.tetraplet().clone();
+
+        for kvpair_obj in canon_stream.iter() {
+            let key = StreamMapKey::from_kvpair_owned(kvpair_obj)
+                .ok_or(UncatchableError::StreamMapKeyError(UnsupportedKVPairObjectOrMapKeyType))?;
+
+            let value = get_value_from_obj(kvpair_obj)?;
+            let entry_canon_stream = map
+                .entry(key)
+                .or_insert(CanonStream::new(vec![], canon_stream.tetraplet().clone()));
+            entry_canon_stream.push(value);
+        }
+
+        let values = canon_stream.into_values();
+        Ok(Self { values, map, tetraplet })
+    }
+
+    // This returns a number of values in a canon map.
+    pub(crate) fn len(&self) -> usize {
+        self.values.len()
+    }
+
+    pub(crate) fn is_empty(&self) -> bool {
+        self.map.is_empty()
+    }
+
+    pub(crate) fn as_jvalue(&self) -> JValue {
+        let json_map: air_interpreter_value::Map<JsonString, JValue> =
+            self.map.iter().map(|(k, v)| (k.to_key(), v.as_jvalue())).collect();
+        json_map.into()
+    }
+
+    pub(crate) fn iter(
+        &self,
+    ) -> impl ExactSizeIterator<Item = &ValueAggregate> + DoubleEndedIterator<Item = &ValueAggregate> {
+        self.values.iter()
+    }
+
+    pub(crate) fn tetraplet(&self) -> &Rc<SecurityTetraplet> {
+        &self.tetraplet
+    }
+
+    pub(crate) fn index<'self_l>(&'self_l self, stream_map_key: &StreamMapKey) -> Option<&'self_l CanonStream> {
+        self.map.get(stream_map_key)
+    }
+}
+
+use std::fmt;
+
+impl fmt::Display for CanonStreamMap {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        write!(f, "[")?;
+        for (key, canon_stream) in self.map.iter() {
+            write!(f, "{key} : {canon_stream}, ")?;
+        }
+        write!(f, "]")
+    }
+}
+
+#[derive(Debug, Clone)]
+pub struct CanonStreamMapWithProvenance {
+    pub(crate) canon_stream_map: CanonStreamMap,
+    pub(crate) cid: CID<CanonResultCidAggregate>,
+}
+
+impl CanonStreamMapWithProvenance {
+    pub(crate) fn new(canon_stream_map: CanonStreamMap, cid: CID<CanonResultCidAggregate>) -> Self {
+        Self { canon_stream_map, cid }
+    }
+}
+
+impl Deref for CanonStreamMapWithProvenance {
+    type Target = CanonStreamMap;
+
+    fn deref(&self) -> &Self::Target {
+        &self.canon_stream_map
+    }
+}
+
+fn get_value_from_obj(value_aggregate: &ValueAggregate) -> ExecutionResult<ValueAggregate> {
+    use crate::StreamMapKeyError::NotAnObject;
+    use crate::StreamMapKeyError::ValueFieldIsAbsent;
+
+    let tetraplet = value_aggregate.get_tetraplet();
+    let provenance = value_aggregate.get_provenance();
+    let trace_pos = value_aggregate.get_trace_pos();
+    let object = value_aggregate
+        .get_result()
+        .as_object()
+        .ok_or(UncatchableError::StreamMapKeyError(NotAnObject))?;
+    let value =
+        object
+            .get(VALUE_FIELD_NAME)
+            .ok_or(ExecutionError::Uncatchable(UncatchableError::StreamMapKeyError(
+                ValueFieldIsAbsent,
+            )))?;
+    let result = value.clone();
+    Ok(ValueAggregate::new(result, tetraplet, trace_pos, provenance))
+}
+
+#[cfg(test)]
+mod test {
+    use super::get_value_from_obj;
+    use super::CanonStream;
+    use super::CanonStreamMap;
+    use crate::execution_step::execution_context::stream_map_key::StreamMapKey;
+    use crate::execution_step::value_types::stream_map::from_key_value;
+    use crate::execution_step::ValueAggregate;
+    use crate::JValue;
+
+    fn create_value_aggregate(value: JValue) -> ValueAggregate {
+        ValueAggregate::new(
+            value,
+            <_>::default(),
+            0.into(),
+            air_interpreter_data::Provenance::literal(),
+        )
+    }
+
+    fn create_value_aggregate_and_keys_vec() -> (Vec<ValueAggregate>, Vec<&'static str>) {
+        let keys = vec!["key_one", "key_two", "key_one"];
+        let values = vec!["first_value", "second_value", "third_value"];
+        let va_vec = keys
+            .iter()
+            .zip(values)
+            .clone()
+            .map(|(&key, value)| {
+                let key = StreamMapKey::Str(key.into());
+                let value = JValue::string(value);
+                let kvpair = from_key_value(key.clone(), &value);
+                create_value_aggregate(kvpair)
+            })
+            .collect();
+
+        (va_vec, keys)
+    }
+
+    fn create_va_canon_and_keys_vecs(peer_pk: &str) -> (Vec<ValueAggregate>, Vec<CanonStream>, Vec<&'static str>) {
+        let (va_vec, keys) = create_value_aggregate_and_keys_vec();
+
+        let va_one = get_value_from_obj(&va_vec[0]).unwrap();
+        let va_two = get_value_from_obj(&va_vec[1]).unwrap();
+        let va_three = get_value_from_obj(&va_vec[2]).unwrap();
+
+        let va_vec_one = vec![va_one, va_three];
+        let va_vec_two = vec![va_two];
+        let canon_stream_one = CanonStream::from_values(va_vec_one, peer_pk.into());
+        let canon_stream_two = CanonStream::from_values(va_vec_two, peer_pk.into());
+
+        (va_vec, vec![canon_stream_one, canon_stream_two], keys)
+    }
+
+    #[test]
+    fn from_canon_stream() {
+        let peer_pk = "some_tetraplet";
+        let (va_vec, canon_streams, keys) = create_va_canon_and_keys_vecs(peer_pk);
+        let canon_stream = CanonStream::from_values(va_vec, peer_pk.into());
+        let canon_stream_map = CanonStreamMap::from_canon_stream(canon_stream).expect("This ctor call must not fail");
+
+        let key_one = (*keys.first().expect("There must be a key")).into();
+        let key_two = (*keys[1]).into();
+
+        let canon_stream_map_key_one = canon_stream_map.map.get(&key_one).expect("There must be a key");
+        let canon_stream_map_key_two = canon_stream_map.map.get(&key_two).expect("There must be a key");
+        let canon_stream_one = canon_streams.first().expect("There must be a canon stream");
+        let canon_stream_two = canon_streams.last().expect("There must be a canon stream");
+
+        assert!(canon_stream_map_key_one.clone().into_values() == canon_stream_one.clone().into_values());
+        assert!(canon_stream_map_key_two.clone().into_values() == canon_stream_two.clone().into_values());
+    }
+
+    #[test]
+    fn test_index_ok() {
+        let peer_pk = "some_tetraplet";
+        let (va_vec, canon_streams, _) = create_va_canon_and_keys_vecs(peer_pk);
+        let canon_stream = CanonStream::from_values(va_vec, peer_pk.into());
+        let canon_stream_map =
+            CanonStreamMap::from_canon_stream(canon_stream.clone()).expect("This ctor call must not fail");
+        let key_one = StreamMapKey::Str("key_one".into());
+
+        let result_canon_stream = canon_stream_map
+            .index(&key_one)
+            .expect("There must be a value for this index.");
+        let canon_stream_one = canon_streams.first().unwrap();
+
+        assert!(result_canon_stream.clone().into_values() == canon_stream_one.clone().into_values());
+
+        let key_two = StreamMapKey::Str("key_two".into());
+        let result_canon_stream = canon_stream_map
+            .index(&key_two)
+            .expect("There must be a value for this index.");
+        let canon_stream_two = canon_streams.last().unwrap();
+
+        assert!(result_canon_stream.clone().into_values() == canon_stream_two.clone().into_values());
+    }
+}
+
\ No newline at end of file diff --git a/src/air/execution_step/value_types/iterable.rs.html b/src/air/execution_step/value_types/iterable.rs.html new file mode 100644 index 00000000..1fea324c --- /dev/null +++ b/src/air/execution_step/value_types/iterable.rs.html @@ -0,0 +1,253 @@ +iterable.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+mod canon_stream;
+mod canon_stream_map;
+mod lambda_result;
+mod resolved_call;
+mod vec_resolved_call;
+
+pub(crate) use canon_stream::CanonStreamIterableIngredients;
+pub(crate) use canon_stream_map::CanonStreamMapIterableIngredients;
+pub(crate) use lambda_result::IterableLambdaResult;
+pub(crate) use resolved_call::IterableResolvedCall;
+pub(crate) use vec_resolved_call::IterableVecResolvedCall;
+
+use super::ValueAggregate;
+use crate::execution_step::RcSecurityTetraplet;
+use crate::JValue;
+
+use air_interpreter_data::Provenance;
+use air_interpreter_data::TracePos;
+
+/// This trait represent bidirectional iterator and
+/// is used to abstract values used in fold as iterables.
+pub(crate) trait Iterable<'ctx> {
+    /// Represent iterable type.
+    type Item;
+
+    /// Move inner iterator to the next value and return true if it exists,
+    /// does nothing and return false otherwise.
+    fn next(&mut self) -> bool;
+
+    /// Move inner iterator to the previous value and return true if it exists,
+    /// does nothing and return false otherwise.
+    fn prev(&mut self) -> bool;
+
+    /// Return current iterable value if Iterable value is not empty and None otherwise.
+    fn peek(&'ctx self) -> Option<Self::Item>;
+
+    /// Returns length of the current iterator.
+    fn len(&self) -> usize;
+}
+
+/// Combines all possible iterable item types.
+///
+/// Iterable item is a variable that `fold` sets to each element of the collection it iterates
+/// through, i.e., it is the `iterable` in the `(fold collection iterable instruction)` statement.
+#[derive(Clone, Debug, Eq, PartialEq)]
+pub(crate) enum IterableItem<'ctx> {
+    RefValue((&'ctx JValue, RcSecurityTetraplet, TracePos, Provenance)),
+    RcValue((JValue, RcSecurityTetraplet, TracePos, Provenance)),
+}
+
+impl IterableItem<'_> {
+    pub(crate) fn pos(&self) -> TracePos {
+        use IterableItem::*;
+
+        let pos = match self {
+            RefValue((.., pos, _)) => pos,
+            RcValue((.., pos, _)) => pos,
+        };
+
+        *pos
+    }
+
+    pub(crate) fn provenance(&self) -> Provenance {
+        use IterableItem::*;
+
+        match self {
+            RefValue((.., ref prov)) => prov,
+            RcValue((.., ref prov)) => prov,
+        }
+        .clone()
+    }
+
+    pub(crate) fn into_resolved_result(self) -> ValueAggregate {
+        use IterableItem::*;
+
+        let (value, tetraplet, pos, provenance) = match self {
+            RefValue((value, tetraplet, pos, prov)) => (value.clone(), tetraplet, pos, prov),
+            RcValue(ingredients) => ingredients,
+        };
+
+        ValueAggregate::new(value, tetraplet, pos, provenance)
+    }
+}
+
+#[macro_export]
+macro_rules! foldable_next {
+    ($self: expr, $len:expr) => {{
+        if $self.cursor + 1 < $len {
+            $self.cursor += 1;
+            true
+        } else {
+            false
+        }
+    }};
+}
+
+#[macro_export]
+macro_rules! foldable_prev {
+    ($self: expr) => {{
+        if $self.cursor >= 1 {
+            $self.cursor -= 1;
+            true
+        } else {
+            false
+        }
+    }};
+}
+
\ No newline at end of file diff --git a/src/air/execution_step/value_types/iterable/canon_stream.rs.html b/src/air/execution_step/value_types/iterable/canon_stream.rs.html new file mode 100644 index 00000000..b28d3fcb --- /dev/null +++ b/src/air/execution_step/value_types/iterable/canon_stream.rs.html @@ -0,0 +1,145 @@ +canon_stream.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::Iterable;
+use super::IterableItem;
+use crate::execution_step::value_types::CanonStream;
+use crate::execution_step::value_types::TracePosOperate;
+use crate::foldable_next;
+use crate::foldable_prev;
+
+const EXPECT_VALUE_IN_STREAM: &str = "value must exist, because length checked before creation and canonicalized stream can't be modified during iteration";
+
+pub(crate) struct CanonStreamIterableIngredients {
+    canon_stream: CanonStream,
+    cursor: usize,
+}
+
+impl CanonStreamIterableIngredients {
+    pub(crate) fn init(canon_stream: CanonStream) -> Self {
+        Self {
+            canon_stream,
+            cursor: 0,
+        }
+    }
+}
+
+impl<'ctx> Iterable<'ctx> for CanonStreamIterableIngredients {
+    type Item = IterableItem<'ctx>;
+
+    fn next(&mut self) -> bool {
+        foldable_next!(self, self.len())
+    }
+
+    fn prev(&mut self) -> bool {
+        foldable_prev!(self)
+    }
+
+    fn peek(&'ctx self) -> Option<Self::Item> {
+        if self.canon_stream.is_empty() {
+            return None;
+        }
+
+        let value = self.canon_stream.nth(self.cursor).expect(EXPECT_VALUE_IN_STREAM);
+        let result = IterableItem::RefValue((
+            value.get_result(),
+            value.get_tetraplet(),
+            value.get_trace_pos(),
+            value.get_provenance(),
+        ));
+        Some(result)
+    }
+
+    fn len(&self) -> usize {
+        self.canon_stream.len()
+    }
+}
+
\ No newline at end of file diff --git a/src/air/execution_step/value_types/iterable/canon_stream_map.rs.html b/src/air/execution_step/value_types/iterable/canon_stream_map.rs.html new file mode 100644 index 00000000..4fd81e37 --- /dev/null +++ b/src/air/execution_step/value_types/iterable/canon_stream_map.rs.html @@ -0,0 +1,139 @@ +canon_stream_map.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::Iterable;
+use super::IterableItem;
+use crate::execution_step::value_types::TracePosOperate;
+use crate::execution_step::ValueAggregate;
+use crate::foldable_next;
+use crate::foldable_prev;
+
+const EXPECT_VALUE_IN_MAP: &str = "value must exist, because length checked before creation and canonicalized stream map can not be modified during iteration";
+
+pub(crate) struct CanonStreamMapIterableIngredients {
+    values: Vec<ValueAggregate>,
+    cursor: usize,
+}
+
+impl CanonStreamMapIterableIngredients {
+    pub(crate) fn init(values: Vec<ValueAggregate>) -> Self {
+        Self { values, cursor: 0 }
+    }
+}
+
+impl<'ctx> Iterable<'ctx> for CanonStreamMapIterableIngredients {
+    type Item = IterableItem<'ctx>;
+
+    fn next(&mut self) -> bool {
+        foldable_next!(self, self.len())
+    }
+
+    fn prev(&mut self) -> bool {
+        foldable_prev!(self)
+    }
+
+    fn peek(&'ctx self) -> Option<Self::Item> {
+        if self.values.is_empty() {
+            return None;
+        }
+
+        let value = self.values.get(self.cursor).expect(EXPECT_VALUE_IN_MAP);
+        let result = IterableItem::RefValue((
+            value.get_result(),
+            value.get_tetraplet(),
+            value.get_trace_pos(),
+            value.get_provenance(),
+        ));
+        Some(result)
+    }
+
+    fn len(&self) -> usize {
+        self.values.len()
+    }
+}
+
\ No newline at end of file diff --git a/src/air/execution_step/value_types/iterable/lambda_result.rs.html b/src/air/execution_step/value_types/iterable/lambda_result.rs.html new file mode 100644 index 00000000..59cd35b0 --- /dev/null +++ b/src/air/execution_step/value_types/iterable/lambda_result.rs.html @@ -0,0 +1,153 @@ +lambda_result.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::Iterable;
+use super::IterableItem;
+use crate::execution_step::RcSecurityTetraplet;
+use crate::foldable_next;
+use crate::foldable_prev;
+use crate::JValue;
+
+use air_interpreter_data::Provenance;
+
+/// Used for iterating over a result of applied to a JValue lambda.
+#[derive(Clone, Debug, Eq, PartialEq)]
+pub(crate) struct IterableLambdaResult {
+    pub(crate) jvalues: Vec<JValue>,
+    pub(crate) tetraplet: RcSecurityTetraplet,
+    pub(crate) provenance: Provenance,
+    pub(crate) cursor: usize,
+}
+
+impl IterableLambdaResult {
+    pub(crate) fn init(jvalues: Vec<JValue>, tetraplet: RcSecurityTetraplet, provenance: Provenance) -> Self {
+        Self {
+            jvalues,
+            tetraplet,
+            provenance,
+            cursor: 0,
+        }
+    }
+}
+
+impl<'ctx> Iterable<'ctx> for IterableLambdaResult {
+    type Item = IterableItem<'ctx>;
+
+    fn next(&mut self) -> bool {
+        foldable_next!(self, self.jvalues.len())
+    }
+
+    fn prev(&mut self) -> bool {
+        foldable_prev!(self)
+    }
+
+    fn peek(&'ctx self) -> Option<Self::Item> {
+        if self.jvalues.is_empty() {
+            return None;
+        }
+
+        let jvalue = &self.jvalues[self.cursor];
+        let mut tetraplet = (*self.tetraplet).clone();
+        tetraplet.add_lens(&format!(".$.[{}]", self.cursor));
+        let result = IterableItem::RefValue((jvalue, tetraplet.into(), 0.into(), self.provenance.clone()));
+
+        Some(result)
+    }
+
+    fn len(&self) -> usize {
+        self.jvalues.len()
+    }
+}
+
\ No newline at end of file diff --git a/src/air/execution_step/value_types/iterable/resolved_call.rs.html b/src/air/execution_step/value_types/iterable/resolved_call.rs.html new file mode 100644 index 00000000..badc41a4 --- /dev/null +++ b/src/air/execution_step/value_types/iterable/resolved_call.rs.html @@ -0,0 +1,165 @@ +resolved_call.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::Iterable;
+use super::IterableItem;
+use super::ValueAggregate;
+use crate::foldable_next;
+use crate::foldable_prev;
+use crate::JValue;
+
+/// Used for iterating over JValue of array type.
+#[derive(Clone, Debug, Eq, PartialEq)]
+pub(crate) struct IterableResolvedCall {
+    pub(crate) call_result: ValueAggregate,
+    pub(crate) cursor: usize,
+    pub(crate) len: usize,
+}
+
+impl IterableResolvedCall {
+    pub(crate) fn init(call_result: ValueAggregate, len: usize) -> Self {
+        Self {
+            call_result,
+            cursor: 0,
+            len,
+        }
+    }
+}
+
+impl<'ctx> Iterable<'ctx> for IterableResolvedCall {
+    type Item = IterableItem<'ctx>;
+
+    fn next(&mut self) -> bool {
+        foldable_next!(self, self.len)
+    }
+
+    fn prev(&mut self) -> bool {
+        foldable_prev!(self)
+    }
+
+    fn peek(&'ctx self) -> Option<Self::Item> {
+        if self.len == 0 {
+            return None;
+        }
+
+        let (result, tetraplet, trace_pos) = self.call_result.as_inner_parts();
+        let provenance = self.call_result.get_provenance();
+
+        let jvalue = match &result {
+            JValue::Array(array) => &array[self.cursor],
+            _ => unimplemented!("this jvalue is set only by fold instruction, so it must have an array type"),
+        };
+
+        let mut tetraplet = (*tetraplet).clone();
+        tetraplet.add_lens(&format!(".$.[{}]", self.cursor));
+
+        let result = IterableItem::RefValue((jvalue, tetraplet.into(), trace_pos, provenance));
+        Some(result)
+    }
+
+    fn len(&self) -> usize {
+        match self.call_result.get_result() {
+            JValue::Array(array) => array.len(),
+            _ => unimplemented!("this jvalue is set only by fold instruction, so it must have an array type"),
+        }
+    }
+}
+
\ No newline at end of file diff --git a/src/air/execution_step/value_types/iterable/vec_resolved_call.rs.html b/src/air/execution_step/value_types/iterable/vec_resolved_call.rs.html new file mode 100644 index 00000000..d79e5539 --- /dev/null +++ b/src/air/execution_step/value_types/iterable/vec_resolved_call.rs.html @@ -0,0 +1,145 @@ +vec_resolved_call.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::Iterable;
+use super::IterableItem;
+use super::ValueAggregate;
+use crate::foldable_next;
+use crate::foldable_prev;
+
+/// Used for iterating over stream with JValues.
+#[derive(Clone, Debug, Eq, PartialEq)]
+pub(crate) struct IterableVecResolvedCall {
+    pub(crate) call_results: Vec<ValueAggregate>,
+    pub(crate) cursor: usize,
+}
+
+impl IterableVecResolvedCall {
+    pub(crate) fn init(call_results: Vec<ValueAggregate>) -> Self {
+        Self {
+            call_results,
+            cursor: 0,
+        }
+    }
+}
+
+impl<'ctx> Iterable<'ctx> for IterableVecResolvedCall {
+    type Item = IterableItem<'ctx>;
+
+    fn next(&mut self) -> bool {
+        foldable_next!(self, self.call_results.len())
+    }
+
+    fn prev(&mut self) -> bool {
+        foldable_prev!(self)
+    }
+
+    fn peek(&'ctx self) -> Option<Self::Item> {
+        if self.call_results.is_empty() {
+            return None;
+        }
+
+        let (result, tetraplet, trace_pos) = self.call_results[self.cursor].as_inner_parts();
+
+        let result = IterableItem::RcValue((
+            result.clone(),
+            tetraplet,
+            trace_pos,
+            self.call_results[self.cursor].get_provenance(),
+        ));
+        Some(result)
+    }
+
+    fn len(&self) -> usize {
+        self.call_results.len()
+    }
+}
+
\ No newline at end of file diff --git a/src/air/execution_step/value_types/jvaluable.rs.html b/src/air/execution_step/value_types/jvaluable.rs.html new file mode 100644 index 00000000..c5111fe9 --- /dev/null +++ b/src/air/execution_step/value_types/jvaluable.rs.html @@ -0,0 +1,119 @@ +jvaluable.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+mod canon_stream;
+mod canon_stream_map;
+mod cell_vec_resolved_call_result;
+mod iterable_item;
+mod resolved_call_result;
+
+use super::iterable::IterableItem;
+use super::ExecutionResult;
+use super::ValueAggregate;
+use crate::execution_step::lambda_applier::*;
+use crate::execution_step::ExecutionCtx;
+use crate::execution_step::RcSecurityTetraplets;
+use crate::JValue;
+use crate::LambdaAST;
+use crate::SecurityTetraplet;
+
+use air_interpreter_data::Provenance;
+
+/// Represent a value that could be transform to a JValue with or without tetraplets.
+pub(crate) trait JValuable {
+    /// Applies lambda to the internal value, produces JValue.
+    fn apply_lambda(&self, lambda: &LambdaAST<'_>, exec_ctx: &ExecutionCtx<'_>) -> ExecutionResult<JValue>;
+
+    /// Applies lambda to the internal value, produces JValue with tetraplet.
+    // TODO self should know about own provenance, but it will require
+    // TODO implementing JValuable for different types than now,
+    // TODO that's why current implementation passes root provenance explicitely
+    fn apply_lambda_with_tetraplets(
+        &self,
+        lambda: &LambdaAST<'_>,
+        exec_ctx: &ExecutionCtx<'_>,
+        root_provenance: &Provenance,
+    ) -> ExecutionResult<(JValue, SecurityTetraplet, Provenance)>;
+
+    /// Return internal value as borrowed if it's possible, owned otherwise.
+    fn as_jvalue(&self) -> JValue;
+
+    /// Return tetraplets associating with internal value.
+    fn as_tetraplets(&self) -> RcSecurityTetraplets;
+}
+
\ No newline at end of file diff --git a/src/air/execution_step/value_types/jvaluable/canon_stream.rs.html b/src/air/execution_step/value_types/jvaluable/canon_stream.rs.html new file mode 100644 index 00000000..40492080 --- /dev/null +++ b/src/air/execution_step/value_types/jvaluable/canon_stream.rs.html @@ -0,0 +1,165 @@ +canon_stream.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::select_by_lambda_from_stream;
+use super::ExecutionResult;
+use super::JValuable;
+use crate::execution_step::value_types::CanonStream;
+use crate::execution_step::ExecutionCtx;
+use crate::execution_step::RcSecurityTetraplets;
+use crate::JValue;
+use crate::LambdaAST;
+use crate::SecurityTetraplet;
+
+use air_interpreter_data::Provenance;
+
+use std::ops::Deref;
+
+impl JValuable for &CanonStream {
+    fn apply_lambda(&self, lambda: &LambdaAST<'_>, exec_ctx: &ExecutionCtx<'_>) -> ExecutionResult<JValue> {
+        let iter = self.iter().map(|v| v.get_result());
+        let select_result = select_by_lambda_from_stream(iter, lambda, exec_ctx)?;
+
+        Ok(select_result.result)
+    }
+
+    fn apply_lambda_with_tetraplets(
+        &self,
+        lambda: &LambdaAST<'_>,
+        exec_ctx: &ExecutionCtx<'_>,
+        root_provenance: &Provenance,
+    ) -> ExecutionResult<(JValue, SecurityTetraplet, Provenance)> {
+        let iter = self.iter().map(|v| v.get_result());
+        let select_result = select_by_lambda_from_stream(iter, lambda, exec_ctx)?;
+
+        let (tetraplet, provenance) = match select_result.tetraplet_idx {
+            Some(idx) => {
+                let resolved_call = self.nth(idx).expect(crate::execution_step::TETRAPLET_IDX_CORRECT);
+                (
+                    resolved_call.get_tetraplet().deref().clone(),
+                    resolved_call.get_provenance(),
+                )
+            }
+            // TODO it seems it is not covered by tests
+            None => (
+                SecurityTetraplet::new(
+                    exec_ctx.run_parameters.current_peer_id.to_string(),
+                    lambda.to_string(),
+                    "",
+                    "",
+                ),
+                root_provenance.clone(),
+            ),
+        };
+
+        Ok((select_result.result, tetraplet, provenance))
+    }
+
+    #[inline]
+    fn as_jvalue(&self) -> JValue {
+        CanonStream::as_jvalue(self)
+    }
+
+    fn as_tetraplets(&self) -> RcSecurityTetraplets {
+        self.iter().map(|r| r.get_tetraplet()).collect()
+    }
+}
+
\ No newline at end of file diff --git a/src/air/execution_step/value_types/jvaluable/canon_stream_map.rs.html b/src/air/execution_step/value_types/jvaluable/canon_stream_map.rs.html new file mode 100644 index 00000000..46c45b0b --- /dev/null +++ b/src/air/execution_step/value_types/jvaluable/canon_stream_map.rs.html @@ -0,0 +1,121 @@ +canon_stream_map.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::ExecutionResult;
+use super::JValuable;
+use crate::execution_step::lambda_applier::select_by_lambda_from_canon_map;
+use crate::execution_step::lambda_applier::MapLensResult;
+use crate::execution_step::value_types::CanonStreamMap;
+use crate::execution_step::ExecutionCtx;
+use crate::execution_step::RcSecurityTetraplets;
+use crate::JValue;
+use crate::LambdaAST;
+use crate::SecurityTetraplet;
+
+use air_interpreter_data::Provenance;
+
+impl JValuable for &CanonStreamMap {
+    #[inline]
+    fn apply_lambda(&self, lambda: &LambdaAST<'_>, exec_ctx: &ExecutionCtx<'_>) -> ExecutionResult<JValue> {
+        let select_result = select_by_lambda_from_canon_map(self, lambda, exec_ctx)?;
+        Ok(select_result.result)
+    }
+
+    fn apply_lambda_with_tetraplets(
+        &self,
+        lambda: &LambdaAST<'_>,
+        exec_ctx: &ExecutionCtx<'_>,
+        root_provenance: &Provenance,
+    ) -> ExecutionResult<(JValue, SecurityTetraplet, Provenance)> {
+        let MapLensResult { result, tetraplet } = select_by_lambda_from_canon_map(self, lambda, exec_ctx)?;
+
+        // Provenance is borrowed from the map.
+        Ok((result, tetraplet.as_ref().clone(), root_provenance.clone()))
+    }
+
+    #[inline]
+    fn as_jvalue(&self) -> JValue {
+        CanonStreamMap::as_jvalue(self)
+    }
+
+    fn as_tetraplets(&self) -> RcSecurityTetraplets {
+        self.iter().map(|r| r.get_tetraplet()).collect()
+    }
+}
+
\ No newline at end of file diff --git a/src/air/execution_step/value_types/jvaluable/cell_vec_resolved_call_result.rs.html b/src/air/execution_step/value_types/jvaluable/cell_vec_resolved_call_result.rs.html new file mode 100644 index 00000000..97d5615b --- /dev/null +++ b/src/air/execution_step/value_types/jvaluable/cell_vec_resolved_call_result.rs.html @@ -0,0 +1,137 @@ +cell_vec_resolved_call_result.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::select_by_lambda_from_stream;
+use super::ExecutionResult;
+use super::JValuable;
+use super::ValueAggregate;
+use crate::execution_step::value_types::populate_tetraplet_with_lambda;
+use crate::execution_step::ExecutionCtx;
+use crate::execution_step::RcSecurityTetraplets;
+use crate::JValue;
+use crate::LambdaAST;
+use crate::SecurityTetraplet;
+
+use air_interpreter_data::Provenance;
+
+impl JValuable for std::cell::Ref<'_, Vec<ValueAggregate>> {
+    fn apply_lambda(&self, lambda: &LambdaAST<'_>, exec_ctx: &ExecutionCtx<'_>) -> ExecutionResult<JValue> {
+        let stream_iter = self.iter().map(|r| r.get_result());
+        let select_result = select_by_lambda_from_stream(stream_iter, lambda, exec_ctx)?;
+        Ok(select_result.result)
+    }
+
+    fn apply_lambda_with_tetraplets(
+        &self,
+        lambda: &LambdaAST<'_>,
+        exec_ctx: &ExecutionCtx<'_>,
+        root_provenance: &Provenance,
+    ) -> ExecutionResult<(JValue, SecurityTetraplet, Provenance)> {
+        let stream_iter = self.iter().map(|r| r.get_result());
+        let select_result = select_by_lambda_from_stream(stream_iter, lambda, exec_ctx)?;
+
+        let tetraplet = match select_result.tetraplet_idx {
+            Some(idx) => {
+                let tetraplet = self[idx].get_tetraplet();
+                populate_tetraplet_with_lambda(tetraplet.as_ref().clone(), lambda)
+            }
+            None => SecurityTetraplet::new(exec_ctx.run_parameters.current_peer_id.to_string(), "", "", ""),
+        };
+
+        Ok((select_result.result, tetraplet, root_provenance.clone()))
+    }
+
+    fn as_jvalue(&self) -> JValue {
+        let jvalue_iter = self.iter().map(|r| r.get_result().clone());
+        JValue::array_from_iter(jvalue_iter)
+    }
+
+    fn as_tetraplets(&self) -> RcSecurityTetraplets {
+        self.iter().map(|r| r.get_tetraplet()).collect::<Vec<_>>()
+    }
+}
+
\ No newline at end of file diff --git a/src/air/execution_step/value_types/jvaluable/iterable_item.rs.html b/src/air/execution_step/value_types/jvaluable/iterable_item.rs.html new file mode 100644 index 00000000..b34638fc --- /dev/null +++ b/src/air/execution_step/value_types/jvaluable/iterable_item.rs.html @@ -0,0 +1,169 @@ +iterable_item.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::select_by_lambda_from_scalar;
+use super::ExecutionResult;
+use super::IterableItem;
+use super::JValuable;
+use super::LambdaAST;
+use crate::execution_step::value_types::populate_tetraplet_with_lambda;
+use crate::execution_step::ExecutionCtx;
+use crate::execution_step::RcSecurityTetraplets;
+use crate::JValue;
+use crate::SecurityTetraplet;
+
+use air_interpreter_data::Provenance;
+
+impl<'ctx> JValuable for IterableItem<'ctx> {
+    fn apply_lambda(&self, lambda: &LambdaAST<'_>, exec_ctx: &ExecutionCtx<'_>) -> ExecutionResult<JValue> {
+        use super::IterableItem::*;
+
+        let jvalue = match self {
+            RefValue((jvalue, ..)) => jvalue,
+            RcValue((jvalue, ..)) => jvalue,
+        };
+
+        let selected_value = select_by_lambda_from_scalar(jvalue, lambda, exec_ctx)?;
+        Ok(selected_value)
+    }
+
+    fn apply_lambda_with_tetraplets(
+        &self,
+        lambda: &LambdaAST<'_>,
+        exec_ctx: &ExecutionCtx<'_>,
+        _root_provenance: &Provenance,
+    ) -> ExecutionResult<(JValue, SecurityTetraplet, Provenance)> {
+        use super::IterableItem::*;
+
+        let (jvalue, tetraplet, provenance) = match self {
+            RefValue((jvalue, tetraplet, _, provenance)) => (*jvalue, tetraplet, provenance),
+            RcValue((jvalue, tetraplet, _, provenance)) => (jvalue, tetraplet, provenance),
+        };
+
+        let selected_value = select_by_lambda_from_scalar(jvalue, lambda, exec_ctx)?;
+        let tetraplet = populate_tetraplet_with_lambda(tetraplet.as_ref().clone(), lambda);
+
+        Ok((selected_value, tetraplet, provenance.clone()))
+    }
+
+    #[inline]
+    fn as_jvalue(&self) -> JValue {
+        use super::IterableItem::*;
+
+        match self {
+            RefValue((jvalue, ..)) => (*jvalue).clone(),
+            RcValue((jvalue, ..)) => jvalue.clone(),
+        }
+    }
+
+    fn as_tetraplets(&self) -> RcSecurityTetraplets {
+        use super::IterableItem::*;
+
+        // these clones are needed because rust-sdk allows passing arguments only by value
+        match self {
+            RefValue((_, tetraplet, _, _)) => vec![tetraplet.clone()],
+            RcValue((_, tetraplet, _, _)) => vec![tetraplet.clone()],
+        }
+    }
+}
+
\ No newline at end of file diff --git a/src/air/execution_step/value_types/jvaluable/resolved_call_result.rs.html b/src/air/execution_step/value_types/jvaluable/resolved_call_result.rs.html new file mode 100644 index 00000000..3c526571 --- /dev/null +++ b/src/air/execution_step/value_types/jvaluable/resolved_call_result.rs.html @@ -0,0 +1,119 @@ +resolved_call_result.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::select_by_lambda_from_scalar;
+use super::ExecutionResult;
+use super::JValuable;
+use super::LambdaAST;
+use super::ValueAggregate;
+use crate::execution_step::value_types::populate_tetraplet_with_lambda;
+use crate::execution_step::ExecutionCtx;
+use crate::execution_step::RcSecurityTetraplets;
+use crate::JValue;
+use crate::SecurityTetraplet;
+
+use air_interpreter_data::Provenance;
+
+impl JValuable for ValueAggregate {
+    fn apply_lambda(&self, lambda: &LambdaAST<'_>, exec_ctx: &ExecutionCtx<'_>) -> ExecutionResult<JValue> {
+        let selected_value = select_by_lambda_from_scalar(self.get_result(), lambda, exec_ctx)?;
+        Ok(selected_value)
+    }
+
+    fn apply_lambda_with_tetraplets(
+        &self,
+        lambda: &LambdaAST<'_>,
+        exec_ctx: &ExecutionCtx<'_>,
+        _root_provenane: &Provenance,
+    ) -> ExecutionResult<(JValue, SecurityTetraplet, Provenance)> {
+        let selected_value = select_by_lambda_from_scalar(self.get_result(), lambda, exec_ctx)?;
+        let tetraplet = populate_tetraplet_with_lambda(self.get_tetraplet().as_ref().clone(), lambda);
+
+        Ok((selected_value, tetraplet, self.get_provenance()))
+    }
+
+    #[inline]
+    fn as_jvalue(&self) -> JValue {
+        self.get_result().clone()
+    }
+
+    fn as_tetraplets(&self) -> RcSecurityTetraplets {
+        vec![self.get_tetraplet()]
+    }
+}
+
\ No newline at end of file diff --git a/src/air/execution_step/value_types/mod.rs.html b/src/air/execution_step/value_types/mod.rs.html new file mode 100644 index 00000000..bd12fcdd --- /dev/null +++ b/src/air/execution_step/value_types/mod.rs.html @@ -0,0 +1,103 @@ +mod.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+mod canon_stream;
+mod canon_stream_map;
+mod iterable;
+mod jvaluable;
+mod scalar;
+mod stream;
+mod stream_map;
+mod utils;
+
+pub type Stream = stream::Stream<ValueAggregate>;
+
+pub(crate) use canon_stream::*;
+pub(crate) use canon_stream_map::*;
+pub(crate) use iterable::*;
+pub(crate) use jvaluable::*;
+pub(crate) use scalar::CanonResultAggregate;
+pub(crate) use scalar::LiteralAggregate;
+pub(crate) use scalar::ScalarRef;
+pub(crate) use scalar::ServiceResultAggregate;
+pub(crate) use scalar::TracePosOperate;
+pub(crate) use scalar::ValueAggregate;
+
+pub(crate) use stream::Generation;
+pub(crate) use stream::IterableValue;
+pub(crate) use stream::RecursiveCursorState;
+pub(crate) use stream::RecursiveStreamCursor;
+pub(super) use stream::STREAM_MAX_SIZE;
+pub(crate) use stream_map::StreamMap;
+
+pub(crate) use utils::populate_tetraplet_with_lambda;
+
+use super::ExecutionResult;
+
\ No newline at end of file diff --git a/src/air/execution_step/value_types/scalar.rs.html b/src/air/execution_step/value_types/scalar.rs.html new file mode 100644 index 00000000..020fcb60 --- /dev/null +++ b/src/air/execution_step/value_types/scalar.rs.html @@ -0,0 +1,523 @@ +scalar.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+pub mod values;
+
+pub(crate) use self::values::CanonResultAggregate;
+pub(crate) use self::values::LiteralAggregate;
+pub(crate) use self::values::ServiceResultAggregate;
+
+use super::JValuable;
+use crate::execution_step::FoldState;
+use crate::execution_step::RcSecurityTetraplet;
+use crate::execution_step::PEEK_ALLOWED_ON_NON_EMPTY;
+use crate::JValue;
+
+use air_interpreter_cid::CID;
+use air_interpreter_data::CanonResultCidAggregate;
+use air_interpreter_data::Provenance;
+use air_interpreter_data::ServiceResultCidAggregate;
+use air_interpreter_data::TracePos;
+use serde::Deserialize;
+use serde::Serialize;
+
+#[derive(Debug, Clone, Eq, PartialEq, Serialize, Deserialize)]
+#[serde(rename_all = "snake_case", tag = "type")]
+pub enum ValueAggregate {
+    Literal(LiteralAggregate),
+    ServiceResult {
+        #[serde(flatten)]
+        result: ServiceResultAggregate,
+        // the original call result CID; not changed on lambda application
+        #[serde(rename = "cid")]
+        provenance_cid: CID<ServiceResultCidAggregate>,
+    },
+    Canon {
+        #[serde(flatten)]
+        result: CanonResultAggregate,
+        // the original canon CID; not changed on lambda application
+        #[serde(rename = "cid")]
+        provenance_cid: CID<CanonResultCidAggregate>,
+    },
+}
+
+pub(crate) enum ScalarRef<'i> {
+    Value(&'i ValueAggregate),
+    IterableValue(&'i FoldState<'i>),
+}
+
+impl<'i> ScalarRef<'i> {
+    pub(crate) fn into_jvaluable(self) -> (Box<dyn JValuable + 'i>, Provenance) {
+        match self {
+            ScalarRef::Value(value) => (Box::new(value.clone()), value.get_provenance()),
+            ScalarRef::IterableValue(fold_state) => {
+                let peeked_value = fold_state.iterable.peek().expect(PEEK_ALLOWED_ON_NON_EMPTY);
+                let provenance = peeked_value.provenance();
+                (Box::new(peeked_value), provenance)
+            }
+        }
+    }
+}
+
+impl ValueAggregate {
+    pub(crate) fn new(
+        result: JValue,
+        tetraplet: RcSecurityTetraplet,
+        trace_pos: TracePos,
+        provenance: Provenance,
+    ) -> Self {
+        match provenance {
+            Provenance::Literal => ValueAggregate::Literal(LiteralAggregate::new(
+                result,
+                tetraplet.peer_pk.as_str().into(),
+                trace_pos,
+            )),
+            Provenance::ServiceResult { cid } => ValueAggregate::ServiceResult {
+                result: ServiceResultAggregate::new(result, tetraplet, trace_pos),
+                provenance_cid: cid,
+            },
+            Provenance::Canon { cid } => ValueAggregate::Canon {
+                result: CanonResultAggregate::new(
+                    result,
+                    tetraplet.peer_pk.as_str().into(),
+                    &tetraplet.lens,
+                    trace_pos,
+                ),
+                provenance_cid: cid,
+            },
+        }
+    }
+
+    pub(crate) fn from_literal_result(literal: LiteralAggregate) -> Self {
+        Self::Literal(literal)
+    }
+
+    pub(crate) fn from_service_result(
+        service_result: ServiceResultAggregate,
+        service_result_agg_cid: CID<ServiceResultCidAggregate>,
+    ) -> Self {
+        Self::ServiceResult {
+            result: service_result,
+            provenance_cid: service_result_agg_cid,
+        }
+    }
+
+    pub(crate) fn from_canon_result(
+        canon_result: CanonResultAggregate,
+        canon_result_agg_cid: CID<CanonResultCidAggregate>,
+    ) -> Self {
+        Self::Canon {
+            result: canon_result,
+            provenance_cid: canon_result_agg_cid,
+        }
+    }
+
+    pub(crate) fn as_inner_parts(&self) -> (&JValue, RcSecurityTetraplet, TracePos) {
+        match self {
+            ValueAggregate::Literal(ref literal) => (&literal.result, literal.get_tetraplet(), literal.trace_pos),
+            ValueAggregate::ServiceResult {
+                result: ref service_result,
+                provenance_cid: _,
+            } => (
+                &service_result.result,
+                service_result.tetraplet.clone(),
+                service_result.trace_pos,
+            ),
+            ValueAggregate::Canon {
+                result: ref canon_result,
+                provenance_cid: _,
+            } => (
+                &canon_result.result,
+                canon_result.get_tetraplet(),
+                canon_result.trace_pos,
+            ),
+        }
+    }
+
+    pub fn get_result(&self) -> &JValue {
+        match self {
+            ValueAggregate::Literal(literal) => &literal.result,
+            ValueAggregate::ServiceResult {
+                result: service_result,
+                provenance_cid: _,
+            } => &service_result.result,
+            ValueAggregate::Canon {
+                result: canon_result,
+                provenance_cid: _,
+            } => &canon_result.result,
+        }
+    }
+
+    pub fn get_tetraplet(&self) -> RcSecurityTetraplet {
+        match self {
+            ValueAggregate::Literal(literal) => literal.get_tetraplet(),
+            ValueAggregate::ServiceResult {
+                result: service_result,
+                provenance_cid: _,
+            } => service_result.tetraplet.clone(),
+            ValueAggregate::Canon {
+                result: canon_result,
+                provenance_cid: _,
+            } => canon_result.get_tetraplet(),
+        }
+    }
+
+    pub fn get_provenance(&self) -> Provenance {
+        match self {
+            ValueAggregate::Literal(_) => Provenance::Literal,
+            ValueAggregate::ServiceResult {
+                result: _,
+                provenance_cid: cid,
+            } => Provenance::ServiceResult { cid: cid.clone() },
+            ValueAggregate::Canon {
+                result: _,
+                provenance_cid: cid,
+            } => Provenance::Canon { cid: cid.clone() },
+        }
+    }
+}
+
+pub trait TracePosOperate {
+    fn get_trace_pos(&self) -> TracePos;
+
+    fn set_trace_pos(&mut self, pos: TracePos);
+}
+
+impl TracePosOperate for ValueAggregate {
+    fn get_trace_pos(&self) -> TracePos {
+        match self {
+            ValueAggregate::Literal(literal) => literal.trace_pos,
+            ValueAggregate::ServiceResult {
+                result: service_result,
+                provenance_cid: _,
+            } => service_result.trace_pos,
+            ValueAggregate::Canon {
+                result: canon_result,
+                provenance_cid: _,
+            } => canon_result.trace_pos,
+        }
+    }
+
+    fn set_trace_pos(&mut self, trace_pos: TracePos) {
+        let trace_pos_ref = match self {
+            ValueAggregate::Literal(literal) => &mut literal.trace_pos,
+            ValueAggregate::ServiceResult {
+                result: service_result,
+                provenance_cid: _,
+            } => &mut service_result.trace_pos,
+            ValueAggregate::Canon {
+                result: canon_result,
+                provenance_cid: _,
+            } => &mut canon_result.trace_pos,
+        };
+        *trace_pos_ref = trace_pos;
+    }
+}
+
+use std::fmt;
+
+impl fmt::Display for ValueAggregate {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        let (result, tetraplet, trace_pos) = self.as_inner_parts();
+        write!(
+            f,
+            "value: {}, tetraplet: {}, position: {}, provenance: {:?} ",
+            result,
+            tetraplet,
+            trace_pos,
+            self.get_provenance(),
+        )
+    }
+}
+
+impl<'i> fmt::Display for ScalarRef<'i> {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        match self {
+            ScalarRef::Value(value) => write!(f, "{value:?}")?,
+            ScalarRef::IterableValue(cursor) => {
+                let iterable = &cursor.iterable;
+                write!(f, "cursor, current value: {:?}", iterable.peek())?;
+            }
+        }
+
+        Ok(())
+    }
+}
+
\ No newline at end of file diff --git a/src/air/execution_step/value_types/scalar/values.rs.html b/src/air/execution_step/value_types/scalar/values.rs.html new file mode 100644 index 00000000..11e15c5a --- /dev/null +++ b/src/air/execution_step/value_types/scalar/values.rs.html @@ -0,0 +1,189 @@ +values.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use crate::execution_step::RcSecurityTetraplet;
+use crate::JValue;
+
+use air_interpreter_data::TracePos;
+use polyplets::SecurityTetraplet;
+use serde::Deserialize;
+use serde::Serialize;
+
+use std::rc::Rc;
+
+#[derive(Debug, Clone, Eq, PartialEq, Serialize, Deserialize)]
+// no lambda here are literal + lambda is literal
+pub struct LiteralAggregate {
+    pub result: JValue,
+    // this Rc is not really shared ATM, as execution passes through the Resolvable needle
+    pub init_peer_id: Rc<str>,
+    // TODO #[serde(skip)]
+    pub trace_pos: TracePos,
+}
+
+#[derive(Debug, Clone, Eq, PartialEq, Serialize, Deserialize)]
+pub struct ServiceResultAggregate {
+    pub result: JValue,
+    pub tetraplet: RcSecurityTetraplet,
+    // TODO #[serde(skip)]
+    pub trace_pos: TracePos,
+}
+
+#[derive(Debug, Clone, Eq, PartialEq, Serialize, Deserialize)]
+pub struct CanonResultAggregate {
+    pub result: JValue,
+    pub peer_id: Rc<str>,
+    pub lambda: Rc<str>,
+    // TODO #[serde(skip)]
+    pub trace_pos: TracePos,
+}
+
+impl LiteralAggregate {
+    pub(crate) fn new(result: JValue, init_peer_id: Rc<str>, trace_pos: TracePos) -> Self {
+        Self {
+            result,
+            init_peer_id,
+            trace_pos,
+        }
+    }
+
+    pub(crate) fn get_tetraplet(&self) -> RcSecurityTetraplet {
+        SecurityTetraplet::literal_tetraplet(self.init_peer_id.as_ref()).into()
+    }
+}
+
+impl ServiceResultAggregate {
+    pub(crate) fn new(result: JValue, tetraplet: RcSecurityTetraplet, trace_pos: TracePos) -> Self {
+        Self {
+            result,
+            tetraplet,
+            trace_pos,
+        }
+    }
+}
+
+impl CanonResultAggregate {
+    pub(crate) fn new(result: JValue, peer_id: Rc<str>, lambda: &str, trace_pos: TracePos) -> Self {
+        Self {
+            result,
+            peer_id,
+            lambda: lambda.into(),
+            trace_pos,
+        }
+    }
+
+    pub(crate) fn get_tetraplet(&self) -> RcSecurityTetraplet {
+        SecurityTetraplet::new(self.peer_id.as_ref(), "", "", self.lambda.as_ref()).into()
+    }
+}
+
\ No newline at end of file diff --git a/src/air/execution_step/value_types/stream/mod.rs.html b/src/air/execution_step/value_types/stream/mod.rs.html new file mode 100644 index 00000000..e7d4e6ce --- /dev/null +++ b/src/air/execution_step/value_types/stream/mod.rs.html @@ -0,0 +1,61 @@ +mod.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+mod recursive_stream;
+mod stream_definition;
+mod values_matrix;
+
+pub(crate) use recursive_stream::IterableValue;
+pub(crate) use recursive_stream::RecursiveCursorState;
+pub(crate) use recursive_stream::RecursiveStreamCursor;
+pub(crate) use recursive_stream::StreamCursor;
+pub(crate) use stream_definition::Generation;
+pub(crate) use stream_definition::Stream;
+pub(crate) use stream_definition::STREAM_MAX_SIZE;
+
\ No newline at end of file diff --git a/src/air/execution_step/value_types/stream/recursive_stream.rs.html b/src/air/execution_step/value_types/stream/recursive_stream.rs.html new file mode 100644 index 00000000..632c5a4c --- /dev/null +++ b/src/air/execution_step/value_types/stream/recursive_stream.rs.html @@ -0,0 +1,509 @@ +recursive_stream.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::Stream;
+use crate::execution_step::value_types::Iterable;
+use crate::execution_step::value_types::IterableItem;
+use crate::execution_step::value_types::IterableVecResolvedCall;
+use crate::execution_step::ValueAggregate;
+
+use air_interpreter_data::GenerationIdx;
+
+pub(crate) type IterableValue = Box<dyn for<'ctx> Iterable<'ctx, Item = IterableItem<'ctx>>>;
+
+/// Tracks a state of a stream by storing last generation of every value type.
+#[derive(Debug, Clone, Copy)]
+pub struct StreamCursor {
+    pub previous_start_idx: GenerationIdx,
+    pub current_start_idx: GenerationIdx,
+    pub new_start_idx: GenerationIdx,
+}
+
+/// Intended to generate values for recursive stream handling.
+///
+/// It could be considered as a simple state machine which should be started with
+/// fold_started and then continued with next_iteration:
+///    met_fold_start  - met_iteration_end - ... met_iteration_end - Exhausted
+///          |                  |
+///      Exhausted          Exhausted
+#[derive(Debug, Clone, Copy)]
+pub(crate) struct RecursiveStreamCursor {
+    cursor: StreamCursor,
+}
+
+pub(crate) enum RecursiveCursorState {
+    Continue(Vec<IterableValue>),
+    Exhausted,
+}
+
+impl RecursiveStreamCursor {
+    pub fn new() -> Self {
+        Self {
+            cursor: StreamCursor::empty(),
+        }
+    }
+
+    pub fn met_fold_start(&mut self, stream: &mut Stream<ValueAggregate>) -> RecursiveCursorState {
+        let state = self.cursor_state(stream);
+        self.cursor = stream.cursor();
+
+        if state.should_continue() {
+            // add a new generation to made all consequence "new" (meaning that they are just executed on this peer)
+            // write operation to this stream to write to this new generation
+            stream.new_values().add_new_empty_generation();
+        }
+
+        state
+    }
+
+    pub fn met_iteration_end(&mut self, stream: &mut Stream<ValueAggregate>) -> RecursiveCursorState {
+        let state = self.cursor_state(stream);
+
+        // remove last generation if it empty to track cursor state
+        remove_last_generation_if_empty(stream);
+        self.cursor = stream.cursor();
+        // add new last generation to store new values into this generation
+        stream.new_values().add_new_empty_generation();
+
+        state
+    }
+
+    fn cursor_state(&self, stream: &Stream<ValueAggregate>) -> RecursiveCursorState {
+        let slice_iter = stream.slice_iter(self.cursor);
+        let iterable = Self::slice_iter_to_iterable(slice_iter);
+
+        RecursiveCursorState::from_iterable_values(iterable)
+    }
+
+    fn slice_iter_to_iterable<'value>(iter: impl Iterator<Item = &'value [ValueAggregate]>) -> Vec<IterableValue> {
+        iter.map(|iterable| {
+            let foldable = IterableVecResolvedCall::init(iterable.to_vec());
+            let foldable: IterableValue = Box::new(foldable);
+            foldable
+        })
+        .collect::<Vec<_>>()
+    }
+}
+
+fn remove_last_generation_if_empty(stream: &mut Stream<ValueAggregate>) {
+    if stream.new_values().last_generation_is_empty() {
+        stream.new_values().remove_last_generation();
+    }
+}
+
+impl StreamCursor {
+    pub(crate) fn empty() -> Self {
+        Self {
+            previous_start_idx: GenerationIdx::from(0),
+            current_start_idx: GenerationIdx::from(0),
+            new_start_idx: GenerationIdx::from(0),
+        }
+    }
+
+    pub(crate) fn new(
+        previous_start_idx: GenerationIdx,
+        current_start_idx: GenerationIdx,
+        new_start_idx: GenerationIdx,
+    ) -> Self {
+        Self {
+            previous_start_idx,
+            current_start_idx,
+            new_start_idx,
+        }
+    }
+}
+
+impl RecursiveCursorState {
+    pub(crate) fn from_iterable_values(values: Vec<IterableValue>) -> Self {
+        if values.is_empty() {
+            Self::Exhausted
+        } else {
+            Self::Continue(values)
+        }
+    }
+
+    pub(crate) fn should_continue(&self) -> bool {
+        matches!(self, Self::Continue(_))
+    }
+}
+
+#[cfg(test)]
+mod test {
+    use super::IterableValue;
+    use super::RecursiveCursorState;
+    use super::RecursiveStreamCursor;
+    use super::Stream;
+    use super::ValueAggregate;
+    use crate::execution_step::Generation;
+    use crate::execution_step::ServiceResultAggregate;
+    use crate::JValue;
+
+    use air_interpreter_cid::CID;
+
+    fn create_value(value: impl Into<JValue>) -> ValueAggregate {
+        ValueAggregate::from_service_result(
+            ServiceResultAggregate::new(value.into(), <_>::default(), 0.into()),
+            CID::new("some fake cid").into(),
+        )
+    }
+
+    fn iterables_unwrap(cursor_state: RecursiveCursorState) -> Vec<IterableValue> {
+        match cursor_state {
+            RecursiveCursorState::Continue(iterables) => iterables,
+            RecursiveCursorState::Exhausted => panic!("cursor is exhausted"),
+        }
+    }
+
+    #[test]
+    fn fold_started_empty_if_no_values() {
+        let mut stream = Stream::new();
+        let mut recursive_stream = RecursiveStreamCursor::new();
+        let cursor_state = recursive_stream.met_fold_start(&mut stream);
+
+        assert!(!cursor_state.should_continue())
+    }
+
+    #[test]
+    fn next_iteration_empty_if_no_values() {
+        let mut stream = Stream::new();
+        let mut recursive_stream = RecursiveStreamCursor::new();
+        let cursor_state = recursive_stream.met_iteration_end(&mut stream);
+
+        assert!(!cursor_state.should_continue())
+    }
+
+    #[test]
+    fn next_iteration_empty_if_no_values_added() {
+        let mut stream = Stream::new();
+        let mut recursive_stream = RecursiveStreamCursor::new();
+
+        let value = create_value("1");
+        stream.add_value(value, Generation::current(0)).unwrap();
+
+        let cursor_state = recursive_stream.met_fold_start(&mut stream);
+        let iterables = iterables_unwrap(cursor_state);
+        assert_eq!(iterables.len(), 1);
+
+        let cursor_state = recursive_stream.met_iteration_end(&mut stream);
+        assert!(!cursor_state.should_continue());
+    }
+
+    #[test]
+    fn one_recursive_iteration() {
+        let mut stream = Stream::new();
+        let mut recursive_stream = RecursiveStreamCursor::new();
+
+        let value = create_value("1");
+        stream.add_value(value.clone(), Generation::current(0)).unwrap();
+
+        let cursor_state = recursive_stream.met_fold_start(&mut stream);
+        let iterables = iterables_unwrap(cursor_state);
+        assert_eq!(iterables.len(), 1);
+
+        stream.add_value(value.clone(), Generation::new()).unwrap();
+        stream.add_value(value, Generation::new()).unwrap();
+
+        let cursor_state = recursive_stream.met_iteration_end(&mut stream);
+        let iterables = iterables_unwrap(cursor_state);
+        assert_eq!(iterables.len(), 1);
+
+        let cursor_state = recursive_stream.met_iteration_end(&mut stream);
+        assert!(!cursor_state.should_continue());
+    }
+
+    #[test]
+    fn add_value_into_prev_and_current() {
+        let mut stream = Stream::new();
+        let mut recursive_stream = RecursiveStreamCursor::new();
+
+        let value = create_value("1");
+        stream.add_value(value.clone(), Generation::current(0)).unwrap();
+
+        let cursor_state = recursive_stream.met_fold_start(&mut stream);
+        assert!(cursor_state.should_continue());
+
+        stream.add_value(value.clone(), Generation::previous(0)).unwrap();
+
+        let cursor_state = recursive_stream.met_iteration_end(&mut stream);
+        assert!(cursor_state.should_continue());
+
+        stream.add_value(value, Generation::current(1)).unwrap();
+
+        let cursor_state = recursive_stream.met_iteration_end(&mut stream);
+        assert!(cursor_state.should_continue());
+
+        let cursor_state = recursive_stream.met_iteration_end(&mut stream);
+        assert!(!cursor_state.should_continue());
+    }
+}
+
\ No newline at end of file diff --git a/src/air/execution_step/value_types/stream/stream_definition.rs.html b/src/air/execution_step/value_types/stream/stream_definition.rs.html new file mode 100644 index 00000000..a883267b --- /dev/null +++ b/src/air/execution_step/value_types/stream/stream_definition.rs.html @@ -0,0 +1,1207 @@ +stream_definition.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
+334
+335
+336
+337
+338
+339
+340
+341
+342
+343
+344
+345
+346
+347
+348
+349
+350
+351
+352
+353
+354
+355
+356
+357
+358
+359
+360
+361
+362
+363
+364
+365
+366
+367
+368
+369
+370
+371
+372
+373
+374
+375
+376
+377
+378
+379
+380
+381
+382
+383
+384
+385
+386
+387
+388
+389
+390
+391
+392
+393
+394
+395
+396
+397
+398
+399
+400
+401
+402
+403
+404
+405
+406
+407
+408
+409
+410
+411
+412
+413
+414
+415
+416
+417
+418
+419
+420
+421
+422
+423
+424
+425
+426
+427
+428
+429
+430
+431
+432
+433
+434
+435
+436
+437
+438
+439
+440
+441
+442
+443
+444
+445
+446
+447
+448
+449
+450
+451
+452
+453
+454
+455
+456
+457
+458
+459
+460
+461
+462
+463
+464
+465
+466
+467
+468
+469
+470
+471
+472
+473
+474
+475
+476
+477
+478
+479
+480
+481
+482
+483
+484
+485
+486
+487
+488
+489
+490
+491
+492
+493
+494
+495
+496
+497
+498
+499
+500
+501
+502
+503
+504
+505
+506
+507
+508
+509
+510
+511
+512
+513
+514
+515
+516
+517
+518
+519
+520
+521
+522
+523
+524
+525
+526
+527
+528
+529
+530
+531
+532
+533
+534
+535
+536
+537
+538
+539
+540
+541
+542
+543
+544
+545
+546
+547
+548
+549
+550
+551
+552
+553
+554
+555
+556
+557
+558
+559
+560
+561
+562
+563
+564
+565
+566
+567
+568
+569
+570
+571
+572
+573
+574
+575
+576
+577
+578
+579
+580
+581
+582
+583
+584
+585
+586
+587
+588
+589
+590
+591
+592
+593
+594
+595
+596
+597
+598
+599
+600
+601
+602
+603
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::values_matrix::NewValuesMatrix;
+use super::values_matrix::ValuesMatrix;
+use super::StreamCursor;
+use crate::execution_step::value_types::TracePosOperate;
+use crate::execution_step::ExecutionResult;
+
+use air_interpreter_data::GenerationIdx;
+use air_trace_handler::TraceHandler;
+
+/// This const limits the number of values in a Stream to mitigate
+/// endless recursive stream loop issue.
+pub(crate) const STREAM_MAX_SIZE: usize = 1024;
+
+/// Streams are CRDT-like append only data structures. They are guaranteed to have locally
+/// the same order of values on each peer.
+#[derive(Debug, Clone)]
+pub struct Stream<T> {
+    /// Values from previous data.
+    previous_values: ValuesMatrix<T>,
+
+    /// Values from current data.
+    current_values: ValuesMatrix<T>,
+
+    /// Values from call results or aps executed on a current peer.
+    new_values: NewValuesMatrix<T>,
+}
+
+impl<'value, T: 'value> Stream<T> {
+    pub(crate) fn new() -> Self {
+        Self {
+            previous_values: ValuesMatrix::new(),
+            current_values: ValuesMatrix::new(),
+            new_values: NewValuesMatrix::new(),
+        }
+    }
+
+    pub(crate) fn iter(&self) -> impl Iterator<Item = &T> {
+        self.previous_values
+            .iter()
+            .chain(self.current_values.iter())
+            .chain(self.new_values.iter())
+    }
+
+    // Contract: all slices will be non-empty
+    pub(crate) fn slice_iter(&self, cursor: StreamCursor) -> impl Iterator<Item = &[T]> {
+        self.previous_values
+            .slice_iter(cursor.previous_start_idx)
+            .chain(self.current_values.slice_iter(cursor.current_start_idx))
+            .chain(self.new_values.slice_iter(cursor.new_start_idx))
+    }
+
+    pub(crate) fn cursor(&self) -> StreamCursor {
+        StreamCursor::new(
+            self.previous_values.generations_count(),
+            self.current_values.generations_count(),
+            self.new_values.generations_count(),
+        )
+    }
+
+    pub(super) fn new_values(&mut self) -> &mut NewValuesMatrix<T> {
+        &mut self.new_values
+    }
+
+    fn check_stream_size_limit(&self) -> ExecutionResult<()> {
+        use crate::execution_step::ExecutionError;
+        use crate::UncatchableError;
+
+        let prev_size = self.previous_values.get_size();
+        let curr_size = self.current_values.get_size();
+        let new_size = self.new_values.get_size();
+        let cumulative_size = prev_size + curr_size + new_size;
+
+        if cumulative_size >= STREAM_MAX_SIZE {
+            Err(ExecutionError::Uncatchable(UncatchableError::StreamSizeLimitExceeded))
+        } else {
+            Ok(())
+        }
+    }
+}
+
+impl<'value, T: 'value + Clone + fmt::Display> Stream<T> {
+    pub(crate) fn add_value(&mut self, value: T, generation: Generation) -> ExecutionResult<()> {
+        match generation {
+            Generation::Previous(previous_gen) => self.previous_values.add_value_to_generation(value, previous_gen),
+            Generation::Current(current_gen) => self.current_values.add_value_to_generation(value, current_gen),
+            Generation::New => self.new_values.add_to_last_generation(value),
+        }
+        // This check limits the cumulative number of values in a stream to
+        // prevent neverending recursive stream use case.
+        self.check_stream_size_limit()
+    }
+}
+
+impl<'value, T: 'value + TracePosOperate + fmt::Display> Stream<T> {
+    /// Removes empty generations updating data.
+    pub(crate) fn compactify(&mut self, trace_ctx: &mut TraceHandler) -> ExecutionResult<()> {
+        self.previous_values.remove_empty_generations();
+        self.current_values.remove_empty_generations();
+        self.new_values.remove_empty_generations();
+
+        let start_idx = 0.into();
+        Self::update_generations(self.previous_values.slice_iter(0.into()), start_idx, trace_ctx)?;
+
+        let start_idx = self.previous_values.generations_count();
+        Self::update_generations(self.current_values.slice_iter(0.into()), start_idx, trace_ctx)?;
+
+        let start_idx = start_idx.checked_add(self.current_values.generations_count()).unwrap();
+        Self::update_generations(self.new_values.slice_iter(0.into()), start_idx, trace_ctx)?;
+
+        Ok(())
+    }
+
+    fn update_generations(
+        values: impl Iterator<Item = &'value [T]>,
+        start_idx: GenerationIdx,
+        trace_ctx: &mut TraceHandler,
+    ) -> ExecutionResult<()> {
+        use crate::execution_step::errors::UncatchableError;
+        use crate::execution_step::ExecutionError;
+
+        for (position, values) in values.enumerate() {
+            // TODO: replace it with error
+            let generation = start_idx.checked_add(position.into()).unwrap();
+            for value in values.iter() {
+                trace_ctx
+                    .update_generation(value.get_trace_pos(), generation)
+                    .map_err(|e| ExecutionError::Uncatchable(UncatchableError::GenerationCompactificationError(e)))?;
+            }
+        }
+
+        Ok(())
+    }
+}
+
+impl<T> Default for Stream<T> {
+    fn default() -> Self {
+        Self {
+            previous_values: <_>::default(),
+            current_values: <_>::default(),
+            new_values: <_>::default(),
+        }
+    }
+}
+
+use air_trace_handler::merger::MetApResult;
+use air_trace_handler::merger::ValueSource;
+
+#[derive(Clone, Copy, Debug, Eq, PartialEq)]
+pub enum Generation {
+    Previous(GenerationIdx),
+    Current(GenerationIdx),
+    New,
+}
+
+impl Generation {
+    #[cfg(test)]
+    pub fn previous(generation_id: u32) -> Self {
+        let generation_id = usize::try_from(generation_id).unwrap();
+        let generation_idx = GenerationIdx::from(generation_id);
+        Self::Previous(generation_idx)
+    }
+
+    #[cfg(test)]
+    pub fn current(generation_id: u32) -> Self {
+        let generation_id = usize::try_from(generation_id).unwrap();
+        let generation_idx = GenerationIdx::from(generation_id);
+        Self::Current(generation_idx)
+    }
+
+    pub fn from_met_result(result: &MetApResult) -> Self {
+        Self::from_data(result.value_source, result.generation)
+    }
+
+    pub fn from_data(data_type: ValueSource, generation: GenerationIdx) -> Self {
+        match data_type {
+            ValueSource::PreviousData => Generation::Previous(generation),
+            ValueSource::CurrentData => Generation::Current(generation),
+        }
+    }
+
+    pub fn new() -> Self {
+        Self::New
+    }
+}
+
+use std::fmt;
+
+impl<T: fmt::Display> fmt::Display for Stream<T> {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        writeln!(f, "previous values:\n{}", self.previous_values)?;
+        writeln!(f, "current values:\n{}", self.current_values)?;
+        writeln!(f, "new values:\n{}", self.new_values)
+    }
+}
+
+impl fmt::Display for Generation {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        match self {
+            Generation::Previous(generation) => write!(f, "previous({})", generation),
+            Generation::Current(generation) => write!(f, "current({})", generation),
+            Generation::New => write!(f, "new"),
+        }
+    }
+}
+
+#[cfg(test)]
+mod test {
+    use super::Generation;
+    use super::StreamCursor;
+    use super::TraceHandler;
+    use crate::execution_step::ServiceResultAggregate;
+    use crate::execution_step::ValueAggregate;
+    use crate::ExecutionError;
+    use crate::JValue;
+    use crate::UncatchableError;
+
+    use air_interpreter_cid::CID;
+    use air_interpreter_data::ApResult;
+    use air_interpreter_data::CanonResult;
+    use air_interpreter_data::ExecutedState;
+    use air_interpreter_data::ExecutionTrace;
+    use air_interpreter_data::TracePos;
+    use air_trace_handler::GenerationCompactificationError;
+    use serde_json::json;
+
+    type Stream = super::Stream<ValueAggregate>;
+
+    fn create_value(value: impl Into<JValue>) -> ValueAggregate {
+        ValueAggregate::from_service_result(
+            ServiceResultAggregate::new(value.into(), <_>::default(), 1.into()),
+            CID::new("some fake cid").into(),
+        )
+    }
+
+    fn create_value_with_pos(value: impl Into<JValue>, trace_pos: TracePos) -> ValueAggregate {
+        ValueAggregate::from_service_result(
+            ServiceResultAggregate::new(value.into(), <_>::default(), trace_pos),
+            CID::new("some fake cid").into(),
+        )
+    }
+
+    #[test]
+    fn test_iter() {
+        let value_1 = create_value(json!("value_1"));
+        let value_2 = create_value(json!("value_2"));
+        let mut stream = Stream::new();
+
+        stream.add_value(value_1.clone(), Generation::previous(0)).unwrap();
+        stream.add_value(value_2.clone(), Generation::previous(1)).unwrap();
+
+        let mut iter = stream.iter();
+        println!("  after getting iter");
+        assert_eq!(iter.next(), Some(&value_1));
+        assert_eq!(iter.next(), Some(&value_2));
+        assert_eq!(iter.next(), None);
+    }
+
+    #[test]
+    fn test_slice_iter_prev() {
+        let value_1 = create_value(json!("value_1"));
+        let value_2 = create_value(json!("value_2"));
+        let value_3 = create_value(json!("value_3"));
+        let value_4 = create_value(json!("value_4"));
+        let mut stream = Stream::new();
+
+        stream.add_value(value_1.clone(), Generation::previous(0)).unwrap();
+        stream.add_value(value_2.clone(), Generation::previous(0)).unwrap();
+        stream.add_value(value_3.clone(), Generation::previous(0)).unwrap();
+        stream.add_value(value_4.clone(), Generation::previous(0)).unwrap();
+
+        let mut slice_iter = stream.slice_iter(StreamCursor::empty());
+        assert_eq!(
+            slice_iter.next(),
+            Some(vec![value_1, value_2, value_3, value_4].as_slice())
+        );
+        assert_eq!(slice_iter.next(), None);
+    }
+
+    #[test]
+    fn test_slice_iter_current() {
+        let value_1 = create_value(json!("value_1"));
+        let value_2 = create_value(json!("value_2"));
+        let value_3 = create_value(json!("value_3"));
+        let value_4 = create_value(json!("value_4"));
+        let mut stream = Stream::new();
+
+        stream.add_value(value_1.clone(), Generation::current(0)).unwrap();
+        stream.add_value(value_2.clone(), Generation::current(0)).unwrap();
+        stream.add_value(value_3.clone(), Generation::current(0)).unwrap();
+        stream.add_value(value_4.clone(), Generation::current(0)).unwrap();
+
+        let mut slice_iter = stream.slice_iter(StreamCursor::empty());
+        assert_eq!(
+            slice_iter.next(),
+            Some(vec![value_1, value_2, value_3, value_4].as_slice())
+        );
+        assert_eq!(slice_iter.next(), None);
+    }
+
+    #[test]
+    fn test_slice_iter_new() {
+        let value_1 = create_value(json!("value_1"));
+        let value_2 = create_value(json!("value_2"));
+        let value_3 = create_value(json!("value_3"));
+        let value_4 = create_value(json!("value_4"));
+        let mut stream = Stream::new();
+
+        stream.add_value(value_1.clone(), Generation::New).unwrap();
+        stream.add_value(value_2.clone(), Generation::New).unwrap();
+        stream.add_value(value_3.clone(), Generation::New).unwrap();
+        stream.add_value(value_4.clone(), Generation::New).unwrap();
+
+        let mut slice_iter = stream.slice_iter(StreamCursor::empty());
+        assert_eq!(
+            slice_iter.next(),
+            Some(vec![value_1, value_2, value_3, value_4].as_slice())
+        );
+        assert_eq!(slice_iter.next(), None);
+    }
+
+    #[test]
+    fn test_iter_on_empty_stream() {
+        let stream = Stream::new();
+
+        let mut slice = stream.iter();
+        assert_eq!(slice.next(), None);
+    }
+
+    #[test]
+    fn test_slice_on_empty_stream() {
+        let stream = Stream::new();
+
+        let mut slice = stream.slice_iter(StreamCursor::empty());
+        assert_eq!(slice.next(), None);
+    }
+
+    #[test]
+    fn generation_from_current_data_after_previous() {
+        let value_1 = create_value(json!("value_1"));
+        let value_2 = create_value(json!("value_2"));
+        let mut stream = Stream::new();
+
+        stream.add_value(value_1.clone(), Generation::current(0)).unwrap();
+        stream.add_value(value_2.clone(), Generation::previous(0)).unwrap();
+
+        let mut iter = stream.iter();
+        assert_eq!(iter.next(), Some(&value_2));
+        assert_eq!(iter.next(), Some(&value_1));
+        assert_eq!(iter.next(), None);
+    }
+
+    #[test]
+    fn generation_from_new_data_after_current_and_previous() {
+        let value_1 = create_value(json!("value_1"));
+        let value_2 = create_value(json!("value_2"));
+        let value_3 = create_value(json!("value_3"));
+        let mut stream = Stream::new();
+
+        stream.add_value(value_1.clone(), Generation::new()).unwrap();
+        stream.add_value(value_2.clone(), Generation::current(0)).unwrap();
+        stream.add_value(value_3.clone(), Generation::previous(0)).unwrap();
+
+        let mut iter = stream.iter();
+        assert_eq!(iter.next(), Some(&value_3));
+        assert_eq!(iter.next(), Some(&value_2));
+        assert_eq!(iter.next(), Some(&value_1));
+        assert_eq!(iter.next(), None);
+    }
+
+    #[test]
+    fn empty_generations_skipped_in_slice_iter_prev() {
+        let value_1 = create_value(json!("value_1"));
+        let value_2 = create_value(json!("value_2"));
+        let value_3 = create_value(json!("value_3"));
+        let mut stream = Stream::new();
+
+        stream.add_value(value_1.clone(), Generation::previous(0)).unwrap();
+        stream.add_value(value_2.clone(), Generation::previous(1)).unwrap();
+        stream.add_value(value_3.clone(), Generation::previous(3)).unwrap();
+
+        let mut slice_iter = stream.slice_iter(StreamCursor::empty());
+        assert_eq!(slice_iter.next(), Some(vec![value_1].as_slice()));
+        assert_eq!(slice_iter.next(), Some(vec![value_2].as_slice()));
+        assert_eq!(slice_iter.next(), Some(vec![value_3].as_slice()));
+        assert_eq!(slice_iter.next(), None);
+    }
+
+    #[test]
+    fn empty_generations_skipped_in_slice_iter_current() {
+        let value_1 = create_value(json!("value_1"));
+        let value_2 = create_value(json!("value_2"));
+        let value_3 = create_value(json!("value_3"));
+        let mut stream = Stream::new();
+
+        stream.add_value(value_1.clone(), Generation::current(0)).unwrap();
+        stream.add_value(value_2.clone(), Generation::current(1)).unwrap();
+        stream.add_value(value_3.clone(), Generation::current(3)).unwrap();
+
+        let mut slice_iter = stream.slice_iter(StreamCursor::empty());
+        assert_eq!(slice_iter.next(), Some(vec![value_1].as_slice()));
+        assert_eq!(slice_iter.next(), Some(vec![value_2].as_slice()));
+        assert_eq!(slice_iter.next(), Some(vec![value_3].as_slice()));
+        assert_eq!(slice_iter.next(), None);
+    }
+
+    #[test]
+    fn compactification_with_previous_new_generation() {
+        let value_1 = create_value_with_pos(json!("value_1"), 0.into());
+        let value_2 = create_value_with_pos(json!("value_2"), 1.into());
+        let mut stream = Stream::new();
+
+        stream.add_value(value_1.clone(), Generation::previous(0)).unwrap();
+        stream.add_value(value_2.clone(), Generation::new()).unwrap();
+
+        let trace = ExecutionTrace::from(vec![]);
+        let mut trace_ctx = TraceHandler::from_trace(trace.clone(), trace);
+        let ap_result = ApResult::stub();
+        trace_ctx.meet_ap_end(ap_result.clone());
+        trace_ctx.meet_ap_end(ap_result);
+
+        let compactification_result = stream.compactify(&mut trace_ctx);
+        assert!(compactification_result.is_ok());
+
+        let actual_trace = trace_ctx.into_result_trace();
+        let expected_trace = vec![
+            ExecutedState::Ap(ApResult::new(0.into())),
+            ExecutedState::Ap(ApResult::new(1.into())),
+        ];
+        let expected_trace = ExecutionTrace::from(expected_trace);
+
+        assert_eq!(actual_trace, expected_trace);
+    }
+
+    #[test]
+    fn compactification_with_current_generation() {
+        let value_1 = create_value_with_pos(json!("value_1"), 0.into());
+        let value_2 = create_value_with_pos(json!("value_2"), 1.into());
+        let value_3 = create_value_with_pos(json!("value_3"), 2.into());
+        let mut stream = Stream::new();
+
+        stream.add_value(value_1.clone(), Generation::current(0)).unwrap();
+        stream.add_value(value_2.clone(), Generation::current(2)).unwrap();
+        stream.add_value(value_3.clone(), Generation::current(4)).unwrap();
+
+        let trace = ExecutionTrace::from(vec![]);
+        let mut trace_ctx = TraceHandler::from_trace(trace.clone(), trace);
+        let ap_result = ApResult::stub();
+        trace_ctx.meet_ap_end(ap_result.clone());
+        trace_ctx.meet_ap_end(ap_result.clone());
+        trace_ctx.meet_ap_end(ap_result);
+
+        let compactification_result = stream.compactify(&mut trace_ctx);
+        assert!(compactification_result.is_ok());
+
+        let actual_trace = trace_ctx.into_result_trace();
+        let expected_trace = vec![
+            ExecutedState::Ap(ApResult::new(0.into())),
+            ExecutedState::Ap(ApResult::new(1.into())),
+            ExecutedState::Ap(ApResult::new(2.into())),
+        ];
+        let expected_trace = ExecutionTrace::from(expected_trace);
+
+        assert_eq!(actual_trace, expected_trace);
+    }
+
+    #[test]
+    fn compactification_works_with_mixed_generations() {
+        let value_1 = create_value_with_pos(json!("value_1"), 0.into());
+        let value_2 = create_value_with_pos(json!("value_2"), 1.into());
+        let value_3 = create_value_with_pos(json!("value_3"), 2.into());
+        let value_4 = create_value_with_pos(json!("value_1"), 3.into());
+        let value_5 = create_value_with_pos(json!("value_2"), 4.into());
+        let value_6 = create_value_with_pos(json!("value_3"), 5.into());
+        let mut stream = Stream::new();
+
+        stream.add_value(value_1.clone(), Generation::new()).unwrap();
+        stream.add_value(value_2.clone(), Generation::current(4)).unwrap();
+        stream.add_value(value_3.clone(), Generation::current(0)).unwrap();
+        stream.add_value(value_4.clone(), Generation::previous(100)).unwrap();
+        stream.add_value(value_5.clone(), Generation::new()).unwrap();
+        stream.add_value(value_6.clone(), Generation::current(2)).unwrap();
+
+        let trace = ExecutionTrace::from(vec![]);
+        let mut trace_ctx = TraceHandler::from_trace(trace.clone(), trace);
+        let ap_result = ApResult::stub();
+        trace_ctx.meet_ap_end(ap_result.clone());
+        trace_ctx.meet_ap_end(ap_result.clone());
+        trace_ctx.meet_ap_end(ap_result.clone());
+        trace_ctx.meet_ap_end(ap_result.clone());
+        trace_ctx.meet_ap_end(ap_result.clone());
+        trace_ctx.meet_ap_end(ap_result);
+
+        let compactification_result = stream.compactify(&mut trace_ctx);
+        assert!(compactification_result.is_ok());
+
+        let actual_trace = trace_ctx.into_result_trace();
+        let expected_trace = vec![
+            ExecutedState::Ap(ApResult::new(4.into())),
+            ExecutedState::Ap(ApResult::new(3.into())),
+            ExecutedState::Ap(ApResult::new(1.into())),
+            ExecutedState::Ap(ApResult::new(0.into())),
+            ExecutedState::Ap(ApResult::new(4.into())),
+            ExecutedState::Ap(ApResult::new(2.into())),
+        ];
+        let expected_trace = ExecutionTrace::from(expected_trace);
+
+        assert_eq!(actual_trace, expected_trace);
+    }
+
+    #[test]
+    fn compactification_invalid_state_error() {
+        let value_1 = create_value(json!("value_1"));
+        let mut stream = Stream::new();
+
+        stream.add_value(value_1.clone(), Generation::current(0)).unwrap();
+
+        let trace = ExecutionTrace::from(vec![]);
+        let mut trace_ctx = TraceHandler::from_trace(trace.clone(), trace);
+        let canon_result = CanonResult::executed(CID::new("fake canon CID"));
+        trace_ctx.meet_canon_end(canon_result.clone());
+        trace_ctx.meet_canon_end(canon_result.clone());
+        trace_ctx.meet_canon_end(canon_result);
+
+        let compactification_result = stream.compactify(&mut trace_ctx);
+        assert!(matches!(
+            compactification_result,
+            Err(ExecutionError::Uncatchable(
+                UncatchableError::GenerationCompactificationError(
+                    GenerationCompactificationError::TracePosPointsToInvalidState { .. }
+                )
+            ))
+        ));
+    }
+
+    #[test]
+    fn compactification_points_to_nowhere_error() {
+        let value_1 = create_value(json!("value_1"));
+        let mut stream = Stream::new();
+
+        stream.add_value(value_1.clone(), Generation::current(0)).unwrap();
+
+        let trace = ExecutionTrace::from(vec![]);
+        let mut trace_ctx = TraceHandler::from_trace(trace.clone(), trace);
+
+        let compactification_result = stream.compactify(&mut trace_ctx);
+        assert!(matches!(
+            compactification_result,
+            Err(ExecutionError::Uncatchable(
+                UncatchableError::GenerationCompactificationError(
+                    GenerationCompactificationError::TracePosPointsToNowhere { .. }
+                )
+            ))
+        ));
+    }
+
+    #[test]
+    fn stream_size_limit() {
+        use super::STREAM_MAX_SIZE;
+        use crate::UncatchableError;
+
+        let mut stream = Stream::new();
+
+        let value = create_value(json!("1"));
+
+        for _ in 0..STREAM_MAX_SIZE / 2 {
+            stream.add_value(value.clone(), Generation::current(0)).unwrap();
+        }
+
+        for _ in 0..STREAM_MAX_SIZE / 4 {
+            stream.add_value(value.clone(), Generation::previous(0)).unwrap();
+        }
+
+        for _ in 0..STREAM_MAX_SIZE / 4 - 1 {
+            stream.add_value(value.clone(), Generation::new()).unwrap();
+        }
+
+        let add_value_result = stream.add_value(value.clone(), Generation::new());
+
+        let Err(ExecutionError::Uncatchable(error)) = add_value_result else {
+            panic!("there must be CatchableError")
+        };
+        assert!(matches!(error, UncatchableError::StreamSizeLimitExceeded));
+    }
+}
+
\ No newline at end of file diff --git a/src/air/execution_step/value_types/stream/values_matrix.rs.html b/src/air/execution_step/value_types/stream/values_matrix.rs.html new file mode 100644 index 00000000..96db38e3 --- /dev/null +++ b/src/air/execution_step/value_types/stream/values_matrix.rs.html @@ -0,0 +1,379 @@ +values_matrix.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use air_interpreter_data::GenerationIdx;
+
+use typed_index_collections::TiVec;
+
+/// It is intended to store values according to generations which stream has. Each generation could
+/// contain several values, generation are ordered, meaning that values in elder generations are
+/// handled by AIR instructions (such as fold) later. Also, there is an order between values in one
+/// generation. And being placed by generations values could be considered as a matrix.
+///
+/// This matrix is used for values in previous and current data.
+#[derive(Debug, Clone)]
+pub(crate) struct ValuesMatrix<T> {
+    /// The first Vec represents generations, the second values in a generation. Generation is a set
+    /// of values that interpreter obtained from one particle. It means that number of generation on
+    /// a peer is equal to number of the interpreter runs in context of one particle.
+    values: TiVec<GenerationIdx, Vec<T>>,
+    /// This is a counter to track number of values in the matrix.
+    size: usize,
+}
+
+impl<T> ValuesMatrix<T> {
+    pub fn new() -> Self {
+        Self {
+            values: TiVec::new(),
+            size: 0,
+        }
+    }
+
+    pub fn remove_empty_generations(&mut self) {
+        self.values.retain(|generation| !generation.is_empty())
+    }
+
+    pub fn generations_count(&self) -> GenerationIdx {
+        self.values.len().into()
+    }
+
+    pub fn iter(&self) -> impl Iterator<Item = &T> {
+        self.values.iter().flat_map(|generation| generation.iter())
+    }
+
+    pub fn slice_iter(&self, skip: GenerationIdx) -> impl Iterator<Item = &[T]> {
+        self.values
+            .iter()
+            .filter(|generation| !generation.is_empty())
+            .skip(skip.into())
+            .map(|generation| generation.as_ref())
+    }
+
+    pub fn get_size(&self) -> usize {
+        self.size
+    }
+}
+
+impl<T: Clone> ValuesMatrix<T> {
+    pub fn add_value_to_generation(&mut self, value: T, generation_idx: GenerationIdx) {
+        if generation_idx >= self.values.len() {
+            // TODO: replace unwrap with error
+            let new_size = generation_idx.checked_add(1.into()).unwrap();
+            self.values.resize(new_size.into(), Vec::new());
+        }
+
+        self.values[generation_idx].push(value);
+        self.size += 1;
+    }
+}
+
+/// It's intended to handle new values from call results.
+#[derive(Debug, Clone)]
+pub(crate) struct NewValuesMatrix<T>(ValuesMatrix<T>);
+
+impl<T> NewValuesMatrix<T> {
+    pub fn new() -> Self {
+        let values = ValuesMatrix::new();
+        Self(values)
+    }
+
+    pub fn add_new_empty_generation(&mut self) {
+        self.0.values.push(vec![]);
+    }
+
+    pub fn remove_empty_generations(&mut self) {
+        self.0.remove_empty_generations();
+    }
+
+    pub fn remove_last_generation(&mut self) {
+        self.0.values.pop();
+    }
+
+    pub fn last_generation_is_empty(&mut self) -> bool {
+        if self.0.values.is_empty() {
+            return true;
+        }
+
+        self.0.values[self.last_non_empty_generation_idx()].is_empty()
+    }
+
+    pub fn iter(&self) -> impl Iterator<Item = &T> {
+        self.0.iter()
+    }
+
+    pub fn slice_iter(&self, skip: GenerationIdx) -> impl Iterator<Item = &[T]> {
+        self.0.slice_iter(skip)
+    }
+
+    pub fn generations_count(&self) -> GenerationIdx {
+        self.0.generations_count()
+    }
+
+    pub fn last_non_empty_generation_idx(&self) -> GenerationIdx {
+        let values_len = self.0.values.len();
+        if values_len == 0 {
+            return 0.into();
+        }
+
+        (values_len - 1).into()
+    }
+
+    pub fn get_size(&self) -> usize {
+        self.0.size
+    }
+}
+
+impl<T: Clone> NewValuesMatrix<T> {
+    pub fn add_to_last_generation(&mut self, value: T) {
+        let last_generation_idx = self.last_non_empty_generation_idx();
+        self.0.add_value_to_generation(value, last_generation_idx);
+    }
+}
+
+impl<T> Default for ValuesMatrix<T> {
+    fn default() -> Self {
+        Self {
+            values: TiVec::new(),
+            size: 0,
+        }
+    }
+}
+
+impl<T> Default for NewValuesMatrix<T> {
+    fn default() -> Self {
+        Self(<_>::default())
+    }
+}
+
+use std::fmt;
+
+impl<T: fmt::Display> fmt::Display for ValuesMatrix<T> {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        if self.values.is_empty() {
+            return write!(f, "[]");
+        }
+
+        writeln!(f, "[")?;
+        for (idx, generation_values) in self.values.iter_enumerated() {
+            write!(f, " -- {idx}: ")?;
+            for value in generation_values.iter() {
+                write!(f, "{value}, ")?;
+            }
+            writeln!(f)?;
+        }
+
+        write!(f, "]")
+    }
+}
+
+impl<T: fmt::Display> fmt::Display for NewValuesMatrix<T> {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        self.0.fmt(f)
+    }
+}
+
\ No newline at end of file diff --git a/src/air/execution_step/value_types/stream_map.rs.html b/src/air/execution_step/value_types/stream_map.rs.html new file mode 100644 index 00000000..be9e72d1 --- /dev/null +++ b/src/air/execution_step/value_types/stream_map.rs.html @@ -0,0 +1,695 @@ +stream_map.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
+334
+335
+336
+337
+338
+339
+340
+341
+342
+343
+344
+345
+346
+347
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::Generation;
+use super::Stream;
+use super::ValueAggregate;
+use crate::execution_step::execution_context::stream_map_key::StreamMapKey;
+use crate::execution_step::execution_context::stream_map_key::KEY_FIELD_NAME;
+use crate::execution_step::value_types::TracePosOperate;
+use crate::execution_step::ExecutionResult;
+use crate::JValue;
+
+use air_interpreter_value::JsonString;
+use air_trace_handler::TraceHandler;
+
+pub(super) static VALUE_FIELD_NAME: &str = "value";
+
+pub(super) fn from_key_value(key: StreamMapKey, value: &JValue) -> JValue {
+    maplit::hashmap! {
+        VALUE_FIELD_NAME => value.clone(),
+        KEY_FIELD_NAME => key.into(),
+    }
+    .into()
+}
+
+#[derive(Debug, Default, Clone)]
+pub struct StreamMap {
+    stream: Stream,
+}
+
+impl StreamMap {
+    pub(crate) fn new() -> Self {
+        Self { stream: Stream::new() }
+    }
+
+    pub(crate) fn insert(
+        &mut self,
+        key: StreamMapKey,
+        value: &ValueAggregate,
+        generation: Generation,
+    ) -> ExecutionResult<()> {
+        let obj = from_key_value(key, value.get_result());
+        let value = ValueAggregate::new(
+            obj,
+            value.get_tetraplet(),
+            value.get_trace_pos(),
+            value.get_provenance(),
+        );
+        self.stream.add_value(value, generation)
+    }
+
+    pub(crate) fn compactify(&mut self, trace_ctx: &mut TraceHandler) -> ExecutionResult<()> {
+        self.stream.compactify(trace_ctx)
+    }
+
+    pub(crate) fn get_mut_stream_ref(&mut self) -> &mut Stream {
+        &mut self.stream
+    }
+
+    pub(crate) fn iter(&self) -> impl Iterator<Item = &ValueAggregate> {
+        self.stream.iter()
+    }
+
+    pub(crate) fn iter_unique_key_object(&self) -> impl Iterator<Item = (JsonString, JValue)> + '_ {
+        use std::collections::HashSet;
+        let mut met_keys = HashSet::new();
+
+        // There are two issues with this implementation:
+        // 1. There might be key values overlap, given the key value is casted to String, e.g. 42 vs "42".
+        // 2. The original kvpair key field has an unsupported type, e.g. float.
+        self.stream.iter().filter_map(move |value_aggregate| {
+            let (value, ..) = value_aggregate.as_inner_parts();
+
+            let object = value.as_object()?;
+
+            // This monadic chain casts numeric and string keys to string so that string "42" and
+            // number 42 are considered equal.
+            let key = object
+                .get(KEY_FIELD_NAME)
+                .and_then(StreamMapKey::from_value_ref)
+                .and_then(|key| if met_keys.insert(key.to_key()) { Some(key) } else { None })?;
+
+            let value = object.get(VALUE_FIELD_NAME)?.clone();
+
+            Some((key.to_key(), value))
+        })
+    }
+}
+
+use std::fmt;
+
+impl fmt::Display for StreamMap {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        self.stream.fmt(f)
+    }
+}
+
+#[cfg(test)]
+mod test {
+    use super::Generation;
+    use super::StreamMap;
+    use crate::execution_step::execution_context::stream_map_key::StreamMapKey;
+    use crate::execution_step::value_types::stream_map::from_key_value;
+    use crate::execution_step::ValueAggregate;
+    use crate::ExecutionError;
+    use crate::JValue;
+    use crate::UncatchableError;
+
+    use air_interpreter_cid::CID;
+    use air_interpreter_data::ExecutionTrace;
+    use air_trace_handler::GenerationCompactificationError;
+    use air_trace_handler::TraceHandler;
+
+    fn create_value_aggregate(value: impl Into<JValue>) -> ValueAggregate {
+        ValueAggregate::new(
+            value.into(),
+            <_>::default(),
+            0.into(),
+            air_interpreter_data::Provenance::literal(),
+        )
+    }
+
+    fn compare_stream_iter<'value>(
+        mut iter: impl Iterator<Item = &'value ValueAggregate>,
+        key: StreamMapKey,
+        value: impl Into<JValue>,
+    ) -> bool {
+        let value = value.into();
+        let actual_value = iter.next().map(|e| e.get_result()).unwrap();
+        let expected_value = from_key_value(key, &value);
+
+        actual_value == &expected_value
+    }
+
+    #[test]
+    fn test_from_value_key_str() {
+        let key = StreamMapKey::Str("some_key".into());
+        let value = "1";
+        let value_aggregate = create_value_aggregate(value);
+
+        let mut stream_map = StreamMap::new();
+        stream_map
+            .insert(key.clone(), &value_aggregate, Generation::New)
+            .unwrap();
+        let mut iter = stream_map.stream.iter();
+
+        assert!(compare_stream_iter(&mut iter, key, value));
+        assert_eq!(iter.next(), None);
+    }
+
+    #[test]
+    fn test_from_value_key_int() {
+        let key = StreamMapKey::I64(42.into());
+        let value = "1";
+        let value_aggregate = create_value_aggregate(value);
+
+        let mut stream_map = StreamMap::new();
+        stream_map
+            .insert(key.clone(), &value_aggregate, Generation::New)
+            .unwrap();
+        let mut iter = stream_map.stream.iter();
+
+        assert!(compare_stream_iter(&mut iter, key, value));
+        assert_eq!(iter.next(), None);
+    }
+
+    #[test]
+    fn test_insert() {
+        let key_1_2 = StreamMapKey::Str("some_key".into());
+        let value_1 = "1";
+        let value_aggregate_1 = create_value_aggregate(value_1);
+
+        let value_2 = "2";
+        let value_aggregate_2 = create_value_aggregate(value_2);
+
+        let mut stream_map = StreamMap::new();
+        stream_map
+            .insert(key_1_2.clone(), &value_aggregate_1, Generation::new())
+            .unwrap();
+        stream_map
+            .insert(key_1_2.clone(), &value_aggregate_2, Generation::current(0))
+            .unwrap();
+
+        let key_3 = StreamMapKey::Str("other_key".into());
+        let value_3 = "3";
+        let value_aggregate_3 = create_value_aggregate(value_3);
+        stream_map
+            .insert(key_3.clone(), &value_aggregate_3, Generation::current(0))
+            .unwrap();
+
+        let key_4 = StreamMapKey::I64(42.into());
+        let value_4 = "4";
+        let value_aggregate_4 = create_value_aggregate(value_4);
+        stream_map
+            .insert(key_4.clone(), &value_aggregate_4, Generation::current(0))
+            .unwrap();
+
+        let mut iter = stream_map.stream.iter();
+
+        assert!(compare_stream_iter(&mut iter, key_1_2.clone(), value_2));
+        assert!(compare_stream_iter(&mut iter, key_3, value_3));
+        assert!(compare_stream_iter(&mut iter, key_4, value_4));
+        assert!(compare_stream_iter(&mut iter, key_1_2, value_1));
+        assert_eq!(iter.next(), None);
+    }
+
+    #[test]
+    fn compactification_invalid_state_error() {
+        use air_interpreter_data::CanonResult;
+
+        let key = StreamMapKey::Str("some_key".into());
+        let value = "1";
+        let value_aggregate = create_value_aggregate(value);
+        let mut stream_map = StreamMap::new();
+
+        stream_map
+            .insert(key, &value_aggregate, Generation::current(0))
+            .unwrap();
+
+        let trace = ExecutionTrace::from(vec![]);
+        let mut trace_ctx = TraceHandler::from_trace(trace.clone(), trace);
+        let canon_result = CanonResult::executed(CID::new("fake canon CID"));
+        trace_ctx.meet_canon_end(canon_result.clone());
+        trace_ctx.meet_canon_end(canon_result.clone());
+        trace_ctx.meet_canon_end(canon_result);
+
+        let compactification_result = stream_map.compactify(&mut trace_ctx);
+        assert!(matches!(
+            compactification_result,
+            Err(ExecutionError::Uncatchable(
+                UncatchableError::GenerationCompactificationError(
+                    GenerationCompactificationError::TracePosPointsToInvalidState { .. }
+                )
+            ))
+        ));
+    }
+
+    #[test]
+    fn compactification_points_to_nowhere_error() {
+        let key = StreamMapKey::Str("some_key".into());
+        let value = "1";
+        let value_aggregate = create_value_aggregate(value);
+        let mut stream_map = StreamMap::new();
+
+        stream_map
+            .insert(key, &value_aggregate, Generation::current(0))
+            .unwrap();
+
+        let trace = ExecutionTrace::from(vec![]);
+        let mut trace_ctx = TraceHandler::from_trace(trace.clone(), trace);
+
+        let compactification_result = stream_map.compactify(&mut trace_ctx);
+        assert!(matches!(
+            compactification_result,
+            Err(ExecutionError::Uncatchable(
+                UncatchableError::GenerationCompactificationError(
+                    GenerationCompactificationError::TracePosPointsToNowhere { .. }
+                )
+            ))
+        ));
+    }
+
+    fn generate_key_values(count: usize) -> Vec<(String, ValueAggregate)> {
+        (0..count)
+            .map(|id| {
+                let key = id.to_string();
+                let value = id.into();
+                let value = ValueAggregate::new(
+                    value,
+                    <_>::default(),
+                    0.into(),
+                    air_interpreter_data::Provenance::literal(),
+                );
+
+                (key, value)
+            })
+            .collect()
+    }
+
+    fn insert_into_map(stream_map: &mut StreamMap, key_value: &(String, ValueAggregate), generation: Generation) {
+        stream_map
+            .insert(key_value.0.as_str().into(), &key_value.1, generation)
+            .unwrap();
+    }
+
+    fn bulk_insert_into_map(
+        stream_map: &mut StreamMap,
+        kvpairs: &Vec<(String, ValueAggregate)>,
+        kvpairs_ids: Vec<usize>,
+        generations_ids: Vec<u32>,
+    ) {
+        kvpairs_ids
+            .into_iter()
+            .zip(generations_ids.into_iter())
+            .for_each(|(kvpair_id, generation_id)| {
+                insert_into_map(stream_map, &kvpairs[kvpair_id], Generation::current(generation_id))
+            });
+    }
+
+    #[test]
+    fn test_iter_unique_key_object() {
+        const TEST_DATA_SIZE: usize = 5;
+        let key_values = generate_key_values(TEST_DATA_SIZE);
+
+        let key: u32 = 2;
+        let value = 2;
+        let value = ValueAggregate::new(
+            value.into(),
+            <_>::default(),
+            0.into(),
+            air_interpreter_data::Provenance::literal(),
+        );
+
+        let mut stream_map_json_kvpairs = StreamMap::new();
+        let _ = stream_map_json_kvpairs.insert(key.into(), &value, Generation::current(0));
+
+        bulk_insert_into_map(
+            &mut stream_map_json_kvpairs,
+            &key_values,
+            vec![0, 0, 2, 2, 2, 1, 3],
+            vec![0, 1, 1, 3, 4, 4, 2],
+        );
+        let mut iter = stream_map_json_kvpairs.iter_unique_key_object();
+
+        assert_eq!(("2".into(), 2.into()), iter.next().unwrap());
+        assert_eq!(("0".into(), 0.into()), iter.next().unwrap());
+        assert_eq!(("3".into(), 3.into()), iter.next().unwrap());
+        assert_eq!(("1".into(), 1.into()), iter.next().unwrap());
+        assert_eq!(iter.next(), None);
+    }
+}
+
\ No newline at end of file diff --git a/src/air/execution_step/value_types/utils.rs.html b/src/air/execution_step/value_types/utils.rs.html new file mode 100644 index 00000000..e09c8796 --- /dev/null +++ b/src/air/execution_step/value_types/utils.rs.html @@ -0,0 +1,69 @@ +utils.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use air_lambda_ast::LambdaAST;
+use polyplets::SecurityTetraplet;
+
+pub(crate) fn populate_tetraplet_with_lambda(
+    mut tetraplet: SecurityTetraplet,
+    lambda: &LambdaAST<'_>,
+) -> SecurityTetraplet {
+    match lambda {
+        LambdaAST::ValuePath(_) => {
+            tetraplet.add_lens(&lambda.to_string());
+            tetraplet
+        }
+        LambdaAST::Functor(_) => SecurityTetraplet::new("", "", "", lambda.to_string()),
+    }
+}
+
\ No newline at end of file diff --git a/src/air/farewell_step/errors.rs.html b/src/air/farewell_step/errors.rs.html new file mode 100644 index 00000000..92173c26 --- /dev/null +++ b/src/air/farewell_step/errors.rs.html @@ -0,0 +1,107 @@ +errors.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use crate::ToErrorCode;
+
+use air_interpreter_interface::CallResults;
+use fluence_keypair::error::SigningError;
+use strum::EnumCount;
+use strum::IntoEnumIterator;
+use strum_macros::EnumCount as EnumCountMacro;
+use strum_macros::EnumDiscriminants;
+use strum_macros::EnumIter;
+use thiserror::Error as ThisError;
+
+/// Errors happened during the interpreter farewell step.
+#[derive(Debug, EnumDiscriminants, EnumCountMacro, ThisError)]
+#[strum_discriminants(derive(EnumIter))]
+pub enum FarewellError {
+    /// Call results should be empty at the end of execution thanks to a execution invariant.
+    #[error(
+        "after finishing execution of supplied AIR, there are some unprocessed call results: `{0:?}`, probably a wrong call_id used"
+    )]
+    UnprocessedCallResult(CallResults),
+}
+
+impl ToErrorCode for FarewellError {
+    fn to_error_code(&self) -> i64 {
+        use crate::utils::FAREWELL_ERRORS_START_ID;
+        crate::generate_to_error_code!(self, FarewellError, FAREWELL_ERRORS_START_ID)
+    }
+}
+
+impl ToErrorCode for SigningError {
+    fn to_error_code(&self) -> i64 {
+        crate::utils::FAREWELL_ERRORS_START_ID + FarewellError::COUNT as i64
+    }
+}
+
\ No newline at end of file diff --git a/src/air/farewell_step/mod.rs.html b/src/air/farewell_step/mod.rs.html new file mode 100644 index 00000000..fd3bc3e7 --- /dev/null +++ b/src/air/farewell_step/mod.rs.html @@ -0,0 +1,55 @@ +mod.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+mod errors;
+mod outcome;
+
+pub use errors::FarewellError;
+
+pub(crate) use outcome::from_execution_error;
+pub(crate) use outcome::from_success_result;
+pub(crate) use outcome::from_uncatchable_error;
+
\ No newline at end of file diff --git a/src/air/farewell_step/outcome.rs.html b/src/air/farewell_step/outcome.rs.html new file mode 100644 index 00000000..e4a966e7 --- /dev/null +++ b/src/air/farewell_step/outcome.rs.html @@ -0,0 +1,447 @@ +outcome.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::FarewellError;
+use crate::execution_step::ExecutionCtx;
+use crate::execution_step::TraceHandler;
+use crate::ExecutionError;
+use crate::InterpreterOutcome;
+use crate::ToErrorCode;
+use crate::INTERPRETER_SUCCESS;
+
+use air_interpreter_data::InterpreterDataEnvelope;
+use air_interpreter_interface::CallRequests;
+use air_interpreter_interface::CallRequestsRepr;
+use air_interpreter_interface::SoftLimitsTriggering;
+use air_interpreter_sede::ToSerialized;
+use air_interpreter_signatures::KeyPair;
+use air_utils::measure;
+use fluence_keypair::error::SigningError;
+
+use std::fmt::Debug;
+use std::hash::Hash;
+use std::rc::Rc;
+
+/// Create InterpreterOutcome from supplied execution context and trace handler,
+/// set ret_code to INTERPRETER_SUCCESS.
+#[tracing::instrument(skip_all)]
+pub(crate) fn from_success_result(
+    exec_ctx: ExecutionCtx<'_>,
+    trace_handler: TraceHandler,
+    keypair: &KeyPair,
+    soft_limits_triggering: SoftLimitsTriggering,
+) -> Result<InterpreterOutcome, InterpreterOutcome> {
+    let (ret_code, error_message) = if exec_ctx.call_results.is_empty() {
+        (INTERPRETER_SUCCESS, String::new())
+    } else {
+        let farewell_error = Rc::new(FarewellError::UnprocessedCallResult(exec_ctx.call_results.clone()));
+        (farewell_error.to_error_code(), farewell_error.to_string())
+    };
+
+    let outcome = populate_outcome_from_contexts(
+        exec_ctx,
+        trace_handler,
+        ret_code,
+        error_message,
+        keypair,
+        soft_limits_triggering,
+    );
+    Ok(outcome)
+}
+
+/// Create InterpreterOutcome from supplied data and error,
+/// set ret_code based on the error.
+#[tracing::instrument]
+pub(crate) fn from_uncatchable_error(
+    data: impl Into<Vec<u8>> + Debug,
+    error: impl ToErrorCode + ToString + Debug,
+    soft_limits_triggering: SoftLimitsTriggering,
+) -> InterpreterOutcome {
+    let ret_code = error.to_error_code();
+    let data = data.into();
+    let call_requests = CallRequestsRepr
+        .serialize(&CallRequests::new())
+        .expect("default serializer shouldn't fail");
+
+    InterpreterOutcome::new(
+        ret_code,
+        error.to_string(),
+        data,
+        vec![],
+        call_requests,
+        soft_limits_triggering,
+    )
+}
+
+/// Create InterpreterOutcome from supplied execution context, trace handler, and error,
+/// set ret_code based on the error.
+#[tracing::instrument(skip(exec_ctx, trace_handler, keypair))]
+pub(crate) fn from_execution_error(
+    exec_ctx: ExecutionCtx<'_>,
+    trace_handler: TraceHandler,
+    error: impl ToErrorCode + ToString + Debug,
+    keypair: &KeyPair,
+    soft_limits_triggering: SoftLimitsTriggering,
+) -> InterpreterOutcome {
+    populate_outcome_from_contexts(
+        exec_ctx,
+        trace_handler,
+        error.to_error_code(),
+        error.to_string(),
+        keypair,
+        soft_limits_triggering,
+    )
+}
+
+#[tracing::instrument(skip(exec_ctx, trace_handler, keypair), level = "info")]
+fn populate_outcome_from_contexts(
+    mut exec_ctx: ExecutionCtx<'_>,
+    mut trace_handler: TraceHandler,
+    ret_code: i64,
+    error_message: String,
+    keypair: &KeyPair,
+    soft_limits_triggering: SoftLimitsTriggering,
+) -> InterpreterOutcome {
+    match compactify_streams(&mut exec_ctx, &mut trace_handler, soft_limits_triggering) {
+        Ok(()) => {}
+        Err(outcome) => return outcome,
+    };
+
+    match sign_result(&mut exec_ctx, keypair, soft_limits_triggering) {
+        Ok(()) => {}
+        Err(outcome) => return outcome,
+    };
+
+    let data = InterpreterDataEnvelope::from_execution_result(
+        trace_handler.into_result_trace(),
+        exec_ctx.cid_state.into(),
+        exec_ctx.signature_store,
+        exec_ctx.last_call_request_id,
+        semver::Version::parse(env!("CARGO_PKG_VERSION")).expect("cargo version is valid"),
+    );
+    let data = measure!(
+        data.serialize().expect("default serializer shouldn't fail"),
+        tracing::Level::INFO,
+        "InterpreterDataEnv::serialize"
+    );
+
+    let next_peer_pks = dedup(exec_ctx.next_peer_pks);
+    let call_requests = measure!(
+        CallRequestsRepr
+            .serialize(&exec_ctx.call_requests)
+            .expect("default serializer shouldn't fail"),
+        tracing::Level::INFO,
+        "CallRequestsRepr.serialize",
+    );
+    InterpreterOutcome::new(
+        ret_code,
+        error_message,
+        data,
+        next_peer_pks,
+        call_requests,
+        soft_limits_triggering,
+    )
+}
+
+fn compactify_streams(
+    exec_ctx: &mut ExecutionCtx<'_>,
+    trace_ctx: &mut TraceHandler,
+    soft_limits_triggering: SoftLimitsTriggering,
+) -> Result<(), InterpreterOutcome> {
+    exec_ctx
+        .streams
+        .compactify(trace_ctx)
+        .and_then(|_| exec_ctx.stream_maps.compactify(trace_ctx))
+        .map_err(|err| execution_error_into_outcome(err, soft_limits_triggering))
+}
+
+fn sign_result(
+    exec_ctx: &mut ExecutionCtx<'_>,
+    keypair: &KeyPair,
+    soft_limits_triggering: SoftLimitsTriggering,
+) -> Result<(), InterpreterOutcome> {
+    let current_signature = exec_ctx
+        .peer_cid_tracker
+        .gen_signature(&exec_ctx.run_parameters.salt, keypair)
+        .map_err(|err| signing_error_into_outcome(err, soft_limits_triggering))?;
+
+    let current_pubkey = keypair.public();
+    exec_ctx.signature_store.put(current_pubkey, current_signature);
+
+    Ok(())
+}
+
+// these methods are called only if there is an internal error in the interpreter and
+// new execution trace was corrupted
+fn execution_error_into_outcome(
+    error: ExecutionError,
+    soft_limits_triggering: SoftLimitsTriggering,
+) -> InterpreterOutcome {
+    InterpreterOutcome::new(
+        error.to_error_code(),
+        error.to_string(),
+        vec![],
+        vec![],
+        <_>::default(),
+        soft_limits_triggering,
+    )
+}
+
+fn signing_error_into_outcome(error: SigningError, soft_limits_triggering: SoftLimitsTriggering) -> InterpreterOutcome {
+    InterpreterOutcome::new(
+        error.to_error_code(),
+        error.to_string(),
+        vec![],
+        vec![],
+        <_>::default(),
+        soft_limits_triggering,
+    )
+}
+
+/// Deduplicate values in a supplied vector.
+fn dedup<T: Eq + Hash + Debug>(mut vec: Vec<T>) -> Vec<T> {
+    use std::collections::HashSet;
+
+    let set: HashSet<_> = vec.drain(..).collect();
+    set.into_iter().collect()
+}
+
\ No newline at end of file diff --git a/src/air/human_readable_data.rs.html b/src/air/human_readable_data.rs.html new file mode 100644 index 00000000..79728aa5 --- /dev/null +++ b/src/air/human_readable_data.rs.html @@ -0,0 +1,89 @@ +human_readable_data.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use crate::preparation_step::check_version_compatibility;
+
+use air_interpreter_data::InterpreterData;
+use air_interpreter_data::InterpreterDataEnvelope;
+use serde_json::json;
+
+use std::error::Error as StdError;
+
+pub fn to_human_readable_data(data: Vec<u8>) -> Result<String, Box<dyn StdError>> {
+    let envelope = InterpreterDataEnvelope::try_from_slice(&data)?;
+
+    check_version_compatibility(&envelope.versions)?;
+
+    let data = InterpreterData::try_from_slice(&envelope.inner_data)?;
+
+    // TODO convert value store strings to JSON
+    let envelope_json = json!({
+        "versions": envelope.versions,
+        "data": data,
+    });
+
+    // it may produce quite a big string (whitespaces, escaping, etc), but this function
+    // is intended to be executed on user machine, not on chain or in a cloud.
+    Ok(serde_json::to_string_pretty(&envelope_json)?)
+}
+
\ No newline at end of file diff --git a/src/air/lib.rs.html b/src/air/lib.rs.html new file mode 100644 index 00000000..18261a09 --- /dev/null +++ b/src/air/lib.rs.html @@ -0,0 +1,177 @@ +lib.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#![forbid(unsafe_code)]
+#![warn(rust_2018_idioms)]
+#![deny(
+    dead_code,
+    nonstandard_style,
+    unused_imports,
+    unused_mut,
+    unused_variables,
+    unused_unsafe,
+    unreachable_patterns
+)]
+
+mod execution_step;
+mod farewell_step;
+mod human_readable_data;
+mod preparation_step;
+mod runner;
+mod signing_step;
+mod utils;
+mod verification_step;
+
+pub use air_interpreter_interface::InterpreterOutcome;
+pub use air_interpreter_interface::RunParameters;
+pub use air_interpreter_interface::INTERPRETER_SUCCESS;
+pub use execution_step::execution_context::errors::unsupported_map_key_type;
+pub use execution_step::execution_context::errors::CanonStreamMapError;
+pub use execution_step::execution_context::errors::StreamMapError;
+pub use execution_step::execution_context::errors::StreamMapKeyError;
+pub use execution_step::execution_context::no_error;
+pub use execution_step::execution_context::no_error_object;
+pub use execution_step::execution_context::ExecutionCidState;
+pub use execution_step::execution_context::InstructionError;
+pub use execution_step::execution_context::ERROR_CODE_FIELD_NAME;
+pub use execution_step::execution_context::INSTRUCTION_FIELD_NAME;
+pub use execution_step::execution_context::MESSAGE_FIELD_NAME;
+pub use execution_step::execution_context::NO_ERROR_ERROR_CODE;
+pub use execution_step::execution_context::NO_ERROR_MESSAGE;
+pub use execution_step::CatchableError;
+pub use execution_step::ErrorObjectError;
+pub use execution_step::ExecutionError;
+pub use execution_step::LambdaError;
+pub use execution_step::UncatchableError;
+pub use farewell_step::FarewellError;
+pub use polyplets::ResolvedTriplet;
+pub use polyplets::SecurityTetraplet;
+pub use preparation_step::interpreter_version;
+pub use preparation_step::min_supported_version;
+pub use preparation_step::PreparationError;
+pub use utils::ToErrorCode;
+
+pub use crate::human_readable_data::to_human_readable_data;
+pub use crate::runner::execute_air;
+
+pub mod interpreter_data {
+    pub use air_interpreter_data::*;
+}
+
+pub mod parser {
+    pub use air_parser::ast::Instruction;
+
+    /// Parse an AIR script to AST.
+    pub fn parse(script: &str) -> Result<Instruction<'_>, String> {
+        air_parser::parse(script)
+    }
+}
+
+pub(crate) type JValue = air_interpreter_value::JValue;
+
+use air_lambda_parser::LambdaAST;
+
\ No newline at end of file diff --git a/src/air/main.rs.html b/src/air/main.rs.html new file mode 100644 index 00000000..8c2e7741 --- /dev/null +++ b/src/air/main.rs.html @@ -0,0 +1,139 @@ +main.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#![forbid(unsafe_code)]
+#![warn(rust_2018_idioms)]
+#![deny(
+    dead_code,
+    nonstandard_style,
+    unused_imports,
+    unused_mut,
+    unused_variables,
+    unused_unsafe,
+    unreachable_patterns
+)]
+// risc0 feature flag is commented out, but the code remains for future experiments
+#![allow(unexpected_cfgs)]
+
+mod beautify;
+mod data;
+mod trace;
+
+use clap::Parser;
+
+#[derive(Parser)]
+struct Cli {
+    #[clap(subcommand)]
+    subcommand: Subcommand,
+}
+
+#[derive(clap::Subcommand)]
+#[allow(clippy::large_enum_variant)]
+enum Subcommand {
+    #[clap(alias = "b")]
+    Beautify(self::beautify::Args),
+    #[clap(alias = "d")]
+    Data(self::data::Args),
+    #[clap(alias = "r")]
+    Run(self::trace::run::Args),
+    #[clap(alias = "s")]
+    Stats(self::trace::stats::Args),
+}
+
+#[tokio::main]
+async fn main() -> Result<(), Box<dyn std::error::Error>> {
+    let args = Cli::parse();
+    match args.subcommand {
+        Subcommand::Beautify(args) => self::beautify::beautify(args)?,
+        Subcommand::Data(args) => self::data::to_human_readable_data(args).await?,
+        Subcommand::Run(args) => self::trace::run::run(args).await?,
+        Subcommand::Stats(args) => self::trace::stats::stats(args)?,
+    }
+    Ok(())
+}
+
\ No newline at end of file diff --git a/src/air/preparation_step/errors.rs.html b/src/air/preparation_step/errors.rs.html new file mode 100644 index 00000000..6791e5ee --- /dev/null +++ b/src/air/preparation_step/errors.rs.html @@ -0,0 +1,319 @@ +errors.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use crate::ToErrorCode;
+use air_interpreter_data::data_version;
+use air_interpreter_data::verification::DataVerifierError;
+use air_interpreter_data::CidStoreVerificationError;
+use air_interpreter_data::DataDeserializationError;
+use air_interpreter_data::Versions;
+use air_interpreter_interface::CallResultsDeserializeError;
+use strum::IntoEnumIterator;
+use strum_macros::EnumDiscriminants;
+use strum_macros::EnumIter;
+use thiserror::Error as ThisError;
+
+/// Errors happened during the interpreter preparation step.
+#[derive(Debug, EnumDiscriminants, ThisError)]
+#[strum_discriminants(derive(EnumIter))]
+pub enum PreparationError {
+    /// Error occurred while parsing AIR script
+    #[error("air can't be parsed:\n{0}")]
+    AIRParseError(String),
+
+    /// Errors occurred on executed trace deserialization.
+    #[error(
+        "an error occurred while data deserialization: {error:?}.\n\
+        AquaVM version is {} and it expects {} version.",
+        super::interpreter_version(),
+        data_version()
+    )]
+    DataDeFailed { error: DataDeserializationError },
+
+    /// Errors occurred on executed trace deserialization.
+    #[error(
+        "an error occurred while envelope deserialization: {error:?}.\n\
+        AquaVM version is {} and it expects {} version.",
+        super::interpreter_version(),
+        data_version()
+    )]
+    EnvelopeDeFailed { error: DataDeserializationError },
+
+    /// Errors occurred on executed trace deserialization
+    /// when it was possible to recover versions.
+    #[error(
+        "an error occurred while data deserialization: {error:?}.\n\
+        AquaVM's version is {} and it expects data of {} version.\n\
+        Supplied data version is {}, it's produced by AquaVM of {} version.",
+        super::interpreter_version(),
+        data_version(),
+        versions.data_version,
+        versions.interpreter_version,
+    )]
+    EnvelopeDeFailedWithVersions {
+        error: DataDeserializationError,
+        versions: Versions,
+    },
+
+    /// Error occurred on call results deserialization.
+    #[error("error occurred while deserialize call results: {error:?}.")]
+    CallResultsDeFailed { error: CallResultsDeserializeError },
+
+    /// Error occurred when a version of interpreter produced supplied data is less then minimal.
+    #[error("supplied data was produced by `{actual_version}` version of interpreter, but minimum `{required_version}` version is required")]
+    UnsupportedInterpreterVersion {
+        actual_version: semver::Version,
+        required_version: semver::Version,
+    },
+
+    /// Malformed keypair format data.
+    #[error("malformed keypair format: {0}")]
+    MalformedKeyPairData(#[from] air_interpreter_signatures::KeyError),
+
+    /// Failed to verify CidStore contents of the current data.
+    #[error(transparent)]
+    CidStoreVerificationError(#[from] CidStoreVerificationError),
+
+    /// Failed to check peers' signatures.
+    #[error(transparent)]
+    DataSignatureCheckError(#[from] DataVerifierError),
+
+    /// RAM limits are excedeed.
+    #[error(transparent)]
+    SizeLimitsExceded(#[from] SizeLimitsExceded),
+}
+
+impl ToErrorCode for PreparationError {
+    fn to_error_code(&self) -> i64 {
+        use crate::utils::PREPARATION_ERROR_START_ID;
+        crate::generate_to_error_code!(self, PreparationError, PREPARATION_ERROR_START_ID)
+    }
+}
+
+impl PreparationError {
+    pub fn data_de_failed(error: DataDeserializationError) -> Self {
+        Self::DataDeFailed { error }
+    }
+
+    pub fn envelope_de_failed(error: DataDeserializationError) -> Self {
+        Self::EnvelopeDeFailed { error }
+    }
+
+    pub fn env_de_failed_with_versions(error: DataDeserializationError, versions: Versions) -> Self {
+        Self::EnvelopeDeFailedWithVersions { error, versions }
+    }
+
+    pub fn call_results_de_failed(error: CallResultsDeserializeError) -> Self {
+        Self::CallResultsDeFailed { error }
+    }
+
+    pub fn unsupported_interpreter_version(actual_version: semver::Version, required_version: semver::Version) -> Self {
+        Self::UnsupportedInterpreterVersion {
+            actual_version,
+            required_version,
+        }
+    }
+
+    pub fn air_size_limit(actual_size: usize, limit: u64) -> Self {
+        Self::SizeLimitsExceded(SizeLimitsExceded::Air(actual_size, limit))
+    }
+
+    pub fn particle_size_limit(actual_size: usize, limit: u64) -> Self {
+        Self::SizeLimitsExceded(SizeLimitsExceded::Particle(actual_size, limit))
+    }
+
+    pub fn call_result_size_limit(limit: u64) -> Self {
+        Self::SizeLimitsExceded(SizeLimitsExceded::CallResult(limit))
+    }
+}
+
+#[derive(Debug, ThisError)]
+pub enum SizeLimitsExceded {
+    /// AIR script size is bigger than the allowed limit.
+    #[error("air size: {0} bytes is bigger than the limit allowed: {1} bytes")]
+    Air(usize, u64),
+
+    /// Current_data particle size is bigger than the allowed limit.
+    #[error("Current_data particle size: {0} bytes is bigger than the limit allowed: {1} bytes")]
+    Particle(usize, u64),
+
+    /// CallResult size is bigger than the allowed limit.
+    #[error("Call result size is bigger than the limit allowed: {0} bytes")]
+    CallResult(u64),
+}
+
\ No newline at end of file diff --git a/src/air/preparation_step/interpreter_versions.rs.html b/src/air/preparation_step/interpreter_versions.rs.html new file mode 100644 index 00000000..ae7337fd --- /dev/null +++ b/src/air/preparation_step/interpreter_versions.rs.html @@ -0,0 +1,91 @@ +interpreter_versions.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use once_cell::sync::Lazy;
+
+use std::str::FromStr;
+
+/// Minimal supported interpreter version, should be updated according to
+/// [./docs/update-guide.md]
+static MINIMAL_INTERPRETER_VERSION: Lazy<semver::Version> =
+    Lazy::new(|| semver::Version::from_str("0.61.0").expect("valid minimal supported version specified"));
+
+/// Current interpreter version, more info in
+/// [./docs/update-guide.md]
+static INTERPRETER_VERSION: Lazy<semver::Version> =
+    Lazy::new(|| semver::Version::from_str(env!("CARGO_PKG_VERSION")).expect("invalid data format version specified"));
+
+// This local is intended to check that set version is correct at the AquaVM start for graceful error message.
+thread_local!(static _MINIMAL_INTERPRETER_VERSION_CHECK: &'static semver::Version = Lazy::force(&MINIMAL_INTERPRETER_VERSION));
+
+/// Returns a minimal support version by this interpreter.
+pub fn min_supported_version() -> &'static semver::Version {
+    Lazy::force(&MINIMAL_INTERPRETER_VERSION)
+}
+
+/// Returns a current interpreter version.
+pub fn interpreter_version() -> &'static semver::Version {
+    Lazy::force(&INTERPRETER_VERSION)
+}
+
\ No newline at end of file diff --git a/src/air/preparation_step/mod.rs.html b/src/air/preparation_step/mod.rs.html new file mode 100644 index 00000000..f5301f59 --- /dev/null +++ b/src/air/preparation_step/mod.rs.html @@ -0,0 +1,69 @@ +mod.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+mod errors;
+mod interpreter_versions;
+mod preparation;
+mod sizes_limits_check;
+
+pub use errors::PreparationError;
+pub use interpreter_versions::interpreter_version;
+pub use interpreter_versions::min_supported_version;
+
+pub(crate) use preparation::check_version_compatibility;
+pub(crate) use preparation::parse_data;
+pub(crate) use preparation::prepare;
+pub(crate) use preparation::ParsedDataPair;
+pub(crate) use preparation::PreparationDescriptor;
+pub(crate) use sizes_limits_check::check_against_size_limits;
+
\ No newline at end of file diff --git a/src/air/preparation_step/preparation.rs.html b/src/air/preparation_step/preparation.rs.html new file mode 100644 index 00000000..5cb7477e --- /dev/null +++ b/src/air/preparation_step/preparation.rs.html @@ -0,0 +1,393 @@ +preparation.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::PreparationError;
+use crate::execution_step::execution_context::ExecCtxIngredients;
+use crate::execution_step::ExecutionCtx;
+use crate::execution_step::TraceHandler;
+
+use air_interpreter_data::DataDeserializationError;
+use air_interpreter_data::InterpreterData;
+use air_interpreter_data::InterpreterDataEnvelope;
+use air_interpreter_data::Versions;
+use air_interpreter_interface::CallResultsRepr;
+use air_interpreter_interface::RunParameters;
+use air_interpreter_interface::SerializedCallResults;
+use air_interpreter_interface::SoftLimitsTriggering;
+use air_interpreter_sede::FromSerialized;
+use air_interpreter_signatures::KeyError;
+use air_interpreter_signatures::KeyPair;
+use air_interpreter_signatures::SignatureStore;
+use air_parser::ast::Instruction;
+use air_utils::measure;
+use fluence_keypair::KeyFormat;
+
+pub(crate) type PreparationResult<T> = Result<T, PreparationError>;
+
+/// Represents result of the preparation_step step.
+pub(crate) struct PreparationDescriptor<'ctx, 'i> {
+    pub(crate) exec_ctx: ExecutionCtx<'ctx>,
+    pub(crate) trace_handler: TraceHandler,
+    pub(crate) air: Instruction<'i>,
+    pub(crate) keypair: KeyPair,
+}
+
+pub(crate) struct ParsedDataPair {
+    pub(crate) prev_data: InterpreterData,
+    pub(crate) current_data: InterpreterData,
+}
+
+/// Parse data and check its version.
+#[tracing::instrument(skip_all)]
+pub(crate) fn parse_data(prev_data: &[u8], current_data: &[u8]) -> PreparationResult<ParsedDataPair> {
+    let prev_envelope = try_to_envelope(prev_data)?;
+    let current_envelope = try_to_envelope(current_data)?;
+
+    check_version_compatibility(&current_envelope.versions)?;
+
+    let prev_data = try_to_data(&prev_envelope.inner_data)?;
+    let current_data = try_to_data(&current_envelope.inner_data)?;
+
+    Ok(ParsedDataPair {
+        prev_data,
+        current_data,
+    })
+}
+
+/// Parse and prepare supplied data and AIR script.
+#[tracing::instrument(skip_all)]
+pub(crate) fn prepare<'i>(
+    prev_data: InterpreterData,
+    current_data: InterpreterData,
+    raw_air: &'i str,
+    call_results: &SerializedCallResults,
+    run_parameters: RunParameters,
+    signature_store: SignatureStore,
+    soft_limits_triggering: &mut SoftLimitsTriggering,
+) -> PreparationResult<PreparationDescriptor<'static, 'i>> {
+    let air: Instruction<'i> = air_parser::parse(raw_air).map_err(PreparationError::AIRParseError)?;
+
+    let prev_ingredients = ExecCtxIngredients {
+        last_call_request_id: prev_data.last_call_request_id,
+        cid_info: prev_data.cid_info,
+    };
+
+    let current_ingredients = ExecCtxIngredients {
+        last_call_request_id: current_data.last_call_request_id,
+        cid_info: current_data.cid_info,
+    };
+
+    let exec_ctx = make_exec_ctx(
+        prev_ingredients,
+        current_ingredients,
+        call_results,
+        signature_store,
+        &run_parameters,
+        soft_limits_triggering,
+    )?;
+    let trace_handler = TraceHandler::from_trace(prev_data.trace, current_data.trace);
+
+    let key_format = KeyFormat::try_from(run_parameters.key_format).map_err(KeyError::from)?;
+    let keypair = KeyPair::from_secret_key(run_parameters.secret_key_bytes, key_format)?;
+
+    let result = PreparationDescriptor {
+        exec_ctx,
+        trace_handler,
+        air,
+        keypair,
+    };
+
+    Ok(result)
+}
+
+pub(crate) fn try_to_envelope(raw_env_data: &[u8]) -> PreparationResult<InterpreterDataEnvelope<'_>> {
+    // treat empty slice as an empty data,
+    // it allows abstracting from an internal format for an empty data
+    if raw_env_data.is_empty() {
+        return Ok(InterpreterDataEnvelope::new(super::min_supported_version().clone()));
+    }
+
+    InterpreterDataEnvelope::try_from_slice(raw_env_data)
+        .map_err(|de_error| to_envelope_de_error(raw_env_data.to_vec(), de_error))
+}
+
+pub(crate) fn try_to_data(raw_data: &[u8]) -> PreparationResult<InterpreterData> {
+    InterpreterData::try_from_slice(raw_data).map_err(to_data_de_error)
+}
+
+fn to_envelope_de_error(env_raw_data: Vec<u8>, de_error: DataDeserializationError) -> PreparationError {
+    match InterpreterDataEnvelope::try_get_versions(&env_raw_data) {
+        Ok(versions) => PreparationError::env_de_failed_with_versions(de_error, versions),
+        Err(_) => PreparationError::envelope_de_failed(de_error),
+    }
+}
+
+fn to_data_de_error(de_error: DataDeserializationError) -> PreparationError {
+    PreparationError::data_de_failed(de_error)
+}
+
+#[tracing::instrument(skip_all)]
+fn make_exec_ctx(
+    prev_ingredients: ExecCtxIngredients,
+    current_ingredients: ExecCtxIngredients,
+    call_results: &SerializedCallResults,
+    signature_store: SignatureStore,
+    run_parameters: &RunParameters,
+    soft_limits_triggering: &mut SoftLimitsTriggering,
+) -> PreparationResult<ExecutionCtx<'static>> {
+    use crate::preparation_step::sizes_limits_check::handle_limit_exceeding;
+
+    let call_results = measure!(
+        CallResultsRepr
+            .deserialize(call_results)
+            .map_err(PreparationError::call_results_de_failed)?,
+        tracing::Level::INFO,
+        "CallResultsRepr.deserialize",
+    );
+
+    // This is a part of argument size limit check where we check the size of every call result.
+    if call_results
+        .values()
+        .any(|call_result| call_result.result.len() as u64 > run_parameters.call_result_size_limit)
+    {
+        let error: PreparationError = PreparationError::call_result_size_limit(run_parameters.call_result_size_limit);
+        handle_limit_exceeding(
+            run_parameters,
+            error,
+            &mut soft_limits_triggering.call_result_size_limit_exceeded,
+        )?;
+    }
+
+    let ctx = ExecutionCtx::new(
+        prev_ingredients,
+        current_ingredients,
+        call_results,
+        signature_store,
+        run_parameters,
+    );
+    Ok(ctx)
+}
+
+pub(crate) fn check_version_compatibility(versions: &Versions) -> PreparationResult<()> {
+    if &versions.interpreter_version < super::min_supported_version() {
+        return Err(PreparationError::UnsupportedInterpreterVersion {
+            actual_version: versions.interpreter_version.clone(),
+            required_version: super::min_supported_version().clone(),
+        });
+    }
+
+    Ok(())
+}
+
\ No newline at end of file diff --git a/src/air/preparation_step/sizes_limits_check.rs.html b/src/air/preparation_step/sizes_limits_check.rs.html new file mode 100644 index 00000000..4b7c61d2 --- /dev/null +++ b/src/air/preparation_step/sizes_limits_check.rs.html @@ -0,0 +1,133 @@ +sizes_limits_check.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::preparation::PreparationResult;
+use crate::PreparationError;
+
+use air_interpreter_interface::RunParameters;
+use air_interpreter_interface::SoftLimitsTriggering;
+
+pub(crate) fn handle_limit_exceeding(
+    run_parameters: &RunParameters,
+    error: PreparationError,
+    soft_limit_flag: &mut bool,
+) -> PreparationResult<()> {
+    *soft_limit_flag = true;
+
+    if run_parameters.hard_limit_enabled {
+        Err(error)
+    } else {
+        Ok(())
+    }
+}
+
+pub(crate) fn check_against_size_limits(
+    run_parameters: &RunParameters,
+    air: &str,
+    raw_current_data: &[u8],
+) -> PreparationResult<SoftLimitsTriggering> {
+    let mut soft_limits_triggering = SoftLimitsTriggering::default();
+
+    if air.len() as u64 > run_parameters.air_size_limit {
+        let error = PreparationError::air_size_limit(air.len(), run_parameters.air_size_limit);
+        handle_limit_exceeding(
+            run_parameters,
+            error,
+            &mut soft_limits_triggering.air_size_limit_exceeded,
+        )?;
+    }
+
+    if raw_current_data.len() as u64 > run_parameters.particle_size_limit {
+        let error = PreparationError::particle_size_limit(raw_current_data.len(), run_parameters.particle_size_limit);
+        handle_limit_exceeding(
+            run_parameters,
+            error,
+            &mut soft_limits_triggering.particle_size_limit_exceeded,
+        )?;
+    }
+
+    Ok(soft_limits_triggering)
+}
+
\ No newline at end of file diff --git a/src/air/runner.rs.html b/src/air/runner.rs.html new file mode 100644 index 00000000..3897250c --- /dev/null +++ b/src/air/runner.rs.html @@ -0,0 +1,323 @@ +runner.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use crate::execution_step::ExecutableInstruction;
+use crate::farewell_step as farewell;
+use crate::preparation_step::parse_data;
+use crate::preparation_step::prepare;
+use crate::preparation_step::ParsedDataPair;
+use crate::preparation_step::PreparationDescriptor;
+use crate::signing_step::sign_produced_cids;
+use crate::verification_step::verify;
+
+use air_interpreter_interface::InterpreterOutcome;
+use air_interpreter_interface::RunParameters;
+use air_interpreter_interface::SerializedCallResults;
+use air_interpreter_interface::SoftLimitsTriggering;
+use air_log_targets::RUN_PARAMS;
+use air_utils::farewell_if_fail;
+use air_utils::measure;
+
+#[tracing::instrument(skip_all)]
+pub fn execute_air(
+    air: String,
+    prev_data: Vec<u8>,
+    data: Vec<u8>,
+    params: RunParameters,
+    call_results: SerializedCallResults,
+) -> InterpreterOutcome {
+    use std::convert::identity;
+
+    log::trace!(
+        target: RUN_PARAMS,
+        "air interpreter version is {}, run parameters:\
+            init peer id {}\
+            current peer id {}",
+        env!("CARGO_PKG_VERSION"),
+        params.init_peer_id,
+        params.current_peer_id,
+    );
+
+    execute_air_impl(air, prev_data, data, params, call_results).unwrap_or_else(identity)
+}
+
+#[allow(clippy::result_large_err)]
+fn execute_air_impl(
+    air: String,
+    raw_prev_data: Vec<u8>,
+    raw_current_data: Vec<u8>,
+    params: RunParameters,
+    call_results: SerializedCallResults,
+) -> Result<InterpreterOutcome, InterpreterOutcome> {
+    use crate::preparation_step::check_against_size_limits;
+
+    let mut soft_limits_triggering = farewell_if_fail!(
+        check_against_size_limits(&params, &air, &raw_current_data),
+        raw_prev_data,
+        SoftLimitsTriggering::default()
+    );
+
+    farewell_if_fail!(
+        check_against_size_limits(&params, &air, &raw_current_data),
+        raw_prev_data,
+        soft_limits_triggering
+    );
+
+    let ParsedDataPair {
+        prev_data,
+        current_data,
+    } = farewell_if_fail!(
+        parse_data(&raw_prev_data, &raw_current_data),
+        raw_prev_data,
+        soft_limits_triggering
+    );
+
+    // TODO currently we use particle ID, but it should be changed to signature,
+    // as partical ID can be equally replayed
+    let salt = params.particle_id.clone();
+    let signature_store = farewell_if_fail!(
+        verify(&prev_data, &current_data, &salt),
+        raw_prev_data,
+        soft_limits_triggering
+    );
+
+    let PreparationDescriptor {
+        mut exec_ctx,
+        mut trace_handler,
+        air,
+        keypair,
+    } = farewell_if_fail!(
+        prepare(
+            prev_data,
+            current_data,
+            &air,
+            &call_results,
+            params,
+            signature_store,
+            &mut soft_limits_triggering
+        ),
+        raw_prev_data,
+        soft_limits_triggering
+    );
+
+    // match here is used instead of map_err, because the compiler can't determine that
+    // they are exclusive and would treat exec_ctx and trace_handler as moved
+    let exec_result = measure!(
+        air.execute(&mut exec_ctx, &mut trace_handler),
+        tracing::Level::INFO,
+        "execute",
+    );
+
+    farewell_if_fail!(
+        sign_produced_cids(
+            &mut exec_ctx.peer_cid_tracker,
+            &mut exec_ctx.signature_store,
+            &salt,
+            &keypair,
+        ),
+        raw_prev_data,
+        soft_limits_triggering
+    );
+
+    measure!(
+        match exec_result {
+            Ok(_) => farewell::from_success_result(exec_ctx, trace_handler, &keypair, soft_limits_triggering),
+            // return new collected trace in case of errors
+            Err(error) if error.is_catchable() => {
+                Err(farewell::from_execution_error(
+                    exec_ctx,
+                    trace_handler,
+                    error,
+                    &keypair,
+                    soft_limits_triggering,
+                ))
+            }
+            // return the prev data in case of any trace errors
+            Err(error) => Err(farewell::from_uncatchable_error(
+                raw_prev_data,
+                error,
+                soft_limits_triggering
+            )),
+        },
+        tracing::Level::INFO,
+        "farewell",
+    )
+}
+
\ No newline at end of file diff --git a/src/air/signing_step.rs.html b/src/air/signing_step.rs.html new file mode 100644 index 00000000..aa5f7ae9 --- /dev/null +++ b/src/air/signing_step.rs.html @@ -0,0 +1,107 @@ +signing_step.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use crate::ExecutionError;
+
+use air_interpreter_signatures::KeyPair;
+use air_interpreter_signatures::PeerCidTracker;
+use air_interpreter_signatures::SignatureStore;
+
+#[cfg(feature = "gen_signatures")]
+#[tracing::instrument(skip_all)]
+pub(crate) fn sign_produced_cids(
+    signature_tracker: &mut PeerCidTracker,
+    signature_store: &mut SignatureStore,
+    salt: &str,
+    keypair: &KeyPair,
+) -> Result<(), ExecutionError> {
+    use crate::UncatchableError;
+
+    let signature = signature_tracker
+        .gen_signature(salt, keypair)
+        .map_err(UncatchableError::SigningError)?;
+    let public_key = keypair.public();
+    signature_store.put(public_key, signature);
+    Ok(())
+}
+
+#[cfg(not(feature = "gen_signatures"))]
+#[tracing::instrument(skip_all)]
+pub(crate) fn sign_produced_cids(
+    _signature_tracker: &mut PeerCidTracker,
+    _signature_store: &mut SignatureStore,
+    _salt: &str,
+    _keypair: &KeyPair,
+) -> Result<(), ExecutionError> {
+    Ok(())
+}
+
\ No newline at end of file diff --git a/src/air/trace/mod.rs.html b/src/air/trace/mod.rs.html new file mode 100644 index 00000000..4e4df96a --- /dev/null +++ b/src/air/trace/mod.rs.html @@ -0,0 +1,45 @@ +mod.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+pub(crate) mod run;
+pub(crate) mod stats;
+mod utils;
+
\ No newline at end of file diff --git a/src/air/trace/run.rs.html b/src/air/trace/run.rs.html new file mode 100644 index 00000000..246fa5e6 --- /dev/null +++ b/src/air/trace/run.rs.html @@ -0,0 +1,679 @@ +run.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
+334
+335
+336
+337
+338
+339
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+mod data;
+pub(crate) mod native;
+#[cfg(feature = "near")]
+mod near;
+#[cfg(feature = "risc0")]
+mod risc0;
+#[cfg(feature = "wasm")]
+pub(crate) mod wasm;
+
+pub(crate) mod runner;
+
+use self::runner::AirRunner;
+use crate::trace::run::runner::TestInitParameters;
+use avm_interface::CallResults;
+
+use clap::Parser;
+use clap::Subcommand;
+use eyre::Context as _;
+use fluence_keypair::KeyPair;
+use zeroize::Zeroize;
+
+use std::io::Read;
+use std::path::Path;
+use std::path::PathBuf;
+
+#[derive(Parser, Debug)]
+#[clap(about = "Run AIR script with AquaVM")]
+pub(crate) struct Args {
+    #[clap(long = "call-results")]
+    call_results_path: Option<PathBuf>,
+
+    #[clap(long)]
+    max_heap_size: Option<u64>,
+
+    #[clap(long, default_value = "info")]
+    tracing_params: String,
+    #[clap(long, default_value = "warn")]
+    runner_tracing_params: String,
+
+    #[clap(flatten)]
+    mode: ModeArgs,
+
+    #[clap(
+        long = "interpreter",
+        env = "AIR_INTERPRETER_WASM_PATH",
+        default_value = "target/wasm32-wasi/release/air_interpreter_server.wasm"
+    )]
+    air_interpreter_path: PathBuf,
+
+    #[clap(
+        long = "near-contract",
+        env = "AIR_NEAR_CONTRACT_PATH",
+        default_value = "tools/wasm/air-near-contract/target/wasm32-unknown-unknown/release/air-near-contract.wasm"
+    )]
+    air_near_contract_path: PathBuf,
+
+    #[clap(long, help = "Execute several times; great for native profiling")]
+    repeat: Option<u32>,
+    #[clap(long, help = "Output JSON tracing info")]
+    json: bool,
+
+    #[clap(long = "no-fail", help = "Do not fail if AquaVM returns error")]
+    no_fail: bool,
+
+    #[command(flatten)]
+    keys: Keys,
+
+    #[clap(subcommand)]
+    source: Source,
+}
+
+#[derive(Subcommand, Debug)]
+#[allow(clippy::large_enum_variant)]
+enum Source {
+    #[clap(name = "--anomaly")]
+    Anomaly(self::data::anomaly::AnomalyDataArgs),
+    #[clap(name = "--plain")]
+    PlainData(self::data::plain::PlainDataArgs),
+}
+
+#[derive(clap::Args, Debug)]
+#[group(required = true, multiple = false)]
+struct Keys {
+    #[arg(long)]
+    random_key: bool,
+    #[arg(long)]
+    ed25519_key: Option<PathBuf>,
+}
+
+impl Keys {
+    fn get_keypair(&self) -> eyre::Result<KeyPair> {
+        match (self.random_key, self.ed25519_key.as_ref()) {
+            (true, None) => Ok(KeyPair::generate_ed25519()),
+            (false, Some(path)) => load_keypair_ed25519(path),
+            _ => unreachable!("clap should allow to provide one and only one key option"),
+        }
+    }
+}
+
+#[derive(clap::Args, Debug, Copy, Clone)]
+#[group(multiple = false)]
+struct ModeArgs {
+    #[arg(long)]
+    native: bool,
+
+    #[cfg(feature = "wasm")]
+    #[arg(long)]
+    wasm: bool,
+
+    #[cfg(feature = "near")]
+    #[arg(long)]
+    near: bool,
+
+    #[cfg(feature = "risc0")]
+    #[arg(long)]
+    risc0: bool,
+}
+
+impl From<ModeArgs> for Option<Mode> {
+    fn from(value: ModeArgs) -> Self {
+        if value.native {
+            return Some(Mode::Native);
+        }
+
+        #[cfg(feature = "wasm")]
+        if value.wasm {
+            return Some(Mode::Wasm);
+        }
+
+        #[cfg(feature = "near")]
+        if value.near {
+            return Some(Mode::Near);
+        }
+
+        #[cfg(feature = "risc0")]
+        if value.risc0 {
+            return Some(Mode::Risc0);
+        }
+
+        None
+    }
+}
+
+enum Mode {
+    Native,
+
+    #[cfg(feature = "wasm")]
+    Wasm,
+
+    #[cfg(feature = "near")]
+    Near,
+
+    #[cfg(feature = "risc0")]
+    Risc0,
+}
+
+pub(crate) async fn run(args: Args) -> eyre::Result<()> {
+    let tracing_json = (!args.json) as u8;
+    #[cfg(feature = "wasm")]
+    let global_tracing_params = if args.mode.wasm {
+        // for native and other, there is single tracing configuration, and no runner
+        args.tracing_params.clone()
+    } else {
+        args.runner_tracing_params
+    };
+    #[cfg(not(feature = "wasm"))]
+    let global_tracing_params = args.tracing_params.clone();
+    init_tracing(global_tracing_params, tracing_json);
+
+    let execution_data = match &args.source {
+        Source::Anomaly(anomaly) => data::anomaly::load(anomaly)?,
+        Source::PlainData(raw) => data::plain::load(raw)?,
+    };
+
+    let particle = execution_data.particle;
+
+    let mut runner = create_runner(
+        args.mode.into(),
+        &args.air_interpreter_path,
+        &args.air_near_contract_path,
+        args.max_heap_size,
+        execution_data.test_init_parameters,
+    )
+    .await?;
+
+    let call_results = read_call_results(args.call_results_path.as_deref())?;
+
+    let key_pair = args
+        .keys
+        .get_keypair()
+        .context("failed to get the keypair")?;
+
+    let repeat = args.repeat.unwrap_or(1);
+    for _ in 0..repeat {
+        let result = runner
+            .call_tracing(
+                execution_data.air_script.clone(),
+                execution_data.prev_data.clone(),
+                execution_data.current_data.clone(),
+                particle.init_peer_id.clone().into_owned(),
+                particle.timestamp,
+                particle.ttl,
+                particle.current_peer_id.clone().into(),
+                call_results.clone(),
+                args.tracing_params.clone(),
+                tracing_json,
+                &key_pair,
+                particle.particle_id.clone().into_owned(),
+            )
+            .await
+            .context("Failed to execute the script")?;
+        if args.repeat.is_none() {
+            println!("{result:?}");
+        }
+        if !args.no_fail && (result.ret_code != 0) {
+            std::process::exit(2);
+        }
+    }
+
+    Ok(())
+}
+
+async fn create_runner(
+    mode: Option<Mode>,
+    _air_interpreter_wasm_path: &Path,
+    _air_contract_wasm_path: &Path,
+    _max_heap_size: Option<u64>,
+    _test_init_parameters: TestInitParameters,
+) -> eyre::Result<Box<dyn AirRunner>> {
+    #[cfg(not(feature = "wasm"))]
+    let default_mode = Mode::Native;
+    #[cfg(feature = "wasm")]
+    let default_mode = Mode::Wasm;
+
+    let mode = mode.unwrap_or(default_mode);
+
+    let runner = match mode {
+        Mode::Native => self::native::create_native_avm_runner(_test_init_parameters)
+            .context("Failed to instantiate a native AVM")? as _,
+        #[cfg(feature = "wasm")]
+        Mode::Wasm => self::wasm::create_wasm_avm_runner(
+            _air_interpreter_wasm_path,
+            _max_heap_size,
+            _test_init_parameters,
+        )
+        .await
+        .context("Failed to instantiate WASM AVM")? as _,
+        #[cfg(feature = "near")]
+        Mode::Near => self::near::create_near_runner(_air_contract_wasm_path)
+            .context("Failed to instantiate NEAR AVM")?,
+        #[cfg(feature = "risc0")]
+        Mode::Risc0 => Box::new(self::risc0::Risc0Runner::new()),
+    };
+    Ok(runner)
+}
+
+// TODO This is a copy of function from air_interpreter/marine.rs.  It should be moved to the marine_rs_sdk.
+pub fn init_tracing(tracing_params: String, trace_mode: u8) {
+    use tracing_subscriber::fmt::format::FmtSpan;
+
+    let builder = tracing_subscriber::fmt()
+        .with_env_filter(tracing_params)
+        .with_span_events(FmtSpan::ENTER | FmtSpan::CLOSE)
+        .with_writer(std::io::stderr);
+    if trace_mode == 0 {
+        builder.json().init();
+    } else {
+        // Human-readable output.
+        builder.init();
+    }
+}
+fn read_call_results(call_results_path: Option<&Path>) -> eyre::Result<CallResults> {
+    match call_results_path {
+        None => Ok(CallResults::default()),
+        Some(call_results_path) => {
+            let call_results_json =
+                load_data(call_results_path).context("failed to read call_results")?;
+            // call resuls are may be manually crafted, so JSON representation
+            // of avm_interface::CallResults is more user-friendly
+            Ok(serde_json::from_slice(&call_results_json)
+                .context("failed to parse call_results data")?)
+        }
+    }
+}
+
+fn load_data_or_default(
+    data_path: Option<impl AsRef<Path>>,
+    default: &[u8],
+) -> eyre::Result<Vec<u8>> {
+    match data_path {
+        None => Ok(default.to_owned()),
+        Some(data_path) => load_data(data_path.as_ref()),
+    }
+}
+
+pub(crate) fn load_data(data_path: &Path) -> eyre::Result<Vec<u8>> {
+    std::fs::read(data_path).with_context(|| data_path.to_string_lossy().into_owned())
+}
+
+fn load_keypair_ed25519(path: &PathBuf) -> Result<KeyPair, eyre::Error> {
+    use fluence_keypair::KeyFormat;
+
+    // It follows rust-peer format
+    let mut file = std::fs::File::open(path)?;
+
+    let mut file_content = String::with_capacity(
+        file.metadata()?
+            .len()
+            .try_into()
+            .context("failed to convert file length")?,
+    );
+    file.read_to_string(&mut file_content)?;
+
+    let key_data = bs58::decode(file_content.trim())
+        .into_vec()
+        .context("failed to decode the base58 key material")?;
+    file_content.zeroize();
+
+    KeyPair::from_vec(key_data, KeyFormat::Ed25519).context("malformed key data")
+}
+
\ No newline at end of file diff --git a/src/air/trace/run/data/anomaly.rs.html b/src/air/trace/run/data/anomaly.rs.html new file mode 100644 index 00000000..c2e44610 --- /dev/null +++ b/src/air/trace/run/data/anomaly.rs.html @@ -0,0 +1,113 @@ +anomaly.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use crate::trace::run::runner::TestInitParameters;
+
+use super::super::load_data;
+use super::ExecutionData;
+use avm_data_store::AnomalyData;
+use avm_interface::ParticleParameters;
+
+use clap::Parser;
+use eyre::Context;
+
+use std::path::PathBuf;
+
+#[derive(Parser, Debug)]
+pub(crate) struct AnomalyDataArgs {
+    anomaly_data_path: PathBuf,
+}
+
+pub(crate) fn load(args: &AnomalyDataArgs) -> eyre::Result<super::ExecutionData<'_>> {
+    let anomaly_json = load_data(&args.anomaly_data_path).context("Failed to read anomaly data")?;
+    let anomaly_data: AnomalyData<'_> =
+        serde_json::from_slice(&anomaly_json).context("Failed to parse anomaly data")?;
+
+    let air_script = anomaly_data.air_script.to_string();
+    let prev_data = anomaly_data.prev_data.to_vec();
+    let current_data = anomaly_data.current_data.to_vec();
+    let particle: ParticleParameters<'static> = serde_json::from_slice(&anomaly_data.particle)
+        .context("Anomaly particle is not a valid JSON")?;
+    let test_init_parameters = TestInitParameters::no_limits();
+
+    Ok(ExecutionData {
+        air_script,
+        prev_data,
+        current_data,
+        particle,
+        test_init_parameters,
+    })
+}
+
\ No newline at end of file diff --git a/src/air/trace/run/data/mod.rs.html b/src/air/trace/run/data/mod.rs.html new file mode 100644 index 00000000..418637d6 --- /dev/null +++ b/src/air/trace/run/data/mod.rs.html @@ -0,0 +1,67 @@ +mod.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+pub(crate) mod anomaly;
+pub(crate) mod plain;
+
+use avm_interface::ParticleParameters;
+
+use super::runner::TestInitParameters;
+
+pub(crate) struct ExecutionData<'ctx> {
+    pub(crate) air_script: String,
+    pub(crate) current_data: Vec<u8>,
+    pub(crate) prev_data: Vec<u8>,
+    pub(crate) particle: ParticleParameters<'ctx>,
+    pub(crate) test_init_parameters: TestInitParameters,
+}
+
\ No newline at end of file diff --git a/src/air/trace/run/data/plain.rs.html b/src/air/trace/run/data/plain.rs.html new file mode 100644 index 00000000..35a51f08 --- /dev/null +++ b/src/air/trace/run/data/plain.rs.html @@ -0,0 +1,275 @@ +plain.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::super::super::utils::unix_timestamp_now;
+use super::ExecutionData;
+use crate::trace::run::runner::TestInitParameters;
+
+use avm_interface::ParticleParameters;
+
+use eyre::Context;
+
+use std::path::{Path, PathBuf};
+
+const DEFAULT_DATA: &[u8] = b"";
+
+#[derive(clap::Args, Debug)]
+pub(crate) struct PlainDataArgs {
+    #[clap(long, default_value = "some_id")]
+    init_peer_id: String,
+    #[clap(long, help = "default: current time")]
+    timestamp: Option<u64>,
+    #[clap(long, help = "default: max possible ttl")]
+    ttl: Option<u32>,
+    #[clap(long, default_value = "some_id")]
+    current_peer_id: String,
+
+    #[clap(long = "script", help = "read from stdin by default")]
+    air_script_path: Option<PathBuf>,
+    #[clap(long = "prev-data")]
+    prev_data_path: Option<PathBuf>,
+    #[clap(long = "current-data")]
+    current_data_path: Option<PathBuf>,
+
+    #[clap(long = "particle-id")]
+    particle_id: Option<String>,
+
+    #[clap(long = "air-size-limit")]
+    air_size_limit: Option<u64>,
+
+    #[clap(long = "particle-size-limit")]
+    particle_size_limit: Option<u64>,
+
+    #[clap(long = "call-result-size-limit")]
+    call_result_size_limit: Option<u64>,
+
+    #[clap(long = "hard-limit-enabled", default_value = "false")]
+    hard_limit_enabled: bool,
+}
+
+pub(crate) fn load(args: &PlainDataArgs) -> eyre::Result<ExecutionData<'_>> {
+    use super::super::load_data_or_default;
+
+    let air_script = read_air_with_prompt(args.air_script_path.as_deref())
+        .context("failed to read AIR script")?;
+    let prev_data = load_data_or_default(args.prev_data_path.as_ref(), DEFAULT_DATA)
+        .context("failed to read prev_data")?;
+    let current_data = load_data_or_default(args.current_data_path.as_ref(), DEFAULT_DATA)
+        .context("failed to read data")?;
+
+    let timestamp = args.timestamp.unwrap_or_else(unix_timestamp_now);
+    let ttl = args.ttl.unwrap_or(u32::MAX);
+    let init_peer_id = &args.init_peer_id;
+    let current_peer_id = &args.current_peer_id;
+
+    let particle = ParticleParameters::new(
+        init_peer_id.into(),
+        args.particle_id.as_deref().unwrap_or_default().into(),
+        timestamp,
+        ttl,
+        current_peer_id.into(),
+    );
+
+    let test_init_parameters = TestInitParameters::new(
+        args.air_size_limit,
+        args.particle_size_limit,
+        args.call_result_size_limit,
+        args.hard_limit_enabled,
+    );
+
+    Ok(ExecutionData {
+        air_script,
+        prev_data,
+        current_data,
+        particle,
+        test_init_parameters,
+    })
+}
+
+fn read_air_with_prompt(air_input: Option<&Path>) -> eyre::Result<String> {
+    use std::io::Read;
+
+    let air_script = match air_input {
+        Some(in_path) => std::fs::read_to_string(in_path)?,
+        None => {
+            let mut buffer = String::new();
+            let mut stdin = std::io::stdin().lock();
+
+            // unfortunately, it seems to always return false in WASM mode
+            if atty::is(atty::Stream::Stdin) {
+                print_air_prompt();
+            }
+
+            stdin.read_to_string(&mut buffer)?;
+            buffer
+        }
+    };
+
+    Ok(air_script)
+}
+
+fn print_air_prompt() {
+    use termcolor::{ColorChoice, ColorSpec, StandardStream, WriteColor as _};
+
+    let mut stderr = StandardStream::stderr(ColorChoice::Auto);
+    let mut bold = ColorSpec::new();
+    bold.set_bold(true);
+
+    let _ = stderr.set_color(&bold);
+    eprintln!("Reading AIR script from stdin...");
+    let _ = stderr.set_color(&ColorSpec::new());
+}
+
\ No newline at end of file diff --git a/src/air/trace/run/native.rs.html b/src/air/trace/run/native.rs.html new file mode 100644 index 00000000..be5c71ed --- /dev/null +++ b/src/air/trace/run/native.rs.html @@ -0,0 +1,235 @@ +native.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::runner::AirRunner;
+use super::runner::DataToHumanReadable;
+use super::runner::TestInitParameters;
+
+use air_interpreter_interface::CallResultsRepr;
+use air_interpreter_interface::RunParameters;
+use avm_interface::raw_outcome::RawAVMOutcome;
+use avm_server::AquaVMRuntimeLimits;
+use fluence_keypair::KeyPair;
+use futures::future::LocalBoxFuture;
+use futures::FutureExt;
+
+use std::error::Error as StdError;
+
+pub(crate) struct NativeAvmRunner {
+    pub aquavm_runtime_limits: AquaVMRuntimeLimits,
+}
+
+impl AirRunner for NativeAvmRunner {
+    fn call_tracing<'this>(
+        &'this mut self,
+        air: String,
+        prev_data: Vec<u8>,
+        data: Vec<u8>,
+        init_peer_id: String,
+        timestamp: u64,
+        ttl: u32,
+        current_peer_id: String,
+        call_results: avm_interface::CallResults,
+        // We use externally configured logger.
+        _tracing_params: String,
+        _tracing_output_mode: u8,
+        keypair: &KeyPair,
+        particle_id: String,
+    ) -> LocalBoxFuture<'this, eyre::Result<RawAVMOutcome>> {
+        let keypair = keypair.clone();
+        async move {
+            use air_interpreter_sede::ToSerialized;
+            use avm_interface::into_raw_result;
+
+            // some inner parts transformations
+            let raw_call_results = into_raw_result(call_results);
+            let raw_call_results = CallResultsRepr.serialize(&raw_call_results).unwrap();
+
+            let key_format = keypair.key_format().into();
+            let secret_key_bytes = keypair.secret().expect("Failed to get secret key");
+            let AquaVMRuntimeLimits {
+                air_size_limit,
+                particle_size_limit,
+                call_result_size_limit,
+                hard_limit_enabled,
+            } = self.aquavm_runtime_limits;
+
+            let outcome = air::execute_air(
+                air,
+                prev_data,
+                data,
+                RunParameters {
+                    init_peer_id,
+                    current_peer_id,
+                    timestamp,
+                    ttl,
+                    key_format,
+                    secret_key_bytes,
+                    particle_id,
+                    air_size_limit,
+                    particle_size_limit,
+                    call_result_size_limit,
+                    hard_limit_enabled,
+                },
+                raw_call_results,
+            );
+            let outcome = RawAVMOutcome::from_interpreter_outcome(outcome)?;
+
+            Ok(outcome)
+        }
+        .boxed_local()
+    }
+}
+
+impl DataToHumanReadable for NativeAvmRunner {
+    fn to_human_readable<'this>(
+        &'this mut self,
+        data: Vec<u8>,
+    ) -> LocalBoxFuture<'this, Result<String, Box<dyn StdError>>> {
+        async move { air::to_human_readable_data(data) }.boxed_local()
+    }
+}
+
+pub(crate) fn create_native_avm_runner(
+    test_init_parameters: TestInitParameters,
+) -> eyre::Result<Box<NativeAvmRunner>> {
+    let aquavm_runtime_limits: AquaVMRuntimeLimits = test_init_parameters.into();
+
+    Ok(Box::new(NativeAvmRunner {
+        aquavm_runtime_limits,
+    }))
+}
+
\ No newline at end of file diff --git a/src/air/trace/run/runner.rs.html b/src/air/trace/run/runner.rs.html new file mode 100644 index 00000000..f357776c --- /dev/null +++ b/src/air/trace/run/runner.rs.html @@ -0,0 +1,223 @@ +runner.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use avm_interface::raw_outcome::RawAVMOutcome;
+use avm_interface::CallResults;
+use avm_server::AVMRuntimeLimits;
+use avm_server::AquaVMRuntimeLimits;
+use fluence_keypair::KeyPair;
+use futures::future::LocalBoxFuture;
+
+use std::error::Error as StdError;
+
+pub(crate) trait AirRunner {
+    #[allow(clippy::too_many_arguments)]
+    fn call_tracing<'this>(
+        &'this mut self,
+        air: String,
+        prev_data: Vec<u8>,
+        data: Vec<u8>,
+        init_peer_id: String,
+        timestamp: u64,
+        ttl: u32,
+        current_peer_id: String,
+        call_results: CallResults,
+        tracing_params: String,
+        tracing_output_mode: u8,
+        key_pair: &KeyPair,
+        particle_id: String,
+    ) -> LocalBoxFuture<'this, eyre::Result<RawAVMOutcome>>;
+}
+
+pub(crate) trait DataToHumanReadable {
+    fn to_human_readable<'this>(
+        &'this mut self,
+        data: Vec<u8>,
+    ) -> LocalBoxFuture<'this, Result<String, Box<dyn StdError>>>;
+}
+
+/// This struct is used to set limits for the test runner creating AVMRunner.
+#[derive(Debug, Default, Clone)]
+pub struct TestInitParameters {
+    pub air_size_limit: Option<u64>,
+    pub particle_size_limit: Option<u64>,
+    pub call_result_size_limit: Option<u64>,
+    pub hard_limit_enabled: bool,
+}
+impl TestInitParameters {
+    pub fn new(
+        air_size_limit: Option<u64>,
+        particle_size_limit: Option<u64>,
+        call_result_size_limit: Option<u64>,
+        hard_limit_enabled: bool,
+    ) -> Self {
+        Self {
+            air_size_limit,
+            particle_size_limit,
+            call_result_size_limit,
+            hard_limit_enabled,
+        }
+    }
+    pub fn no_limits() -> Self {
+        Self {
+            air_size_limit: Some(u64::MAX),
+            particle_size_limit: Some(u64::MAX),
+            call_result_size_limit: Some(u64::MAX),
+            hard_limit_enabled: false,
+        }
+    }
+}
+
+impl From<TestInitParameters> for AVMRuntimeLimits {
+    fn from(value: TestInitParameters) -> Self {
+        AVMRuntimeLimits::new(
+            value.air_size_limit,
+            value.particle_size_limit,
+            value.call_result_size_limit,
+            value.hard_limit_enabled,
+        )
+    }
+}
+
+impl From<TestInitParameters> for AquaVMRuntimeLimits {
+    fn from(value: TestInitParameters) -> Self {
+        use air_interpreter_interface::MAX_AIR_SIZE;
+        use air_interpreter_interface::MAX_CALL_RESULT_SIZE;
+        use air_interpreter_interface::MAX_PARTICLE_SIZE;
+
+        AquaVMRuntimeLimits::new(
+            value.air_size_limit.unwrap_or(MAX_AIR_SIZE),
+            value.particle_size_limit.unwrap_or(MAX_PARTICLE_SIZE),
+            value.call_result_size_limit.unwrap_or(MAX_CALL_RESULT_SIZE),
+            value.hard_limit_enabled,
+        )
+    }
+}
+
\ No newline at end of file diff --git a/src/air/trace/run/wasm.rs.html b/src/air/trace/run/wasm.rs.html new file mode 100644 index 00000000..ab29b44c --- /dev/null +++ b/src/air/trace/run/wasm.rs.html @@ -0,0 +1,233 @@ +wasm.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::runner::AirRunner;
+use super::runner::DataToHumanReadable;
+use crate::trace::run::runner::TestInitParameters;
+use air_test_utils::avm_runner::AVMRunner;
+use fluence_keypair::KeyPair;
+use futures::future::LocalBoxFuture;
+use futures::FutureExt;
+use marine_wasmtime_backend::WasmtimeConfig;
+use marine_wasmtime_backend::WasmtimeWasmBackend;
+
+use std::error::Error as StdError;
+use std::path::Path;
+
+pub(crate) struct WasmAvmRunner(AVMRunner<WasmtimeWasmBackend>);
+
+impl AirRunner for WasmAvmRunner {
+    fn call_tracing<'this>(
+        &'this mut self,
+        air: String,
+        prev_data: Vec<u8>,
+        data: Vec<u8>,
+        init_peer_id: String,
+        timestamp: u64,
+        ttl: u32,
+        current_peer_id: String,
+        call_results: avm_interface::CallResults,
+        tracing_params: String,
+        tracing_output_mode: u8,
+        keypair: &KeyPair,
+        particle_id: String,
+    ) -> LocalBoxFuture<'this, eyre::Result<avm_interface::raw_outcome::RawAVMOutcome>> {
+        let keypair = keypair.clone();
+        async move {
+            let call_tracing = self
+                .0
+                .call_tracing(
+                    air,
+                    prev_data,
+                    data,
+                    init_peer_id,
+                    timestamp,
+                    ttl,
+                    current_peer_id,
+                    call_results,
+                    tracing_params,
+                    tracing_output_mode,
+                    keypair.key_format().into(),
+                    keypair.secret().expect("Failed to get secret"),
+                    particle_id,
+                )
+                .await;
+            let memory_stats = self.0.memory_stats();
+            tracing::warn!(memory_size = memory_stats.memory_size);
+
+            Ok(call_tracing?)
+        }
+        .boxed_local()
+    }
+}
+
+impl DataToHumanReadable for WasmAvmRunner {
+    fn to_human_readable<'this>(
+        &'this mut self,
+        data: Vec<u8>,
+    ) -> LocalBoxFuture<'this, Result<String, Box<dyn StdError>>> {
+        async {
+            self.0
+                .to_human_readable_data(data)
+                .await
+                .map_err(|e| Box::new(e) as Box<dyn StdError>)
+        }
+        .boxed_local()
+    }
+}
+
+pub(crate) async fn create_wasm_avm_runner(
+    air_interpreter_wasm_path: &Path,
+    max_heap_size: Option<u64>,
+    test_init_parameters: TestInitParameters,
+) -> eyre::Result<Box<WasmAvmRunner>> {
+    let mut config = WasmtimeConfig::default();
+    config
+        .debug_info(true)
+        .wasm_backtrace(true)
+        .epoch_interruption(false);
+    let wasm_backend = WasmtimeWasmBackend::new(config)?;
+    Ok(Box::new(WasmAvmRunner(
+        AVMRunner::new(
+            air_interpreter_wasm_path.to_owned(),
+            max_heap_size,
+            test_init_parameters.into(),
+            0,
+            wasm_backend,
+        )
+        .await?,
+    )))
+}
+
\ No newline at end of file diff --git a/src/air/trace/stats.rs.html b/src/air/trace/stats.rs.html new file mode 100644 index 00000000..b4dd8756 --- /dev/null +++ b/src/air/trace/stats.rs.html @@ -0,0 +1,231 @@ +stats.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+mod log_data;
+mod report;
+
+use self::log_data::{LogRecord, Message};
+
+use clap::Parser;
+
+#[derive(Parser)]
+#[clap(about = "Print human-readable AquaVM JSON trace or provide execution stats")]
+pub(crate) struct Args {
+    #[clap(long)]
+    pretty: bool,
+    #[clap(long)]
+    stats: bool,
+
+    #[clap(long)]
+    sort_stats_by_duration: bool,
+}
+
+pub(crate) fn stats(mut args: Args) -> eyre::Result<()> {
+    use std::io::Write;
+
+    if !args.pretty && !args.stats {
+        args.pretty = true;
+        args.stats = true;
+    }
+
+    let stderr = std::io::stderr();
+    let mut stderr = stderr.lock();
+    let stdin = std::io::stdin();
+    let stdin = stdin.lock();
+
+    let mut stats = self::report::StatsReport::new();
+
+    #[allow(clippy::significant_drop_in_scrutinee)]
+    for rec in read_logs(stdin) {
+        let rec = rec?;
+
+        if args.pretty {
+            print_log_record(&mut stderr, &rec)?;
+        }
+        if args.stats {
+            stats.consider(rec)?;
+        }
+    }
+
+    if args.stats {
+        if args.pretty {
+            writeln!(stderr)?;
+        }
+        stats.report(&mut stderr, args.sort_stats_by_duration)?;
+    }
+    Ok(())
+}
+
+fn read_logs<R: std::io::BufRead>(input: R) -> impl Iterator<Item = eyre::Result<LogRecord>> {
+    input.lines().filter_map(|r| match r {
+        Ok(line) => {
+            let line = line.trim();
+            if line.is_empty() {
+                None
+            } else {
+                Some(serde_json::from_str(line).map_err(eyre::Error::from))
+            }
+        }
+        Err(err) => Some(Err(err.into())),
+    })
+}
+
+fn print_log_record<W: std::io::Write>(mut out: W, log_record: &LogRecord) -> std::io::Result<()> {
+    use itertools::Itertools as _;
+
+    let val = &log_record.value;
+
+    write!(
+        out,
+        "{timestamp}  {level} ",
+        timestamp = val.timestamp,
+        level = val.level,
+    )?;
+    if !val.spans.is_empty() {
+        write!(out, "{spans}", spans = val.spans.iter().join(":"),)?;
+    }
+    if matches!(&val.fields, Message::Close(_)) {
+        if !val.spans.is_empty() {
+            write!(out, ":")?;
+        }
+        write!(out, "{span}", span = log_record.span)?;
+    }
+    writeln!(
+        out,
+        ": {target}: {fields}",
+        target = log_record.target,
+        fields = val.fields,
+    )
+}
+
\ No newline at end of file diff --git a/src/air/trace/stats/log_data.rs.html b/src/air/trace/stats/log_data.rs.html new file mode 100644 index 00000000..3710e93a --- /dev/null +++ b/src/air/trace/stats/log_data.rs.html @@ -0,0 +1,241 @@ +log_data.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use serde::Deserialize;
+use std::collections::HashMap;
+
+#[derive(Deserialize)]
+pub(crate) struct LogRecord {
+    pub(crate) target: String,
+    pub(crate) span: Span,
+
+    #[serde(flatten)]
+    pub(crate) value: LogValue,
+}
+
+#[derive(Debug, Deserialize)]
+pub(crate) struct Span {
+    pub(crate) name: String,
+    #[serde(flatten)]
+    pub(crate) args: HashMap<String, serde_json::Value>,
+}
+
+#[derive(Hash, PartialEq, Eq, PartialOrd, Ord)]
+pub(crate) struct LogKey {
+    pub(crate) target: String,
+    pub(crate) span_name: String,
+}
+
+#[derive(Deserialize)]
+pub(crate) struct LogValue {
+    pub(crate) timestamp: String,
+    pub(crate) fields: Message,
+    pub(crate) level: String,
+    pub(crate) spans: Vec<Span>,
+}
+
+#[derive(Debug, Deserialize)]
+#[serde(tag = "message", rename_all = "lowercase")]
+pub(crate) enum Message {
+    New,
+    Enter,
+    Close(CloseMessage),
+}
+
+#[derive(Debug, Deserialize)]
+pub(crate) struct CloseMessage {
+    #[serde(rename = "time.busy")]
+    pub(crate) time_busy: String,
+    #[serde(rename = "time.idle")]
+    pub(crate) time_idle: String,
+}
+
+impl LogRecord {
+    pub(crate) fn get_key(&self) -> LogKey {
+        LogKey {
+            target: self.target.clone(),
+            span_name: self.span.name.clone(),
+        }
+    }
+}
+
+impl std::fmt::Display for Message {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        match self {
+            Message::New => write!(f, "new"),
+            Message::Enter => write!(f, "enter"),
+            Message::Close(c) => write!(f, "close {c}"),
+        }
+    }
+}
+
+impl std::fmt::Display for CloseMessage {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(f, "idle={}, busy={}", self.time_idle, self.time_busy)
+    }
+}
+
+fn format_argument(val: &serde_json::Value) -> String {
+    match val {
+        serde_json::Value::String(s) => s.to_owned(),
+        _ => val.to_string(),
+    }
+}
+
+impl std::fmt::Display for Span {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        use itertools::Itertools as _;
+
+        self.name.fmt(f)?;
+        if !self.args.is_empty() {
+            "{".fmt(f)?;
+            write!(
+                f,
+                "{}",
+                self.args
+                    .iter()
+                    .map(|(k, v)| format!("{}={}", k, format_argument(v)))
+                    .format(", ")
+            )?;
+            "}".fmt(f)?;
+        }
+        Ok(())
+    }
+}
+
\ No newline at end of file diff --git a/src/air/trace/stats/report.rs.html b/src/air/trace/stats/report.rs.html new file mode 100644 index 00000000..21ecc688 --- /dev/null +++ b/src/air/trace/stats/report.rs.html @@ -0,0 +1,125 @@ +report.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::super::utils::parse_tracing_duration;
+use super::log_data::LogKey;
+use super::log_data::LogRecord;
+use super::log_data::Message;
+
+use std::{collections::HashMap, time::Duration};
+
+#[derive(Default)]
+pub(crate) struct StatsReport {
+    data: HashMap<LogKey, Duration>,
+}
+
+impl StatsReport {
+    pub(crate) fn new() -> Self {
+        Self::default()
+    }
+
+    pub(crate) fn report<W: std::io::Write>(
+        self,
+        mut out: W,
+        sort_stats_by_duration: bool,
+    ) -> std::io::Result<()> {
+        writeln!(out, "*** Statistics ***")?;
+        let mut stats_data: Vec<_> = self.data.into_iter().collect();
+        if sort_stats_by_duration {
+            stats_data.sort_unstable_by(|a, b| (a.1, &a.0).cmp(&(b.1, &b.0)).reverse());
+        } else {
+            stats_data.sort_unstable_by(|a, b| a.0.cmp(&b.0));
+        }
+        for (k, v) in stats_data {
+            writeln!(out, "{} {}: {:?}", k.target, k.span_name, v)?;
+        }
+        Ok(())
+    }
+
+    pub(crate) fn consider(&mut self, rec: LogRecord) -> eyre::Result<()> {
+        if let Message::Close(close) = &rec.value.fields {
+            let time_busy = parse_tracing_duration(&close.time_busy)?;
+            *self.data.entry(rec.get_key()).or_default() += time_busy;
+        }
+        Ok(())
+    }
+}
+
\ No newline at end of file diff --git a/src/air/trace/utils.rs.html b/src/air/trace/utils.rs.html new file mode 100644 index 00000000..a3b5cde4 --- /dev/null +++ b/src/air/trace/utils.rs.html @@ -0,0 +1,89 @@ +utils.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+use std::time::Duration;
+
+// unfortunately, external crates don't seem to provide required functionality:
+// some do not handle floats, others do not handle suffixes
+pub(crate) fn parse_tracing_duration(input: &str) -> Result<Duration, eyre::Error> {
+    for (suffix, scale) in [("ns", 1e-9), ("µs", 1e-6), ("ms", 1e-3), ("s", 1e0)] {
+        if let Some(num_str) = input.strip_suffix(suffix) {
+            if let Ok(num) = num_str.parse::<f64>() {
+                return Ok(Duration::from_secs_f64(num * scale));
+            } else {
+                break;
+            }
+        }
+    }
+
+    Err(eyre::eyre!("malformed duration {:?}", input))
+}
+
+pub(crate) fn unix_timestamp_now() -> u64 {
+    use std::time::SystemTime;
+
+    SystemTime::now()
+        .duration_since(SystemTime::UNIX_EPOCH)
+        .expect("time befor Unix epoch")
+        .as_secs()
+}
+
\ No newline at end of file diff --git a/src/air/utils/error_codes.rs.html b/src/air/utils/error_codes.rs.html new file mode 100644 index 00000000..d4a6a219 --- /dev/null +++ b/src/air/utils/error_codes.rs.html @@ -0,0 +1,49 @@ +error_codes.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+/// This consts are used as start ids of corresponding errors.
+pub(crate) const PREPARATION_ERROR_START_ID: i64 = 1;
+pub(crate) const CATCHABLE_ERRORS_START_ID: i64 = 10000;
+pub(crate) const UNCATCHABLE_ERRORS_START_ID: i64 = 20000;
+pub(crate) const FAREWELL_ERRORS_START_ID: i64 = 30000;
+
\ No newline at end of file diff --git a/src/air/utils/mod.rs.html b/src/air/utils/mod.rs.html new file mode 100644 index 00000000..40ab5bff --- /dev/null +++ b/src/air/utils/mod.rs.html @@ -0,0 +1,49 @@ +mod.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+mod error_codes;
+mod to_error_code;
+
+pub(crate) use error_codes::*;
+pub use to_error_code::ToErrorCode;
+
\ No newline at end of file diff --git a/src/air/utils/to_error_code.rs.html b/src/air/utils/to_error_code.rs.html new file mode 100644 index 00000000..61fbce5f --- /dev/null +++ b/src/air/utils/to_error_code.rs.html @@ -0,0 +1,85 @@ +to_error_code.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+pub trait ToErrorCode {
+    fn to_error_code(&self) -> i64;
+}
+
+#[macro_export]
+macro_rules! generate_to_error_code {
+    ($self: expr, $error_type:ident, $start_id: expr) => {
+        concat_idents::concat_idents!(error_start_id = $error_type, _, START_ID {
+            concat_idents::concat_idents!(error_discriminant = $error_type, Discriminants { {
+                #[allow(non_upper_case_globals)]
+                const error_start_id: i64 = $start_id;
+
+                let mut errors = error_discriminant::iter();
+                let actual_error_type = error_discriminant::from($self);
+
+                // unwrap is safe here because errors are guaranteed to contain all errors variants
+                let enum_variant_position = errors.position(|et| et == actual_error_type).unwrap() as i64;
+                error_start_id + enum_variant_position
+                }
+            })
+        })
+    }
+}
+
\ No newline at end of file diff --git a/src/air/verification_step.rs.html b/src/air/verification_step.rs.html new file mode 100644 index 00000000..63cc0e2a --- /dev/null +++ b/src/air/verification_step.rs.html @@ -0,0 +1,109 @@ +verification_step.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use air_interpreter_data::InterpreterData;
+use air_interpreter_signatures::SignatureStore;
+
+// TODO replace with VerificationError
+use crate::PreparationError;
+
+#[cfg(feature = "check_signatures")]
+#[tracing::instrument(skip_all)]
+pub(crate) fn verify(
+    prev_data: &InterpreterData,
+    current_data: &InterpreterData,
+    salt: &str,
+) -> Result<SignatureStore, PreparationError> {
+    use air_interpreter_data::verification;
+
+    current_data.cid_info.verify()?;
+
+    let prev_data_verifier = verification::DataVerifier::new(prev_data, salt)?;
+    let current_data_verifier = verification::DataVerifier::new(current_data, salt)?;
+    // prev_data is always correct, check only current_data
+    current_data_verifier.verify()?;
+
+    let signature_store = prev_data_verifier.merge(current_data_verifier)?;
+    Ok(signature_store)
+}
+
+#[cfg(not(feature = "check_signatures"))]
+#[tracing::instrument(skip_all)]
+pub(crate) fn verify(
+    _prev_data: &InterpreterData,
+    _current_data: &InterpreterData,
+    _salt: &str,
+) -> Result<SignatureStore, PreparationError> {
+    Ok(<_>::default())
+}
+
\ No newline at end of file diff --git a/src/air_beautifier/beautifier.rs.html b/src/air_beautifier/beautifier.rs.html new file mode 100644 index 00000000..7f68277e --- /dev/null +++ b/src/air_beautifier/beautifier.rs.html @@ -0,0 +1,575 @@ +beautifier.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::r#virtual::try_hopon;
+
+use air_parser::ast;
+
+use std::fmt::Display;
+use std::io;
+
+pub const DEFAULT_INDENT_STEP: usize = 4;
+
+macro_rules! multiline {
+    ($beautifier:expr, $indent:expr $(; $fmt1:literal $(, $arg1:expr)*; $nest:expr)+) => ({
+        let indent_step = $beautifier.indent_step;
+        $({
+              let out = &mut $beautifier.output;
+              $crate::beautifier::fmt_indent(out, $indent)?;
+              writeln!(out, $fmt1 $(, $arg1)*)?;
+          }
+          $crate::beautifier::Beautifier::beautify_walker($beautifier, $nest, $indent + indent_step)?;
+        )+
+    });
+}
+
+macro_rules! compound {
+    ($beautifier:expr, $indent:expr, $instruction:expr) => ({
+        multiline!(
+            $beautifier, $indent;
+            "{}:", $instruction;
+            &$instruction.instruction
+        )
+    });
+}
+
+fn fmt_indent(output: &mut impl io::Write, indent: usize) -> io::Result<()> {
+    write!(output, "{:indent$}", "", indent = indent)
+}
+
+struct CallArgs<'ctx, 'i>(&'ctx [ast::ImmutableValue<'i>]);
+
+impl<'ctx, 'i> Display for CallArgs<'ctx, 'i> {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        use itertools::Itertools as _;
+
+        f.write_fmt(format_args!("{}", self.0.iter().format(", ")))
+    }
+}
+
+struct CallTriplet<'ctx, 'i>(&'ctx ast::Triplet<'i>);
+
+impl<'ctx, 'i> Display for CallTriplet<'ctx, 'i> {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        f.write_fmt(format_args!(
+            "{} ({}, {})",
+            self.0.peer_id, self.0.service_id, self.0.function_name
+        ))
+    }
+}
+
+/// Error produced by the Beautifier.
+#[derive(Debug, thiserror::Error)]
+pub enum BeautifyError {
+    #[error("{0}")]
+    Parse(String),
+    #[error(transparent)]
+    Io(#[from] io::Error),
+}
+
+/// AIR beautifier.
+pub struct Beautifier<W: io::Write> {
+    output: W,
+    indent_step: usize,
+    try_hopon: bool,
+}
+
+impl<W: io::Write> Beautifier<W> {
+    /// Beautifier for the output with default indentation step.
+    #[inline]
+    pub fn new(output: W) -> Self {
+        Self {
+            output,
+            indent_step: DEFAULT_INDENT_STEP,
+            try_hopon: false,
+        }
+    }
+
+    /// Beautifier for the output with custom indentation step.
+    #[inline]
+    pub fn new_with_indent(output: W, indent_step: usize) -> Self {
+        Self {
+            output,
+            indent_step,
+            try_hopon: false,
+        }
+    }
+
+    #[inline]
+    /// Enable all patterns in the emited code.
+    pub fn enable_all_patterns(self) -> Self {
+        self.enable_try_hopon()
+    }
+
+    #[inline]
+    pub fn enable_try_hopon(mut self) -> Self {
+        self.try_hopon = true;
+        self
+    }
+
+    /// Unwrap the Beautifier into the underlying writer.
+    pub fn into_inner(self) -> W {
+        self.output
+    }
+
+    /// Emit beautified code for the `air_script`.
+    pub fn beautify(&mut self, air_script: &str) -> Result<(), BeautifyError> {
+        let tree = air_parser::parse(air_script).map_err(BeautifyError::Parse)?;
+        self.beautify_ast(&tree)
+    }
+
+    /// Emit beautified code for the `ast`.
+    pub fn beautify_ast(&mut self, ast: &ast::Instruction<'_>) -> Result<(), BeautifyError> {
+        Ok(self.beautify_walker(ast, 0)?)
+    }
+
+    fn beautify_walker(&mut self, node: &ast::Instruction<'_>, indent: usize) -> io::Result<()> {
+        match node {
+            ast::Instruction::Call(call) => self.beautify_call(call, indent),
+            ast::Instruction::Ap(ap) => self.beautify_simple(ap, indent),
+            ast::Instruction::ApMap(ap_map) => self.beautify_simple(ap_map, indent),
+            ast::Instruction::Canon(canon) => self.beautify_simple(canon, indent),
+            ast::Instruction::CanonMap(canon_map) => self.beautify_simple(canon_map, indent),
+            ast::Instruction::CanonStreamMapScalar(canon) => self.beautify_simple(canon, indent),
+            ast::Instruction::Seq(seq) => self.beautify_seq(seq, indent),
+            ast::Instruction::Par(par) => self.beautify_par(par, indent),
+            ast::Instruction::Xor(xor) => self.beautify_xor(xor, indent),
+            ast::Instruction::Match(match_) => self.beautify_match(match_, indent),
+            ast::Instruction::MisMatch(mismatch) => self.beautify_mismatch(mismatch, indent),
+            ast::Instruction::Fail(fail) => self.beautify_simple(fail, indent),
+            ast::Instruction::FoldScalar(fold_scalar) => {
+                self.beautify_fold_scalar(fold_scalar, indent)
+            }
+            ast::Instruction::FoldStream(fold_stream) => {
+                self.beautify_fold_stream(fold_stream, indent)
+            }
+            ast::Instruction::FoldStreamMap(fold_stream_map) => {
+                self.beautify_fold_stream_map(fold_stream_map, indent)
+            }
+            ast::Instruction::Never(never) => self.beautify_simple(never, indent),
+            ast::Instruction::New(new) => self.beautify_new(new, indent),
+            ast::Instruction::Next(next) => self.beautify_simple(next, indent),
+            ast::Instruction::Null(null) => self.beautify_simple(null, indent),
+            ast::Instruction::Error => self.beautify_simple("error", indent),
+        }
+    }
+
+    fn beautify_call(&mut self, call: &ast::Call<'_>, indent: usize) -> io::Result<()> {
+        fmt_indent(&mut self.output, indent)?;
+        match &call.output {
+            ast::CallOutputValue::Scalar(v) => write!(&mut self.output, "{v} <- ")?,
+            ast::CallOutputValue::Stream(v) => write!(&mut self.output, "{v} <- ")?,
+            ast::CallOutputValue::None => {}
+        }
+        writeln!(
+            &mut self.output,
+            "call {} [{}]",
+            CallTriplet(&call.triplet),
+            CallArgs(call.args.as_slice())
+        )
+    }
+
+    fn beautify_simple(&mut self, instruction: impl Display, indent: usize) -> io::Result<()> {
+        fmt_indent(&mut self.output, indent)?;
+        writeln!(&mut self.output, "{instruction}")
+    }
+
+    fn beautify_seq(&mut self, seq: &ast::Seq<'_>, indent: usize) -> io::Result<()> {
+        self.beautify_walker(&seq.0, indent)?;
+        self.beautify_walker(&seq.1, indent)
+    }
+
+    fn beautify_par(&mut self, par: &ast::Par<'_>, indent: usize) -> io::Result<()> {
+        multiline!(
+            self, indent;
+            "par:";
+            &par.0;
+            "|";  // TODO: SHOULD BE UNINDENTED AS PER SPEC; OR WE MAY CHANGE THE SPEC
+            &par.1
+        );
+        Ok(())
+    }
+
+    fn beautify_xor(&mut self, xor: &ast::Xor<'_>, indent: usize) -> io::Result<()> {
+        multiline!(
+            self, indent;
+            "try:";
+            &xor.0;
+            "catch:";
+            &xor.1
+        );
+        Ok(())
+    }
+
+    fn beautify_match(&mut self, match_: &ast::Match<'_>, indent: usize) -> io::Result<()> {
+        compound!(self, indent, match_);
+        Ok(())
+    }
+
+    fn beautify_mismatch(&mut self, mismatch: &ast::MisMatch<'_>, indent: usize) -> io::Result<()> {
+        compound!(self, indent, mismatch);
+        Ok(())
+    }
+
+    fn beautify_fold_scalar(
+        &mut self,
+        fold: &ast::FoldScalar<'_>,
+        indent: usize,
+    ) -> io::Result<()> {
+        compound!(self, indent, fold);
+        if let Some(last_instruction) = &fold.last_instruction {
+            multiline!(
+                self, indent;
+                "last:";
+                last_instruction);
+        }
+        Ok(())
+    }
+
+    fn beautify_fold_stream(
+        &mut self,
+        fold: &ast::FoldStream<'_>,
+        indent: usize,
+    ) -> io::Result<()> {
+        compound!(self, indent, fold);
+        if let Some(last_instruction) = &fold.last_instruction {
+            multiline!(
+                self, indent;
+                "last:";
+                last_instruction
+            );
+        }
+        Ok(())
+    }
+
+    fn beautify_fold_stream_map(
+        &mut self,
+        fold: &ast::FoldStreamMap<'_>,
+        indent: usize,
+    ) -> io::Result<()> {
+        compound!(self, indent, fold);
+        if let Some(last_instruction) = &fold.last_instruction {
+            multiline!(
+                self, indent;
+                "last:";
+                last_instruction
+            );
+        }
+        Ok(())
+    }
+
+    fn beautify_new(&mut self, new: &ast::New<'_>, indent: usize) -> io::Result<()> {
+        if self.try_hopon {
+            if let Some(hop_on) = try_hopon(new) {
+                return self.beautify_simple(&hop_on, indent);
+            }
+        }
+        // else
+        compound!(self, indent, new);
+        Ok(())
+    }
+}
+
\ No newline at end of file diff --git a/src/air_beautifier/lib.rs.html b/src/air_beautifier/lib.rs.html new file mode 100644 index 00000000..fd8fdb0a --- /dev/null +++ b/src/air_beautifier/lib.rs.html @@ -0,0 +1,129 @@ +lib.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#![warn(rust_2018_idioms)]
+#![deny(
+    dead_code,
+    nonstandard_style,
+    unused_imports,
+    unused_mut,
+    unused_variables,
+    unused_unsafe,
+    unreachable_patterns
+)]
+
+mod beautifier;
+mod r#virtual;
+
+pub use crate::beautifier::{Beautifier, BeautifyError, DEFAULT_INDENT_STEP};
+
+use std::io;
+
+/// Beautify the `air_script` with default settings to the `output`.
+pub fn beautify(
+    air_script: &str,
+    output: &mut impl io::Write,
+    enable_patterns: bool,
+) -> Result<(), BeautifyError> {
+    let mut beautifier = Beautifier::new(output);
+    if enable_patterns {
+        beautifier = beautifier.enable_all_patterns();
+    }
+    beautifier.beautify(air_script)
+}
+
+/// Beautify the `air_script` to a string with default settings.
+/// Return error on parsing error.
+pub fn beautify_to_string(air_script: &str) -> Result<String, String> {
+    let ast = air_parser::parse(air_script)?;
+    let mut buffer = vec![];
+    let mut beautifier = Beautifier::new(&mut buffer);
+
+    beautifier.beautify_ast(&ast).unwrap();
+    // Safety: safe because Beautifier produces valid utf8 strings
+    Ok(unsafe { String::from_utf8_unchecked(buffer) })
+}
+
+#[cfg(test)]
+mod tests;
+
\ No newline at end of file diff --git a/src/air_beautifier/virtual.rs.html b/src/air_beautifier/virtual.rs.html new file mode 100644 index 00000000..2897f3d9 --- /dev/null +++ b/src/air_beautifier/virtual.rs.html @@ -0,0 +1,175 @@ +virtual.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use air_parser::ast;
+
+use core::fmt;
+use std::fmt::Display;
+
+/// A virtual `hopon` instruction.
+pub(crate) struct HopOn<'i> {
+    pub peer_id: ast::ResolvableToPeerIdVariable<'i>,
+}
+
+impl Display for HopOn<'_> {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        write!(f, "hopon {}", self.peer_id)
+    }
+}
+
+/// Try to parse the `new` instruction and its nested elements as a virtual `hopon` instruction.
+///
+/// For example:
+/// ```clojure
+/// (new #uniq1_name
+///    (new $uniq2_name
+///       (canon peer_id $uniq2_name #uniq1_name)))
+/// ```
+/// is parsed as a virtual instruction
+/// ```clojure
+/// (hopon peer_id)
+/// ```
+pub(crate) fn try_hopon<'i>(root_new: &ast::New<'i>) -> Option<HopOn<'i>> {
+    let expected_stream_name = &root_new.argument;
+
+    if let (ast::Instruction::New(nested_new), ast::NewArgument::Stream(stream_name)) =
+        (&root_new.instruction, expected_stream_name)
+    {
+        let expected_nested_canon_name = &nested_new.argument;
+
+        if let (ast::Instruction::Canon(canon), ast::NewArgument::CanonStream(nested_canon_name)) =
+            (&nested_new.instruction, expected_nested_canon_name)
+        {
+            if canon.canon_stream.name == nested_canon_name.name
+                && canon.stream.name == stream_name.name
+                // this condition handles case that is never generated by an Aqua compiler, but
+                // can be crafted manually
+                //
+                // see `hopon_shadowing` test for an example
+                && !canon_shadows_peer_id(nested_canon_name.name, &canon.peer_id)
+            {
+                return Some(HopOn {
+                    peer_id: canon.peer_id.clone(),
+                });
+            }
+        }
+    }
+
+    None
+}
+
+fn canon_shadows_peer_id(canon_name: &str, peer_id: &ast::ResolvableToPeerIdVariable<'_>) -> bool {
+    use ast::ResolvableToPeerIdVariable::*;
+    match peer_id {
+        InitPeerId => false,
+        Literal(_) => false,
+        Scalar(_) => false,
+        ScalarWithLambda(_) => false,
+        CanonStreamMapWithLambda(_) => false,
+        CanonStreamWithLambda(canon_with_lambda) => canon_with_lambda.name == canon_name,
+    }
+}
+
\ No newline at end of file diff --git a/src/air_beautify_wasm/lib.rs.html b/src/air_beautify_wasm/lib.rs.html new file mode 100644 index 00000000..0f4202f1 --- /dev/null +++ b/src/air_beautify_wasm/lib.rs.html @@ -0,0 +1,69 @@ +lib.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use wasm_bindgen::prelude::*;
+
+#[wasm_bindgen]
+pub fn beautify(air_script: String) -> Result<String, JsError> {
+    let mut output = vec![];
+    air_beautifier::beautify(&air_script, &mut output, true)?;
+    Ok(unsafe { String::from_utf8_unchecked(output) })
+}
+
+#[wasm_bindgen]
+pub fn beautify_raw(air_script: String) -> Result<String, JsError> {
+    let mut output = vec![];
+    air_beautifier::beautify(&air_script, &mut output, false)?;
+    Ok(unsafe { String::from_utf8_unchecked(output) })
+}
+
\ No newline at end of file diff --git a/src/air_execution_info_collector/instructions_tracker.rs.html b/src/air_execution_info_collector/instructions_tracker.rs.html new file mode 100644 index 00000000..07b0da71 --- /dev/null +++ b/src/air_execution_info_collector/instructions_tracker.rs.html @@ -0,0 +1,305 @@ +instructions_tracker.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use air_parser::AirPos;
+
+use std::collections::HashMap;
+
+/// Intended to track a number of executed instruction of each type. For instructions that
+/// have a corresponding state in data, it tracks number of executed instructions on
+/// current peer (executed) and overall number (seen) of met instructions of such type.
+#[derive(Default, Debug, PartialEq, Eq)]
+pub struct InstructionTracker {
+    pub ap: ApTracker,
+    pub call: CallTracker,
+    pub fold: FoldTracker,
+    pub match_count: u32,
+    pub mismatch_count: u32,
+    pub new_tracker: NewTracker,
+    pub next_count: u32,
+    pub null_count: u32,
+    pub par: ParTracker,
+    pub seq_count: u32,
+    pub xor_count: u32,
+}
+
+#[derive(Default, Debug, PartialEq, Eq)]
+pub struct ApTracker {
+    pub seen_count: u32,
+    pub executed_count: u32,
+}
+
+#[derive(Default, Debug, PartialEq, Eq)]
+pub struct CallTracker {
+    pub seen_count: u32,
+    pub executed_count: u32,
+}
+
+#[derive(Default, Debug, PartialEq, Eq)]
+pub struct FoldTracker {
+    pub seen_scalar_count: u32,
+    pub seen_stream_count: u32,
+}
+
+#[derive(Default, Debug, PartialEq, Eq)]
+pub struct ParTracker {
+    pub seen_count: u32,
+    pub executed_count: u32,
+}
+
+#[derive(Default, Debug, PartialEq, Eq)]
+pub struct NewTracker {
+    /// Mapping from a new instruction position in a script
+    /// to a number of their execution. This is needed to
+    /// support private stream generation mappings.
+    pub executed_count: HashMap<AirPos, u32>,
+}
+
+// TODO: return seen_count from other methods of this structure
+impl InstructionTracker {
+    pub fn meet_ap(&mut self) {
+        self.ap.seen_count += 1;
+    }
+
+    pub fn meet_executed_ap(&mut self) {
+        self.ap.executed_count += 1;
+    }
+
+    pub fn meet_call(&mut self) {
+        self.call.seen_count += 1;
+    }
+
+    pub fn meet_executed_call(&mut self) {
+        self.call.executed_count += 1;
+    }
+
+    pub fn meet_fold_scalar(&mut self) {
+        self.fold.seen_scalar_count += 1;
+    }
+
+    pub fn meet_fold_stream(&mut self) -> u32 {
+        self.fold.seen_stream_count += 1;
+        self.fold.seen_stream_count
+    }
+
+    pub fn meet_match(&mut self) {
+        self.match_count += 1;
+    }
+
+    pub fn meet_mismatch(&mut self) {
+        self.mismatch_count += 1;
+    }
+
+    pub fn meet_next(&mut self) {
+        self.next_count += 1;
+    }
+
+    pub fn meet_null(&mut self) {
+        self.null_count += 1;
+    }
+
+    pub fn meet_par(&mut self) {
+        self.par.seen_count += 1;
+    }
+
+    pub fn meet_executed_par(&mut self) {
+        self.par.executed_count += 1;
+    }
+
+    pub fn meet_seq(&mut self) {
+        self.seq_count += 1;
+    }
+
+    pub fn meet_xor(&mut self) {
+        self.xor_count += 1;
+    }
+
+    pub fn meet_new(&mut self, position: AirPos) {
+        use std::collections::hash_map::Entry::{Occupied, Vacant};
+
+        match self.new_tracker.executed_count.entry(position) {
+            Occupied(mut entry) => *entry.get_mut() += 1,
+            Vacant(entry) => {
+                entry.insert(1);
+            }
+        };
+    }
+}
+
+impl NewTracker {
+    pub fn get_iteration(&self, position: AirPos) -> u32 {
+        self.executed_count
+            .get(&position)
+            .copied()
+            .unwrap_or_default()
+    }
+}
+
\ No newline at end of file diff --git a/src/air_execution_info_collector/lib.rs.html b/src/air_execution_info_collector/lib.rs.html new file mode 100644 index 00000000..5cd480c3 --- /dev/null +++ b/src/air_execution_info_collector/lib.rs.html @@ -0,0 +1,69 @@ +lib.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#![forbid(unsafe_code)]
+#![warn(rust_2018_idioms)]
+#![deny(
+    dead_code,
+    nonstandard_style,
+    unused_imports,
+    unused_mut,
+    unused_variables,
+    unused_unsafe,
+    unreachable_patterns
+)]
+
+mod instructions_tracker;
+
+pub use instructions_tracker::*;
+
\ No newline at end of file diff --git a/src/air_interpreter_cid/lib.rs.html b/src/air_interpreter_cid/lib.rs.html new file mode 100644 index 00000000..19c8ba89 --- /dev/null +++ b/src/air_interpreter_cid/lib.rs.html @@ -0,0 +1,431 @@ +lib.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#![forbid(unsafe_code)]
+#![warn(rust_2018_idioms)]
+#![deny(
+    dead_code,
+    nonstandard_style,
+    unused_imports,
+    unused_mut,
+    unused_variables,
+    unused_unsafe,
+    unreachable_patterns
+)]
+
+mod verify;
+
+pub use crate::verify::{verify_raw_value, verify_value, CidVerificationError};
+
+use fluence_blake3 as blake3;
+use serde::Deserialize;
+use serde::Serialize;
+use thiserror::Error as ThisError;
+
+use std::fmt;
+use std::io::BufWriter;
+use std::marker::PhantomData;
+use std::rc::Rc;
+
+/// Should-be-opaque type for the inner representation of CID.
+/// It has to be serializable and Borsh-serializable, as well as implement `Debug`, `Eq`, `Ord`, `Hash` and similar
+/// basic traits.  It is also can be unsized.
+// you should be able to replace it with [u8], and most of the code will just work
+pub type CidRef = str;
+
+// there is no Rust multicodec crate with appropriate constants
+const JSON_CODEC: u64 = 0x0200;
+
+#[derive(Serialize, Deserialize)]
+#[serde(transparent)]
+#[cfg_attr(
+    feature = "rkyv",
+    derive(::rkyv::Archive, ::rkyv::Serialize, ::rkyv::Deserialize)
+)]
+#[cfg_attr(feature = "rkyv", archive(check_bytes))]
+#[cfg_attr(feature = "rkyv", omit_bounds)] // TODO look close, may be a misuse
+pub struct CID<T: ?Sized>(
+    Rc<CidRef>,
+    #[serde(skip)]
+    #[cfg_attr(feature = "rkyv", with(::rkyv::with::Skip))]
+    PhantomData<*const T>,
+);
+
+impl<T: ?Sized> CID<T> {
+    pub fn new(cid: impl Into<Rc<CidRef>>) -> Self {
+        Self(cid.into(), PhantomData)
+    }
+
+    pub fn get_inner(&self) -> Rc<CidRef> {
+        self.0.clone()
+    }
+}
+
+impl<T: ?Sized> std::convert::AsRef<CidRef> for CID<T> {
+    fn as_ref(&self) -> &CidRef {
+        &self.0
+    }
+}
+
+impl<T: ?Sized> std::borrow::Borrow<CidRef> for CID<T> {
+    fn borrow(&self) -> &CidRef {
+        &self.0
+    }
+}
+
+impl<T: ?Sized> Clone for CID<T> {
+    fn clone(&self) -> Self {
+        Self(self.0.clone(), self.1)
+    }
+}
+
+impl<T: ?Sized> fmt::Debug for CID<T> {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        f.debug_tuple("CID").field(&self.0).finish()
+    }
+}
+
+impl<Val> PartialEq for CID<Val> {
+    fn eq(&self, other: &Self) -> bool {
+        self.0 == other.0
+    }
+}
+
+impl<Val> Eq for CID<Val> {}
+
+impl<Val> std::hash::Hash for CID<Val> {
+    fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
+        self.0.hash(state);
+        self.1.hash(state);
+    }
+}
+
+impl<T: ?Sized> std::convert::TryFrom<&'_ CID<T>> for cid::Cid {
+    type Error = cid::Error;
+
+    fn try_from(value: &CID<T>) -> Result<Self, Self::Error> {
+        use std::str::FromStr;
+
+        cid::Cid::from_str(&value.0)
+    }
+}
+
+#[derive(Debug, ThisError)]
+pub enum CidCalculationError {
+    #[error(transparent)]
+    InvalidJson(#[from] serde_json::Error),
+}
+
+/// Calculate a CID of JSON-serialized value.
+// TODO we might refactor this to `SerializationCodec` trait
+// that both transform data to binary/text form (be it JSON, CBOR or something else)
+// and produces CID too
+pub fn value_to_json_cid<Val: Serialize + ?Sized>(
+    value: &Val,
+) -> Result<CID<Val>, CidCalculationError> {
+    use cid::Cid;
+    use multihash_codetable::{Code, MultihashDigest};
+
+    let hash = value_json_hash::<blake3::Hasher, Val>(value)?;
+
+    let digest = Code::Blake3_256
+        .wrap(&hash)
+        .expect("can't happen: incorrect hash length");
+
+    let cid = Cid::new_v1(JSON_CODEC, digest);
+    Ok(CID::new(cid.to_string()))
+}
+
+pub(crate) fn value_json_hash<D: digest::Digest + std::io::Write, Val: Serialize + ?Sized>(
+    value: &Val,
+) -> Result<Vec<u8>, serde_json::Error> {
+    const HASH_BUFFER_SIZE: usize = 8 * 1024;
+
+    let mut hasher = D::new();
+    serde_json::to_writer(
+        BufWriter::with_capacity(HASH_BUFFER_SIZE, &mut hasher),
+        value,
+    )?;
+    let hash = hasher.finalize();
+
+    Ok(hash.to_vec())
+}
+
+pub fn raw_value_to_json_cid<Val>(raw_value: impl AsRef<[u8]>) -> CID<Val> {
+    use cid::Cid;
+    use multihash_codetable::{Code, MultihashDigest};
+
+    let hash = raw_value_hash::<blake3::Hasher>(raw_value);
+    let digest = Code::Blake3_256
+        .wrap(&hash)
+        .expect("can't happen: incorrect hash length");
+
+    let cid = Cid::new_v1(JSON_CODEC, digest);
+    CID::new(cid.to_string())
+}
+
+pub(crate) fn raw_value_hash<D: digest::Digest>(raw_value: impl AsRef<[u8]>) -> Vec<u8> {
+    let mut hasher = D::new();
+    hasher.update(raw_value);
+    let hash = hasher.finalize();
+
+    hash.to_vec()
+}
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+    use serde_json::json;
+
+    #[test]
+    fn test_cid_default() {
+        assert_eq!(
+            value_to_json_cid(&json!("test")).unwrap(),
+            CID::new("bagaaihrarcyykpv4oj7zwdbepczyfthxya4og7s2rwvrzolm5kg2eu5dz3xa")
+        );
+        assert_eq!(
+            value_to_json_cid(&json!([1, 2, 3])).unwrap(),
+            CID::new("bagaaihram6sitn77tquub77n2jzjgttrlwkverv44pv3gns6qghm6hx6d36a"),
+        );
+        assert_eq!(
+            value_to_json_cid(&json!(1)).unwrap(),
+            CID::new("bagaaihra2y55tkbgv6i4d7vdoglfuzhbd3ra6e7ennpvfrmzaejwmbntusdq"),
+        );
+        assert_eq!(
+            value_to_json_cid(&json!({"key": 42})).unwrap(),
+            CID::new("bagaaihracpzxhsrpviexa7k6glwdhyh3a4kvy6j7qlcqokzqbs3q424cmxyq"),
+        );
+    }
+}
+
\ No newline at end of file diff --git a/src/air_interpreter_cid/verify.rs.html b/src/air_interpreter_cid/verify.rs.html new file mode 100644 index 00000000..16bb9952 --- /dev/null +++ b/src/air_interpreter_cid/verify.rs.html @@ -0,0 +1,587 @@ +verify.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use crate::{value_json_hash, CidRef, CID, JSON_CODEC};
+
+use fluence_blake3 as blake3;
+use serde::Serialize;
+use thiserror::Error as ThisError;
+
+use std::convert::TryInto;
+use std::rc::Rc;
+
+#[derive(ThisError, Debug)]
+pub enum CidVerificationError {
+    #[error("Value mismatch in the {type_name:?} store for CID {cid_repr:?}")]
+    ValueMismatch {
+        // nb: type_name is std::any::type_name() result that may be inconsistent between the Rust compiler versions
+        type_name: &'static str,
+        cid_repr: Rc<CidRef>,
+    },
+
+    #[error("JSON error: {0}")]
+    InvalidJson(#[from] serde_json::Error),
+    #[error(transparent)]
+    MalformedCid(#[from] cid::Error),
+    #[error("unsupported CID codec: {0}")]
+    UnsupportedCidCodec(u64),
+    #[error("unsupported multihash code: {0}")]
+    UnsupportedHashCode(u64),
+}
+
+pub fn verify_value<Val: Serialize>(
+    cid: &CID<Val>,
+    value: &Val,
+) -> Result<(), CidVerificationError> {
+    let real_cid: cid::Cid = cid.try_into()?;
+
+    let codec = real_cid.codec();
+    match codec {
+        JSON_CODEC => verify_json_value(real_cid.hash(), value, cid),
+        _ => Err(CidVerificationError::UnsupportedCidCodec(codec)),
+    }
+}
+
+pub fn verify_raw_value<Val>(
+    cid: &CID<Val>,
+    raw_value: impl AsRef<[u8]>,
+) -> Result<(), CidVerificationError> {
+    use digest::Digest;
+    use multihash_codetable::Code;
+
+    let real_cid: cid::Cid = cid.try_into()?;
+
+    let codec = real_cid.codec();
+    // we insist ATM that raw values should be JSON-encoded, but
+    // we do not validate that it is valid JSON data
+    if codec != JSON_CODEC {
+        return Err(CidVerificationError::UnsupportedCidCodec(codec));
+    }
+
+    let mhash = real_cid.hash();
+    let raw_code = mhash.code();
+
+    let code: Code = raw_code
+        .try_into()
+        .map_err(|_| CidVerificationError::UnsupportedHashCode(raw_code))?;
+
+    let expected_hash = match code {
+        Code::Sha2_256 => {
+            let mut hasher = sha2::Sha256::new();
+            hasher.update(raw_value);
+            hasher.finalize().to_vec()
+        }
+        Code::Blake3_256 => {
+            let mut hasher = blake3::Hasher::new();
+            hasher.update(raw_value.as_ref());
+            hasher.finalize().to_vec()
+        }
+        _ => return Err(CidVerificationError::UnsupportedHashCode(raw_code)),
+    };
+    // actually, multihash may contain less bytes than the full hash; to avoid abuse, we reject such multihashes
+    if expected_hash == mhash.digest() {
+        Ok(())
+    } else {
+        Err(CidVerificationError::ValueMismatch {
+            type_name: std::any::type_name::<Val>(),
+            cid_repr: cid.get_inner(),
+        })
+    }
+}
+
+fn verify_json_value<Val: Serialize>(
+    mhash: &multihash_codetable::Multihash,
+    value: &Val,
+    cid: &CID<Val>,
+) -> Result<(), CidVerificationError> {
+    use multihash_codetable::Code;
+
+    let raw_code = mhash.code();
+    let code: Code = raw_code
+        .try_into()
+        .map_err(|_| CidVerificationError::UnsupportedHashCode(raw_code))?;
+
+    let expected_hash = match code {
+        Code::Sha2_256 => value_json_hash::<sha2::Sha256, Val>(value)?,
+        Code::Blake3_256 => value_json_hash::<blake3::Hasher, Val>(value)?,
+        _ => return Err(CidVerificationError::UnsupportedHashCode(raw_code)),
+    };
+    // actually, multihash may contain less bytes than the full hash; to avoid abuse, we reject such multihashes
+    if expected_hash == mhash.digest() {
+        Ok(())
+    } else {
+        Err(CidVerificationError::ValueMismatch {
+            type_name: std::any::type_name::<Val>(),
+            cid_repr: cid.get_inner(),
+        })
+    }
+}
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+    use multihash::Multihash;
+    use serde_json::json;
+
+    #[test]
+    fn test_verify_sha2_256() {
+        verify_value(
+            &CID::new("bagaaierajwlhumardpzj6dv2ahcerm3vyfrjwl7nahg7zq5o3eprwv6v3vpa"),
+            &json!("test"),
+        )
+        .unwrap();
+        verify_value(
+            &CID::new("bagaaierauyk65lxcdxsrphpaqdpiymcszdnjaejyibv2ohbyyaziix35kt2a"),
+            &json!([1, 2, 3]),
+        )
+        .unwrap();
+        verify_value(
+            &CID::new("bagaaieranodle477gt6odhllqbhp6wr7k5d23jhkuixr2soadzjn3n4hlnfq"),
+            &json!(1),
+        )
+        .unwrap();
+        verify_value(
+            &CID::new("bagaaierad7lci6475zdrps4h6fmcpmqyknz5z6bw6p6tmpjkfyueavqw4kaq"),
+            &json!({"key": 42}),
+        )
+        .unwrap();
+    }
+
+    #[test]
+    fn test_verify_blake3() {
+        verify_value(
+            &CID::new("z3v8BBKBcZMDh6ANTaiT7PmfrBWbBmoVQvDxojXt1M4eczFDmhF"),
+            &json!("test"),
+        )
+        .unwrap();
+        verify_value(
+            &CID::new("z3v8BBK9PYQwY7AGn9wb79BFTzSQiLALGAEmyqSYbCV2D9y8RLw"),
+            &json!([1, 2, 3]),
+        )
+        .unwrap();
+        verify_value(
+            &CID::new("z3v8BBKGqF5gxukC6oU2EsSnTD7hBRorAabGJ8UDpNKneW7UApe"),
+            &json!(1),
+        )
+        .unwrap();
+        verify_value(
+            &CID::new("z3v8BBK3kqxb39bomB9bJQ22a734aidv5C7QmjdfKiePgVjdQUQ"),
+            &json!({"key": 42}),
+        )
+        .unwrap();
+    }
+
+    #[test]
+    fn test_incorrect_value() {
+        // CID of json!(1)
+        let cid_1 = CID::new("bagaaieranodle477gt6odhllqbhp6wr7k5d23jhkuixr2soadzjn3n4hlnfq");
+        let err = verify_value(&cid_1, &json!(2));
+        assert!(
+            matches!(err, Err(CidVerificationError::ValueMismatch { .. })),
+            "{:?}",
+            err
+        );
+    }
+
+    #[test]
+    fn test_verify_unknown_codec() {
+        use std::str::FromStr;
+
+        //  git raw object
+        const GIT_RAW_CODEC: u64 = 0x78;
+        // CID of json!(1)
+        let cid_1 =
+            cid::Cid::from_str("bagaaieranodle477gt6odhllqbhp6wr7k5d23jhkuixr2soadzjn3n4hlnfq")
+                .unwrap();
+
+        let unknown_format_cid =
+            cid::Cid::new(cid::Version::V1, GIT_RAW_CODEC, cid_1.hash().clone()).unwrap();
+        let unknown_format_cid = CID::new(unknown_format_cid.to_string());
+
+        let err = verify_value(&unknown_format_cid, &json!(1));
+        match err {
+            Err(CidVerificationError::UnsupportedCidCodec(codec)) => {
+                assert_eq!(codec, GIT_RAW_CODEC);
+            }
+            _ => panic!("wrong result: {:?}", err),
+        }
+    }
+
+    #[test]
+    fn test_verify_unknown_hasher() {
+        use std::str::FromStr;
+
+        const SHAKE_128_CODE: u64 = 0x18;
+
+        let cid_1 =
+            cid::Cid::from_str("bagaaieranodle477gt6odhllqbhp6wr7k5d23jhkuixr2soadzjn3n4hlnfq")
+                .unwrap();
+
+        let unknown_hasher_multihash =
+            Multihash::wrap(SHAKE_128_CODE, cid_1.hash().digest()).unwrap();
+
+        let unknown_hasher_cid =
+            cid::Cid::new(cid::Version::V1, JSON_CODEC, unknown_hasher_multihash).unwrap();
+        let unknown_hasher_cid = CID::new(unknown_hasher_cid.to_string());
+
+        let err = verify_value(&unknown_hasher_cid, &json!(1));
+        match err {
+            Err(CidVerificationError::UnsupportedHashCode(code)) => {
+                assert_eq!(code, SHAKE_128_CODE);
+            }
+            _ => panic!("wrong result: {:?}", err),
+        }
+    }
+
+    #[test]
+    fn test_verify_unsupported_hasher() {
+        use multihash_codetable::Code;
+        use std::str::FromStr;
+
+        // we have no plan to support it, but it may change, and the test should be corrected
+        let ripemd160_code: u64 = Code::Ripemd160.into();
+
+        let cid_1 =
+            cid::Cid::from_str("bagaaieranodle477gt6odhllqbhp6wr7k5d23jhkuixr2soadzjn3n4hlnfq")
+                .unwrap();
+
+        let unknown_hasher_multihash =
+            Multihash::wrap(ripemd160_code, cid_1.hash().digest()).unwrap();
+
+        let unknown_hasher_cid =
+            cid::Cid::new(cid::Version::V1, JSON_CODEC, unknown_hasher_multihash).unwrap();
+        let unknown_hasher_cid = CID::new(unknown_hasher_cid.to_string());
+
+        let err = verify_value(&unknown_hasher_cid, &json!(1));
+        match err {
+            Err(CidVerificationError::UnsupportedHashCode(code)) => {
+                assert_eq!(code, ripemd160_code);
+            }
+            _ => panic!("wrong result: {:?}", err),
+        }
+    }
+
+    #[test]
+    fn test_verify_garbage() {
+        let garbage_cid = CID::new("garbage");
+        let err = verify_value(&garbage_cid, &json!(1));
+        assert!(
+            matches!(
+                err,
+                Err(CidVerificationError::MalformedCid(cid::Error::ParsingError))
+            ),
+            "{:?}",
+            err
+        );
+    }
+}
+
\ No newline at end of file diff --git a/src/air_interpreter_client/ast.rs.html b/src/air_interpreter_client/ast.rs.html new file mode 100644 index 00000000..d300e50e --- /dev/null +++ b/src/air_interpreter_client/ast.rs.html @@ -0,0 +1,67 @@ +ast.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use air::parser::parse;
+
+/// Parse AIR script and return it as minified JSON
+pub fn ast(script: String) -> String {
+    let do_parse = || -> std::result::Result<_, Box<dyn std::error::Error>> {
+        let ast = parse(&script)?;
+        serde_json::to_string(&ast).map_err(Into::into)
+    };
+
+    match do_parse() {
+        Ok(json) => json,
+        Err(err) => err.to_string(),
+    }
+}
+
\ No newline at end of file diff --git a/src/air_interpreter_client/logger.rs.html b/src/air_interpreter_client/logger.rs.html new file mode 100644 index 00000000..9d5d7ba5 --- /dev/null +++ b/src/air_interpreter_client/logger.rs.html @@ -0,0 +1,81 @@ +logger.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use air_log_targets::TARGET_MAP;
+
+use log::LevelFilter;
+
+pub fn init_logger(default_level: Option<LevelFilter>) {
+    let target_map = TARGET_MAP.iter().cloned().collect();
+    let builder = marine_rs_sdk::WasmLoggerBuilder::new().with_target_map(target_map);
+
+    let builder = if let Some(default_level) = default_level {
+        builder.with_log_level(default_level)
+    } else {
+        builder
+    };
+
+    builder.build().unwrap();
+}
+
+#[allow(dead_code)]
+pub fn json_output_mode(trace_mode: u8) -> bool {
+    trace_mode == 0
+}
+
\ No newline at end of file diff --git a/src/air_interpreter_client/wasm_bindgen.rs.html b/src/air_interpreter_client/wasm_bindgen.rs.html new file mode 100644 index 00000000..8bd7fc96 --- /dev/null +++ b/src/air_interpreter_client/wasm_bindgen.rs.html @@ -0,0 +1,161 @@ +wasm_bindgen.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#![allow(unused_attributes)]
+#![warn(rust_2018_idioms)]
+#![deny(
+    dead_code,
+    nonstandard_style,
+    unused_imports,
+    unused_mut,
+    unused_variables,
+    unused_unsafe,
+    unreachable_patterns
+)]
+
+mod ast;
+mod logger;
+
+use air::execute_air;
+use air::RunParameters;
+
+use log::LevelFilter;
+use wasm_bindgen::prelude::*;
+
+pub const DEFAULT_LOG_LEVEL: LevelFilter = LevelFilter::Trace;
+
+#[wasm_bindgen(start)]
+pub fn main() {
+    // it's necessary to initialize it with the minimal allowed log level,
+    // because otherwise it's impossible to set less level than used during initialization.
+
+    const MINIMAL_LOG_LEVEL: LevelFilter = LevelFilter::Trace;
+    logger::init_logger(Some(MINIMAL_LOG_LEVEL));
+
+    // this one is just a guard for possible changes of the invoke function where some log-prone
+    // code could added before the setting max log level from a function parameter.
+    log::set_max_level(LevelFilter::Info);
+}
+
+#[allow(clippy::too_many_arguments)]
+#[wasm_bindgen]
+pub fn invoke(
+    air: String,
+    prev_data: Vec<u8>,
+    data: Vec<u8>,
+    params: Vec<u8>,
+    call_results: Vec<u8>,
+    log_level: &str,
+) -> String {
+    use std::str::FromStr;
+
+    let log_level = log::LevelFilter::from_str(log_level).unwrap_or(DEFAULT_LOG_LEVEL);
+    log::set_max_level(log_level);
+
+    let params: RunParameters = serde_json::from_slice(&params).expect("cannot parse RunParameters");
+
+    let outcome = execute_air(air, prev_data, data, params, call_results.into());
+    serde_json::to_string(&outcome).expect("Cannot parse InterpreterOutcome")
+}
+
+#[wasm_bindgen]
+pub fn ast(script: String) -> String {
+    ast::ast(script)
+}
+
\ No newline at end of file diff --git a/src/air_interpreter_data/cid_info.rs.html b/src/air_interpreter_data/cid_info.rs.html new file mode 100644 index 00000000..c0268bbf --- /dev/null +++ b/src/air_interpreter_data/cid_info.rs.html @@ -0,0 +1,253 @@ +cid_info.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use crate::CidStore;
+use crate::CidStoreVerificationError;
+
+use crate::CanonCidAggregate;
+use crate::CanonResultCidAggregate;
+use crate::RawValue;
+use crate::ServiceResultCidAggregate;
+
+use polyplets::SecurityTetraplet;
+use serde::Deserialize;
+use serde::Serialize;
+
+#[derive(
+    Debug,
+    Default,
+    Clone,
+    Serialize,
+    Deserialize,
+    PartialEq,
+    Eq,
+    ::rkyv::Archive,
+    ::rkyv::Serialize,
+    ::rkyv::Deserialize,
+)]
+#[archive(check_bytes)]
+pub struct CidInfo {
+    /// Map CID to value.
+    pub value_store: CidStore<RawValue>,
+
+    /// Map CID to a tetraplet.
+    pub tetraplet_store: CidStore<SecurityTetraplet>,
+
+    /// Map CID to a canon element value.
+    pub canon_element_store: CidStore<CanonCidAggregate>,
+
+    /// Map CID to a canon result.
+    pub canon_result_store: CidStore<CanonResultCidAggregate>,
+
+    /// Map CID to a service result aggregate.
+    pub service_result_store: CidStore<ServiceResultCidAggregate>,
+}
+
+impl CidInfo {
+    #[tracing::instrument(skip_all)]
+    pub fn verify(&self) -> Result<(), CidStoreVerificationError> {
+        self.verify_value_store()?;
+        self.verify_tetraplet_store()?;
+
+        self.verify_canon_result_store()?;
+        self.verify_service_result_store()?;
+
+        Ok(())
+    }
+
+    fn verify_value_store(&self) -> Result<(), CidStoreVerificationError> {
+        self.value_store.verify_raw_value()
+    }
+
+    fn verify_tetraplet_store(&self) -> Result<(), CidStoreVerificationError> {
+        self.tetraplet_store.verify()
+    }
+
+    fn verify_service_result_store(&self) -> Result<(), CidStoreVerificationError> {
+        self.service_result_store.verify()?;
+
+        for (serv_cid, serv_result) in self.service_result_store.iter() {
+            self.tetraplet_store
+                .check_reference(serv_cid, &serv_result.tetraplet_cid)?;
+            self.value_store
+                .check_reference(serv_cid, &serv_result.value_cid)?;
+        }
+        Ok(())
+    }
+
+    fn verify_canon_result_store(&self) -> Result<(), CidStoreVerificationError> {
+        self.canon_element_store.verify()?;
+        self.canon_result_store.verify()?;
+
+        for (canon_cid, canon_result) in self.canon_result_store.iter() {
+            for val in &canon_result.values {
+                self.canon_element_store.check_reference(canon_cid, val)?;
+            }
+            self.tetraplet_store
+                .check_reference(canon_cid, &canon_result.tetraplet)?;
+        }
+
+        for (element_cid, canon_element) in self.canon_element_store.iter() {
+            self.tetraplet_store
+                .check_reference(element_cid, &canon_element.tetraplet)?;
+            self.value_store
+                .check_reference(element_cid, &canon_element.value)?;
+
+            match &canon_element.provenance {
+                crate::Provenance::Literal => {}
+                crate::Provenance::ServiceResult { cid } => {
+                    self.service_result_store
+                        .check_reference(element_cid, cid)?;
+                }
+                crate::Provenance::Canon { cid } => {
+                    self.canon_result_store.check_reference(element_cid, cid)?;
+                }
+            }
+        }
+
+        Ok(())
+    }
+}
+
\ No newline at end of file diff --git a/src/air_interpreter_data/cid_store.rs.html b/src/air_interpreter_data/cid_store.rs.html new file mode 100644 index 00000000..4ca38dd7 --- /dev/null +++ b/src/air_interpreter_data/cid_store.rs.html @@ -0,0 +1,569 @@ +cid_store.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use crate::JValue;
+use crate::RawValue;
+
+use air_interpreter_cid::raw_value_to_json_cid;
+use air_interpreter_cid::value_to_json_cid;
+use air_interpreter_cid::verify_raw_value;
+use air_interpreter_cid::verify_value;
+use air_interpreter_cid::CidCalculationError;
+use air_interpreter_cid::CidRef;
+use air_interpreter_cid::CidVerificationError;
+use air_interpreter_cid::CID;
+use serde::Deserialize;
+use serde::Serialize;
+use thiserror::Error as ThisError;
+
+use std::{collections::HashMap, rc::Rc};
+
+/// Stores CID to Value corresponance.
+#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)]
+#[serde(transparent)]
+#[derive(::rkyv::Archive, ::rkyv::Serialize, ::rkyv::Deserialize)]
+#[archive(check_bytes)]
+pub struct CidStore<Val>(#[with(::rkyv::with::AsVec)] HashMap<CID<Val>, Rc<Val>>);
+
+impl<Val> CidStore<Val> {
+    pub fn new() -> Self {
+        Self::default()
+    }
+
+    pub fn get(&self, cid: &CID<Val>) -> Option<Rc<Val>> {
+        self.0.get(cid).cloned()
+    }
+
+    pub fn is_empty(&self) -> bool {
+        self.0.is_empty()
+    }
+
+    pub fn len(&self) -> usize {
+        self.0.len()
+    }
+
+    pub fn iter(&self) -> impl Iterator<Item = (&CID<Val>, &Rc<Val>)> {
+        self.0.iter()
+    }
+
+    pub fn check_reference<Src>(
+        &self,
+        _source_cid: &CID<Src>,
+        target_cid: &CID<Val>,
+    ) -> Result<(), CidStoreVerificationError> {
+        self.0
+            .get(target_cid)
+            .ok_or_else(|| CidStoreVerificationError::MissingReference {
+                source_type_name: std::any::type_name::<Src>(),
+                target_type_name: std::any::type_name::<Val>(),
+                target_cid_repr: target_cid.get_inner(),
+            })?;
+        Ok(())
+    }
+}
+
+impl<Val: Serialize> CidStore<Val> {
+    pub fn verify(&self) -> Result<(), CidStoreVerificationError> {
+        for (cid, value) in &self.0 {
+            verify_value(cid, value)?;
+        }
+        Ok(())
+    }
+}
+
+impl CidStore<RawValue> {
+    pub fn verify_raw_value(&self) -> Result<(), CidStoreVerificationError> {
+        for (cid, value) in &self.0 {
+            verify_raw_value(cid, value.as_inner())?;
+        }
+        Ok(())
+    }
+}
+
+#[derive(ThisError, Debug)]
+pub enum CidStoreVerificationError {
+    #[error(transparent)]
+    CidVerificationError(#[from] CidVerificationError),
+
+    #[error("Reference CID {target_cid_repr:?} from type {source_type_name:?} to {target_type_name:?} was not found")]
+    MissingReference {
+        source_type_name: &'static str,
+        target_type_name: &'static str,
+        target_cid_repr: Rc<CidRef>,
+    },
+}
+
+impl<Val> Default for CidStore<Val> {
+    fn default() -> Self {
+        Self(Default::default())
+    }
+}
+
+#[derive(Clone, Debug)]
+pub struct CidTracker<Val = JValue> {
+    cids: HashMap<CID<Val>, Rc<Val>>,
+}
+
+impl<Val> CidTracker<Val> {
+    pub fn new() -> Self {
+        Self::default()
+    }
+
+    pub fn from_cid_stores(prev_cid_map: CidStore<Val>, current_cid_map: CidStore<Val>) -> Self {
+        let mut cids = prev_cid_map.0;
+        for (cid, val) in current_cid_map.0 {
+            // TODO check that values matches?
+            cids.insert(cid, val);
+        }
+        Self { cids }
+    }
+
+    pub fn get(&self, cid: &CID<Val>) -> Option<Rc<Val>> {
+        self.cids.get(cid).cloned()
+    }
+}
+
+impl<Val: Serialize> CidTracker<Val> {
+    pub fn track_value(
+        &mut self,
+        value: impl Into<Rc<Val>>,
+    ) -> Result<CID<Val>, CidCalculationError> {
+        let value = value.into();
+        let cid = value_to_json_cid(&*value)?;
+        self.cids.insert(cid.clone(), value);
+        Ok(cid)
+    }
+}
+
+impl CidTracker<RawValue> {
+    pub fn track_raw_value(&mut self, value: impl Into<Rc<RawValue>>) -> CID<RawValue> {
+        let value = value.into();
+        let cid = raw_value_to_json_cid(value.as_inner());
+        self.cids.insert(cid.clone(), value);
+        cid
+    }
+}
+
+impl<Val> Default for CidTracker<Val> {
+    fn default() -> Self {
+        Self {
+            cids: Default::default(),
+        }
+    }
+}
+
+impl<Val> From<CidTracker<Val>> for CidStore<Val> {
+    fn from(value: CidTracker<Val>) -> Self {
+        Self(value.cids)
+    }
+}
+
+impl<Val> IntoIterator for CidStore<Val> {
+    type Item = (CID<Val>, Rc<Val>);
+
+    type IntoIter = std::collections::hash_map::IntoIter<CID<Val>, Rc<Val>>;
+
+    fn into_iter(self) -> Self::IntoIter {
+        self.0.into_iter()
+    }
+}
+
+#[cfg(test)]
+mod tests {
+    use std::iter::FromIterator;
+
+    use super::*;
+    use serde_json::json;
+
+    #[test]
+    fn test_iter() {
+        let mut tracker = CidTracker::new();
+        tracker.track_value(json!("test")).unwrap();
+        tracker.track_value(json!(1)).unwrap();
+        tracker.track_value(json!([1, 2, 3])).unwrap();
+        tracker
+            .track_value(json!({
+                "key": 42,
+            }))
+            .unwrap();
+        let store = CidStore::from(tracker);
+        assert_eq!(
+            store.into_iter().collect::<HashMap<_, _>>(),
+            HashMap::from_iter(vec![
+                (
+                    CID::new("bagaaihrarcyykpv4oj7zwdbepczyfthxya4og7s2rwvrzolm5kg2eu5dz3xa")
+                        .into(),
+                    json!("test").into()
+                ),
+                (
+                    CID::new("bagaaihram6sitn77tquub77n2jzjgttrlwkverv44pv3gns6qghm6hx6d36a")
+                        .into(),
+                    json!([1, 2, 3]).into(),
+                ),
+                (
+                    CID::new("bagaaihra2y55tkbgv6i4d7vdoglfuzhbd3ra6e7ennpvfrmzaejwmbntusdq")
+                        .into(),
+                    json!(1).into(),
+                ),
+                (
+                    CID::new("bagaaihracpzxhsrpviexa7k6glwdhyh3a4kvy6j7qlcqokzqbs3q424cmxyq")
+                        .into(),
+                    json!({
+                        "key": 42,
+                    })
+                    .into(),
+                )
+            ])
+        );
+    }
+
+    #[test]
+    fn test_store() {
+        let mut tracker = CidTracker::new();
+        tracker.track_value(json!("test")).unwrap();
+        tracker.track_value(json!(1)).unwrap();
+        tracker.track_value(json!([1, 2, 3])).unwrap();
+        tracker
+            .track_value(json!({
+                "key": 42,
+            }))
+            .unwrap();
+        let store = CidStore::from(tracker);
+
+        assert_eq!(
+            &*store
+                .get(&CID::new(
+                    "bagaaihrarcyykpv4oj7zwdbepczyfthxya4og7s2rwvrzolm5kg2eu5dz3xa"
+                ))
+                .unwrap(),
+            &json!("test"),
+        );
+        assert_eq!(
+            &*store
+                .get(&CID::new(
+                    "bagaaihram6sitn77tquub77n2jzjgttrlwkverv44pv3gns6qghm6hx6d36a"
+                ))
+                .unwrap(),
+            &json!([1, 2, 3]),
+        );
+        assert_eq!(
+            &*store
+                .get(&CID::new(
+                    "bagaaihra2y55tkbgv6i4d7vdoglfuzhbd3ra6e7ennpvfrmzaejwmbntusdq"
+                ))
+                .unwrap(),
+            &json!(1),
+        );
+        assert_eq!(
+            &*store
+                .get(&CID::new(
+                    "bagaaihracpzxhsrpviexa7k6glwdhyh3a4kvy6j7qlcqokzqbs3q424cmxyq"
+                ))
+                .unwrap(),
+            &json!({"key": 42}),
+        );
+
+        assert_eq!(store.get(&CID::new("loremimpsumdolorsitament")), None);
+    }
+}
+
\ No newline at end of file diff --git a/src/air_interpreter_data/executed_state.rs.html b/src/air_interpreter_data/executed_state.rs.html new file mode 100644 index 00000000..8652d5f3 --- /dev/null +++ b/src/air_interpreter_data/executed_state.rs.html @@ -0,0 +1,613 @@ +executed_state.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+mod impls;
+mod se_de;
+
+use crate::GenerationIdx;
+use crate::JValue;
+use crate::RawValue;
+use crate::TracePos;
+
+use air_interpreter_cid::CID;
+use polyplets::SecurityTetraplet;
+use se_de::par_serializer;
+use serde::Deserialize;
+use serde::Serialize;
+
+use std::fmt::Formatter;
+use std::rc::Rc;
+
+#[derive(
+    Debug,
+    Default,
+    Clone,
+    Copy,
+    PartialEq,
+    Eq,
+    ::rkyv::Archive,
+    ::rkyv::Serialize,
+    ::rkyv::Deserialize,
+)]
+#[archive(check_bytes)]
+pub struct ParResult {
+    pub left_size: u32,
+    pub right_size: u32,
+}
+
+#[derive(
+    Debug,
+    Clone,
+    PartialEq,
+    Eq,
+    Serialize,
+    Deserialize,
+    ::rkyv::Archive,
+    ::rkyv::Serialize,
+    ::rkyv::Deserialize,
+)]
+#[archive(check_bytes)]
+pub enum Sender {
+    PeerId(Rc<String>),
+    PeerIdWithCallId { peer_id: Rc<String>, call_id: u32 },
+}
+
+#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
+#[serde(rename_all = "snake_case")]
+#[derive(::rkyv::Archive, ::rkyv::Serialize, ::rkyv::Deserialize)]
+#[archive(check_bytes)]
+pub enum CallResult {
+    /// Request was sent to a target node by node with such public key and it shouldn't be called again.
+    #[serde(rename = "sent_by")]
+    RequestSentBy(Sender),
+
+    /// A corresponding call's been already executed with such value as a result.
+    Executed(ValueRef),
+
+    /// The call returned a service error.
+    ///
+    /// The `JValue` has to be a two element array `[i32, String]`.
+    Failed(CID<ServiceResultCidAggregate>),
+}
+
+/*
+ * The current value structure is:
+ *
+ * ```
+ * Scalar(CID<ServiceResultAggregate>) ---+
+ *                                        |
+ *   +----<service_result_store>------+
+ *   |
+ *   +-------> ServiceResultAggregate:
+ *                value_cid ------------<value_store>----> JValue
+ *                tetraplet_cid --------<tetraplet_store>----> SecurityTetraplet
+ *                argument_hash: String
+ * ```
+ *
+ * `Stream` variant is similar, however, `Unused` is different: it has value CID only, but the value
+ * is not stored into the `value_store`:
+ *
+ * ```
+ * Unused(CID<JValue>) ---> X
+ * ```
+ */
+#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
+#[serde(rename_all = "snake_case")]
+#[derive(::rkyv::Archive, ::rkyv::Serialize, ::rkyv::Deserialize)]
+#[archive(check_bytes)]
+pub enum ValueRef {
+    /// The call value is stored to a scalar variable.
+    Scalar(CID<ServiceResultCidAggregate>),
+    /// The call value is stored to a stream variable.
+    Stream {
+        cid: CID<ServiceResultCidAggregate>,
+        generation: GenerationIdx,
+    },
+    /// The call value is not stored.
+    Unused(CID<JValue>),
+}
+
+#[derive(
+    Debug,
+    Clone,
+    PartialEq,
+    Eq,
+    Serialize,
+    Deserialize,
+    ::rkyv::Archive,
+    ::rkyv::Serialize,
+    ::rkyv::Deserialize,
+)]
+#[archive(check_bytes)]
+pub struct CallServiceFailed {
+    pub ret_code: i32,
+    /// This field contains a JSON-serialized value, not a plain error message.
+    pub message: Rc<String>,
+}
+
+impl CallServiceFailed {
+    pub fn new(ret_code: i32, message: Rc<String>) -> Self {
+        Self { ret_code, message }
+    }
+
+    pub fn to_value(&self) -> JValue {
+        serde_json::to_value(self)
+            .expect("serde_json serializer shouldn't fail")
+            .into()
+    }
+}
+
+#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
+#[serde(rename_all = "snake_case")]
+#[derive(::rkyv::Archive, ::rkyv::Serialize, ::rkyv::Deserialize)]
+#[archive(check_bytes)]
+/// A proof of service result execution result.
+pub struct ServiceResultCidAggregate {
+    pub value_cid: CID<RawValue>,
+    /// Hash of the call arguments.
+    pub argument_hash: Rc<str>,
+    /// The tetraplet of the call result.
+    pub tetraplet_cid: CID<SecurityTetraplet>,
+}
+
+/// Let's consider an example of trace that could be produces by the following fold:
+/// (fold $stream v
+///     (call 1)
+///     (call 2)
+///     (next v)
+///     (call 3)
+///     (call 4)
+/// )
+///x
+/// Having started with stream with two elements {v1, v2} the resulted trace would looks like
+/// [(1) (2)] [(1) (2)] [(3) (4)] [(3) (4)]  <---  the sequence of call states
+///    v1        v2        v2        v1      <---- corresponding values from $stream that
+///                                                the iterable v had at the moment of call
+///
+/// From this example, it could be seen that each instruction sequence inside fold is divided into
+/// two intervals (left and right), each of these intervals has borders [begin, end).
+/// So, this struct describes position inside overall execution_step trace belongs to one fold iteration.
+#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)]
+#[serde(rename_all = "snake_case")]
+#[derive(::rkyv::Archive, ::rkyv::Serialize, ::rkyv::Deserialize)]
+#[archive(check_bytes)]
+pub struct FoldSubTraceLore {
+    /// Position of current value in a trace.
+    #[serde(rename = "pos")]
+    pub value_pos: TracePos,
+
+    /// Descriptors of a subtrace that are corresponded to the current value. Technically, now
+    /// it always contains two values, and Vec here is used to have a possibility to handle more
+    /// than one next inside fold in future.
+    #[serde(rename = "desc")]
+    pub subtraces_desc: Vec<SubTraceDesc>,
+}
+
+/// Descriptor of a subtrace inside execution trace.
+#[derive(Debug, Default, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
+#[serde(rename_all = "snake_case")]
+#[derive(::rkyv::Archive, ::rkyv::Serialize, ::rkyv::Deserialize)]
+#[archive(check_bytes)]
+pub struct SubTraceDesc {
+    /// Start position in a trace of this subtrace.
+    #[serde(rename = "pos")]
+    pub begin_pos: TracePos,
+
+    /// Length of the subtrace.
+    #[serde(rename = "len")]
+    pub subtrace_len: u32,
+}
+
+/// This type represents all information in an execution trace about states executed during
+/// a fold execution.
+pub type FoldLore = Vec<FoldSubTraceLore>;
+
+#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)]
+#[serde(rename_all = "snake_case")]
+#[derive(::rkyv::Archive, ::rkyv::Serialize, ::rkyv::Deserialize)]
+#[archive(check_bytes)]
+pub struct FoldResult {
+    pub lore: FoldLore,
+}
+
+/// Describes result of applying functor `apply` to streams.
+#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)]
+#[serde(rename_all = "snake_case")]
+#[derive(::rkyv::Archive, ::rkyv::Serialize, ::rkyv::Deserialize)]
+#[archive(check_bytes)]
+pub struct ApResult {
+    #[serde(rename = "gens")]
+    pub res_generations: Vec<GenerationIdx>,
+}
+
+/// Contains ids of element that were on a stream at the moment of an appropriate canon call.
+#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
+#[serde(rename_all = "snake_case")]
+#[derive(::rkyv::Archive, ::rkyv::Serialize, ::rkyv::Deserialize)]
+#[archive(check_bytes)]
+pub enum CanonResult {
+    /// Request was sent to a target node by node with such public key and it shouldn't be called again.
+    #[serde(rename = "sent_by")]
+    RequestSentBy(Rc<String>),
+    Executed(CID<CanonResultCidAggregate>),
+}
+
+#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
+#[serde(rename_all = "snake_case")]
+#[derive(::rkyv::Archive, ::rkyv::Serialize, ::rkyv::Deserialize)]
+#[archive(check_bytes)]
+pub struct CanonResultCidAggregate {
+    pub tetraplet: CID<SecurityTetraplet>,
+    pub values: Vec<CID<CanonCidAggregate>>,
+}
+
+/// The type Canon trace CID refers to.
+#[derive(
+    Debug,
+    Clone,
+    PartialEq,
+    Eq,
+    Serialize,
+    Deserialize,
+    ::rkyv::Archive,
+    ::rkyv::Serialize,
+    ::rkyv::Deserialize,
+)]
+#[archive(check_bytes)]
+pub struct CanonCidAggregate {
+    pub value: CID<RawValue>,
+    pub tetraplet: CID<SecurityTetraplet>,
+    pub provenance: Provenance,
+}
+
+#[derive(Debug, Clone, Eq, PartialEq, Serialize, Deserialize)]
+#[serde(rename_all = "snake_case", tag = "type")]
+#[derive(::rkyv::Archive, ::rkyv::Serialize, ::rkyv::Deserialize)]
+#[archive(check_bytes)]
+pub enum Provenance {
+    Literal,
+    ServiceResult {
+        // the original call result CID; not changed on lambda application
+        cid: CID<ServiceResultCidAggregate>,
+    },
+    Canon {
+        // the original canon CID; not changed on lambda application
+        cid: CID<CanonResultCidAggregate>,
+    },
+}
+
+#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
+#[serde(rename_all = "snake_case")]
+#[derive(::rkyv::Archive, ::rkyv::Serialize, ::rkyv::Deserialize)]
+#[archive(check_bytes)]
+pub enum ExecutedState {
+    #[serde(with = "par_serializer")]
+    Par(ParResult),
+    Call(CallResult),
+    Fold(FoldResult),
+    Ap(ApResult),
+    Canon(CanonResult),
+}
+
\ No newline at end of file diff --git a/src/air_interpreter_data/executed_state/impls.rs.html b/src/air_interpreter_data/executed_state/impls.rs.html new file mode 100644 index 00000000..ec216ddc --- /dev/null +++ b/src/air_interpreter_data/executed_state/impls.rs.html @@ -0,0 +1,491 @@ +impls.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::*;
+use crate::RawValue;
+
+impl ParResult {
+    pub fn new(left_size: u32, right_size: u32) -> Self {
+        Self {
+            left_size,
+            right_size,
+        }
+    }
+
+    /// Returns a size of subtrace that this par describes in execution_step trace.
+    pub fn size(&self) -> Option<u32> {
+        self.left_size.checked_add(self.right_size)
+    }
+}
+
+impl CallResult {
+    pub fn sent_peer_id(peer_id: Rc<String>) -> CallResult {
+        CallResult::RequestSentBy(Sender::PeerId(peer_id))
+    }
+
+    pub fn sent_peer_id_with_call_id(peer_id: Rc<String>, call_id: u32) -> CallResult {
+        CallResult::RequestSentBy(Sender::PeerIdWithCallId { peer_id, call_id })
+    }
+
+    pub fn executed_service_result(value_ref: ValueRef) -> Self {
+        Self::Executed(value_ref)
+    }
+
+    pub fn executed_scalar(service_result_agg_cid: CID<ServiceResultCidAggregate>) -> Self {
+        Self::executed_service_result(ValueRef::Scalar(service_result_agg_cid))
+    }
+
+    pub fn executed_stream_stub(cid: CID<ServiceResultCidAggregate>) -> CallResult {
+        let generation = GenerationIdx::stub();
+        let value = ValueRef::Stream { cid, generation };
+        CallResult::Executed(value)
+    }
+
+    pub fn executed_unused(value_cid: CID<JValue>) -> CallResult {
+        Self::executed_service_result(ValueRef::Unused(value_cid))
+    }
+
+    pub fn failed(service_result_agg_cid: CID<ServiceResultCidAggregate>) -> CallResult {
+        CallResult::Failed(service_result_agg_cid)
+    }
+
+    pub fn get_cid(&self) -> Option<&CID<ServiceResultCidAggregate>> {
+        match self {
+            CallResult::RequestSentBy(_) => None,
+            CallResult::Executed(executed) => executed.get_cid(),
+            CallResult::Failed(cid) => Some(cid),
+        }
+    }
+}
+
+impl SubTraceDesc {
+    pub fn new(begin_pos: TracePos, subtrace_len: usize) -> Self {
+        Self {
+            begin_pos,
+            subtrace_len: subtrace_len as _,
+        }
+    }
+}
+
+impl ExecutedState {
+    pub fn par(left_subgraph_size: usize, right_subgraph_size: usize) -> Self {
+        let par_result = ParResult {
+            left_size: left_subgraph_size as _,
+            right_size: right_subgraph_size as _,
+        };
+
+        Self::Par(par_result)
+    }
+}
+
+impl ApResult {
+    pub fn new(res_generation: GenerationIdx) -> Self {
+        Self {
+            res_generations: vec![res_generation],
+        }
+    }
+
+    pub fn stub() -> Self {
+        Self {
+            res_generations: vec![GenerationIdx::stub()],
+        }
+    }
+}
+
+impl CanonResult {
+    pub fn executed(cid: CID<CanonResultCidAggregate>) -> Self {
+        CanonResult::Executed(cid)
+    }
+
+    pub fn request_sent_by(peer_id: Rc<String>) -> Self {
+        CanonResult::RequestSentBy(peer_id)
+    }
+}
+
+impl CanonResultCidAggregate {
+    pub fn new(tetraplet: CID<SecurityTetraplet>, values: Vec<CID<CanonCidAggregate>>) -> Self {
+        Self { tetraplet, values }
+    }
+}
+
+impl CanonCidAggregate {
+    pub fn new(
+        value: CID<RawValue>,
+        tetraplet: CID<SecurityTetraplet>,
+        provenance: Provenance,
+    ) -> Self {
+        Self {
+            value,
+            tetraplet,
+            provenance,
+        }
+    }
+}
+
+impl ServiceResultCidAggregate {
+    pub fn new(
+        value_cid: CID<RawValue>,
+        argument_hash: Rc<str>,
+        tetraplet_cid: CID<SecurityTetraplet>,
+    ) -> Self {
+        Self {
+            value_cid,
+            argument_hash,
+            tetraplet_cid,
+        }
+    }
+}
+
+impl Provenance {
+    #[inline]
+    pub fn literal() -> Self {
+        Self::Literal
+    }
+
+    #[inline]
+    pub fn service_result(cid: CID<ServiceResultCidAggregate>) -> Self {
+        Self::ServiceResult { cid }
+    }
+
+    #[inline]
+    pub fn canon(cid: CID<CanonResultCidAggregate>) -> Self {
+        Self::Canon { cid }
+    }
+}
+
+impl std::fmt::Display for ExecutedState {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        use CallResult::*;
+        use ExecutedState::*;
+
+        match self {
+            Par(ParResult {
+                left_size: left_subgraph_size,
+                right_size: right_subgraph_size,
+            }) => write!(f, "par({left_subgraph_size}, {right_subgraph_size})"),
+            Call(RequestSentBy(sender)) => write!(f, r"{sender}"),
+            Call(Executed(value_ref)) => {
+                write!(f, "executed({value_ref:?})")
+            }
+            Call(Failed(failed_cid)) => {
+                write!(f, "failed({failed_cid:?})")
+            }
+            Fold(FoldResult { lore }) => {
+                writeln!(f, "fold(",)?;
+                for sublore in lore {
+                    writeln!(
+                        f,
+                        "          {} - [{}, {}], [{}, {}]",
+                        sublore.value_pos,
+                        sublore.subtraces_desc[0].begin_pos,
+                        sublore.subtraces_desc[0].subtrace_len,
+                        sublore.subtraces_desc[1].begin_pos,
+                        sublore.subtraces_desc[1].subtrace_len
+                    )?;
+                }
+                write!(f, "     )")
+            }
+            Ap(ap) => {
+                write!(f, "ap: _ -> {:?}", ap.res_generations)
+            }
+            Canon(_) => {
+                write!(f, "canon [<object>]")
+            }
+        }
+    }
+}
+
+impl ValueRef {
+    pub(crate) fn get_cid(&self) -> Option<&CID<ServiceResultCidAggregate>> {
+        match self {
+            ValueRef::Scalar(cid) => Some(cid),
+            ValueRef::Stream { cid, .. } => Some(cid),
+            ValueRef::Unused(_) => None,
+        }
+    }
+}
+
+impl std::fmt::Display for ValueRef {
+    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
+        match self {
+            ValueRef::Scalar(cid) => write!(f, "scalar: {cid:?}"),
+            ValueRef::Stream { cid, generation } => {
+                write!(f, "stream: {cid:?} generation: {generation}")
+            }
+            ValueRef::Unused(cid) => write!(f, "unused: {cid:?}"),
+        }
+    }
+}
+
+impl std::fmt::Display for Sender {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        match self {
+            Sender::PeerId(peer_id) => write!(f, "request_sent_by({peer_id})"),
+            Sender::PeerIdWithCallId { peer_id, call_id } => {
+                write!(f, "request_sent_by({peer_id}: {call_id})")
+            }
+        }
+    }
+}
+
\ No newline at end of file diff --git a/src/air_interpreter_data/executed_state/se_de.rs.html b/src/air_interpreter_data/executed_state/se_de.rs.html new file mode 100644 index 00000000..22ecbab1 --- /dev/null +++ b/src/air_interpreter_data/executed_state/se_de.rs.html @@ -0,0 +1,143 @@ +se_de.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::*;
+use serde::de::SeqAccess;
+use serde::de::Visitor;
+use serde::ser::SerializeSeq;
+use serde::Deserializer;
+use serde::Serializer;
+use std::fmt;
+
+pub mod par_serializer {
+    use super::*;
+
+    pub fn serialize<S>(value: &ParResult, serializer: S) -> Result<S::Ok, S::Error>
+    where
+        S: Serializer,
+    {
+        let mut seq = serializer.serialize_seq(Some(2))?;
+        seq.serialize_element(&value.left_size)?;
+        seq.serialize_element(&value.right_size)?;
+        seq.end()
+    }
+
+    pub fn deserialize<'de, D>(deserializer: D) -> Result<ParResult, D::Error>
+    where
+        D: Deserializer<'de>,
+    {
+        struct ParVisitor;
+        impl<'de> Visitor<'de> for ParVisitor {
+            type Value = ParResult;
+
+            fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
+                formatter.write_str("[left_size, right_size]")
+            }
+
+            fn visit_seq<A: SeqAccess<'de>>(self, mut seq: A) -> Result<Self::Value, A::Error> {
+                let left_size = seq.next_element::<u32>()?;
+                let right_size = seq.next_element::<u32>()?;
+
+                let (left_size, right_size) = match (left_size, right_size) {
+                    (Some(left_size), Some(right_size)) => (left_size, right_size),
+                    _ => return Err(serde::de::Error::custom(
+                        "failed to deserialize ParResult, not enough elements in serialized array",
+                    )),
+                };
+                let par_result = ParResult::new(left_size, right_size);
+
+                Ok(par_result)
+            }
+        }
+
+        deserializer.deserialize_seq(ParVisitor {})
+    }
+}
+
\ No newline at end of file diff --git a/src/air_interpreter_data/generation_idx.rs.html b/src/air_interpreter_data/generation_idx.rs.html new file mode 100644 index 00000000..b40c80be --- /dev/null +++ b/src/air_interpreter_data/generation_idx.rs.html @@ -0,0 +1,197 @@ +generation_idx.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use serde::Deserialize;
+use serde::Serialize;
+
+use std::cmp::Ordering;
+use std::fmt::Debug;
+use std::fmt::Display;
+
+type GenerationIdxType = u32;
+
+#[derive(Copy, Clone, Default, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)]
+#[serde(transparent)]
+#[repr(transparent)]
+#[derive(::rkyv::Archive, ::rkyv::Serialize, ::rkyv::Deserialize)]
+#[archive(check_bytes)]
+pub struct GenerationIdx(GenerationIdxType);
+
+impl GenerationIdx {
+    pub fn checked_add(self, other: Self) -> Option<Self> {
+        self.0.checked_add(other.0).map(Self)
+    }
+
+    pub fn checked_sub(self, other: Self) -> Option<Self> {
+        self.0.checked_sub(other.0).map(Self)
+    }
+
+    pub fn next(self) -> Self {
+        // TODO: check for overflow
+        Self::from(self.0 as usize + 1)
+    }
+
+    pub fn prev(self) -> Self {
+        // TODO: check for overflow
+        Self::from(self.0 as usize - 1)
+    }
+
+    pub fn stub() -> Self {
+        const GENERATION_STUB: GenerationIdxType = 0xCAFEBABE;
+        Self(GENERATION_STUB)
+    }
+}
+
+impl PartialOrd<usize> for GenerationIdx {
+    fn partial_cmp(&self, other: &usize) -> Option<Ordering> {
+        let self_as_usize: usize = (*self).into();
+        self_as_usize.partial_cmp(other)
+    }
+}
+
+impl PartialEq<usize> for GenerationIdx {
+    fn eq(&self, other: &usize) -> bool {
+        let self_as_usize: usize = (*self).into();
+        self_as_usize == *other
+    }
+}
+
+//TODO: replace these two traits with try-* versions
+impl From<usize> for GenerationIdx {
+    fn from(value: usize) -> Self {
+        GenerationIdx(value as u32)
+    }
+}
+
+impl From<GenerationIdx> for usize {
+    fn from(value: GenerationIdx) -> Self {
+        value.0 as usize
+    }
+}
+
+impl Debug for GenerationIdx {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        Debug::fmt(&self.0, f)
+    }
+}
+
+impl Display for GenerationIdx {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        Display::fmt(&self.0, f)
+    }
+}
+
\ No newline at end of file diff --git a/src/air_interpreter_data/interpreter_data.rs.html b/src/air_interpreter_data/interpreter_data.rs.html new file mode 100644 index 00000000..4eb52e75 --- /dev/null +++ b/src/air_interpreter_data/interpreter_data.rs.html @@ -0,0 +1,377 @@ +interpreter_data.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+pub(crate) mod errors;
+pub(crate) mod repr;
+pub mod verification;
+
+pub use self::repr::InterpreterDataEnvelopeFormat;
+pub use self::repr::InterpreterDataEnvelopeRepr;
+use crate::CidInfo;
+use crate::ExecutionTrace;
+
+use air_interpreter_sede::FromSerialized;
+use air_interpreter_sede::Representation;
+use air_interpreter_signatures::SignatureStore;
+
+use serde::Deserialize;
+use serde::Serialize;
+
+use std::borrow::Cow;
+
+#[derive(Debug, thiserror::Error)]
+pub enum DataDeserializationError {
+    #[error("failed to deserialize envelope: {0}")]
+    Envelope(rmp_serde::decode::Error),
+    #[error("failed to deserialize data: {0}")]
+    Data(crate::rkyv::RkyvDeserializeError),
+}
+
+/// An envelope for the AIR interpreter data that makes AIR data version info accessible in a stable way.
+#[derive(Debug, Clone, Serialize, Deserialize)]
+pub struct InterpreterDataEnvelope<'a> {
+    /// Versions of data and an interpreter produced this data.
+    #[serde(flatten)]
+    pub versions: Versions,
+    #[serde(with = "serde_bytes", borrow)]
+    pub inner_data: Cow<'a, [u8]>,
+}
+
+/// The AIR interpreter could be considered as a function
+/// f(prev_data: InterpreterData, current_data: InterpreterData, ... ) -> (result_data: InterpreterData, ...).
+/// This function receives prev and current data and produces a result data. All these data
+/// have the following format.
+#[derive(
+    Debug,
+    Clone,
+    Default,
+    ::serde::Serialize,
+    ::serde::Deserialize,
+    ::rkyv::Archive,
+    ::rkyv::Serialize,
+    ::rkyv::Deserialize,
+)]
+#[archive(check_bytes)]
+pub struct InterpreterData {
+    /// Trace of AIR execution, which contains executed call, par, fold, and ap states.
+    pub trace: ExecutionTrace,
+
+    /// Last exposed to a peer call request id. All next call request ids will be bigger than this.
+    #[serde(default)]
+    #[serde(rename = "lcid")]
+    pub last_call_request_id: u32,
+
+    /// CID-to-somethings mappings.
+    pub cid_info: CidInfo,
+
+    /// Signature store.
+    ///
+    /// Every peer signs call results and canon values it produced (all together), and stores the signatures
+    /// in this store.
+    pub signatures: SignatureStore,
+}
+
+impl InterpreterData {
+    #[tracing::instrument(skip_all, level = "info")]
+    pub fn try_from_slice(slice: &[u8]) -> Result<Self, DataDeserializationError> {
+        let mut aligned_data = rkyv::AlignedVec::with_capacity(slice.len());
+        aligned_data.extend_from_slice(slice);
+
+        crate::rkyv::from_aligned_slice(&aligned_data).map_err(DataDeserializationError::Data)
+    }
+
+    #[tracing::instrument(skip_all, level = "info")]
+    pub fn serialize(&self) -> Result<Vec<u8>, crate::rkyv::RkyvSerializeError> {
+        crate::rkyv::to_vec(self)
+    }
+}
+
+#[derive(Debug, Clone, Serialize, Deserialize)]
+pub struct Versions {
+    /// Version of this data format.
+    #[serde(rename = "version")] // for compatibility with versions <= 0.6.0
+    pub data_version: semver::Version,
+
+    /// Version of an interpreter produced this data.
+    pub interpreter_version: semver::Version,
+}
+
+impl InterpreterDataEnvelope<'_> {
+    pub fn new(interpreter_version: semver::Version) -> Self {
+        let versions = Versions::new(interpreter_version);
+
+        let inner_data = InterpreterData::default()
+            .serialize()
+            .expect("shouldn't fail on empty data")
+            .into();
+
+        Self {
+            versions,
+            inner_data,
+        }
+    }
+
+    #[allow(clippy::too_many_arguments)]
+    pub fn from_execution_result(
+        trace: ExecutionTrace,
+        cid_info: CidInfo,
+        signatures: SignatureStore,
+        last_call_request_id: u32,
+        interpreter_version: semver::Version,
+    ) -> Self {
+        let versions = Versions::new(interpreter_version);
+
+        let inner_data = InterpreterData {
+            trace,
+            last_call_request_id,
+            cid_info,
+            signatures,
+        };
+
+        let inner_data = inner_data
+            .serialize()
+            .expect("shouldn't fail on valid data")
+            .into();
+
+        Self {
+            versions,
+            inner_data,
+        }
+    }
+
+    /// Tries to de InterpreterData from slice according to the data version.
+    /// Tries to de only versions part of interpreter data.
+    pub fn try_get_versions(slice: &[u8]) -> Result<Versions, DataDeserializationError> {
+        FromSerialized::deserialize(&InterpreterDataEnvelopeRepr, slice)
+            .map_err(DataDeserializationError::Envelope)
+    }
+
+    pub fn serialize(
+        &self,
+    ) -> Result<Vec<u8>, <InterpreterDataEnvelopeRepr as Representation>::SerializeError> {
+        // use rmp_serde explicitely until interpreter-sede handles types with lifetimes
+        rmp_serde::to_vec_named(self)
+    }
+}
+
+impl<'data> InterpreterDataEnvelope<'data> {
+    #[tracing::instrument(skip_all, level = "info")]
+    pub fn try_from_slice(slice: &'data [u8]) -> Result<Self, DataDeserializationError> {
+        // use rmp_serde explicitely until interpreter-sede handles types with lifetimes
+        rmp_serde::from_slice(slice).map_err(DataDeserializationError::Envelope)
+    }
+}
+
+impl Versions {
+    pub fn new(interpreter_version: semver::Version) -> Self {
+        Self {
+            data_version: crate::data_version().clone(),
+            interpreter_version,
+        }
+    }
+}
+
\ No newline at end of file diff --git a/src/air_interpreter_data/interpreter_data/errors.rs.html b/src/air_interpreter_data/interpreter_data/errors.rs.html new file mode 100644 index 00000000..513911fb --- /dev/null +++ b/src/air_interpreter_data/interpreter_data/errors.rs.html @@ -0,0 +1,107 @@ +errors.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use std::rc::Rc;
+
+use air_interpreter_cid::CidRef;
+use air_interpreter_signatures::KeyError;
+use air_interpreter_signatures::VerificationError;
+use thiserror::Error as ThisError;
+
+#[derive(Debug, ThisError)]
+pub enum DataVerifierError {
+    #[error("malformed key: {key:?}: {error}")]
+    MalformedKey { error: KeyError, key: String },
+
+    #[error(transparent)]
+    MalformedSignature(fluence_keypair::error::DecodingError),
+
+    #[error("peer_id doens't match any available public key: {0:?}")]
+    PeerIdNotFound(String),
+
+    #[error("signature mismatch for {peer_id:?}: {error:?}, values: CIDS: {cids:?}")]
+    SignatureMismatch {
+        error: Box<VerificationError>,
+        cids: Vec<Rc<CidRef>>,
+        peer_id: String,
+    },
+
+    #[error(
+        "inconsistent CID multisets on merge for peer {peer_id:?}, prev: {larger_cids:?}, current: {smaller_cids:?}"
+    )]
+    MergeMismatch {
+        peer_id: String,
+        larger_cids: Vec<Rc<CidRef>>,
+        smaller_cids: Vec<Rc<CidRef>>,
+    },
+}
+
\ No newline at end of file diff --git a/src/air_interpreter_data/interpreter_data/repr.rs.html b/src/air_interpreter_data/interpreter_data/repr.rs.html new file mode 100644 index 00000000..94d83a4f --- /dev/null +++ b/src/air_interpreter_data/interpreter_data/repr.rs.html @@ -0,0 +1,99 @@ +repr.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use crate::Versions;
+
+use air_interpreter_sede::Format;
+use air_interpreter_sede::FromSerialized;
+use air_interpreter_sede::MsgPackFormat;
+use air_interpreter_sede::Representation;
+
+#[derive(Default, Debug)]
+pub struct InterpreterDataEnvelopeRepr;
+
+pub type InterpreterDataEnvelopeFormat = MsgPackFormat;
+
+impl Representation for InterpreterDataEnvelopeRepr {
+    type SerializeError = rmp_serde::encode::Error;
+    type DeserializeError = rmp_serde::decode::Error;
+    type WriteError = rmp_serde::encode::Error;
+    type Format = InterpreterDataEnvelopeFormat;
+    type SerializedValue = Vec<u8>; // TODO a typed wrapper
+
+    fn get_format(&self) -> InterpreterDataEnvelopeFormat {
+        InterpreterDataEnvelopeFormat::default()
+    }
+}
+
+impl FromSerialized<Versions> for InterpreterDataEnvelopeRepr {
+    #[inline]
+    fn deserialize(&self, repr: &[u8]) -> Result<Versions, Self::DeserializeError> {
+        Self::get_format(self).from_slice(repr)
+    }
+}
+
\ No newline at end of file diff --git a/src/air_interpreter_data/interpreter_data/verification.rs.html b/src/air_interpreter_data/interpreter_data/verification.rs.html new file mode 100644 index 00000000..fd44f38c --- /dev/null +++ b/src/air_interpreter_data/interpreter_data/verification.rs.html @@ -0,0 +1,567 @@ +verification.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+pub use super::errors::DataVerifierError;
+use crate::CanonResult;
+use crate::CidInfo;
+use crate::ExecutedState;
+use crate::ExecutionTrace;
+use crate::InterpreterData;
+
+use air_interpreter_cid::{CidRef, CID};
+use air_interpreter_signatures::PublicKey;
+use air_interpreter_signatures::Signature;
+use air_interpreter_signatures::SignatureStore;
+
+use std::collections::HashMap;
+use std::rc::Rc;
+
+const CANNOT_HAPPEN_IN_VERIFIED_CID_STORE: &str = "cannot happen in a checked CID store";
+
+/// An util for verificating particular data's signatures.
+pub struct DataVerifier<'data> {
+    // a map from peer_id to peer's info (public key, signature, CIDS)
+    grouped_cids: HashMap<Box<str>, PeerInfo<'data>>,
+    salt: &'data str,
+}
+
+impl<'data> DataVerifier<'data> {
+    // it can be further optimized if only required parts are passed;
+    // SignatureStore is not used elsewhere
+    pub fn new(data: &'data InterpreterData, salt: &'data str) -> Result<Self, DataVerifierError> {
+        // validate key algoritms
+        for (public_key, _) in data.signatures.iter() {
+            public_key
+                .validate()
+                .map_err(|error| DataVerifierError::MalformedKey {
+                    error,
+                    key: public_key.to_string(),
+                })?;
+        }
+
+        // it contains signature too; if we try to add a value to a peer w/o signature, it is an immediate error
+        let mut grouped_cids: HashMap<Box<str>, PeerInfo<'data>> = data
+            .signatures
+            .iter()
+            .map(|(public_key, signature)| {
+                (
+                    public_key
+                        .to_peer_id()
+                        .expect("cannot happen, was verifeid before")
+                        .to_string()
+                        .into(),
+                    PeerInfo::new(public_key, signature),
+                )
+            })
+            .collect();
+
+        // fill PeerInfo's `cids` field, checking for peer IDs without a key
+        collect_peers_cids_from_trace(&data.trace, &data.cid_info, &mut grouped_cids)?;
+
+        // sort cids for canonicalization
+        for peer_info in grouped_cids.values_mut() {
+            peer_info.cids.sort_unstable();
+        }
+
+        Ok(Self { grouped_cids, salt })
+    }
+
+    /// Verify each peers' signatures.
+    pub fn verify(&self) -> Result<(), DataVerifierError> {
+        for peer_info in self.grouped_cids.values() {
+            peer_info
+                .public_key
+                .verify(&peer_info.cids, self.salt, peer_info.signature)
+                .map_err(|error| DataVerifierError::SignatureMismatch {
+                    error: error.into(),
+                    cids: peer_info.cids.clone(),
+                    peer_id: peer_info
+                        .public_key
+                        .to_peer_id()
+                        .expect("cannot happen, was verified before")
+                        .to_string(),
+                })?;
+        }
+        Ok(())
+    }
+
+    /// For each peer, merge previous and current CID multisets by determining the largest set.
+    ///
+    /// This code uses an invariant: peer's multiset of produced CIDs is always a superset of
+    /// previous invocation's multiset:
+    ///
+    /// A_0 ⊆ A_1 ⊆ ... ⊆ A_n.
+    ///
+    /// So, the largest multiset is selected as the result of merging, the invariant is checked,
+    /// and a error is returned if it is violated.
+    ///
+    /// If the multisets are of same size, they have to be equal.
+    // TODO enforce merging only verified sets
+    // The result is same regardless argument order, so "prevous/current" terminology
+    // is not used deliberately.
+    pub fn merge(mut self, other: Self) -> Result<SignatureStore, DataVerifierError> {
+        use std::collections::hash_map::Entry::*;
+
+        for (other_peer_pk, mut other_info) in other.grouped_cids {
+            let our_info = self.grouped_cids.entry(other_peer_pk);
+            match our_info {
+                Occupied(mut our_info_ent) => {
+                    debug_assert_eq!(other_info.public_key, our_info_ent.get().public_key);
+
+                    if our_info_ent.get().cids.len() < other_info.cids.len() {
+                        // the merged map contains the largest set for each peer_id
+                        //
+                        // this code assumes that a peer only adds CIDs to its set, so CID multisets
+                        //   are growing-only; but it is additionally checked below
+                        // so, we get a largest set as merged one
+                        std::mem::swap(our_info_ent.get_mut(), &mut other_info);
+                    }
+                    // nb: if length are equal, sets should be equal, and any of them
+                    // should be used; if they are not equal, check_cid_multiset_consistency
+                    // will detect it.
+
+                    let larger_info = our_info_ent.get();
+                    let smaller_info = &other_info;
+                    check_cid_multiset_invariant(larger_info, smaller_info)?;
+                }
+                Vacant(ent) => {
+                    ent.insert(other_info);
+                }
+            }
+        }
+        let mut store = SignatureStore::new();
+        for peer_info in self.grouped_cids.into_values() {
+            store.put(peer_info.public_key.clone(), peer_info.signature.clone())
+        }
+        Ok(store)
+    }
+}
+
+fn collect_peers_cids_from_trace<'data>(
+    trace: &'data ExecutionTrace,
+    cid_info: &'data CidInfo,
+    grouped_cids: &mut HashMap<Box<str>, PeerInfo<'data>>,
+) -> Result<(), DataVerifierError> {
+    for elt in trace {
+        match elt {
+            ExecutedState::Call(ref call) => {
+                let cid = call.get_cid();
+                if let Some(cid) = cid {
+                    // TODO refactor
+                    let service_result = cid_info
+                        .service_result_store
+                        .get(cid)
+                        .expect(CANNOT_HAPPEN_IN_VERIFIED_CID_STORE);
+                    let tetraplet = cid_info
+                        .tetraplet_store
+                        .get(&service_result.tetraplet_cid)
+                        .expect(CANNOT_HAPPEN_IN_VERIFIED_CID_STORE);
+
+                    let peer_pk = tetraplet.peer_pk.as_str();
+                    try_push_cid(grouped_cids, peer_pk, cid)?;
+                }
+            }
+            ExecutedState::Canon(CanonResult::Executed(ref cid)) => {
+                // TODO refactor
+                let canon_result = cid_info
+                    .canon_result_store
+                    .get(cid)
+                    .expect(CANNOT_HAPPEN_IN_VERIFIED_CID_STORE);
+                let tetraplet = cid_info
+                    .tetraplet_store
+                    .get(&canon_result.tetraplet)
+                    .expect(CANNOT_HAPPEN_IN_VERIFIED_CID_STORE);
+
+                let peer_pk = tetraplet.peer_pk.as_str();
+                try_push_cid(grouped_cids, peer_pk, cid)?;
+            }
+            _ => {}
+        };
+    }
+    Ok(())
+}
+
+fn try_push_cid<T>(
+    grouped_cids: &mut HashMap<Box<str>, PeerInfo<'_>>,
+    peer_pk: &str,
+    cid: &CID<T>,
+) -> Result<(), DataVerifierError> {
+    match grouped_cids.get_mut(peer_pk) {
+        Some(peer_info) => {
+            peer_info.cids.push(cid.get_inner());
+            Ok(())
+        }
+        None => Err(DataVerifierError::PeerIdNotFound(peer_pk.into())),
+    }
+}
+
+/// Safety check for malicious peer that returns inconsistent CID multisets,
+/// i.e. non-increasing multisets.
+fn check_cid_multiset_invariant(
+    larger_pair: &PeerInfo<'_>,
+    smaller_pair: &PeerInfo<'_>,
+) -> Result<(), DataVerifierError> {
+    let larger_cids = &larger_pair.cids;
+    let smaller_cids = &smaller_pair.cids;
+
+    let larger_count_map = to_count_map(larger_cids);
+    let smaller_count_map = to_count_map(smaller_cids);
+
+    if is_multisubset(larger_count_map, smaller_count_map) {
+        Ok(())
+    } else {
+        let peer_id = smaller_pair
+            .public_key
+            .to_peer_id()
+            .expect("cannot happen, was verified before")
+            .to_string();
+        Err(DataVerifierError::MergeMismatch {
+            peer_id,
+            larger_cids: larger_cids.clone(),
+            smaller_cids: smaller_cids.clone(),
+        })
+    }
+}
+
+fn to_count_map(cids: &Vec<Rc<CidRef>>) -> HashMap<&str, usize> {
+    let mut count_map = HashMap::<_, usize>::new();
+    for cid in cids {
+        // the counter can't overflow, the memory will overflow first
+        *count_map.entry(&**cid).or_default() += 1;
+    }
+    count_map
+}
+
+fn is_multisubset(
+    larger_count_set: HashMap<&str, usize>,
+    smaller_count_set: HashMap<&str, usize>,
+) -> bool {
+    for (cid, &smaller_count) in &smaller_count_set {
+        debug_assert!(smaller_count > 0);
+
+        let larger_count = larger_count_set.get(cid).cloned().unwrap_or_default();
+        if larger_count < smaller_count {
+            return false;
+        }
+    }
+    true
+}
+
+struct PeerInfo<'data> {
+    /// A peer's public key.
+    public_key: &'data PublicKey,
+    /// A peer's signature.
+    signature: &'data Signature,
+    /// Sorted vector of CIDs that belong to the peer.
+    cids: Vec<Rc<CidRef>>,
+}
+
+impl<'data> PeerInfo<'data> {
+    fn new(public_key: &'data PublicKey, signature: &'data Signature) -> Self {
+        Self {
+            public_key,
+            signature,
+            cids: vec![],
+        }
+    }
+}
+
\ No newline at end of file diff --git a/src/air_interpreter_data/lib.rs.html b/src/air_interpreter_data/lib.rs.html new file mode 100644 index 00000000..d761a7dd --- /dev/null +++ b/src/air_interpreter_data/lib.rs.html @@ -0,0 +1,131 @@ +lib.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#![forbid(unsafe_code)]
+#![warn(rust_2018_idioms)]
+#![deny(
+    dead_code,
+    nonstandard_style,
+    unused_imports,
+    unused_mut,
+    unused_variables,
+    unused_unsafe,
+    unreachable_patterns
+)]
+
+mod cid_info;
+mod cid_store;
+mod executed_state;
+mod generation_idx;
+mod interpreter_data;
+mod raw_value;
+mod rkyv;
+mod trace;
+mod trace_pos;
+
+pub use cid_info::*;
+pub use cid_store::*;
+pub use executed_state::*;
+pub use generation_idx::*;
+pub use interpreter_data::*;
+pub use raw_value::*;
+pub use trace::*;
+pub use trace_pos::*;
+
+use air_interpreter_value::JValue;
+use once_cell::sync::Lazy;
+
+use std::str::FromStr;
+
+/// Interpreter data version, more info in
+/// [./docs/update-guide.md]
+static INTERPRETER_DATA_VERSION: Lazy<semver::Version> = Lazy::new(|| {
+    semver::Version::from_str(env!("CARGO_PKG_VERSION"))
+        .expect("invalid data format version specified")
+});
+
+pub fn data_version() -> &'static semver::Version {
+    Lazy::force(&INTERPRETER_DATA_VERSION)
+}
+
\ No newline at end of file diff --git a/src/air_interpreter_data/raw_value.rs.html b/src/air_interpreter_data/raw_value.rs.html new file mode 100644 index 00000000..ceceaf1e --- /dev/null +++ b/src/air_interpreter_data/raw_value.rs.html @@ -0,0 +1,151 @@ +raw_value.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use crate::JValue;
+
+use serde::Deserialize;
+use serde::Serialize;
+
+use std::cell::RefCell;
+
+#[derive(Serialize, Deserialize, Debug, Clone)]
+#[serde(transparent)]
+#[derive(::rkyv::Archive, ::rkyv::Serialize, ::rkyv::Deserialize)]
+#[archive(check_bytes)]
+pub struct RawValue {
+    raw: Box<str>,
+
+    #[serde(skip)]
+    #[with(::rkyv::with::Skip)]
+    parsed: RefCell<Option<JValue>>,
+}
+
+impl RawValue {
+    pub fn from_value(value: impl Into<JValue>) -> Self {
+        let value = value.into();
+        let raw = value.to_string().into();
+        Self {
+            raw,
+            parsed: Some(value).into(),
+        }
+    }
+
+    pub fn get_value(&self) -> JValue {
+        let mut parsed_guard = self.parsed.borrow_mut();
+
+        let parsed_value = parsed_guard
+            .get_or_insert_with(|| serde_json::from_str(&self.raw).expect("TODO handle error"));
+        parsed_value.clone()
+    }
+
+    pub(crate) fn as_inner(&self) -> &str {
+        &self.raw
+    }
+}
+
+impl From<JValue> for RawValue {
+    fn from(value: JValue) -> Self {
+        Self::from_value(value)
+    }
+}
+
+impl PartialEq for RawValue {
+    fn eq(&self, other: &Self) -> bool {
+        self.get_value() == other.get_value()
+    }
+}
+
+// TODO is it implemented for JValue?
+impl Eq for RawValue {}
+
\ No newline at end of file diff --git a/src/air_interpreter_data/rkyv.rs.html b/src/air_interpreter_data/rkyv.rs.html new file mode 100644 index 00000000..bf307448 --- /dev/null +++ b/src/air_interpreter_data/rkyv.rs.html @@ -0,0 +1,193 @@ +rkyv.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use rkyv::de::deserializers::SharedDeserializeMap;
+use rkyv::de::deserializers::SharedDeserializeMapError;
+use rkyv::ser::serializers::AlignedSerializer;
+use rkyv::ser::serializers::AllocScratch;
+use rkyv::ser::serializers::AllocScratchError;
+use rkyv::ser::serializers::CompositeSerializer;
+use rkyv::ser::serializers::CompositeSerializerError;
+use rkyv::ser::serializers::FallbackScratch;
+use rkyv::ser::serializers::HeapScratch;
+use rkyv::ser::serializers::SharedSerializeMap;
+use rkyv::ser::serializers::SharedSerializeMapError;
+use rkyv::ser::serializers::WriteSerializer;
+use rkyv::ser::Serializer;
+use rkyv::validation::validators::DefaultValidator;
+use rkyv::AlignedVec;
+
+const DEFAULT_VALIDATION_CAPACITY: usize = 1024;
+const DEFAULT_DESERIALIZE_CAPACITY: usize = 1024;
+
+#[derive(Debug, thiserror::Error)]
+pub enum RkyvDeserializeError {
+    #[error(transparent)]
+    // rkyv validation types is tricky and involves lifetime, though final type is 'static
+    Validation(Box<dyn std::error::Error>),
+
+    #[error(transparent)]
+    Deserialize(SharedDeserializeMapError),
+}
+
+pub type RkyvSerializeError =
+    CompositeSerializerError<std::convert::Infallible, AllocScratchError, SharedSerializeMapError>;
+
+pub(crate) fn to_vec<Value>(value: &Value) -> Result<Vec<u8>, RkyvSerializeError>
+where
+    Value: rkyv::Serialize<
+        CompositeSerializer<
+            AlignedSerializer<AlignedVec>,
+            FallbackScratch<HeapScratch<4096>, AllocScratch>,
+            SharedSerializeMap,
+        >,
+    >,
+{
+    let mut ser = rkyv::ser::serializers::AllocSerializer::<4096>::default();
+    ser.serialize_value(value)?;
+    Ok(ser.into_serializer().into_inner().to_vec())
+}
+
+pub(crate) fn from_aligned_slice<'a, Value>(slice: &'a [u8]) -> Result<Value, RkyvDeserializeError>
+where
+    Value: rkyv::Archive,
+    <Value as rkyv::Archive>::Archived:
+        rkyv::CheckBytes<DefaultValidator<'a>> + rkyv::Deserialize<Value, SharedDeserializeMap>,
+{
+    let mut validator = rkyv::validation::validators::DefaultValidator::with_capacity(
+        slice,
+        DEFAULT_VALIDATION_CAPACITY,
+    );
+    let archived_data = rkyv::check_archived_root_with_context::<Value, _>(slice, &mut validator)
+        .map_err(|e| RkyvDeserializeError::Validation(Box::new(e)))?;
+
+    let mut shared = SharedDeserializeMap::with_capacity(DEFAULT_DESERIALIZE_CAPACITY);
+    rkyv::Deserialize::<Value, _>::deserialize(archived_data, &mut shared)
+        .map_err(RkyvDeserializeError::Deserialize)
+}
+
+#[allow(dead_code)]
+pub(crate) fn to_writer<'a, Value, W: std::io::Write>(
+    write: &'a mut W,
+    value: &Value,
+) -> Result<(), std::io::Error>
+where
+    Value: rkyv::Serialize<WriteSerializer<&'a mut W>>,
+{
+    let mut ser = rkyv::ser::serializers::WriteSerializer::new(write);
+    ser.serialize_value(value)?;
+    Ok(())
+}
+
\ No newline at end of file diff --git a/src/air_interpreter_data/trace.rs.html b/src/air_interpreter_data/trace.rs.html new file mode 100644 index 00000000..77e810a2 --- /dev/null +++ b/src/air_interpreter_data/trace.rs.html @@ -0,0 +1,211 @@ +trace.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::ExecutedState;
+use crate::TracePos;
+
+use serde::Deserialize;
+use serde::Serialize;
+use std::convert::TryInto;
+use std::ops::Deref;
+use std::ops::Index;
+use std::ops::IndexMut;
+
+pub type TraceLen = u32;
+
+#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
+#[serde(transparent)]
+#[derive(::rkyv::Archive, ::rkyv::Serialize, ::rkyv::Deserialize)]
+#[archive(check_bytes)]
+pub struct ExecutionTrace(Vec<ExecutedState>);
+
+impl ExecutionTrace {
+    pub fn get(&self, index: TracePos) -> Option<&ExecutedState> {
+        self.0.get(usize::from(index))
+    }
+
+    pub fn get_mut(&mut self, index: TracePos) -> Option<&mut ExecutedState> {
+        self.0.get_mut(usize::from(index))
+    }
+
+    pub fn pop(&mut self) -> Option<ExecutedState> {
+        self.0.pop()
+    }
+
+    pub fn push(&mut self, value: ExecutedState) {
+        self.0.push(value);
+    }
+
+    pub fn trace_states_count(&self) -> TraceLen {
+        self.0
+            .len()
+            .try_into()
+            .expect("there is an overflow in trace_states_count().")
+    }
+}
+
+impl Deref for ExecutionTrace {
+    type Target = [ExecutedState];
+
+    fn deref(&self) -> &[ExecutedState] {
+        &self.0
+    }
+}
+
+impl From<Vec<ExecutedState>> for ExecutionTrace {
+    fn from(vec: Vec<ExecutedState>) -> Self {
+        Self(vec)
+    }
+}
+
+impl Index<TracePos> for ExecutionTrace {
+    type Output = ExecutedState;
+
+    fn index(&self, index: TracePos) -> &Self::Output {
+        &self.deref()[usize::from(index)]
+    }
+}
+
+impl IndexMut<TracePos> for ExecutionTrace {
+    fn index_mut(&mut self, index: TracePos) -> &mut Self::Output {
+        &mut self.0[usize::from(index)]
+    }
+}
+
+impl PartialEq<Vec<ExecutedState>> for ExecutionTrace {
+    fn eq(&self, other: &Vec<ExecutedState>) -> bool {
+        &self.0 == other
+    }
+}
+
+impl<'trace> IntoIterator for &'trace ExecutionTrace {
+    type Item = &'trace ExecutedState;
+
+    type IntoIter = <&'trace Vec<ExecutedState> as IntoIterator>::IntoIter;
+
+    fn into_iter(self) -> Self::IntoIter {
+        self.0.iter()
+    }
+}
+
\ No newline at end of file diff --git a/src/air_interpreter_data/trace_pos.rs.html b/src/air_interpreter_data/trace_pos.rs.html new file mode 100644 index 00000000..8b801ee3 --- /dev/null +++ b/src/air_interpreter_data/trace_pos.rs.html @@ -0,0 +1,119 @@ +trace_pos.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use air_utils::auto_checked_add;
+
+use newtype_derive::*;
+
+use serde::Deserialize;
+use serde::Serialize;
+
+pub type PosType = u32;
+
+#[derive(Copy, Clone, Default, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)]
+#[serde(transparent)]
+#[repr(transparent)]
+#[derive(::rkyv::Archive, ::rkyv::Serialize, ::rkyv::Deserialize)]
+#[archive(check_bytes)]
+pub struct TracePos(PosType);
+
+NewtypeFrom! { () pub struct TracePos(PosType); }
+NewtypeAdd! { (PosType) pub struct TracePos(PosType); }
+NewtypeAdd! { () pub struct TracePos(PosType); }
+NewtypeAddAssign! { () pub struct TracePos(PosType); }
+NewtypeAddAssign! { (PosType) pub struct TracePos(PosType); }
+NewtypeSub! { () pub struct TracePos(PosType); }
+NewtypeSub! { (PosType) pub struct TracePos(PosType); }
+NewtypeDebug! { () pub struct TracePos(PosType); }
+NewtypeDisplay! { () pub struct TracePos(PosType); }
+auto_checked_add![TracePos];
+
+impl From<TracePos> for usize {
+    fn from(value: TracePos) -> Self {
+        value.0 as Self
+    }
+}
+
+impl TryFrom<usize> for TracePos {
+    type Error = <PosType as TryFrom<usize>>::Error;
+
+    fn try_from(value: usize) -> Result<Self, Self::Error> {
+        PosType::try_from(value).map(TracePos)
+    }
+}
+
\ No newline at end of file diff --git a/src/air_interpreter_interface/call_request_parameters.rs.html b/src/air_interpreter_interface/call_request_parameters.rs.html new file mode 100644 index 00000000..12c402d5 --- /dev/null +++ b/src/air_interpreter_interface/call_request_parameters.rs.html @@ -0,0 +1,249 @@ +call_request_parameters.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use air_interpreter_sede::define_simple_representation;
+use air_interpreter_sede::derive_serialized_type;
+use air_interpreter_sede::Format;
+use air_interpreter_sede::FromSerialized;
+use air_interpreter_sede::MsgPackFormat;
+use air_interpreter_sede::MsgPackMultiformat;
+use air_interpreter_sede::Representation;
+use air_interpreter_value::JValue;
+
+use marine_call_parameters::SecurityTetraplet;
+#[cfg(feature = "marine")]
+use marine_rs_sdk::marine;
+use serde::Deserialize;
+use serde::Serialize;
+
+use std::collections::HashMap;
+use std::rc::Rc;
+
+pub type CallRequests = HashMap<u32, CallRequestParams>;
+
+derive_serialized_type!(SerializedCallArguments);
+derive_serialized_type!(SerializedTetraplets);
+derive_serialized_type!(SerializedCallRequests);
+
+pub type CallArgumentsFormat = MsgPackFormat;
+pub type TetrapletsFormat = MsgPackFormat;
+pub type CallRequestsFormat = MsgPackMultiformat;
+
+define_simple_representation! {
+    CallArgumentsRepr,
+    Vec<JValue>,
+    CallArgumentsFormat,
+    SerializedCallArguments
+}
+
+pub type CallArgumentsDeserializeError = <CallArgumentsRepr as Representation>::DeserializeError;
+
+impl FromSerialized<Vec<serde_json::Value>> for CallArgumentsRepr {
+    fn deserialize(&self, repr: &[u8]) -> Result<Vec<serde_json::Value>, Self::DeserializeError> {
+        Self.get_format().from_slice(repr)
+    }
+}
+
+define_simple_representation! {
+    TetrapletsRepr,
+    // additional implementation for Vec<Vec<SecurityTetraplet>> is defined below
+    // TODO allow this macro to define implementations for multiple types
+    Vec<Vec<Rc<SecurityTetraplet>>>,
+    TetrapletsFormat,
+    SerializedTetraplets
+}
+
+pub type TetrapletDeserializeError = <TetrapletsRepr as Representation>::DeserializeError;
+
+define_simple_representation! {
+    CallRequestsRepr,
+    CallRequests,
+    CallRequestsFormat,
+    SerializedCallRequests
+}
+
+pub type CallRequestsDeserializeError = <CallRequestsRepr as Representation>::DeserializeError;
+
+impl FromSerialized<Vec<Vec<SecurityTetraplet>>> for TetrapletsRepr {
+    fn deserialize(
+        &self,
+        repr: &[u8],
+    ) -> Result<Vec<Vec<SecurityTetraplet>>, Self::DeserializeError> {
+        Self.get_format().from_slice(repr)
+    }
+}
+
+/// Contains arguments of a call instruction and all other necessary information
+/// required for calling a service.
+#[cfg_attr(feature = "marine", marine)]
+#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
+pub struct CallRequestParams {
+    /// Id of a service that should be called.
+    pub service_id: String,
+
+    /// Name of a function from service identified by service_id that should be called.
+    pub function_name: String,
+
+    /// Serialized to JSON string Vec<JValue> of arguments that should be passed to a service.
+    pub arguments: SerializedCallArguments,
+
+    /// Serialized to JSON string Vec<Vec<SecurityTetraplet>> that should be passed to a service.
+    pub tetraplets: SerializedTetraplets,
+}
+
+impl CallRequestParams {
+    pub fn new(
+        service_id: String,
+        function_name: String,
+        arguments: SerializedCallArguments,
+        tetraplets: SerializedTetraplets,
+    ) -> Self {
+        Self {
+            service_id,
+            function_name,
+            arguments,
+            tetraplets,
+        }
+    }
+}
+
\ No newline at end of file diff --git a/src/air_interpreter_interface/call_service_result.rs.html b/src/air_interpreter_interface/call_service_result.rs.html new file mode 100644 index 00000000..36fec06e --- /dev/null +++ b/src/air_interpreter_interface/call_service_result.rs.html @@ -0,0 +1,165 @@ +call_service_result.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use air_interpreter_sede::define_simple_representation;
+use air_interpreter_sede::derive_serialized_type;
+use air_interpreter_sede::MsgPackMultiformat;
+use air_interpreter_sede::Representation;
+use serde::Deserialize;
+use serde::Serialize;
+use serde_json::Value as JValue;
+use std::collections::HashMap;
+
+/// This is a map from a String to a service result for compatibility with JavaScript.
+/// Binary format implementations like `rmp-serde` do not convert keys from strings, unlike `serde_json`.
+pub type CallResults = HashMap<String, CallServiceResult>;
+pub const CALL_SERVICE_SUCCESS: i32 = 0;
+
+pub type CallResultsFormat = MsgPackMultiformat;
+
+derive_serialized_type!(SerializedCallResults);
+
+define_simple_representation! {
+    CallResultsRepr,
+    CallResults,
+    CallResultsFormat,
+    SerializedCallResults
+}
+
+pub type CallResultsDeserializeError = <CallResultsRepr as Representation>::DeserializeError;
+pub type CallResultsSerializeError = <CallResultsRepr as Representation>::SerializeError;
+
+/// Represents an executed host function result.
+#[derive(Debug, Default, Clone, Serialize, Deserialize)]
+pub struct CallServiceResult {
+    /// A error code service or builtin returned, where CALL_SERVICE_SUCCESS represents success.
+    pub ret_code: i32,
+
+    /// Resulted JValue serialized to a string. It's impossible to wrap it with the marine macro,
+    /// inasmuch as it's a enum uses HashMap inside.
+    pub result: String,
+}
+
+impl CallServiceResult {
+    pub fn ok(result: &JValue) -> Self {
+        Self {
+            ret_code: CALL_SERVICE_SUCCESS,
+            // for compatiblity with JavaScript with binary formats, string IDs are used
+            result: result.to_string(),
+        }
+    }
+
+    pub fn err(err_code: i32, result: &JValue) -> Self {
+        Self {
+            ret_code: err_code,
+            result: result.to_string(),
+        }
+    }
+}
+
+use std::fmt;
+
+impl fmt::Display for CallServiceResult {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        write!(f, "ret_code: {}, result: '{}'", self.ret_code, self.result)
+    }
+}
+
\ No newline at end of file diff --git a/src/air_interpreter_interface/interpreter_outcome.rs.html b/src/air_interpreter_interface/interpreter_outcome.rs.html new file mode 100644 index 00000000..24383c83 --- /dev/null +++ b/src/air_interpreter_interface/interpreter_outcome.rs.html @@ -0,0 +1,459 @@ +interpreter_outcome.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#[cfg(feature = "marine")]
+use marine_rs_sdk::marine;
+
+#[cfg(feature = "marine")]
+use fluence_it_types::IValue;
+use serde::Deserialize;
+use serde::Serialize;
+
+pub const INTERPRETER_SUCCESS: i64 = 0;
+
+/// This stores soft limits triggering flags.
+#[derive(Debug, Default, Copy, Clone, PartialEq, Eq, Serialize, Deserialize)]
+pub struct SoftLimitsTriggering {
+    pub air_size_limit_exceeded: bool,
+    pub particle_size_limit_exceeded: bool,
+    pub call_result_size_limit_exceeded: bool,
+}
+
+/// Describes a result returned at the end of the interpreter execution_step.
+#[cfg_attr(feature = "marine", marine)]
+#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
+pub struct InterpreterOutcome {
+    /// A return code, where INTERPRETER_SUCCESS means success.
+    pub ret_code: i64,
+
+    /// Contains error message if ret_code != INTERPRETER_SUCCESS.
+    pub error_message: String,
+
+    /// Contains script data that should be preserved in an executor of this interpreter
+    /// regardless of ret_code value.
+    pub data: Vec<u8>,
+
+    /// Public keys of peers that should receive data.
+    pub next_peer_pks: Vec<String>,
+
+    /// Collected parameters of all met call instructions that could be executed on a current peer.
+    pub call_requests: Vec<u8>,
+
+    /// This flag signals that AIR script size exceeds the limit.
+    pub air_size_limit_exceeded: bool,
+
+    /// This flag signals that particle data size exceeds the limit.
+    pub particle_size_limit_exceeded: bool,
+
+    /// This flag signals that call result size exceeds the limit.
+    pub call_result_size_limit_exceeded: bool,
+}
+
+impl SoftLimitsTriggering {
+    pub fn new(
+        air_size_limit_exceeded: bool,
+        particle_size_limit_exceeded: bool,
+        call_result_size_limit_exceeded: bool,
+    ) -> Self {
+        Self {
+            air_size_limit_exceeded,
+            particle_size_limit_exceeded,
+            call_result_size_limit_exceeded,
+        }
+    }
+
+    pub fn are_limits_exceeded(&self) -> bool {
+        self.air_size_limit_exceeded
+            || self.particle_size_limit_exceeded
+            || self.call_result_size_limit_exceeded
+    }
+}
+
+impl InterpreterOutcome {
+    pub fn new(
+        ret_code: i64,
+        error_message: String,
+        data: Vec<u8>,
+        next_peer_pks: Vec<String>,
+        call_requests: SerializedCallRequests,
+        soft_limits_triggering: SoftLimitsTriggering,
+    ) -> Self {
+        let call_requests = call_requests.into();
+        Self {
+            ret_code,
+            error_message,
+            data,
+            next_peer_pks,
+            call_requests,
+            air_size_limit_exceeded: soft_limits_triggering.air_size_limit_exceeded,
+            particle_size_limit_exceeded: soft_limits_triggering.particle_size_limit_exceeded,
+            call_result_size_limit_exceeded: soft_limits_triggering.call_result_size_limit_exceeded,
+        }
+    }
+}
+
+#[cfg(feature = "marine")]
+impl InterpreterOutcome {
+    pub fn from_ivalue(ivalue: IValue) -> Result<Self, String> {
+        const OUTCOME_FIELDS_COUNT: usize = 8;
+
+        let mut record_values = try_as_record(ivalue)?.into_vec();
+        if record_values.len() != OUTCOME_FIELDS_COUNT {
+            return Err(format!(
+                "expected InterpreterOutcome struct with {OUTCOME_FIELDS_COUNT} fields, got {record_values:?}"
+            ));
+        }
+
+        let call_result_size_limit_exceeded = try_as_boolean(
+            record_values.pop().unwrap(),
+            "call_result_size_limit_exceeded",
+        )?;
+        let particle_size_limit_exceeded =
+            try_as_boolean(record_values.pop().unwrap(), "particle_size_limit_exceeded")?;
+        let air_size_limit_exceeded =
+            try_as_boolean(record_values.pop().unwrap(), "air_size_limit_exceeded")?;
+
+        let call_requests = try_as_byte_vec(record_values.pop().unwrap(), "call_requests")?;
+        let next_peer_pks = try_as_string_vec(record_values.pop().unwrap(), "next_peer_pks")?;
+        let data = try_as_byte_vec(record_values.pop().unwrap(), "data")?;
+        let error_message = try_as_string(record_values.pop().unwrap(), "error_message")?;
+        let ret_code = try_as_i64(record_values.pop().unwrap(), "ret_code")?;
+        let soft_limits_triggering = SoftLimitsTriggering::new(
+            air_size_limit_exceeded,
+            particle_size_limit_exceeded,
+            call_result_size_limit_exceeded,
+        );
+
+        let outcome = Self::new(
+            ret_code,
+            error_message,
+            data,
+            next_peer_pks,
+            call_requests.into(),
+            soft_limits_triggering,
+        );
+
+        Ok(outcome)
+    }
+}
+
+#[cfg(feature = "marine")]
+use fluence_it_types::ne_vec::NEVec;
+
+use crate::SerializedCallRequests;
+
+#[cfg(feature = "marine")]
+fn try_as_record(ivalue: IValue) -> Result<NEVec<IValue>, String> {
+    match ivalue {
+        IValue::Record(record_values) => Ok(record_values),
+        v => Err(format!("expected record for InterpreterOutcome, got {v:?}")),
+    }
+}
+
+#[cfg(feature = "marine")]
+fn try_as_i64(ivalue: IValue, field_name: &str) -> Result<i64, String> {
+    match ivalue {
+        IValue::S64(value) => Ok(value),
+        v => Err(format!("expected an i64 for {field_name}, got {v:?}")),
+    }
+}
+
+#[cfg(feature = "marine")]
+pub fn try_as_string(ivalue: IValue, field_name: &str) -> Result<String, String> {
+    match ivalue {
+        IValue::String(value) => Ok(value),
+        v => Err(format!("expected a string for {field_name}, got {v:?}")),
+    }
+}
+
+#[cfg(feature = "marine")]
+fn try_as_byte_vec(ivalue: IValue, field_name: &str) -> Result<Vec<u8>, String> {
+    let byte_vec = match ivalue {
+        IValue::Array(array) => {
+            let array: Result<Vec<_>, _> = array
+                .into_iter()
+                .map(|v| match v {
+                    IValue::U8(byte) => Ok(byte),
+                    v => Err(format!("expected a byte, got {v:?}")),
+                })
+                .collect();
+            array?
+        }
+        IValue::ByteArray(array) => array,
+        v => return Err(format!("expected a Vec<u8> for {field_name}, got {v:?}")),
+    };
+
+    Ok(byte_vec)
+}
+
+#[cfg(feature = "marine")]
+fn try_as_string_vec(ivalue: IValue, field_name: &str) -> Result<Vec<String>, String> {
+    match ivalue {
+        IValue::Array(ar_values) => {
+            let array = ar_values
+                .into_iter()
+                .map(|v| match v {
+                    IValue::String(str) => Ok(str),
+                    v => Err(format!("expected string for next_peer_pks, got {v:?}")),
+                })
+                .collect::<Result<Vec<String>, _>>()?;
+
+            Ok(array)
+        }
+        v => Err(format!("expected an array for {field_name}, got {v:?}")),
+    }
+}
+
+#[cfg(feature = "marine")]
+fn try_as_boolean(ivalue: IValue, field_name: &str) -> Result<bool, String> {
+    match ivalue {
+        IValue::Boolean(value) => Ok(value),
+        v => Err(format!("expected a bool for {field_name}, got {v:?}")),
+    }
+}
+
\ No newline at end of file diff --git a/src/air_interpreter_interface/lib.rs.html b/src/air_interpreter_interface/lib.rs.html new file mode 100644 index 00000000..7e039831 --- /dev/null +++ b/src/air_interpreter_interface/lib.rs.html @@ -0,0 +1,85 @@ +lib.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#![forbid(unsafe_code)]
+#![warn(rust_2018_idioms)]
+#![deny(
+    dead_code,
+    nonstandard_style,
+    unused_imports,
+    unused_mut,
+    unused_variables,
+    unused_unsafe,
+    unreachable_patterns
+)]
+
+mod call_request_parameters;
+mod call_service_result;
+mod interpreter_outcome;
+mod run_args_memory_limits;
+mod run_parameters;
+
+pub use call_request_parameters::*;
+pub use call_service_result::*;
+pub use interpreter_outcome::*;
+pub use run_args_memory_limits::*;
+pub use run_parameters::*;
+
\ No newline at end of file diff --git a/src/air_interpreter_interface/run_args_memory_limits.rs.html b/src/air_interpreter_interface/run_args_memory_limits.rs.html new file mode 100644 index 00000000..d9f36654 --- /dev/null +++ b/src/air_interpreter_interface/run_args_memory_limits.rs.html @@ -0,0 +1,71 @@ +run_args_memory_limits.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+const MB: u64 = 1024 * 1024;
+
+/// These are RAM consumption related limits to be enforced by AquaVM.
+/// There are two enforcing modes in AquaVM: soft and hard limit. The mode
+/// is signalled by AquaVM function Invoker via its run parameters.
+/// Soft limit mode sets a set of flags to return to the Invoker.
+/// Hard limit mode forces AquaVM to return Uncatchable error if the limits
+/// are exceeded.
+/// The math behind the limits value is based on:
+/// - 4GB value that provder guaratees for a Computation Unit that also has 1 CPU core.
+/// - the fact that peak RAM consumption linearly depends on: particle size,
+///     number of instructions and their types.
+/// The limits values are to be re-considered after more RAM efficient in-memory representation.
+pub static MAX_AIR_SIZE: u64 = 16 * MB;
+pub static MAX_PARTICLE_SIZE: u64 = 64 * MB;
+pub static MAX_CALL_RESULT_SIZE: u64 = 32 * MB;
+
\ No newline at end of file diff --git a/src/air_interpreter_interface/run_parameters.rs.html b/src/air_interpreter_interface/run_parameters.rs.html new file mode 100644 index 00000000..08d37dd7 --- /dev/null +++ b/src/air_interpreter_interface/run_parameters.rs.html @@ -0,0 +1,245 @@ +run_parameters.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#[cfg(feature = "marine")]
+use fluence_it_types::ne_vec::NEVec;
+#[cfg(feature = "marine")]
+use fluence_it_types::IValue;
+#[cfg(feature = "marine")]
+use marine_rs_sdk::marine;
+use serde::Deserialize;
+use serde::Serialize;
+
+/// Parameters that a host side should pass to an interpreter and that necessary for execution.
+#[cfg_attr(feature = "marine", marine)]
+#[derive(Debug, Clone, Eq, PartialEq, Serialize, Deserialize)]
+pub struct RunParameters {
+    /// Peer id of a peer that start this particle.
+    pub init_peer_id: String,
+
+    /// Peer id of a current peer.
+    pub current_peer_id: String,
+
+    /// Unix timestamp from a particle in milliseconds.
+    /// It represents time when this particle was sent from the init peer id.
+    pub timestamp: u64,
+
+    /// TTL set by init peer id in milliseconds.
+    pub ttl: u32,
+
+    /// A key format.
+    ///
+    /// This value is the result of `fluence_keypair::KeyType::into`.
+    pub key_format: u8,
+
+    /// A secret key material.
+    ///
+    /// The value is the result `fluence_keypair::KeyPair::secret`, for compatibility
+    /// with JS client who can only serialize to secret key, not to keypair.
+    pub secret_key_bytes: Vec<u8>,
+
+    /// Unique particle ID.
+    pub particle_id: String,
+
+    /// The AIR script size limit.
+    pub air_size_limit: u64,
+
+    /// The particle data size limit.
+    pub particle_size_limit: u64,
+
+    /// This is the limit for the size of service call result.
+    pub call_result_size_limit: u64,
+
+    /// This knob controls hard RAM limits behavior for AVMRunner.
+    pub hard_limit_enabled: bool,
+}
+
+impl RunParameters {
+    #![allow(clippy::too_many_arguments)]
+    pub fn new(
+        init_peer_id: String,
+        current_peer_id: String,
+        timestamp: u64,
+        ttl: u32,
+        key_format: u8,
+        secret_key_bytes: Vec<u8>,
+        particle_id: String,
+        air_size_limit: u64,
+        particle_size_limit: u64,
+        call_result_size_limit: u64,
+        hard_limit_enabled: bool,
+    ) -> Self {
+        Self {
+            init_peer_id,
+            current_peer_id,
+            timestamp,
+            ttl,
+            key_format,
+            secret_key_bytes,
+            particle_id,
+            air_size_limit,
+            particle_size_limit,
+            call_result_size_limit,
+            hard_limit_enabled,
+        }
+    }
+
+    #[cfg(feature = "marine")]
+    pub fn into_ivalue(self) -> IValue {
+        let run_parameters = vec![
+            IValue::String(self.init_peer_id),
+            IValue::String(self.current_peer_id),
+            IValue::U64(self.timestamp),
+            IValue::U32(self.ttl),
+            IValue::U8(self.key_format),
+            IValue::ByteArray(self.secret_key_bytes),
+            IValue::String(self.particle_id),
+            IValue::U64(self.air_size_limit),
+            IValue::U64(self.particle_size_limit),
+            IValue::U64(self.call_result_size_limit),
+            IValue::Boolean(self.hard_limit_enabled),
+        ];
+        // unwrap is safe here because run_parameters is non-empty array
+        let run_parameters = NEVec::new(run_parameters).unwrap();
+        IValue::Record(run_parameters)
+    }
+}
+
\ No newline at end of file diff --git a/src/air_interpreter_sede/format.rs.html b/src/air_interpreter_sede/format.rs.html new file mode 100644 index 00000000..e36fae54 --- /dev/null +++ b/src/air_interpreter_sede/format.rs.html @@ -0,0 +1,109 @@ +format.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use std::fmt::Debug;
+
+pub trait Format<Value> {
+    type SerializationError: Debug;
+    type DeserializationError: Debug;
+    type WriteError: Debug;
+
+    fn to_vec(&self, val: &Value) -> Result<Vec<u8>, Self::SerializationError>;
+
+    // todo owned_from_slice
+    #[allow(clippy::wrong_self_convention)]
+    fn from_slice(&self, slice: &[u8]) -> Result<Value, Self::DeserializationError>;
+
+    fn to_writer<W: std::io::Write>(
+        &self,
+        value: &Value,
+        write: &mut W,
+    ) -> Result<(), Self::WriteError>;
+}
+
+pub trait BorrowFormat<'data, Value: 'data>: Format<Value> {
+    #[allow(dead_code)]
+    fn borrow_from_slice(&self, slice: &'data [u8]) -> Result<Value, Self::DeserializationError>;
+}
+
+#[allow(dead_code)]
+pub trait ArchivedFormat<Value>: Format<Value> {
+    type Archived;
+    type ValidationError;
+
+    fn archived_from_slice<'data>(
+        &self,
+        slice: &'data [u8],
+    ) -> Result<&'data Self::Archived, Self::ValidationError>;
+}
+
\ No newline at end of file diff --git a/src/air_interpreter_sede/lib.rs.html b/src/air_interpreter_sede/lib.rs.html new file mode 100644 index 00000000..9eeb2cd4 --- /dev/null +++ b/src/air_interpreter_sede/lib.rs.html @@ -0,0 +1,111 @@ +lib.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+pub mod multiformat;
+
+pub(crate) mod format;
+pub(crate) mod representation;
+pub(crate) mod serialized_type;
+
+pub use crate::format::Format;
+pub use crate::representation::FromSerialiedBorrow;
+pub use crate::representation::FromSerialized;
+pub use crate::representation::Representation;
+pub use crate::representation::ToSerialized;
+pub use crate::representation::ToWriter;
+
+#[cfg(feature = "rmp-serde")]
+pub(crate) mod rmp_serde;
+#[cfg(feature = "rmp-serde")]
+pub use crate::rmp_serde::RmpSerdeFormat;
+#[cfg(feature = "rmp-serde")]
+pub use crate::rmp_serde::RmpSerdeMultiformat;
+
+#[cfg(feature = "msgpack")]
+pub use crate::rmp_serde::RmpSerdeFormat as MsgPackFormat;
+#[cfg(feature = "msgpack")]
+pub use crate::rmp_serde::RmpSerdeMultiformat as MsgPackMultiformat;
+
+#[cfg(feature = "serde_json")]
+pub(crate) mod serde_json;
+#[cfg(feature = "serde_json")]
+pub use crate::serde_json::SerdeJsonFormat;
+#[cfg(feature = "serde_json")]
+pub use crate::serde_json::SerdeJsonMultiformat;
+
+#[cfg(feature = "json")]
+pub use crate::serde_json::SerdeJsonFormat as JsonFormat;
+#[cfg(feature = "json")]
+pub use crate::serde_json::SerdeJsonMultiformat as JsonMultiformat;
+
\ No newline at end of file diff --git a/src/air_interpreter_sede/multiformat.rs.html b/src/air_interpreter_sede/multiformat.rs.html new file mode 100644 index 00000000..8edefc38 --- /dev/null +++ b/src/air_interpreter_sede/multiformat.rs.html @@ -0,0 +1,195 @@ +multiformat.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use std::io::Write;
+
+use crate::Format;
+
+use unsigned_varint::decode as varint_decode;
+use unsigned_varint::encode as varint_encode;
+
+pub type SerializationCodec = u32;
+
+const ENCODING_BUFFER_CAPACITY: usize = 1024;
+
+#[derive(thiserror::Error, Debug)]
+pub enum DecodeError<FormatError> {
+    #[error(transparent)]
+    Format(FormatError),
+    #[error("unsupported multiformat codec: {0}")]
+    Codec(SerializationCodec),
+    #[error("failed to parse multiformat: {0}")]
+    VarInt(#[from] varint_decode::Error),
+}
+
+#[derive(thiserror::Error, Debug)]
+pub enum EncodeError<FormatError> {
+    #[error(transparent)]
+    Format(FormatError),
+    #[error("failed to write: {0}")]
+    Io(#[from] std::io::Error),
+}
+
+pub fn parse_multiformat_bytes(
+    data: &[u8],
+) -> Result<(SerializationCodec, &[u8]), varint_decode::Error> {
+    varint_decode::u32(data)
+}
+
+pub fn encode_multiformat<Value, Fmt: Format<Value>>(
+    data: &Value,
+    codec: SerializationCodec,
+    format: &Fmt,
+) -> Result<Vec<u8>, EncodeError<<Fmt as Format<Value>>::WriteError>> {
+    let mut output = Vec::with_capacity(ENCODING_BUFFER_CAPACITY);
+
+    write_multiformat(data, codec, format, &mut output)?;
+
+    Ok(output)
+}
+
+pub fn write_multiformat<Value, Fmt: Format<Value>, W: Write>(
+    data: &Value,
+    codec: SerializationCodec,
+    format: &Fmt,
+    output: &mut W,
+) -> Result<(), EncodeError<<Fmt as Format<Value>>::WriteError>> {
+    // looks weird, but that's how the API is
+    let mut buf = varint_encode::u32_buffer();
+    let codec_bytes = varint_encode::u32(codec, &mut buf);
+    output.write_all(codec_bytes)?;
+    format
+        .to_writer(data, output)
+        .map_err(EncodeError::Format)?;
+    Ok(())
+}
+
+pub fn decode_multiformat<Value, Fmt: Format<Value>>(
+    multiformat_data: &[u8],
+    expected_codec: SerializationCodec,
+    format: &Fmt,
+) -> Result<Value, DecodeError<<Fmt as Format<Value>>::DeserializationError>> {
+    let (data_codec, data) = parse_multiformat_bytes(multiformat_data)?;
+
+    if data_codec != expected_codec {
+        // TODO we may be more permissive, having kind of registry for the possible incoming formats, akin to
+        // CID algorithms; but it may be *really* tricky to organize it
+        return Err(DecodeError::Codec(data_codec));
+    }
+
+    format.from_slice(data).map_err(DecodeError::Format)
+}
+
\ No newline at end of file diff --git a/src/air_interpreter_sede/representation.rs.html b/src/air_interpreter_sede/representation.rs.html new file mode 100644 index 00000000..d8f894c9 --- /dev/null +++ b/src/air_interpreter_sede/representation.rs.html @@ -0,0 +1,229 @@ +representation.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+/// A formatter intended for particular type, a base type that defines generic behavior
+/// used by particular implementations.
+pub trait Representation {
+    type SerializeError;
+    type DeserializeError;
+    type WriteError;
+    type Format;
+    type SerializedValue: std::ops::Deref<Target = [u8]>;
+
+    fn get_format(&self) -> Self::Format;
+}
+
+/// Serialization trait restricted to for particular type.
+pub trait ToSerialized<Value>: Representation {
+    fn serialize(&self, value: &Value) -> Result<Self::SerializedValue, Self::SerializeError>;
+}
+
+/// Owned deserialization trait restricted to for particular type.
+pub trait FromSerialized<Value>: Representation {
+    fn deserialize(&self, repr: &[u8]) -> Result<Value, Self::DeserializeError>;
+}
+
+/// Borrow deserialization trait restricted to for particular type.
+pub trait FromSerialiedBorrow<'data, Value: 'data>: Representation {
+    fn deserialize_borrow(&self, repr: &'data [u8]) -> Result<Value, Self::DeserializeError>;
+}
+
+/// Writing deserialization trait restricted to for particular type.
+pub trait ToWriter<Value>: Representation {
+    fn to_writer<W: std::io::Write>(
+        &self,
+        value: &Value,
+        writer: &mut W,
+    ) -> Result<(), Self::WriteError>;
+}
+
+#[macro_export]
+macro_rules! define_simple_representation {
+    ($repr_type:ident, $value_type:ty, $format_type:ty, $serialized_value:ty) => {
+        #[derive(Default)]
+        pub struct $repr_type;
+
+        impl $crate::Representation for $repr_type {
+            type SerializeError = <$format_type as $crate::Format<$value_type>>::SerializationError;
+
+            type DeserializeError =
+                <$format_type as $crate::Format<$value_type>>::DeserializationError;
+
+            type WriteError = <$format_type as $crate::Format<$value_type>>::WriteError;
+
+            type Format = $format_type;
+
+            type SerializedValue = $serialized_value;
+
+            #[inline]
+            fn get_format(&self) -> Self::Format {
+                <$format_type>::default()
+            }
+        }
+
+        impl $crate::ToSerialized<$value_type> for $repr_type {
+            #[inline]
+            fn serialize(
+                &self,
+                value: &$value_type,
+            ) -> Result<$serialized_value, Self::SerializeError> {
+                use $crate::Format;
+                use $crate::Representation;
+                Self::get_format(self).to_vec(value).map(Into::into)
+            }
+        }
+
+        impl $crate::FromSerialized<$value_type> for $repr_type {
+            #[inline]
+            fn deserialize(&self, repr: &[u8]) -> Result<$value_type, Self::DeserializeError> {
+                use $crate::Format;
+                use $crate::Representation;
+                Self::get_format(self).from_slice(repr)
+            }
+        }
+
+        impl $crate::ToWriter<$value_type> for $repr_type {
+            #[inline]
+            fn to_writer<W: std::io::Write>(
+                &self,
+                value: &$value_type,
+                writer: &mut W,
+            ) -> Result<(), Self::WriteError> {
+                use $crate::Format;
+                use $crate::Representation;
+                Self::get_format(self).to_writer(value, writer)
+            }
+        }
+    };
+}
+
\ No newline at end of file diff --git a/src/air_interpreter_sede/rmp_serde.rs.html b/src/air_interpreter_sede/rmp_serde.rs.html new file mode 100644 index 00000000..7c665311 --- /dev/null +++ b/src/air_interpreter_sede/rmp_serde.rs.html @@ -0,0 +1,205 @@ +rmp_serde.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use crate::format::BorrowFormat;
+use crate::multiformat::SerializationCodec;
+use crate::Format;
+
+// https://github.com/multiformats/multicodec/blob/master/table.csv
+const MULTIFORMAT_MSGPCK: SerializationCodec = 0x0201;
+
+// rmp_serde has config with human-readable representation too, but I'm not sure it worth it
+#[derive(Copy, Clone, Default)]
+pub struct RmpSerdeFormat;
+
+impl<Value> Format<Value> for RmpSerdeFormat
+where
+    Value: serde::Serialize + serde::de::DeserializeOwned,
+{
+    type SerializationError = rmp_serde::encode::Error;
+    type DeserializationError = rmp_serde::decode::Error;
+    type WriteError = rmp_serde::encode::Error;
+
+    #[inline]
+    fn to_vec(&self, val: &Value) -> Result<Vec<u8>, Self::SerializationError> {
+        // named representation (i.e. structs are serialized as maps, not tuples) is important
+        // for JS interop and data compatibility detection
+        rmp_serde::to_vec_named(val)
+    }
+
+    #[inline]
+    fn from_slice(&self, slice: &[u8]) -> Result<Value, Self::DeserializationError> {
+        rmp_serde::from_slice(slice)
+    }
+
+    #[inline]
+    fn to_writer<W: std::io::Write>(
+        &self,
+        value: &Value,
+        write: &mut W,
+    ) -> Result<(), Self::WriteError> {
+        // named representation (i.e. structs are serialized as maps, not tuples) is important
+        // for JS interop and data compatibility detection
+        rmp_serde::encode::write_named(write, value)
+    }
+}
+
+impl<'data, Value: 'data> BorrowFormat<'data, Value> for RmpSerdeFormat
+where
+    Value: serde::Serialize + for<'de> serde::Deserialize<'de>,
+{
+    #[inline]
+    fn borrow_from_slice(&self, slice: &'data [u8]) -> Result<Value, Self::DeserializationError> {
+        rmp_serde::from_slice(slice)
+    }
+}
+
+#[derive(Copy, Clone, Default)]
+pub struct RmpSerdeMultiformat;
+
+impl<Value> Format<Value> for RmpSerdeMultiformat
+where
+    Value: serde::Serialize + serde::de::DeserializeOwned,
+{
+    type SerializationError = crate::multiformat::EncodeError<rmp_serde::encode::Error>;
+    type DeserializationError = crate::multiformat::DecodeError<rmp_serde::decode::Error>;
+    type WriteError = crate::multiformat::EncodeError<rmp_serde::encode::Error>;
+
+    #[inline]
+    fn to_vec(&self, value: &Value) -> Result<Vec<u8>, Self::SerializationError> {
+        crate::multiformat::encode_multiformat(value, MULTIFORMAT_MSGPCK, &RmpSerdeFormat)
+    }
+
+    #[inline]
+    fn from_slice(&self, slice: &[u8]) -> Result<Value, Self::DeserializationError> {
+        crate::multiformat::decode_multiformat(slice, MULTIFORMAT_MSGPCK, &RmpSerdeFormat)
+    }
+
+    #[inline]
+    fn to_writer<W: std::io::Write>(
+        &self,
+        value: &Value,
+        write: &mut W,
+    ) -> Result<(), Self::WriteError> {
+        crate::multiformat::write_multiformat(value, MULTIFORMAT_MSGPCK, &RmpSerdeFormat, write)
+    }
+}
+
\ No newline at end of file diff --git a/src/air_interpreter_sede/serialized_type.rs.html b/src/air_interpreter_sede/serialized_type.rs.html new file mode 100644 index 00000000..2b437c37 --- /dev/null +++ b/src/air_interpreter_sede/serialized_type.rs.html @@ -0,0 +1,209 @@ +serialized_type.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#[macro_export]
+macro_rules! derive_serialized_type {
+    ($type_name:ident) => {
+        #[derive(
+            ::core::fmt::Debug,
+            ::core::default::Default,
+            ::serde::Serialize,
+            ::serde::Deserialize,
+            ::core::cmp::PartialEq,
+            ::core::cmp::Eq,
+            ::core::hash::Hash,
+            ::core::clone::Clone,
+        )]
+        #[serde(transparent)]
+        #[repr(transparent)]
+        #[cfg_attr(
+            any(feature = "marine", feature = "marine-abi"),
+            ::marine_rs_sdk::marine
+        )]
+        pub struct $type_name {
+            // it cannot be implemented as a tuple as marine doesn't support tuple structs
+            #[serde(with = "serde_bytes")]
+            value: ::std::vec::Vec<u8>,
+        }
+
+        impl ::core::convert::From<::std::vec::Vec<u8>> for $type_name {
+            #[inline]
+            fn from(value: ::std::vec::Vec<u8>) -> Self {
+                Self { value }
+            }
+        }
+
+        impl ::core::convert::From<$type_name> for ::std::vec::Vec<u8> {
+            #[inline]
+            fn from(value: $type_name) -> Self {
+                value.value
+            }
+        }
+
+        impl ::core::ops::Deref for $type_name {
+            type Target = [u8];
+
+            #[inline]
+            fn deref(&self) -> &Self::Target {
+                &self.value
+            }
+        }
+    };
+
+    ($type_name:ident, $decl:meta) => {
+        #[derive(
+            ::core::fmt::Debug,
+            ::core::default::Default,
+            ::serde::Serialize,
+            ::serde::Deserialize,
+            ::core::cmp::PartialEq,
+            ::core::cmp::Eq,
+            ::core::hash::Hash,
+            ::core::clone::Clone,
+        )]
+        #[serde(transparent)]
+        #[repr(transparent)]
+        #[$decl]
+        pub struct $type_name {
+            // it cannot be implemented as a tuple as marine doesn't support tuple structs
+            value: ::std::vec::Vec<u8>,
+        }
+
+        impl ::core::convert::From<::std::vec::Vec<u8>> for $type_name {
+            #[inline]
+            fn from(value: ::std::vec::Vec<u8>) -> Self {
+                Self { value }
+            }
+        }
+
+        impl ::core::ops::Deref for $type_name {
+            type Target = [u8];
+
+            #[inline]
+            fn deref(&self) -> &Self::Target {
+                &self.value
+            }
+        }
+    };
+}
+
\ No newline at end of file diff --git a/src/air_interpreter_server/ast.rs.html b/src/air_interpreter_server/ast.rs.html new file mode 100644 index 00000000..f126dc44 --- /dev/null +++ b/src/air_interpreter_server/ast.rs.html @@ -0,0 +1,67 @@ +ast.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use air::parser::parse;
+
+/// Parse AIR script and return it as minified JSON
+pub fn ast(script: String) -> String {
+    let do_parse = || -> std::result::Result<_, Box<dyn std::error::Error>> {
+        let ast = parse(&script)?;
+        serde_json::to_string(&ast).map_err(Into::into)
+    };
+
+    match do_parse() {
+        Ok(json) => json,
+        Err(err) => err.to_string(),
+    }
+}
+
\ No newline at end of file diff --git a/src/air_interpreter_server/logger.rs.html b/src/air_interpreter_server/logger.rs.html new file mode 100644 index 00000000..b8fc39ba --- /dev/null +++ b/src/air_interpreter_server/logger.rs.html @@ -0,0 +1,81 @@ +logger.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use air_log_targets::TARGET_MAP;
+
+use log::LevelFilter;
+
+pub fn init_logger(default_level: Option<LevelFilter>) {
+    let target_map = TARGET_MAP.iter().cloned().collect();
+    let builder = marine_rs_sdk::WasmLoggerBuilder::new().with_target_map(target_map);
+
+    let builder = if let Some(default_level) = default_level {
+        builder.with_log_level(default_level)
+    } else {
+        builder
+    };
+
+    builder.build().unwrap();
+}
+
+#[allow(dead_code)]
+pub fn json_output_mode(trace_mode: u8) -> bool {
+    trace_mode == 0
+}
+
\ No newline at end of file diff --git a/src/air_interpreter_server/marine.rs.html b/src/air_interpreter_server/marine.rs.html new file mode 100644 index 00000000..75b33299 --- /dev/null +++ b/src/air_interpreter_server/marine.rs.html @@ -0,0 +1,205 @@ +marine.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#![allow(improper_ctypes)]
+#![warn(rust_2018_idioms)]
+#![deny(
+    dead_code,
+    nonstandard_style,
+    unused_imports,
+    unused_mut,
+    unused_variables,
+    unused_unsafe,
+    unreachable_patterns
+)]
+
+mod ast;
+mod logger;
+
+use air::execute_air;
+use air::InterpreterOutcome;
+use air::RunParameters;
+use marine_rs_sdk::marine;
+use marine_rs_sdk::module_manifest;
+
+module_manifest!();
+
+pub fn main() {
+    logger::init_logger(None);
+}
+
+#[marine]
+pub fn invoke(
+    air: String,
+    prev_data: Vec<u8>,
+    data: Vec<u8>,
+    params: RunParameters,
+    call_results: Vec<u8>,
+) -> InterpreterOutcome {
+    execute_air(air, prev_data, data, params, call_results.into())
+}
+
+#[allow(clippy::too_many_arguments)]
+#[marine]
+pub fn invoke_tracing(
+    air: String,
+    prev_data: Vec<u8>,
+    data: Vec<u8>,
+    params: RunParameters,
+    call_results: Vec<u8>,
+    tracing_params: String,
+    tracing_output_mode: u8,
+) -> InterpreterOutcome {
+    use tracing::Dispatch;
+    use tracing_subscriber::fmt::format::FmtSpan;
+
+    let builder = tracing_subscriber::fmt()
+        .with_env_filter(tracing_params)
+        .with_span_events(FmtSpan::ENTER | FmtSpan::CLOSE)
+        .with_writer(std::io::stderr);
+
+    let dispatch = if logger::json_output_mode(tracing_output_mode) {
+        let subscriber = builder.json().finish();
+        Dispatch::new(subscriber)
+    } else {
+        // Human-readable output.
+        let subscriber = builder.finish();
+        Dispatch::new(subscriber)
+    };
+    tracing::dispatcher::with_default(&dispatch, || {
+        execute_air(air, prev_data, data, params, call_results.into())
+    })
+}
+
+#[marine]
+pub fn ast(script: String) -> String {
+    ast::ast(script)
+}
+
+/// Like ast, this function is intended to be run localy by tools.
+#[marine]
+pub fn to_human_readable_data(data: Vec<u8>) -> String {
+    match air::to_human_readable_data(data) {
+        Ok(text) => text,
+        Err(err) => err.to_string(),
+    }
+}
+
\ No newline at end of file diff --git a/src/air_interpreter_signatures/lib.rs.html b/src/air_interpreter_signatures/lib.rs.html new file mode 100644 index 00000000..e35b3452 --- /dev/null +++ b/src/air_interpreter_signatures/lib.rs.html @@ -0,0 +1,469 @@ +lib.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#![forbid(unsafe_code)]
+#![warn(rust_2018_idioms)]
+#![deny(
+    dead_code,
+    nonstandard_style,
+    unused_imports,
+    unused_mut,
+    unused_variables,
+    unused_unsafe,
+    unreachable_patterns
+)]
+
+mod sede;
+mod stores;
+mod trackers;
+
+pub use crate::stores::*;
+pub use crate::trackers::*;
+
+pub use fluence_keypair::KeyFormat;
+
+use borsh::BorshSerialize;
+use fluence_keypair::error::DecodingError;
+use fluence_keypair::error::SigningError;
+use serde::{Deserialize, Serialize};
+
+use std::hash::Hash;
+
+#[derive(Debug, thiserror::Error)]
+pub enum KeyError {
+    #[error("signature algorithm {0:?} not whitelisted")]
+    AlgorithmNotWhitelisted(fluence_keypair::KeyFormat),
+    #[error("invalid key data: {0}")]
+    InvalidKeyData(#[from] DecodingError),
+}
+
+#[derive(Debug, thiserror::Error)]
+pub enum VerificationError {
+    #[error("incorrect key: {0}")]
+    InvalidKey(DecodingError),
+    #[error("incorrect signature: {0}")]
+    InvalidSignature(DecodingError),
+    #[error(transparent)]
+    Verification(#[from] fluence_keypair::error::VerificationError),
+}
+
+/// An opaque serializable representation of a public key.
+///
+/// It can be a string or a binary, you shouldn't care about it unless you change serialization format.
+// surrent implementation serializes to string as it is used as a key in a JSON map
+#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize, Hash)]
+#[cfg_attr(
+    feature = "rkyv",
+    derive(::rkyv::Archive, ::rkyv::Serialize, ::rkyv::Deserialize)
+)]
+#[cfg_attr(feature = "rkyv", archive_attr(derive(PartialEq, Eq, Hash)))]
+#[cfg_attr(feature = "rkyv", archive(check_bytes))]
+pub struct PublicKey(
+    #[serde(
+        deserialize_with = "sede::b58_to_public_key",
+        serialize_with = "sede::public_key_to_b58"
+    )]
+    Box<[u8]>,
+);
+
+impl PublicKey {
+    pub fn new(inner: fluence_keypair::PublicKey) -> Self {
+        Self(inner.encode().into())
+    }
+
+    pub fn verify<T: BorshSerialize + ?Sized>(
+        &self,
+        value: &T,
+        salt: &str,
+        signature: &Signature,
+    ) -> Result<(), VerificationError> {
+        let pk =
+            fluence_keypair::PublicKey::decode(&self.0).map_err(VerificationError::InvalidKey)?;
+        let signature = fluence_keypair::Signature::decode(signature.0.to_vec())
+            .map_err(VerificationError::InvalidSignature)?;
+
+        let serialized_value = SaltedData::new(&value, salt).serialize();
+        Ok(pk.verify(&serialized_value, &signature)?)
+    }
+
+    pub fn to_peer_id(&self) -> Result<String, KeyError> {
+        // TODO cache the public key, or verify key format in Rkyv verification/deserialization
+        let pk = fluence_keypair::PublicKey::decode(&self.0)?;
+        Ok(pk.to_peer_id().to_string())
+    }
+
+    pub fn validate(&self) -> Result<(), KeyError> {
+        let pk = fluence_keypair::PublicKey::decode(&self.0)?;
+        let key_format = pk.get_key_format();
+        validate_with_key_format((), key_format)
+    }
+}
+
+impl ToString for PublicKey {
+    fn to_string(&self) -> String {
+        bs58::encode(self.0.as_ref()).into_string()
+    }
+}
+
+#[derive(Clone)]
+pub struct KeyPair(fluence_keypair::KeyPair);
+
+impl KeyPair {
+    pub fn new(inner: fluence_keypair::KeyPair) -> Result<Self, KeyError> {
+        let key_format = inner.key_format();
+        validate_with_key_format((), key_format)?;
+
+        Ok(Self(inner))
+    }
+
+    pub fn from_secret_key(secret_key: Vec<u8>, key_format: KeyFormat) -> Result<Self, KeyError> {
+        let inner = fluence_keypair::KeyPair::from_secret_key(secret_key, key_format)?;
+        Self::new(inner)
+    }
+
+    pub fn public(&self) -> PublicKey {
+        PublicKey::new(self.0.public())
+    }
+
+    pub fn key_format(&self) -> KeyFormat {
+        self.0.key_format()
+    }
+
+    pub fn sign(&self, msg: &[u8]) -> Result<Signature, SigningError> {
+        self.0.sign(msg).map(Signature::new)
+    }
+
+    pub fn secret(&self) -> Vec<u8> {
+        self.0.secret().expect("cannot fail on supported formats")
+    }
+
+    pub fn into_inner(self) -> fluence_keypair::KeyPair {
+        self.0
+    }
+
+    pub fn as_inner(&self) -> &fluence_keypair::KeyPair {
+        &self.0
+    }
+}
+
+impl TryFrom<fluence_keypair::KeyPair> for KeyPair {
+    type Error = KeyError;
+
+    fn try_from(value: fluence_keypair::KeyPair) -> Result<Self, Self::Error> {
+        Self::new(value)
+    }
+}
+
+impl From<KeyPair> for fluence_keypair::KeyPair {
+    fn from(value: KeyPair) -> Self {
+        value.0
+    }
+}
+
+pub(crate) fn validate_with_key_format<V>(inner: V, key_format: KeyFormat) -> Result<V, KeyError> {
+    // this allow is needed in order to support old versions of the fluence_keypair
+    // repos which is used to build it for RISC-0
+    #[allow(unreachable_patterns)]
+    match key_format {
+        fluence_keypair::KeyFormat::Ed25519 => Ok(inner),
+        _ => Err(KeyError::AlgorithmNotWhitelisted(key_format)),
+    }
+}
+
+/// An opaque serializable representation of signature key.
+///
+/// It can be string or binary, you shouldn't care about it unless you change serialization format.
+// surrent implementation serializes string as more compact in JSON representation than number array
+#[derive(Debug, Clone, Eq, PartialEq, Deserialize, Serialize)]
+#[serde(transparent)]
+#[cfg_attr(
+    feature = "rkyv",
+    derive(::rkyv::Archive, ::rkyv::Serialize, ::rkyv::Deserialize)
+)]
+#[cfg_attr(feature = "rkyv", archive(check_bytes))]
+pub struct Signature(
+    #[serde(
+        deserialize_with = "sede::b58_to_signature",
+        serialize_with = "sede::signature_to_b58"
+    )]
+    Box<[u8]>,
+);
+
+impl Signature {
+    fn new(signature: fluence_keypair::Signature) -> Self {
+        Self(signature.encode().into())
+    }
+}
+
+impl From<fluence_keypair::Signature> for Signature {
+    fn from(value: fluence_keypair::Signature) -> Self {
+        Self(value.encode().into())
+    }
+}
+
+#[derive(BorshSerialize)]
+pub(crate) struct SaltedData<'ctx, Data: BorshSerialize>(&'ctx Data, &'ctx str);
+
+impl<'ctx, Data: BorshSerialize> SaltedData<'ctx, Data> {
+    pub(crate) fn new(data: &'ctx Data, salt: &'ctx str) -> Self {
+        Self(data, salt)
+    }
+
+    pub(crate) fn serialize(&self) -> Vec<u8> {
+        // TODO make pluggable serialization
+        // TODO it will be useful for CID too
+        // TODO please note that using serde::Serializer is not enough
+        borsh::to_vec(&self).expect("borsh serializer shouldn't fail")
+    }
+}
+
\ No newline at end of file diff --git a/src/air_interpreter_signatures/sede.rs.html b/src/air_interpreter_signatures/sede.rs.html new file mode 100644 index 00000000..358f5bb9 --- /dev/null +++ b/src/air_interpreter_signatures/sede.rs.html @@ -0,0 +1,181 @@ +sede.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+pub(crate) fn public_key_to_b58<S: serde::Serializer>(
+    key: &[u8],
+    serializer: S,
+) -> Result<S::Ok, S::Error> {
+    serializer.serialize_str(&bs58::encode(key).into_string())
+}
+
+pub(crate) fn b58_to_public_key<'de, D: serde::Deserializer<'de>>(
+    deserializer: D,
+) -> Result<Box<[u8]>, D::Error> {
+    deserializer.deserialize_str(PublicKeyVisitor)
+}
+
+/// Visitor who tries to decode base58-encoded string to a fluence_keypair::PublicKey.
+struct PublicKeyVisitor;
+
+impl serde::de::Visitor<'_> for PublicKeyVisitor {
+    type Value = Box<[u8]>;
+
+    fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        formatter.write_str("a base58-encoded public key string")
+    }
+
+    fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
+    where
+        E: serde::de::Error,
+    {
+        use serde::de;
+
+        bs58::decode(v)
+            .into_vec()
+            .map(Into::into)
+            .map_err(|_| de::Error::invalid_value(de::Unexpected::Str(v), &self))
+    }
+}
+
+pub(crate) fn signature_to_b58<S: serde::Serializer>(
+    signature: &[u8],
+    serializer: S,
+) -> Result<S::Ok, S::Error> {
+    serializer.serialize_str(&bs58::encode(signature).into_string())
+}
+
+pub(crate) fn b58_to_signature<'de, D: serde::Deserializer<'de>>(
+    deserializer: D,
+) -> Result<Box<[u8]>, D::Error> {
+    deserializer.deserialize_str(SignatureVisitor)
+}
+
+/// Visitor who tries to decode base58-encoded string to a fluence_keypair::Signature.
+struct SignatureVisitor;
+
+impl serde::de::Visitor<'_> for SignatureVisitor {
+    type Value = Box<[u8]>;
+
+    fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        formatter.write_str("expecting a base58-encoded signature string")
+    }
+
+    fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
+    where
+        E: serde::de::Error,
+    {
+        use serde::de;
+
+        bs58::decode(v)
+            .into_vec()
+            .map(Into::into)
+            .map_err(|_| de::Error::invalid_value(de::Unexpected::Str(v), &self))
+    }
+}
+
\ No newline at end of file diff --git a/src/air_interpreter_signatures/stores.rs.html b/src/air_interpreter_signatures/stores.rs.html new file mode 100644 index 00000000..677521fc --- /dev/null +++ b/src/air_interpreter_signatures/stores.rs.html @@ -0,0 +1,149 @@ +stores.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use crate::PublicKey;
+use crate::Signature;
+
+use serde::{Deserialize, Serialize};
+
+use std::borrow::Borrow;
+use std::collections::HashMap;
+use std::hash::Hash;
+
+/// A dictionary-like structure that stores peer public keys and their particle data signatures.
+#[derive(Clone, Debug, Serialize, Deserialize)]
+#[cfg_attr(
+    feature = "rkyv",
+    derive(::rkyv::Archive, ::rkyv::Serialize, ::rkyv::Deserialize)
+)]
+#[cfg_attr(feature = "rkyv", archive(check_bytes))]
+pub struct SignatureStore<Key: Hash + Eq = PublicKey, Sign = Signature>(
+    #[cfg_attr(feature = "rkyv", with(::rkyv::with::AsVec))] HashMap<Key, Sign>,
+);
+
+impl<Key: Hash + Eq, Sign> SignatureStore<Key, Sign> {
+    pub fn new() -> Self {
+        Default::default()
+    }
+
+    pub fn is_empty(&self) -> bool {
+        self.0.is_empty()
+    }
+
+    pub fn len(&self) -> usize {
+        self.0.len()
+    }
+
+    pub fn get<Q>(&self, peer_pk: &Q) -> Option<&Sign>
+    where
+        Key: Borrow<Q>,
+        Q: Hash + Eq + ?Sized,
+    {
+        self.0.get(peer_pk)
+    }
+
+    pub fn put(&mut self, peer_pk: Key, signature: Sign) {
+        self.0.insert(peer_pk, signature);
+    }
+
+    pub fn iter(&self) -> <&HashMap<Key, Sign> as IntoIterator>::IntoIter {
+        self.0.iter()
+    }
+}
+
+impl<Key: Hash + Eq, Sign> Default for SignatureStore<Key, Sign> {
+    fn default() -> Self {
+        Self(Default::default())
+    }
+}
+
\ No newline at end of file diff --git a/src/air_interpreter_signatures/trackers.rs.html b/src/air_interpreter_signatures/trackers.rs.html new file mode 100644 index 00000000..6b03e0e2 --- /dev/null +++ b/src/air_interpreter_signatures/trackers.rs.html @@ -0,0 +1,135 @@ +trackers.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use crate::KeyPair;
+use crate::SaltedData;
+
+use air_interpreter_cid::{CidRef, CID};
+use fluence_keypair::error::SigningError;
+
+use std::rc::Rc;
+
+/// The tracker that collect current peer's CIDs only.
+#[derive(Debug)]
+pub struct PeerCidTracker {
+    current_peer_id: Rc<String>,
+    cids: Vec<Rc<CidRef>>,
+}
+
+impl PeerCidTracker {
+    pub fn new(current_peer_id: impl Into<Rc<String>>) -> Self {
+        Self {
+            current_peer_id: current_peer_id.into(),
+            cids: vec![],
+        }
+    }
+
+    pub fn register<T>(&mut self, peer: &str, cid: &CID<T>) {
+        if peer == *self.current_peer_id {
+            self.cids.push(cid.get_inner())
+        }
+    }
+
+    pub fn gen_signature(
+        &self,
+        salt: &str,
+        keypair: &KeyPair,
+    ) -> Result<crate::Signature, SigningError> {
+        sign_cids(self.cids.clone(), salt, &keypair.0).map(Into::into)
+    }
+}
+
+pub fn sign_cids(
+    mut cids: Vec<Rc<CidRef>>,
+    salt: &str,
+    keypair: &fluence_keypair::KeyPair,
+) -> Result<fluence_keypair::Signature, SigningError> {
+    cids.sort_unstable();
+
+    let serialized_cids = SaltedData::new(&cids, salt).serialize();
+    keypair.sign(&serialized_cids)
+}
+
\ No newline at end of file diff --git a/src/air_interpreter_value/lib.rs.html b/src/air_interpreter_value/lib.rs.html new file mode 100644 index 00000000..bd338894 --- /dev/null +++ b/src/air_interpreter_value/lib.rs.html @@ -0,0 +1,153 @@ +lib.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+/*
+* This file is based on serde_json crate licensed under conditions
+* of MIT License.
+* Copyright (C) 2023 by Erick Tryzelaar and David Tolnay
+
+* Permission is hereby granted, free of charge, to any
+* person obtaining a copy of this software and associated
+* documentation files (the "Software"), to deal in the
+* Software without restriction, including without
+* limitation the rights to use, copy, modify, merge,
+* publish, distribute, sublicense, and/or sell copies of
+* the Software, and to permit persons to whom the Software
+* is furnished to do so, subject to the following
+* conditions:
+*
+* The above copyright notice and this permission notice
+* shall be included in all copies or substantial portions
+* of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
+* ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+* TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+* SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+* IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+* DEALINGS IN THE SOFTWARE.
+*/
+
+#[cfg(not(feature = "preserve_order"))]
+use std::collections::BTreeMap;
+use std::rc::Rc;
+
+// We only use our own error type; no need for From conversions provided by the
+// standard library's try! macro. This reduces lines of LLVM IR by 4%.
+macro_rules! tri {
+    ($e:expr $(,)?) => {
+        match $e {
+            core::result::Result::Ok(val) => val,
+            core::result::Result::Err(err) => return core::result::Result::Err(err),
+        }
+    };
+}
+
+mod value;
+
+pub use value::JValue;
+
+#[cfg(not(feature = "preserve_order"))]
+pub type Map<K, V> = BTreeMap<K, V>;
+
+#[cfg(feature = "preserve_order")]
+pub type Map<K, V> = indexmap::IndexMap<K, V>;
+
+// it is memory- and CPU-wise more effective than a string
+pub type JsonString = Rc<str>;
+
\ No newline at end of file diff --git a/src/air_interpreter_value/value/de.rs.html b/src/air_interpreter_value/value/de.rs.html new file mode 100644 index 00000000..5b9849ea --- /dev/null +++ b/src/air_interpreter_value/value/de.rs.html @@ -0,0 +1,371 @@ +de.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+/*
+* This file is based on serde_json crate licensed under conditions
+* of MIT License.
+* Copyright (C) 2023 by Erick Tryzelaar and David Tolnay
+
+* Permission is hereby granted, free of charge, to any
+* person obtaining a copy of this software and associated
+* documentation files (the "Software"), to deal in the
+* Software without restriction, including without
+* limitation the rights to use, copy, modify, merge,
+* publish, distribute, sublicense, and/or sell copies of
+* the Software, and to permit persons to whom the Software
+* is furnished to do so, subject to the following
+* conditions:
+*
+* The above copyright notice and this permission notice
+* shall be included in all copies or substantial portions
+* of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
+* ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+* TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+* SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+* IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+* DEALINGS IN THE SOFTWARE.
+*/
+
+use crate::value::JValue;
+use crate::{JsonString, Map};
+use core::fmt;
+use serde::de::{self, Deserialize, DeserializeSeed, MapAccess, SeqAccess, Visitor};
+use serde_json::Number;
+use std::vec::Vec;
+
+impl<'de> Deserialize<'de> for JValue {
+    #[inline]
+    fn deserialize<D>(deserializer: D) -> Result<JValue, D::Error>
+    where
+        D: serde::Deserializer<'de>,
+    {
+        struct ValueVisitor;
+
+        impl<'de> Visitor<'de> for ValueVisitor {
+            type Value = JValue;
+
+            fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
+                formatter.write_str("any valid JSON value")
+            }
+
+            #[inline]
+            fn visit_bool<E>(self, value: bool) -> Result<JValue, E> {
+                Ok(JValue::Bool(value))
+            }
+
+            #[inline]
+            fn visit_i64<E>(self, value: i64) -> Result<JValue, E> {
+                Ok(JValue::Number(value.into()))
+            }
+
+            #[inline]
+            fn visit_u64<E>(self, value: u64) -> Result<JValue, E> {
+                Ok(JValue::Number(value.into()))
+            }
+
+            #[inline]
+            fn visit_f64<E>(self, value: f64) -> Result<JValue, E> {
+                Ok(Number::from_f64(value).map_or(JValue::Null, JValue::Number))
+            }
+
+            fn visit_str<E>(self, value: &str) -> Result<JValue, E>
+            where
+                E: serde::de::Error,
+            {
+                Ok(JValue::String(value.into()))
+            }
+
+            #[inline]
+            fn visit_none<E>(self) -> Result<JValue, E> {
+                Ok(JValue::Null)
+            }
+
+            #[inline]
+            fn visit_some<D>(self, deserializer: D) -> Result<JValue, D::Error>
+            where
+                D: serde::Deserializer<'de>,
+            {
+                Deserialize::deserialize(deserializer)
+            }
+
+            #[inline]
+            fn visit_unit<E>(self) -> Result<JValue, E> {
+                Ok(JValue::Null)
+            }
+
+            #[inline]
+            fn visit_seq<V>(self, mut visitor: V) -> Result<JValue, V::Error>
+            where
+                V: SeqAccess<'de>,
+            {
+                let mut vec = Vec::new();
+
+                while let Some(elem) = tri!(visitor.next_element()) {
+                    vec.push(elem);
+                }
+
+                Ok(JValue::Array(vec.into()))
+            }
+
+            fn visit_map<V>(self, mut visitor: V) -> Result<JValue, V::Error>
+            where
+                V: MapAccess<'de>,
+            {
+                match tri!(visitor.next_key_seed(KeyClassifier)) {
+                    Some(KeyClass::Map(first_key)) => {
+                        let mut values = Map::<JsonString, JValue>::new();
+
+                        values.insert(first_key, tri!(visitor.next_value()));
+                        while let Some((key, value)) = tri!(visitor.next_entry::<JsonString, _>()) {
+                            values.insert(key, value);
+                        }
+
+                        Ok(JValue::Object(values.into()))
+                    }
+                    None => Ok(JValue::Object(Map::new().into())),
+                }
+            }
+        }
+
+        deserializer.deserialize_any(ValueVisitor)
+    }
+}
+
+struct KeyClassifier;
+
+enum KeyClass {
+    Map(JsonString),
+}
+
+impl<'de> DeserializeSeed<'de> for KeyClassifier {
+    type Value = KeyClass;
+
+    fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
+    where
+        D: serde::Deserializer<'de>,
+    {
+        deserializer.deserialize_str(self)
+    }
+}
+
+impl<'de> Visitor<'de> for KeyClassifier {
+    type Value = KeyClass;
+
+    fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
+        formatter.write_str("a string key")
+    }
+
+    fn visit_str<E>(self, s: &str) -> Result<Self::Value, E>
+    where
+        E: de::Error,
+    {
+        Ok(KeyClass::Map(s.into()))
+    }
+}
+
\ No newline at end of file diff --git a/src/air_interpreter_value/value/from.rs.html b/src/air_interpreter_value/value/from.rs.html new file mode 100644 index 00000000..5febed1c --- /dev/null +++ b/src/air_interpreter_value/value/from.rs.html @@ -0,0 +1,771 @@ +from.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
+334
+335
+336
+337
+338
+339
+340
+341
+342
+343
+344
+345
+346
+347
+348
+349
+350
+351
+352
+353
+354
+355
+356
+357
+358
+359
+360
+361
+362
+363
+364
+365
+366
+367
+368
+369
+370
+371
+372
+373
+374
+375
+376
+377
+378
+379
+380
+381
+382
+383
+384
+385
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+/*
+* This file is based on serde_json crate licensed under conditions
+* of MIT License.
+* Copyright (C) 2023 by Erick Tryzelaar and David Tolnay
+
+* Permission is hereby granted, free of charge, to any
+* person obtaining a copy of this software and associated
+* documentation files (the "Software"), to deal in the
+* Software without restriction, including without
+* limitation the rights to use, copy, modify, merge,
+* publish, distribute, sublicense, and/or sell copies of
+* the Software, and to permit persons to whom the Software
+* is furnished to do so, subject to the following
+* conditions:
+*
+* The above copyright notice and this permission notice
+* shall be included in all copies or substantial portions
+* of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
+* ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+* TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+* SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+* IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+* DEALINGS IN THE SOFTWARE.
+*/
+
+use super::JValue;
+use crate::{JsonString, Map};
+use serde_json::Number;
+use std::borrow::Cow;
+use std::collections::HashMap;
+use std::rc::Rc;
+use std::string::String;
+use std::vec::Vec;
+
+macro_rules! from_integer {
+    ($($ty:ident)*) => {
+        $(
+            impl From<$ty> for JValue {
+                fn from(n: $ty) -> Self {
+                    JValue::Number(n.into())
+                }
+            }
+        )*
+    };
+}
+
+from_integer! {
+    i8 i16 i32 i64 isize
+    u8 u16 u32 u64 usize
+}
+
+impl From<f32> for JValue {
+    /// Convert 32-bit floating point number to `JValue::Number`, or
+    /// `JValue::Null` if infinite or NaN.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use air_interpreter_value::JValue;
+    ///
+    /// let f: f32 = 13.37;
+    /// let x: JValue = f.into();
+    /// ```
+    fn from(f: f32) -> Self {
+        Number::from_f64(f as _).map_or(JValue::Null, JValue::Number)
+    }
+}
+
+impl From<f64> for JValue {
+    /// Convert 64-bit floating point number to `JValue::Number`, or
+    /// `JValue::Null` if infinite or NaN.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use air_interpreter_value::JValue;
+    ///
+    /// let f: f64 = 13.37;
+    /// let x: JValue = f.into();
+    /// ```
+    fn from(f: f64) -> Self {
+        Number::from_f64(f).map_or(JValue::Null, JValue::Number)
+    }
+}
+
+impl From<bool> for JValue {
+    /// Convert boolean to `JValue::Bool`.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use air_interpreter_value::JValue;
+    ///
+    /// let b = false;
+    /// let x: JValue = b.into();
+    /// ```
+    fn from(f: bool) -> Self {
+        JValue::Bool(f)
+    }
+}
+
+impl From<String> for JValue {
+    /// Convert `String` to `JValue::String`.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use air_interpreter_value::JValue;
+    ///
+    /// let s: String = "lorem".to_string();
+    /// let x: JValue = s.into();
+    /// ```
+    fn from(f: String) -> Self {
+        JValue::String(f.into())
+    }
+}
+
+impl From<JsonString> for JValue {
+    /// Convert `JsonString` to `JValue::String`.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use air_interpreter_value::JValue;
+    ///
+    /// let s: String = "lorem".to_string();
+    /// let x: JValue = s.into();
+    /// ```
+    fn from(f: JsonString) -> Self {
+        JValue::String(f)
+    }
+}
+
+impl From<&str> for JValue {
+    /// Convert string slice to `JValue::String`.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use air_interpreter_value::JValue;
+    ///
+    /// let s: &str = "lorem";
+    /// let x: JValue = s.into();
+    /// ```
+    fn from(f: &str) -> Self {
+        JValue::String(f.into())
+    }
+}
+
+impl<'a> From<Cow<'a, str>> for JValue {
+    /// Convert copy-on-write string to `JValue::String`.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use air_interpreter_value::JValue;
+    /// use std::borrow::Cow;
+    ///
+    /// let s: Cow<str> = Cow::Borrowed("lorem");
+    /// let x: JValue = s.into();
+    /// ```
+    ///
+    /// ```
+    /// use air_interpreter_value::JValue;
+    /// use std::borrow::Cow;
+    ///
+    /// let s: Cow<str> = Cow::Owned("lorem".to_string());
+    /// let x: JValue = s.into();
+    /// ```
+    fn from(f: Cow<'a, str>) -> Self {
+        JValue::String(f.into())
+    }
+}
+
+impl From<Number> for JValue {
+    /// Convert `serde_json::Number` to `JValue::Number`.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use serde_json::Number;
+    /// use air_interpreter_value::JValue;
+    ///
+    /// let n = Number::from(7);
+    /// let x: JValue = n.into();
+    /// ```
+    fn from(f: Number) -> Self {
+        JValue::Number(f)
+    }
+}
+
+impl From<Map<JsonString, JValue>> for JValue {
+    /// Convert map (with string keys) to `JValue::Object`.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use air_interpreter_value::{Map, JValue, JsonString};
+    ///
+    /// let mut m = Map::<JsonString, JValue>::new();
+    /// m.insert("Lorem".into(), "ipsum".into());
+    /// let x: JValue = m.into();
+    /// ```
+    fn from(f: Map<JsonString, JValue>) -> Self {
+        JValue::Object(f.into())
+    }
+}
+
+impl<K: Into<JsonString>, V: Into<JValue>> From<HashMap<K, V>> for JValue {
+    /// Convert map (with string keys) to `JValue::Object`.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use air_interpreter_value::JValue;
+    /// use std::collections::HashMap;
+    ///
+    /// let mut m = HashMap::<&str, &str>::new();
+    /// m.insert("Lorem", "ipsum");
+    /// let x: JValue = m.into();
+    /// ```
+    fn from(f: HashMap<K, V>) -> Self {
+        JValue::object_from_pairs(f)
+    }
+}
+
+impl<T: Into<JValue>> From<Vec<T>> for JValue {
+    /// Convert a `Vec` to `JValue::Array`.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use air_interpreter_value::JValue;
+    ///
+    /// let v = vec!["lorem", "ipsum", "dolor"];
+    /// let x: JValue = v.into();
+    /// ```
+    fn from(f: Vec<T>) -> Self {
+        JValue::Array(f.into_iter().map(Into::into).collect())
+    }
+}
+
+impl<T: Clone + Into<JValue>> From<&[T]> for JValue {
+    /// Convert a slice to `JValue::Array`.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use air_interpreter_value::JValue;
+    ///
+    /// let v: &[&str] = &["lorem", "ipsum", "dolor"];
+    /// let x: JValue = v.into();
+    /// ```
+    fn from(f: &[T]) -> Self {
+        JValue::Array(f.iter().cloned().map(Into::into).collect())
+    }
+}
+
+impl<T: Into<JValue>> FromIterator<T> for JValue {
+    /// Create a `JValue::Array` by collecting an iterator of array elements.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use air_interpreter_value::JValue;
+    ///
+    /// let v = std::iter::repeat(42).take(5);
+    /// let x: JValue = v.collect();
+    /// ```
+    ///
+    /// ```
+    /// use air_interpreter_value::JValue;
+    ///
+    /// let v: Vec<_> = vec!["lorem", "ipsum", "dolor"];
+    /// let x: JValue = v.into_iter().collect();
+    /// ```
+    ///
+    /// ```
+    /// use std::iter::FromIterator;
+    /// use air_interpreter_value::JValue;
+    ///
+    /// let x: JValue = JValue::from_iter(vec!["lorem", "ipsum", "dolor"]);
+    /// ```
+    fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> Self {
+        JValue::Array(iter.into_iter().map(Into::into).collect())
+    }
+}
+
+impl<K: Into<JsonString>, V: Into<JValue>> FromIterator<(K, V)> for JValue {
+    /// Create a `JValue::Object` by collecting an iterator of key-value pairs.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use air_interpreter_value::JValue;
+    ///
+    /// let v: Vec<_> = vec![("lorem", 40), ("ipsum", 2)];
+    /// let x: JValue = v.into_iter().collect();
+    /// ```
+    fn from_iter<I: IntoIterator<Item = (K, V)>>(iter: I) -> Self {
+        JValue::Object(Rc::new(
+            iter.into_iter()
+                .map(|(k, v)| (k.into(), v.into()))
+                .collect(),
+        ))
+    }
+}
+
+impl From<()> for JValue {
+    /// Convert `()` to `JValue::Null`.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use air_interpreter_value::JValue;
+    ///
+    /// let u = ();
+    /// let x: JValue = u.into();
+    /// ```
+    #[inline]
+    fn from((): ()) -> Self {
+        JValue::Null
+    }
+}
+
+impl<T> From<Option<T>> for JValue
+where
+    T: Into<JValue>,
+{
+    fn from(opt: Option<T>) -> Self {
+        match opt {
+            None => JValue::Null,
+            Some(value) => Into::into(value),
+        }
+    }
+}
+
+impl From<&serde_json::Value> for JValue {
+    fn from(value: &serde_json::Value) -> Self {
+        use serde_json::Value;
+
+        match value {
+            Value::Null => JValue::Null,
+            Value::Bool(b) => JValue::Bool(*b),
+            Value::Number(n) => JValue::Number(n.clone()),
+            Value::String(s) => JValue::String(s.as_str().into()),
+            Value::Array(a) => JValue::Array(a.iter().map(Into::into).collect()),
+            Value::Object(o) => {
+                let oo = Map::from_iter(o.into_iter().map(|(k, v)| (k.as_str().into(), v.into())));
+                JValue::Object(oo.into())
+            }
+        }
+    }
+}
+
+impl From<serde_json::Value> for JValue {
+    #[inline]
+    fn from(value: serde_json::Value) -> Self {
+        Self::from(&value)
+    }
+}
+
\ No newline at end of file diff --git a/src/air_interpreter_value/value/index.rs.html b/src/air_interpreter_value/value/index.rs.html new file mode 100644 index 00000000..8c2cf8f6 --- /dev/null +++ b/src/air_interpreter_value/value/index.rs.html @@ -0,0 +1,309 @@ +index.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+/*
+* This file is based on serde_json crate licensed under conditions
+* of MIT License.
+* Copyright (C) 2023 by Erick Tryzelaar and David Tolnay
+
+* Permission is hereby granted, free of charge, to any
+* person obtaining a copy of this software and associated
+* documentation files (the "Software"), to deal in the
+* Software without restriction, including without
+* limitation the rights to use, copy, modify, merge,
+* publish, distribute, sublicense, and/or sell copies of
+* the Software, and to permit persons to whom the Software
+* is furnished to do so, subject to the following
+* conditions:
+*
+* The above copyright notice and this permission notice
+* shall be included in all copies or substantial portions
+* of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
+* ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+* TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+* SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+* IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+* DEALINGS IN THE SOFTWARE.
+*/
+
+use super::JValue;
+use core::ops;
+use std::string::String;
+
+/// A type that can be used to index into a `air_interpreter_value::JValue`.
+///
+/// The [`get`] and [`get_mut`] methods of `JValue` accept any type that
+/// implements `Index`, as does the [square-bracket indexing operator]. This
+/// trait is implemented for strings which are used as the index into a JSON
+/// map, and for `usize` which is used as the index into a JSON array.
+///
+/// [`get`]: ../enum.JValue.html#method.get
+/// [`get_mut`]: ../enum.JValue.html#method.get_mut
+/// [square-bracket indexing operator]: ../enum.JValue.html#impl-Index%3CI%3E
+///
+/// This trait is sealed and cannot be implemented for types outside of
+/// `air_interpreter_value`.
+pub trait Index: private::Sealed {
+    /// Return None if the key is not already in the array or object.
+    #[doc(hidden)]
+    fn index_into<'v>(&self, v: &'v JValue) -> Option<&'v JValue>;
+}
+
+impl Index for usize {
+    fn index_into<'v>(&self, v: &'v JValue) -> Option<&'v JValue> {
+        match v {
+            JValue::Array(vec) => vec.get(*self),
+            _ => None,
+        }
+    }
+}
+
+impl Index for str {
+    fn index_into<'v>(&self, v: &'v JValue) -> Option<&'v JValue> {
+        match v {
+            JValue::Object(map) => map.get(self),
+            _ => None,
+        }
+    }
+}
+
+impl Index for String {
+    fn index_into<'v>(&self, v: &'v JValue) -> Option<&'v JValue> {
+        self[..].index_into(v)
+    }
+}
+
+impl<T> Index for &T
+where
+    T: ?Sized + Index,
+{
+    fn index_into<'v>(&self, v: &'v JValue) -> Option<&'v JValue> {
+        (**self).index_into(v)
+    }
+}
+
+// Prevent users from implementing the Index trait.
+mod private {
+    pub trait Sealed {}
+    impl Sealed for usize {}
+    impl Sealed for str {}
+    impl Sealed for std::string::String {}
+    impl<'a, T> Sealed for &'a T where T: ?Sized + Sealed {}
+}
+
+// The usual semantics of Index is to panic on invalid indexing.
+//
+// That said, the usual semantics are for things like Vec and BTreeMap which
+// have different use cases than JValue. If you are working with a Vec, you know
+// that you are working with a Vec and you can get the len of the Vec and make
+// sure your indices are within bounds. The JValue use cases are more
+// loosey-goosey. You got some JSON from an endpoint and you want to pull values
+// out of it. Outside of this Index impl, you already have the option of using
+// value.as_array() and working with the Vec directly, or matching on
+// JValue::Array and getting the Vec directly. The Index impl means you can skip
+// that and index directly into the thing using a concise syntax. You don't have
+// to check the type, you don't have to check the len, it is all about what you
+// expect the JValue to look like.
+//
+// Basically the use cases that would be well served by panicking here are
+// better served by using one of the other approaches: get and get_mut,
+// as_array, or match. The value of this impl is that it adds a way of working
+// with JValue that is not well served by the existing approaches: concise and
+// careless and sometimes that is exactly what you want.
+impl<I> ops::Index<I> for JValue
+where
+    I: Index,
+{
+    type Output = JValue;
+
+    /// Index into a `air_interpreter_value::JValue` using the syntax `value[0]` or
+    /// `value["k"]`.
+    ///
+    /// Returns `JValue::Null` if the type of `self` does not match the type of
+    /// the index, for example if the index is a string and `self` is an array
+    /// or a number. Also returns `JValue::Null` if the given key does not exist
+    /// in the map or the given index is not within the bounds of the array.
+    ///
+    /// For retrieving deeply nested values, you should have a look at the
+    /// `JValue::pointer` method.
+    fn index(&self, index: I) -> &JValue {
+        const NULL: JValue = JValue::Null;
+        index.index_into(self).unwrap_or(&NULL)
+    }
+}
+
\ No newline at end of file diff --git a/src/air_interpreter_value/value/mod.rs.html b/src/air_interpreter_value/value/mod.rs.html new file mode 100644 index 00000000..75656ebe --- /dev/null +++ b/src/air_interpreter_value/value/mod.rs.html @@ -0,0 +1,867 @@ +mod.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
+334
+335
+336
+337
+338
+339
+340
+341
+342
+343
+344
+345
+346
+347
+348
+349
+350
+351
+352
+353
+354
+355
+356
+357
+358
+359
+360
+361
+362
+363
+364
+365
+366
+367
+368
+369
+370
+371
+372
+373
+374
+375
+376
+377
+378
+379
+380
+381
+382
+383
+384
+385
+386
+387
+388
+389
+390
+391
+392
+393
+394
+395
+396
+397
+398
+399
+400
+401
+402
+403
+404
+405
+406
+407
+408
+409
+410
+411
+412
+413
+414
+415
+416
+417
+418
+419
+420
+421
+422
+423
+424
+425
+426
+427
+428
+429
+430
+431
+432
+433
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+/*
+* This file is based on serde_json crate licensed under conditions
+* of MIT License.
+* Copyright (C) 2023 by Erick Tryzelaar and David Tolnay
+
+* Permission is hereby granted, free of charge, to any
+* person obtaining a copy of this software and associated
+* documentation files (the "Software"), to deal in the
+* Software without restriction, including without
+* limitation the rights to use, copy, modify, merge,
+* publish, distribute, sublicense, and/or sell copies of
+* the Software, and to permit persons to whom the Software
+* is furnished to do so, subject to the following
+* conditions:
+*
+* The above copyright notice and this permission notice
+* shall be included in all copies or substantial portions
+* of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
+* ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+* TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+* SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+* IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+* DEALINGS IN THE SOFTWARE.
+*/
+
+//! The JValue enum, a loosely typed way of representing any valid JSON value.
+//!
+
+mod de;
+mod from;
+mod index;
+mod partial_eq;
+mod ser;
+
+use core::fmt::{self, Debug, Display};
+use core::mem;
+use core::str;
+use std::io;
+use std::rc::Rc;
+
+pub use self::index::Index;
+use crate::JsonString;
+pub use crate::Map;
+pub use serde_json::Number;
+
+/// Represents any valid JSON value with a cheap to clone Rc-based representation.
+#[derive(Clone, Eq, PartialEq)]
+pub enum JValue {
+    /// Represents a JSON null value.
+    Null,
+
+    /// Represents a JSON boolean.
+    Bool(bool),
+
+    /// Represents a JSON number, whether integer or floating point.
+    Number(Number),
+
+    /// Represents a JSON string.
+    String(JsonString),
+
+    /// Represents a JSON array.
+    Array(Rc<[JValue]>),
+
+    /// Represents a JSON object.
+    ///
+    /// By default the map is backed by a BTreeMap. Enable the `preserve_order`
+    /// feature of serde_json to use IndexMap instead, which preserves
+    /// entries in the order they are inserted into the map. In particular, this
+    /// allows JSON data to be deserialized into a JValue and serialized to a
+    /// string while retaining the order of map keys in the input.
+    Object(Rc<Map<JsonString, JValue>>),
+}
+
+impl Debug for JValue {
+    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
+        match self {
+            JValue::Null => formatter.write_str("Null"),
+            JValue::Bool(boolean) => write!(formatter, "Bool({})", boolean),
+            JValue::Number(number) => Debug::fmt(number, formatter),
+            JValue::String(string) => write!(formatter, "String({:?})", string),
+            JValue::Array(vec) => {
+                tri!(formatter.write_str("Array "));
+                Debug::fmt(vec, formatter)
+            }
+            JValue::Object(map) => {
+                tri!(formatter.write_str("Object "));
+                Debug::fmt(&**map, formatter)
+            }
+        }
+    }
+}
+
+impl Display for JValue {
+    /// Display a JSON value as a string.
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        struct WriterFormatter<'a, 'b: 'a> {
+            inner: &'a mut fmt::Formatter<'b>,
+        }
+
+        impl<'a, 'b> io::Write for WriterFormatter<'a, 'b> {
+            fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
+                // Safety: the serializer below only emits valid utf8 when using
+                // the default formatter.
+                let s = unsafe { str::from_utf8_unchecked(buf) };
+                tri!(self.inner.write_str(s).map_err(io_error));
+                Ok(buf.len())
+            }
+
+            fn flush(&mut self) -> io::Result<()> {
+                Ok(())
+            }
+        }
+
+        fn io_error(_: fmt::Error) -> io::Error {
+            // Error value does not matter because Display impl just maps it
+            // back to fmt::Error.
+            io::Error::new(io::ErrorKind::Other, "fmt error")
+        }
+
+        let alternate = f.alternate();
+        let mut wr = WriterFormatter { inner: f };
+        if alternate {
+            // {:#}
+            serde_json::ser::to_writer_pretty(&mut wr, self).map_err(|_| fmt::Error)
+        } else {
+            // {}
+            serde_json::ser::to_writer(&mut wr, self).map_err(|_| fmt::Error)
+        }
+    }
+}
+
+fn parse_index(s: &str) -> Option<usize> {
+    if s.starts_with('+') || (s.starts_with('0') && s.len() != 1) {
+        return None;
+    }
+    s.parse().ok()
+}
+
+impl JValue {
+    #[inline]
+    pub fn string(s: impl Into<Rc<str>>) -> Self {
+        Self::String(s.into())
+    }
+
+    #[inline]
+    pub fn array(vec: impl Into<Rc<[JValue]>>) -> Self {
+        Self::Array(vec.into())
+    }
+
+    pub fn array_from_iter(into_iter: impl IntoIterator<Item = impl Into<JValue>>) -> Self {
+        Self::Array(into_iter.into_iter().map(Into::into).collect())
+    }
+
+    pub fn object(map: impl Into<Map<JsonString, JValue>>) -> Self {
+        Self::Object(Rc::new(map.into()))
+    }
+
+    pub fn object_from_pairs(
+        into_iter: impl IntoIterator<Item = (impl Into<JsonString>, impl Into<JValue>)>,
+    ) -> Self {
+        Self::Object(Rc::new(
+            into_iter
+                .into_iter()
+                .map(|(k, v)| (k.into(), v.into()))
+                .collect(),
+        ))
+    }
+
+    /// Index into a JSON array or map. A string index can be used to access a
+    /// value in a map, and a usize index can be used to access an element of an
+    /// array.
+    ///
+    /// Returns `None` if the type of `self` does not match the type of the
+    /// index, for example if the index is a string and `self` is an array or a
+    /// number. Also returns `None` if the given key does not exist in the map
+    /// or the given index is not within the bounds of the array.
+    ///
+    /// Square brackets can also be used to index into a value in a more concise
+    /// way. This returns `JValue::Null` in cases where `get` would have returned
+    /// `None`.
+    pub fn get<I: Index>(&self, index: I) -> Option<&JValue> {
+        index.index_into(self)
+    }
+
+    /// Returns true if the `JValue` is an Object. Returns false otherwise.
+    ///
+    /// For any JValue on which `is_object` returns true, `as_object` and
+    /// `as_object_mut` are guaranteed to return the map representation of the
+    /// object.
+    #[inline]
+    pub fn is_object(&self) -> bool {
+        self.as_object().is_some()
+    }
+
+    /// If the `JValue` is an Object, returns the associated Map. Returns None
+    /// otherwise.
+    #[inline]
+    pub fn as_object(&self) -> Option<&Map<JsonString, JValue>> {
+        match self {
+            JValue::Object(map) => Some(map),
+            _ => None,
+        }
+    }
+
+    /// Returns true if the `JValue` is an Array. Returns false otherwise.
+    ///
+    /// For any JValue on which `is_array` returns true, `as_array` and
+    /// `as_array_mut` are guaranteed to return the vector representing the
+    /// array.
+    #[inline]
+    pub fn is_array(&self) -> bool {
+        self.as_array().is_some()
+    }
+
+    /// If the `JValue` is an Array, returns the associated vector. Returns None
+    /// otherwise.
+    #[inline]
+    pub fn as_array(&self) -> Option<&[JValue]> {
+        match self {
+            JValue::Array(array) => Some(array),
+            _ => None,
+        }
+    }
+
+    /// Returns true if the `JValue` is a String. Returns false otherwise.
+    ///
+    /// For any JValue on which `is_string` returns true, `as_str` is guaranteed
+    /// to return the string slice.
+    #[inline]
+    pub fn is_string(&self) -> bool {
+        self.as_str().is_some()
+    }
+
+    /// If the `JValue` is a string, returns the associated str. Returns None
+    /// otherwise.
+    #[inline]
+    pub fn as_str(&self) -> Option<&JsonString> {
+        match self {
+            JValue::String(s) => Some(s),
+            _ => None,
+        }
+    }
+
+    /// Returns true if the `JValue` is a Number. Returns false otherwise.
+    #[inline]
+    pub fn is_number(&self) -> bool {
+        matches!(self, JValue::Number(_))
+    }
+
+    /// If the `JValue` is a Number, returns the associated [`Number`]. Returns
+    /// None otherwise.
+    #[inline]
+    pub fn as_number(&self) -> Option<&Number> {
+        match self {
+            JValue::Number(number) => Some(number),
+            _ => None,
+        }
+    }
+
+    /// Returns true if the `JValue` is an integer between `i64::MIN` and
+    /// `i64::MAX`.
+    ///
+    /// For any JValue on which `is_i64` returns true, `as_i64` is guaranteed to
+    /// return the integer value.
+    #[inline]
+    pub fn is_i64(&self) -> bool {
+        match self {
+            JValue::Number(n) => n.is_i64(),
+            _ => false,
+        }
+    }
+
+    /// Returns true if the `JValue` is an integer between zero and `u64::MAX`.
+    ///
+    /// For any JValue on which `is_u64` returns true, `as_u64` is guaranteed to
+    /// return the integer value.
+    #[inline]
+    pub fn is_u64(&self) -> bool {
+        match self {
+            JValue::Number(n) => n.is_u64(),
+            _ => false,
+        }
+    }
+
+    /// Returns true if the `JValue` is a number that can be represented by f64.
+    ///
+    /// For any JValue on which `is_f64` returns true, `as_f64` is guaranteed to
+    /// return the floating point value.
+    ///
+    /// Currently this function returns true if and only if both `is_i64` and
+    /// `is_u64` return false but this is not a guarantee in the future.
+    #[inline]
+    pub fn is_f64(&self) -> bool {
+        match self {
+            JValue::Number(n) => n.is_f64(),
+            _ => false,
+        }
+    }
+
+    /// If the `JValue` is an integer, represent it as i64 if possible. Returns
+    /// None otherwise.
+    #[inline]
+    pub fn as_i64(&self) -> Option<i64> {
+        match self {
+            JValue::Number(n) => n.as_i64(),
+            _ => None,
+        }
+    }
+
+    /// If the `JValue` is an integer, represent it as u64 if possible. Returns
+    /// None otherwise.
+    #[inline]
+    pub fn as_u64(&self) -> Option<u64> {
+        match self {
+            JValue::Number(n) => n.as_u64(),
+            _ => None,
+        }
+    }
+
+    /// If the `JValue` is a number, represent it as f64 if possible. Returns
+    /// None otherwise.
+    #[inline]
+    pub fn as_f64(&self) -> Option<f64> {
+        match self {
+            JValue::Number(n) => n.as_f64(),
+            _ => None,
+        }
+    }
+
+    /// Returns true if the `JValue` is a Boolean. Returns false otherwise.
+    ///
+    /// For any JValue on which `is_boolean` returns true, `as_bool` is
+    /// guaranteed to return the boolean value.
+    #[inline]
+    pub fn is_boolean(&self) -> bool {
+        self.as_bool().is_some()
+    }
+
+    /// If the `JValue` is a Boolean, returns the associated bool. Returns None
+    /// otherwise.
+    #[inline]
+    pub fn as_bool(&self) -> Option<bool> {
+        match *self {
+            JValue::Bool(b) => Some(b),
+            _ => None,
+        }
+    }
+
+    /// Returns true if the `JValue` is a Null. Returns false otherwise.
+    ///
+    /// For any JValue on which `is_null` returns true, `as_null` is guaranteed
+    /// to return `Some(())`.
+    #[inline]
+    pub fn is_null(&self) -> bool {
+        self.as_null().is_some()
+    }
+
+    /// If the `JValue` is a Null, returns (). Returns None otherwise.
+    #[inline]
+    pub fn as_null(&self) -> Option<()> {
+        match *self {
+            JValue::Null => Some(()),
+            _ => None,
+        }
+    }
+
+    /// Looks up a value by a JSON Pointer.
+    ///
+    /// JSON Pointer defines a string syntax for identifying a specific value
+    /// within a JavaScript Object Notation (JSON) document.
+    ///
+    /// A Pointer is a Unicode string with the reference tokens separated by `/`.
+    /// Inside tokens `/` is replaced by `~1` and `~` is replaced by `~0`. The
+    /// addressed value is returned and if there is no such value `None` is
+    /// returned.
+    ///
+    /// For more information read [RFC6901](https://tools.ietf.org/html/rfc6901).
+    pub fn pointer(&self, pointer: &str) -> Option<&JValue> {
+        if pointer.is_empty() {
+            return Some(self);
+        }
+        if !pointer.starts_with('/') {
+            return None;
+        }
+        pointer
+            .split('/')
+            .skip(1)
+            .map(|x| x.replace("~1", "/").replace("~0", "~"))
+            .try_fold(self, |target, token| match target {
+                JValue::Object(map) => map.get(token.as_str()),
+                JValue::Array(list) => parse_index(&token).and_then(|x| list.get(x)),
+                _ => None,
+            })
+    }
+
+    /// Takes the value out of the `JValue`, leaving a `Null` in its place.
+    #[inline]
+    pub fn take(&mut self) -> JValue {
+        mem::replace(self, JValue::Null)
+    }
+}
+
+/// The default value is `JValue::Null`.
+impl Default for JValue {
+    #[inline]
+    fn default() -> JValue {
+        JValue::Null
+    }
+}
+
\ No newline at end of file diff --git a/src/air_interpreter_value/value/partial_eq.rs.html b/src/air_interpreter_value/value/partial_eq.rs.html new file mode 100644 index 00000000..8314df96 --- /dev/null +++ b/src/air_interpreter_value/value/partial_eq.rs.html @@ -0,0 +1,295 @@ +partial_eq.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+/*
+* This file is based on serde_json crate licensed under conditions
+* of MIT License.
+* Copyright (C) 2023 by Erick Tryzelaar and David Tolnay
+
+* Permission is hereby granted, free of charge, to any
+* person obtaining a copy of this software and associated
+* documentation files (the "Software"), to deal in the
+* Software without restriction, including without
+* limitation the rights to use, copy, modify, merge,
+* publish, distribute, sublicense, and/or sell copies of
+* the Software, and to permit persons to whom the Software
+* is furnished to do so, subject to the following
+* conditions:
+*
+* The above copyright notice and this permission notice
+* shall be included in all copies or substantial portions
+* of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
+* ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+* TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+* SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+* IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+* DEALINGS IN THE SOFTWARE.
+*/
+
+use super::JValue;
+use std::string::String;
+
+fn eq_i64(value: &JValue, other: i64) -> bool {
+    value.as_i64().map_or(false, |i| i == other)
+}
+
+fn eq_u64(value: &JValue, other: u64) -> bool {
+    value.as_u64().map_or(false, |i| i == other)
+}
+
+fn eq_f32(value: &JValue, other: f32) -> bool {
+    match value {
+        // NB: is not same as the original version
+        JValue::Number(n) => n.as_f64().map_or(false, |i| i == other as f64),
+        _ => false,
+    }
+}
+
+fn eq_f64(value: &JValue, other: f64) -> bool {
+    value.as_f64().map_or(false, |i| i == other)
+}
+
+fn eq_bool(value: &JValue, other: bool) -> bool {
+    value.as_bool().map_or(false, |i| i == other)
+}
+
+fn eq_str(value: &JValue, other: &str) -> bool {
+    value.as_str().map_or(false, |i| &**i == other)
+}
+
+impl PartialEq<str> for JValue {
+    fn eq(&self, other: &str) -> bool {
+        eq_str(self, other)
+    }
+}
+
+impl PartialEq<&str> for JValue {
+    fn eq(&self, other: &&str) -> bool {
+        eq_str(self, other)
+    }
+}
+
+impl PartialEq<JValue> for str {
+    fn eq(&self, other: &JValue) -> bool {
+        eq_str(other, self)
+    }
+}
+
+impl PartialEq<JValue> for &str {
+    fn eq(&self, other: &JValue) -> bool {
+        eq_str(other, self)
+    }
+}
+
+impl PartialEq<String> for JValue {
+    fn eq(&self, other: &String) -> bool {
+        eq_str(self, other.as_str())
+    }
+}
+
+impl PartialEq<JValue> for String {
+    fn eq(&self, other: &JValue) -> bool {
+        eq_str(other, self.as_str())
+    }
+}
+
+macro_rules! partialeq_numeric {
+    ($($eq:ident [$($ty:ty)*])*) => {
+        $($(
+            impl PartialEq<$ty> for JValue {
+                fn eq(&self, other: &$ty) -> bool {
+                    $eq(self, *other as _)
+                }
+            }
+
+            impl PartialEq<JValue> for $ty {
+                fn eq(&self, other: &JValue) -> bool {
+                    $eq(other, *self as _)
+                }
+            }
+
+            impl<'a> PartialEq<$ty> for &'a JValue {
+                fn eq(&self, other: &$ty) -> bool {
+                    $eq(*self, *other as _)
+                }
+            }
+        )*)*
+    }
+}
+
+partialeq_numeric! {
+    eq_i64[i8 i16 i32 i64 isize]
+    eq_u64[u8 u16 u32 u64 usize]
+    eq_f32[f32]
+    eq_f64[f64]
+    eq_bool[bool]
+}
+
\ No newline at end of file diff --git a/src/air_interpreter_value/value/ser.rs.html b/src/air_interpreter_value/value/ser.rs.html new file mode 100644 index 00000000..ce70782f --- /dev/null +++ b/src/air_interpreter_value/value/ser.rs.html @@ -0,0 +1,153 @@ +ser.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+/*
+* This file is based on serde_json crate licensed under conditions
+* of MIT License.
+* Copyright (C) 2023 by Erick Tryzelaar and David Tolnay
+
+* Permission is hereby granted, free of charge, to any
+* person obtaining a copy of this software and associated
+* documentation files (the "Software"), to deal in the
+* Software without restriction, including without
+* limitation the rights to use, copy, modify, merge,
+* publish, distribute, sublicense, and/or sell copies of
+* the Software, and to permit persons to whom the Software
+* is furnished to do so, subject to the following
+* conditions:
+*
+* The above copyright notice and this permission notice
+* shall be included in all copies or substantial portions
+* of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
+* ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+* TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+* SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+* IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+* DEALINGS IN THE SOFTWARE.
+*/
+
+use crate::value::JValue;
+use core::result;
+use serde::ser::Serialize;
+
+impl Serialize for JValue {
+    #[inline]
+    fn serialize<S>(&self, serializer: S) -> result::Result<S::Ok, S::Error>
+    where
+        S: ::serde::Serializer,
+    {
+        match self {
+            JValue::Null => serializer.serialize_unit(),
+            JValue::Bool(b) => serializer.serialize_bool(*b),
+            JValue::Number(n) => n.serialize(serializer),
+            JValue::String(s) => serializer.serialize_str(s),
+            JValue::Array(v) => v.serialize(serializer),
+            JValue::Object(m) => {
+                use serde::ser::SerializeMap;
+                let mut map = tri!(serializer.serialize_map(Some(m.len())));
+                for (k, v) in &**m {
+                    tri!(map.serialize_entry(k, v));
+                }
+                map.end()
+            }
+        }
+    }
+}
+
\ No newline at end of file diff --git a/src/air_lambda_ast/ast.rs.html b/src/air_lambda_ast/ast.rs.html new file mode 100644 index 00000000..49472f8f --- /dev/null +++ b/src/air_lambda_ast/ast.rs.html @@ -0,0 +1,119 @@ +ast.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+mod impls;
+mod traits;
+
+use non_empty_vec::NonEmpty;
+use serde::Deserialize;
+use serde::Serialize;
+
+// TODO: rename lambda to smth more appropriate
+#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)]
+pub enum LambdaAST<'input> {
+    /// Various functors that could applied to a value.
+    Functor(Functor),
+    /// Each value in AIR could be represented as a tree and
+    /// this variant acts as a path in such trees.
+    #[serde(borrow)]
+    ValuePath(NonEmpty<ValueAccessor<'input>>),
+}
+
+#[derive(Debug, PartialEq, Eq, Clone, Copy, Serialize, Deserialize)]
+pub enum ValueAccessor<'input> {
+    // (.)?[$idx]
+    ArrayAccess { idx: u32 },
+
+    // .field
+    FieldAccessByName { field_name: &'input str },
+
+    // (.)?[field]
+    FieldAccessByScalar { scalar_name: &'input str },
+
+    // needed to allow parser catch all errors from a lambda expression without stopping
+    // on the very first one. Although, this variant is guaranteed not to be present in a lambda.
+    Error,
+}
+
+#[derive(Debug, PartialEq, Eq, Clone, Copy, Serialize, Deserialize)]
+pub enum Functor {
+    /// Returns a length of a value if this value has array type (json array or canon stream)
+    /// or a error if not.
+    Length,
+}
+
\ No newline at end of file diff --git a/src/air_lambda_ast/ast/impls.rs.html b/src/air_lambda_ast/ast/impls.rs.html new file mode 100644 index 00000000..adad12a9 --- /dev/null +++ b/src/air_lambda_ast/ast/impls.rs.html @@ -0,0 +1,77 @@ +impls.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use crate::Functor;
+use crate::LambdaAST;
+use crate::ValueAccessor;
+
+pub use non_empty_vec::EmptyError;
+use non_empty_vec::NonEmpty;
+
+impl<'input> LambdaAST<'input> {
+    pub fn try_from_accessors(accessors: Vec<ValueAccessor<'input>>) -> Result<Self, EmptyError> {
+        let value_path = NonEmpty::try_from(accessors)?;
+        let lambda_ast = Self::ValuePath(value_path);
+
+        Ok(lambda_ast)
+    }
+
+    pub fn from_functor(functor: Functor) -> Self {
+        Self::Functor(functor)
+    }
+}
+
\ No newline at end of file diff --git a/src/air_lambda_ast/ast/traits.rs.html b/src/air_lambda_ast/ast/traits.rs.html new file mode 100644 index 00000000..a2b3e0f1 --- /dev/null +++ b/src/air_lambda_ast/ast/traits.rs.html @@ -0,0 +1,115 @@ +traits.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::*;
+use itertools::Itertools;
+
+use std::fmt;
+
+impl fmt::Display for LambdaAST<'_> {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        use LambdaAST::*;
+
+        match self {
+            Functor(functor) => write!(f, ".{functor}"),
+            ValuePath(value_path) => write!(f, ".$.{}", value_path.iter().join(".")),
+        }
+    }
+}
+
+impl fmt::Display for ValueAccessor<'_> {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        use ValueAccessor::*;
+
+        match self {
+            ArrayAccess { idx } => write!(f, "[{idx}]"),
+            FieldAccessByName { field_name } => write!(f, "{field_name}"),
+            FieldAccessByScalar { scalar_name } => write!(f, "[{scalar_name}]"),
+            Error => write!(f, "a parser error occurred while parsing lambda expression"),
+        }
+    }
+}
+
+impl fmt::Display for Functor {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        use Functor::*;
+
+        match self {
+            Length => write!(f, "length"),
+        }
+    }
+}
+
\ No newline at end of file diff --git a/src/air_lambda_ast/lib.rs.html b/src/air_lambda_ast/lib.rs.html new file mode 100644 index 00000000..67338757 --- /dev/null +++ b/src/air_lambda_ast/lib.rs.html @@ -0,0 +1,69 @@ +lib.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#![forbid(unsafe_code)]
+#![warn(rust_2018_idioms)]
+#![deny(
+    dead_code,
+    nonstandard_style,
+    unused_imports,
+    unused_mut,
+    unused_variables,
+    unused_unsafe,
+    unreachable_patterns
+)]
+
+mod ast;
+
+pub use ast::*;
+
\ No newline at end of file diff --git a/src/air_lambda_parser/lib.rs.html b/src/air_lambda_parser/lib.rs.html new file mode 100644 index 00000000..84466b29 --- /dev/null +++ b/src/air_lambda_parser/lib.rs.html @@ -0,0 +1,81 @@ +lib.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#![forbid(unsafe_code)]
+#![deny(
+    dead_code,
+    nonstandard_style,
+    unused_imports,
+    unused_mut,
+    unused_variables,
+    unused_unsafe,
+    unreachable_patterns
+)]
+
+mod parser;
+
+pub use parser::parse;
+pub use parser::LambdaASTLexer;
+pub use parser::LambdaParserError;
+pub use parser::LexerError;
+
+pub use air_lambda_ast::Functor;
+pub use air_lambda_ast::LambdaAST;
+pub use air_lambda_ast::ValueAccessor;
+
\ No newline at end of file diff --git a/src/air_lambda_parser/parser/errors.rs.html b/src/air_lambda_parser/parser/errors.rs.html new file mode 100644 index 00000000..0c6ba441 --- /dev/null +++ b/src/air_lambda_parser/parser/errors.rs.html @@ -0,0 +1,131 @@ +errors.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use crate::parser::lexer::LexerError;
+use crate::parser::lexer::Token;
+
+use lalrpop_util::ErrorRecovery;
+use lalrpop_util::ParseError;
+use thiserror::Error as ThisError;
+
+#[derive(ThisError, Debug, Clone, PartialEq, Eq)]
+pub enum LambdaParserError<'input> {
+    #[error(transparent)]
+    LexerError(#[from] LexerError),
+
+    #[error(transparent)]
+    LambdaError(#[from] IncorrectLambdaError),
+
+    #[error("{0:?}")]
+    ParseError(ParseError<usize, Token<'input>, LexerError>),
+
+    #[error("{0:?}")]
+    RecoveryErrors(Vec<ErrorRecovery<usize, Token<'input>, LexerError>>),
+}
+
+#[derive(ThisError, Debug, Clone, PartialEq, Eq)]
+pub enum IncorrectLambdaError {
+    #[error("provided lambda expression doesn't contain any accessor")]
+    EmptyLambda,
+
+    #[error(
+        "normally, this error shouldn't occur, it's an internal error of a parser implementation"
+    )]
+    InternalError,
+}
+
+impl<'input> From<ParseError<usize, Token<'input>, LexerError>> for LambdaParserError<'input> {
+    fn from(e: ParseError<usize, Token<'input>, LexerError>) -> Self {
+        Self::ParseError(e)
+    }
+}
+
+impl<'input> From<Vec<ErrorRecovery<usize, Token<'input>, LexerError>>>
+    for LambdaParserError<'input>
+{
+    fn from(errors: Vec<ErrorRecovery<usize, Token<'input>, LexerError>>) -> Self {
+        Self::RecoveryErrors(errors)
+    }
+}
+
\ No newline at end of file diff --git a/src/air_lambda_parser/parser/lambda_parser.rs.html b/src/air_lambda_parser/parser/lambda_parser.rs.html new file mode 100644 index 00000000..ef5239fb --- /dev/null +++ b/src/air_lambda_parser/parser/lambda_parser.rs.html @@ -0,0 +1,135 @@ +lambda_parser.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::lexer::LambdaASTLexer;
+use super::LambdaParserResult;
+use crate::parser::errors::IncorrectLambdaError;
+use crate::parser::va_lambda::RawLambdaASTParser;
+use crate::Functor;
+use crate::LambdaAST;
+use crate::ValueAccessor;
+
+// Caching parser to cache internal regexes, which are expensive to instantiate
+// See also https://github.com/lalrpop/lalrpop/issues/269
+thread_local!(static PARSER: RawLambdaASTParser = RawLambdaASTParser::new());
+
+/// Parse AIR lambda ast to `LambdaAST`
+pub fn parse(lambda: &str) -> LambdaParserResult<'_, LambdaAST> {
+    PARSER.with(|parser| {
+        let mut errors = Vec::new();
+        let lexer = LambdaASTLexer::new(lambda);
+        let result = parser.parse(lambda, &mut errors, lexer);
+
+        match result {
+            Ok(lambda_ast) if errors.is_empty() => lambda_ast.try_into().map_err(Into::into),
+            Ok(_) => Err(errors.into()),
+            Err(e) => Err(e.into()),
+        }
+    })
+}
+
+impl<'input> TryFrom<RawLambdaAST<'input>> for LambdaAST<'input> {
+    type Error = IncorrectLambdaError;
+
+    fn try_from(raw_lambda_ast: RawLambdaAST<'input>) -> Result<Self, Self::Error> {
+        match raw_lambda_ast {
+            RawLambdaAST::ValuePath(accessors) => {
+                LambdaAST::try_from_accessors(accessors).or(Err(IncorrectLambdaError::EmptyLambda))
+            }
+            RawLambdaAST::Functor(functor) => Ok(LambdaAST::from_functor(functor)),
+            RawLambdaAST::Error => Err(IncorrectLambdaError::InternalError),
+        }
+    }
+}
+
+#[derive(Debug, PartialEq, Eq, Clone)]
+pub(crate) enum RawLambdaAST<'input> {
+    Functor(Functor),
+    ValuePath(Vec<ValueAccessor<'input>>),
+    // needed to allow parser catch all errors from a lambda expression without stopping on the very first one.
+    Error,
+}
+
\ No newline at end of file diff --git a/src/air_lambda_parser/parser/lexer/errors.rs.html b/src/air_lambda_parser/parser/lexer/errors.rs.html new file mode 100644 index 00000000..b0235239 --- /dev/null +++ b/src/air_lambda_parser/parser/lexer/errors.rs.html @@ -0,0 +1,63 @@ +errors.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use thiserror::Error as ThisError;
+
+use std::num::ParseIntError;
+
+#[derive(ThisError, Debug, Clone, PartialEq, Eq)]
+pub enum LexerError {
+    #[error("unexpected symbol for value accessor")]
+    UnexpectedSymbol(usize, usize),
+
+    #[error("{2}")]
+    ParseIntError(usize, usize, #[source] ParseIntError),
+}
+
\ No newline at end of file diff --git a/src/air_lambda_parser/parser/lexer/lambda_ast_lexer.rs.html b/src/air_lambda_parser/parser/lexer/lambda_ast_lexer.rs.html new file mode 100644 index 00000000..6f132bcc --- /dev/null +++ b/src/air_lambda_parser/parser/lexer/lambda_ast_lexer.rs.html @@ -0,0 +1,297 @@ +lambda_ast_lexer.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::errors::LexerError;
+use super::token::Token;
+use crate::parser::lexer::is_air_alphanumeric;
+
+use std::iter::Peekable;
+use std::str::CharIndices;
+
+const ARRAY_IDX_BASE: u32 = 10;
+const LENGTH_FUNCTOR: &str = ".length";
+const VALUE_PATH_STARTER: &str = ".$";
+
+pub type Spanned<Token, Loc, Error> = Result<(Loc, Token, Loc), Error>;
+
+pub struct LambdaASTLexer<'input> {
+    input: &'input str,
+    chars: Peekable<CharIndices<'input>>,
+    is_first_token: bool,
+}
+
+impl<'input> Iterator for LambdaASTLexer<'input> {
+    type Item = Spanned<Token<'input>, usize, LexerError>;
+
+    fn next(&mut self) -> Option<Self::Item> {
+        self.next_token()
+    }
+}
+
+impl<'input> LambdaASTLexer<'input> {
+    pub fn new(input: &'input str) -> Self {
+        Self {
+            input,
+            chars: input.char_indices().peekable(),
+            is_first_token: true,
+        }
+    }
+
+    pub fn next_token(&mut self) -> Option<Spanned<Token<'input>, usize, LexerError>> {
+        if self.input.is_empty() {
+            return None;
+        }
+
+        if self.is_first_token {
+            self.is_first_token = false;
+            return Some(self.try_parse_first_token());
+        }
+
+        self.chars.next().map(|(start_offset, ch)| match ch {
+            '[' => Ok((start_offset, Token::OpenSquareBracket, start_offset + 1)),
+            ']' => Ok((start_offset, Token::CloseSquareBracket, start_offset + 1)),
+
+            '.' => Ok((start_offset, Token::ValuePathSelector, start_offset + 1)),
+
+            d if d.is_digit(ARRAY_IDX_BASE) => self.tokenize_arrays_idx(start_offset),
+            s if is_air_alphanumeric(s) => self.tokenize_field_name(start_offset),
+
+            '!' => Ok((start_offset, Token::FlatteningSign, start_offset + 1)),
+
+            _ => Err(LexerError::UnexpectedSymbol(start_offset, start_offset + 1)),
+        })
+    }
+
+    fn tokenize_arrays_idx(
+        &mut self,
+        start_offset: usize,
+    ) -> Spanned<Token<'input>, usize, LexerError> {
+        let array_idx = self.tokenize_until(start_offset, |ch| ch.is_digit(ARRAY_IDX_BASE));
+        match array_idx
+            .parse::<u32>()
+            .map_err(|e| LexerError::ParseIntError(start_offset, start_offset + array_idx.len(), e))
+        {
+            Ok(idx) => Ok((
+                start_offset,
+                Token::NumberAccessor(idx),
+                start_offset + array_idx.len(),
+            )),
+            Err(e) => Err(e),
+        }
+    }
+
+    fn tokenize_field_name(
+        &mut self,
+        start_offset: usize,
+    ) -> Spanned<Token<'input>, usize, LexerError> {
+        let field_name = self.tokenize_until(start_offset, is_air_alphanumeric);
+
+        Ok((
+            start_offset,
+            Token::StringAccessor(field_name),
+            start_offset + field_name.len(),
+        ))
+    }
+
+    fn tokenize_until(
+        &mut self,
+        start_offset: usize,
+        condition: impl Fn(char) -> bool,
+    ) -> &'input str {
+        let mut end_pos = start_offset;
+        while let Some((pos, ch)) = self.chars.peek() {
+            if !condition(*ch) {
+                break;
+            }
+            end_pos = *pos;
+            self.chars.next();
+        }
+
+        &self.input[start_offset..end_pos + 1]
+    }
+
+    fn try_parse_first_token(&mut self) -> Spanned<Token<'input>, usize, LexerError> {
+        let (token, token_size) = if self.input == LENGTH_FUNCTOR {
+            (Token::LengthFunctor, LENGTH_FUNCTOR.len())
+        } else if self.input.starts_with(VALUE_PATH_STARTER) {
+            (Token::ValuePathStarter, VALUE_PATH_STARTER.len())
+        } else {
+            return Err(LexerError::UnexpectedSymbol(0, self.input.len()));
+        };
+
+        self.advance_by(token_size);
+        Ok((0, token, token_size))
+    }
+
+    fn advance_by(&mut self, advance_size: usize) {
+        // advance_by is unstable
+        for _ in 0..advance_size {
+            self.chars.next();
+        }
+    }
+}
+
\ No newline at end of file diff --git a/src/air_lambda_parser/parser/lexer/mod.rs.html b/src/air_lambda_parser/parser/lexer/mod.rs.html new file mode 100644 index 00000000..1e861ed8 --- /dev/null +++ b/src/air_lambda_parser/parser/lexer/mod.rs.html @@ -0,0 +1,65 @@ +mod.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+mod errors;
+mod lambda_ast_lexer;
+mod token;
+mod utils;
+
+#[cfg(test)]
+mod tests;
+
+pub use errors::LexerError;
+pub use lambda_ast_lexer::LambdaASTLexer;
+pub use token::Token;
+
+use utils::is_air_alphanumeric;
+
\ No newline at end of file diff --git a/src/air_lambda_parser/parser/lexer/token.rs.html b/src/air_lambda_parser/parser/lexer/token.rs.html new file mode 100644 index 00000000..022c320d --- /dev/null +++ b/src/air_lambda_parser/parser/lexer/token.rs.html @@ -0,0 +1,81 @@ +token.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use serde::Deserialize;
+use serde::Serialize;
+
+#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
+pub enum Token<'input> {
+    LengthFunctor,
+
+    //.$
+    ValuePathStarter,
+    // .
+    ValuePathSelector,
+
+    OpenSquareBracket,
+    CloseSquareBracket,
+
+    NumberAccessor(u32),
+    StringAccessor(&'input str),
+
+    // !
+    FlatteningSign,
+}
+
\ No newline at end of file diff --git a/src/air_lambda_parser/parser/lexer/utils.rs.html b/src/air_lambda_parser/parser/lexer/utils.rs.html new file mode 100644 index 00000000..9e153df2 --- /dev/null +++ b/src/air_lambda_parser/parser/lexer/utils.rs.html @@ -0,0 +1,47 @@ +utils.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+// TODO: decouple it to a separate crate
+pub(super) fn is_air_alphanumeric(ch: char) -> bool {
+    ch.is_alphanumeric() || ch == '_' || ch == '-'
+}
+
\ No newline at end of file diff --git a/src/air_lambda_parser/parser/mod.rs.html b/src/air_lambda_parser/parser/mod.rs.html new file mode 100644 index 00000000..1aa87df9 --- /dev/null +++ b/src/air_lambda_parser/parser/mod.rs.html @@ -0,0 +1,89 @@ +mod.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+pub mod lambda_parser;
+mod lexer;
+
+// air is auto-generated, so exclude it from `cargo fmt -- --check` and `cargo clippy`
+#[rustfmt::skip]
+#[allow(clippy::all)]
+mod va_lambda;
+
+mod errors;
+
+#[cfg(test)]
+pub mod tests;
+
+pub type LambdaParserResult<'input, T> = std::result::Result<T, LambdaParserError<'input>>;
+
+pub use errors::LambdaParserError;
+pub use lambda_parser::parse;
+pub use lexer::LambdaASTLexer;
+pub use lexer::LexerError;
+
+#[derive(Debug, Clone, Copy, PartialEq, Eq)]
+pub struct Span {
+    pub left: usize,
+    pub right: usize,
+}
+
\ No newline at end of file diff --git a/src/air_lambda_parser/parser/va_lambda.rs.html b/src/air_lambda_parser/parser/va_lambda.rs.html new file mode 100644 index 00000000..f45966c0 --- /dev/null +++ b/src/air_lambda_parser/parser/va_lambda.rs.html @@ -0,0 +1,4053 @@ +va_lambda.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
+334
+335
+336
+337
+338
+339
+340
+341
+342
+343
+344
+345
+346
+347
+348
+349
+350
+351
+352
+353
+354
+355
+356
+357
+358
+359
+360
+361
+362
+363
+364
+365
+366
+367
+368
+369
+370
+371
+372
+373
+374
+375
+376
+377
+378
+379
+380
+381
+382
+383
+384
+385
+386
+387
+388
+389
+390
+391
+392
+393
+394
+395
+396
+397
+398
+399
+400
+401
+402
+403
+404
+405
+406
+407
+408
+409
+410
+411
+412
+413
+414
+415
+416
+417
+418
+419
+420
+421
+422
+423
+424
+425
+426
+427
+428
+429
+430
+431
+432
+433
+434
+435
+436
+437
+438
+439
+440
+441
+442
+443
+444
+445
+446
+447
+448
+449
+450
+451
+452
+453
+454
+455
+456
+457
+458
+459
+460
+461
+462
+463
+464
+465
+466
+467
+468
+469
+470
+471
+472
+473
+474
+475
+476
+477
+478
+479
+480
+481
+482
+483
+484
+485
+486
+487
+488
+489
+490
+491
+492
+493
+494
+495
+496
+497
+498
+499
+500
+501
+502
+503
+504
+505
+506
+507
+508
+509
+510
+511
+512
+513
+514
+515
+516
+517
+518
+519
+520
+521
+522
+523
+524
+525
+526
+527
+528
+529
+530
+531
+532
+533
+534
+535
+536
+537
+538
+539
+540
+541
+542
+543
+544
+545
+546
+547
+548
+549
+550
+551
+552
+553
+554
+555
+556
+557
+558
+559
+560
+561
+562
+563
+564
+565
+566
+567
+568
+569
+570
+571
+572
+573
+574
+575
+576
+577
+578
+579
+580
+581
+582
+583
+584
+585
+586
+587
+588
+589
+590
+591
+592
+593
+594
+595
+596
+597
+598
+599
+600
+601
+602
+603
+604
+605
+606
+607
+608
+609
+610
+611
+612
+613
+614
+615
+616
+617
+618
+619
+620
+621
+622
+623
+624
+625
+626
+627
+628
+629
+630
+631
+632
+633
+634
+635
+636
+637
+638
+639
+640
+641
+642
+643
+644
+645
+646
+647
+648
+649
+650
+651
+652
+653
+654
+655
+656
+657
+658
+659
+660
+661
+662
+663
+664
+665
+666
+667
+668
+669
+670
+671
+672
+673
+674
+675
+676
+677
+678
+679
+680
+681
+682
+683
+684
+685
+686
+687
+688
+689
+690
+691
+692
+693
+694
+695
+696
+697
+698
+699
+700
+701
+702
+703
+704
+705
+706
+707
+708
+709
+710
+711
+712
+713
+714
+715
+716
+717
+718
+719
+720
+721
+722
+723
+724
+725
+726
+727
+728
+729
+730
+731
+732
+733
+734
+735
+736
+737
+738
+739
+740
+741
+742
+743
+744
+745
+746
+747
+748
+749
+750
+751
+752
+753
+754
+755
+756
+757
+758
+759
+760
+761
+762
+763
+764
+765
+766
+767
+768
+769
+770
+771
+772
+773
+774
+775
+776
+777
+778
+779
+780
+781
+782
+783
+784
+785
+786
+787
+788
+789
+790
+791
+792
+793
+794
+795
+796
+797
+798
+799
+800
+801
+802
+803
+804
+805
+806
+807
+808
+809
+810
+811
+812
+813
+814
+815
+816
+817
+818
+819
+820
+821
+822
+823
+824
+825
+826
+827
+828
+829
+830
+831
+832
+833
+834
+835
+836
+837
+838
+839
+840
+841
+842
+843
+844
+845
+846
+847
+848
+849
+850
+851
+852
+853
+854
+855
+856
+857
+858
+859
+860
+861
+862
+863
+864
+865
+866
+867
+868
+869
+870
+871
+872
+873
+874
+875
+876
+877
+878
+879
+880
+881
+882
+883
+884
+885
+886
+887
+888
+889
+890
+891
+892
+893
+894
+895
+896
+897
+898
+899
+900
+901
+902
+903
+904
+905
+906
+907
+908
+909
+910
+911
+912
+913
+914
+915
+916
+917
+918
+919
+920
+921
+922
+923
+924
+925
+926
+927
+928
+929
+930
+931
+932
+933
+934
+935
+936
+937
+938
+939
+940
+941
+942
+943
+944
+945
+946
+947
+948
+949
+950
+951
+952
+953
+954
+955
+956
+957
+958
+959
+960
+961
+962
+963
+964
+965
+966
+967
+968
+969
+970
+971
+972
+973
+974
+975
+976
+977
+978
+979
+980
+981
+982
+983
+984
+985
+986
+987
+988
+989
+990
+991
+992
+993
+994
+995
+996
+997
+998
+999
+1000
+1001
+1002
+1003
+1004
+1005
+1006
+1007
+1008
+1009
+1010
+1011
+1012
+1013
+1014
+1015
+1016
+1017
+1018
+1019
+1020
+1021
+1022
+1023
+1024
+1025
+1026
+1027
+1028
+1029
+1030
+1031
+1032
+1033
+1034
+1035
+1036
+1037
+1038
+1039
+1040
+1041
+1042
+1043
+1044
+1045
+1046
+1047
+1048
+1049
+1050
+1051
+1052
+1053
+1054
+1055
+1056
+1057
+1058
+1059
+1060
+1061
+1062
+1063
+1064
+1065
+1066
+1067
+1068
+1069
+1070
+1071
+1072
+1073
+1074
+1075
+1076
+1077
+1078
+1079
+1080
+1081
+1082
+1083
+1084
+1085
+1086
+1087
+1088
+1089
+1090
+1091
+1092
+1093
+1094
+1095
+1096
+1097
+1098
+1099
+1100
+1101
+1102
+1103
+1104
+1105
+1106
+1107
+1108
+1109
+1110
+1111
+1112
+1113
+1114
+1115
+1116
+1117
+1118
+1119
+1120
+1121
+1122
+1123
+1124
+1125
+1126
+1127
+1128
+1129
+1130
+1131
+1132
+1133
+1134
+1135
+1136
+1137
+1138
+1139
+1140
+1141
+1142
+1143
+1144
+1145
+1146
+1147
+1148
+1149
+1150
+1151
+1152
+1153
+1154
+1155
+1156
+1157
+1158
+1159
+1160
+1161
+1162
+1163
+1164
+1165
+1166
+1167
+1168
+1169
+1170
+1171
+1172
+1173
+1174
+1175
+1176
+1177
+1178
+1179
+1180
+1181
+1182
+1183
+1184
+1185
+1186
+1187
+1188
+1189
+1190
+1191
+1192
+1193
+1194
+1195
+1196
+1197
+1198
+1199
+1200
+1201
+1202
+1203
+1204
+1205
+1206
+1207
+1208
+1209
+1210
+1211
+1212
+1213
+1214
+1215
+1216
+1217
+1218
+1219
+1220
+1221
+1222
+1223
+1224
+1225
+1226
+1227
+1228
+1229
+1230
+1231
+1232
+1233
+1234
+1235
+1236
+1237
+1238
+1239
+1240
+1241
+1242
+1243
+1244
+1245
+1246
+1247
+1248
+1249
+1250
+1251
+1252
+1253
+1254
+1255
+1256
+1257
+1258
+1259
+1260
+1261
+1262
+1263
+1264
+1265
+1266
+1267
+1268
+1269
+1270
+1271
+1272
+1273
+1274
+1275
+1276
+1277
+1278
+1279
+1280
+1281
+1282
+1283
+1284
+1285
+1286
+1287
+1288
+1289
+1290
+1291
+1292
+1293
+1294
+1295
+1296
+1297
+1298
+1299
+1300
+1301
+1302
+1303
+1304
+1305
+1306
+1307
+1308
+1309
+1310
+1311
+1312
+1313
+1314
+1315
+1316
+1317
+1318
+1319
+1320
+1321
+1322
+1323
+1324
+1325
+1326
+1327
+1328
+1329
+1330
+1331
+1332
+1333
+1334
+1335
+1336
+1337
+1338
+1339
+1340
+1341
+1342
+1343
+1344
+1345
+1346
+1347
+1348
+1349
+1350
+1351
+1352
+1353
+1354
+1355
+1356
+1357
+1358
+1359
+1360
+1361
+1362
+1363
+1364
+1365
+1366
+1367
+1368
+1369
+1370
+1371
+1372
+1373
+1374
+1375
+1376
+1377
+1378
+1379
+1380
+1381
+1382
+1383
+1384
+1385
+1386
+1387
+1388
+1389
+1390
+1391
+1392
+1393
+1394
+1395
+1396
+1397
+1398
+1399
+1400
+1401
+1402
+1403
+1404
+1405
+1406
+1407
+1408
+1409
+1410
+1411
+1412
+1413
+1414
+1415
+1416
+1417
+1418
+1419
+1420
+1421
+1422
+1423
+1424
+1425
+1426
+1427
+1428
+1429
+1430
+1431
+1432
+1433
+1434
+1435
+1436
+1437
+1438
+1439
+1440
+1441
+1442
+1443
+1444
+1445
+1446
+1447
+1448
+1449
+1450
+1451
+1452
+1453
+1454
+1455
+1456
+1457
+1458
+1459
+1460
+1461
+1462
+1463
+1464
+1465
+1466
+1467
+1468
+1469
+1470
+1471
+1472
+1473
+1474
+1475
+1476
+1477
+1478
+1479
+1480
+1481
+1482
+1483
+1484
+1485
+1486
+1487
+1488
+1489
+1490
+1491
+1492
+1493
+1494
+1495
+1496
+1497
+1498
+1499
+1500
+1501
+1502
+1503
+1504
+1505
+1506
+1507
+1508
+1509
+1510
+1511
+1512
+1513
+1514
+1515
+1516
+1517
+1518
+1519
+1520
+1521
+1522
+1523
+1524
+1525
+1526
+1527
+1528
+1529
+1530
+1531
+1532
+1533
+1534
+1535
+1536
+1537
+1538
+1539
+1540
+1541
+1542
+1543
+1544
+1545
+1546
+1547
+1548
+1549
+1550
+1551
+1552
+1553
+1554
+1555
+1556
+1557
+1558
+1559
+1560
+1561
+1562
+1563
+1564
+1565
+1566
+1567
+1568
+1569
+1570
+1571
+1572
+1573
+1574
+1575
+1576
+1577
+1578
+1579
+1580
+1581
+1582
+1583
+1584
+1585
+1586
+1587
+1588
+1589
+1590
+1591
+1592
+1593
+1594
+1595
+1596
+1597
+1598
+1599
+1600
+1601
+1602
+1603
+1604
+1605
+1606
+1607
+1608
+1609
+1610
+1611
+1612
+1613
+1614
+1615
+1616
+1617
+1618
+1619
+1620
+1621
+1622
+1623
+1624
+1625
+1626
+1627
+1628
+1629
+1630
+1631
+1632
+1633
+1634
+1635
+1636
+1637
+1638
+1639
+1640
+1641
+1642
+1643
+1644
+1645
+1646
+1647
+1648
+1649
+1650
+1651
+1652
+1653
+1654
+1655
+1656
+1657
+1658
+1659
+1660
+1661
+1662
+1663
+1664
+1665
+1666
+1667
+1668
+1669
+1670
+1671
+1672
+1673
+1674
+1675
+1676
+1677
+1678
+1679
+1680
+1681
+1682
+1683
+1684
+1685
+1686
+1687
+1688
+1689
+1690
+1691
+1692
+1693
+1694
+1695
+1696
+1697
+1698
+1699
+1700
+1701
+1702
+1703
+1704
+1705
+1706
+1707
+1708
+1709
+1710
+1711
+1712
+1713
+1714
+1715
+1716
+1717
+1718
+1719
+1720
+1721
+1722
+1723
+1724
+1725
+1726
+1727
+1728
+1729
+1730
+1731
+1732
+1733
+1734
+1735
+1736
+1737
+1738
+1739
+1740
+1741
+1742
+1743
+1744
+1745
+1746
+1747
+1748
+1749
+1750
+1751
+1752
+1753
+1754
+1755
+1756
+1757
+1758
+1759
+1760
+1761
+1762
+1763
+1764
+1765
+1766
+1767
+1768
+1769
+1770
+1771
+1772
+1773
+1774
+1775
+1776
+1777
+1778
+1779
+1780
+1781
+1782
+1783
+1784
+1785
+1786
+1787
+1788
+1789
+1790
+1791
+1792
+1793
+1794
+1795
+1796
+1797
+1798
+1799
+1800
+1801
+1802
+1803
+1804
+1805
+1806
+1807
+1808
+1809
+1810
+1811
+1812
+1813
+1814
+1815
+1816
+1817
+1818
+1819
+1820
+1821
+1822
+1823
+1824
+1825
+1826
+1827
+1828
+1829
+1830
+1831
+1832
+1833
+1834
+1835
+1836
+1837
+1838
+1839
+1840
+1841
+1842
+1843
+1844
+1845
+1846
+1847
+1848
+1849
+1850
+1851
+1852
+1853
+1854
+1855
+1856
+1857
+1858
+1859
+1860
+1861
+1862
+1863
+1864
+1865
+1866
+1867
+1868
+1869
+1870
+1871
+1872
+1873
+1874
+1875
+1876
+1877
+1878
+1879
+1880
+1881
+1882
+1883
+1884
+1885
+1886
+1887
+1888
+1889
+1890
+1891
+1892
+1893
+1894
+1895
+1896
+1897
+1898
+1899
+1900
+1901
+1902
+1903
+1904
+1905
+1906
+1907
+1908
+1909
+1910
+1911
+1912
+1913
+1914
+1915
+1916
+1917
+1918
+1919
+1920
+1921
+1922
+1923
+1924
+1925
+1926
+1927
+1928
+1929
+1930
+1931
+1932
+1933
+1934
+1935
+1936
+1937
+1938
+1939
+1940
+1941
+1942
+1943
+1944
+1945
+1946
+1947
+1948
+1949
+1950
+1951
+1952
+1953
+1954
+1955
+1956
+1957
+1958
+1959
+1960
+1961
+1962
+1963
+1964
+1965
+1966
+1967
+1968
+1969
+1970
+1971
+1972
+1973
+1974
+1975
+1976
+1977
+1978
+1979
+1980
+1981
+1982
+1983
+1984
+1985
+1986
+1987
+1988
+1989
+1990
+1991
+1992
+1993
+1994
+1995
+1996
+1997
+1998
+1999
+2000
+2001
+2002
+2003
+2004
+2005
+2006
+2007
+2008
+2009
+2010
+2011
+2012
+2013
+2014
+2015
+2016
+2017
+2018
+2019
+2020
+2021
+2022
+2023
+2024
+2025
+2026
+
// auto-generated: "lalrpop 0.20.0"
+// sha3: 592663f5597c21f4cc9cb3ad5cb93fa0a7db3635fc4d677c2b6130d33b6e22fd
+use crate::ValueAccessor;
+use crate::parser::lambda_parser::RawLambdaAST;
+use crate::Functor;
+use crate::parser::lexer::LexerError;
+use crate::parser::lexer::Token;
+use lalrpop_util::ErrorRecovery;
+#[allow(unused_extern_crates)]
+extern crate lalrpop_util as __lalrpop_util;
+#[allow(unused_imports)]
+use self::__lalrpop_util::state_machine as __state_machine;
+extern crate core;
+extern crate alloc;
+
+#[rustfmt::skip]
+#[allow(non_snake_case, non_camel_case_types, unused_mut, unused_variables, unused_imports, unused_parens, clippy::all)]
+mod __parse__RawLambdaAST {
+
+    use crate::ValueAccessor;
+    use crate::parser::lambda_parser::RawLambdaAST;
+    use crate::Functor;
+    use crate::parser::lexer::LexerError;
+    use crate::parser::lexer::Token;
+    use lalrpop_util::ErrorRecovery;
+    #[allow(unused_extern_crates)]
+    extern crate lalrpop_util as __lalrpop_util;
+    #[allow(unused_imports)]
+    use self::__lalrpop_util::state_machine as __state_machine;
+    extern crate core;
+    extern crate alloc;
+    use super::__ToTriple;
+    #[allow(dead_code)]
+    pub(crate) enum __Symbol<'input>
+     {
+        Variant0(Token<'input>),
+        Variant1(u32),
+        Variant2(&'input str),
+        Variant3(__lalrpop_util::ErrorRecovery<usize, Token<'input>, LexerError>),
+        Variant4(core::option::Option<Token<'input>>),
+        Variant5(RawLambdaAST<'input>),
+        Variant6(ValueAccessor<'input>),
+        Variant7(alloc::vec::Vec<ValueAccessor<'input>>),
+    }
+    const __ACTION: &[i8] = &[
+        // State 0
+        0, 0, 2, 0, 0, 5, 0, 0, 6,
+        // State 1
+        0, 8, 0, 9, 0, 0, 0, 0, 10,
+        // State 2
+        0, 8, 0, 9, 0, 0, 0, 0, 10,
+        // State 3
+        0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 4
+        0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 5
+        0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 6
+        0, -22, 0, -22, 0, 0, 0, 0, -22,
+        // State 7
+        0, 0, 0, 12, 0, 0, 0, 13, 0,
+        // State 8
+        0, 0, 0, 0, 0, 0, 14, 15, 0,
+        // State 9
+        0, -19, 0, -19, 0, 0, 0, 0, -19,
+        // State 10
+        0, -23, 0, -23, 0, 0, 0, 0, -23,
+        // State 11
+        0, 0, 0, 0, 0, 0, 16, 17, 0,
+        // State 12
+        18, -18, 0, -18, 0, 0, 0, 0, -18,
+        // State 13
+        0, 0, 0, 0, 19, 0, 0, 0, 0,
+        // State 14
+        0, 0, 0, 0, 20, 0, 0, 0, 0,
+        // State 15
+        0, 0, 0, 0, 21, 0, 0, 0, 0,
+        // State 16
+        0, 0, 0, 0, 22, 0, 0, 0, 0,
+        // State 17
+        0, -17, 0, -17, 0, 0, 0, 0, -17,
+        // State 18
+        23, -12, 0, -12, 0, 0, 0, 0, -12,
+        // State 19
+        24, -16, 0, -16, 0, 0, 0, 0, -16,
+        // State 20
+        25, -11, 0, -11, 0, 0, 0, 0, -11,
+        // State 21
+        26, -15, 0, -15, 0, 0, 0, 0, -15,
+        // State 22
+        0, -10, 0, -10, 0, 0, 0, 0, -10,
+        // State 23
+        0, -14, 0, -14, 0, 0, 0, 0, -14,
+        // State 24
+        0, -9, 0, -9, 0, 0, 0, 0, -9,
+        // State 25
+        0, -13, 0, -13, 0, 0, 0, 0, -13,
+    ];
+    fn __action(state: i8, integer: usize) -> i8 {
+        __ACTION[(state as usize) * 9 + integer]
+    }
+    const __EOF_ACTION: &[i8] = &[
+        // State 0
+        0,
+        // State 1
+        -5,
+        // State 2
+        -6,
+        // State 3
+        -24,
+        // State 4
+        -7,
+        // State 5
+        -8,
+        // State 6
+        -22,
+        // State 7
+        0,
+        // State 8
+        0,
+        // State 9
+        -19,
+        // State 10
+        -23,
+        // State 11
+        0,
+        // State 12
+        -18,
+        // State 13
+        0,
+        // State 14
+        0,
+        // State 15
+        0,
+        // State 16
+        0,
+        // State 17
+        -17,
+        // State 18
+        -12,
+        // State 19
+        -16,
+        // State 20
+        -11,
+        // State 21
+        -15,
+        // State 22
+        -10,
+        // State 23
+        -14,
+        // State 24
+        -9,
+        // State 25
+        -13,
+    ];
+    fn __goto(state: i8, nt: usize) -> i8 {
+        match nt {
+            2 => 3,
+            3 => match state {
+                2 => 10,
+                _ => 6,
+            },
+            5 => 2,
+            _ => 0,
+        }
+    }
+    const __TERMINAL: &[&str] = &[
+        r###""!""###,
+        r###"".""###,
+        r###"".$""###,
+        r###""[""###,
+        r###""]""###,
+        r###"length_functor"###,
+        r###"number_accessor"###,
+        r###"string_accessor"###,
+    ];
+    fn __expected_tokens(__state: i8) -> alloc::vec::Vec<alloc::string::String> {
+        __TERMINAL.iter().enumerate().filter_map(|(index, terminal)| {
+            let next_state = __action(__state, index);
+            if next_state == 0 {
+                None
+            } else {
+                Some(alloc::string::ToString::to_string(terminal))
+            }
+        }).collect()
+    }
+    fn __expected_tokens_from_states<
+        'err,
+        'input,
+    >(
+        __states: &[i8],
+        _: core::marker::PhantomData<(&'err (), &'input ())>,
+    ) -> alloc::vec::Vec<alloc::string::String>
+    where
+        'input: 'err,
+    {
+        __TERMINAL.iter().enumerate().filter_map(|(index, terminal)| {
+            if __accepts(None, __states, Some(index), core::marker::PhantomData::<(&(), &())>) {
+                Some(alloc::string::ToString::to_string(terminal))
+            } else {
+                None
+            }
+        }).collect()
+    }
+    pub(crate) struct __StateMachine<'err, 'input>
+    where 'input: 'err
+    {
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<usize, Token<'input>, LexerError>>,
+        __phantom: core::marker::PhantomData<(&'err (), &'input ())>,
+    }
+    impl<'err, 'input> __state_machine::ParserDefinition for __StateMachine<'err, 'input>
+    where 'input: 'err
+    {
+        type Location = usize;
+        type Error = LexerError;
+        type Token = Token<'input>;
+        type TokenIndex = usize;
+        type Symbol = __Symbol<'input>;
+        type Success = RawLambdaAST<'input>;
+        type StateIndex = i8;
+        type Action = i8;
+        type ReduceIndex = i8;
+        type NonterminalIndex = usize;
+
+        #[inline]
+        fn start_location(&self) -> Self::Location {
+              Default::default()
+        }
+
+        #[inline]
+        fn start_state(&self) -> Self::StateIndex {
+              0
+        }
+
+        #[inline]
+        fn token_to_index(&self, token: &Self::Token) -> Option<usize> {
+            __token_to_integer(token, core::marker::PhantomData::<(&(), &())>)
+        }
+
+        #[inline]
+        fn action(&self, state: i8, integer: usize) -> i8 {
+            __action(state, integer)
+        }
+
+        #[inline]
+        fn error_action(&self, state: i8) -> i8 {
+            __action(state, 9 - 1)
+        }
+
+        #[inline]
+        fn eof_action(&self, state: i8) -> i8 {
+            __EOF_ACTION[state as usize]
+        }
+
+        #[inline]
+        fn goto(&self, state: i8, nt: usize) -> i8 {
+            __goto(state, nt)
+        }
+
+        fn token_to_symbol(&self, token_index: usize, token: Self::Token) -> Self::Symbol {
+            __token_to_symbol(token_index, token, core::marker::PhantomData::<(&(), &())>)
+        }
+
+        fn expected_tokens(&self, state: i8) -> alloc::vec::Vec<alloc::string::String> {
+            __expected_tokens(state)
+        }
+
+        fn expected_tokens_from_states(&self, states: &[i8]) -> alloc::vec::Vec<alloc::string::String> {
+            __expected_tokens_from_states(states, core::marker::PhantomData::<(&(), &())>)
+        }
+
+        #[inline]
+        fn uses_error_recovery(&self) -> bool {
+            true
+        }
+
+        #[inline]
+        fn error_recovery_symbol(
+            &self,
+            recovery: __state_machine::ErrorRecovery<Self>,
+        ) -> Self::Symbol {
+            __Symbol::Variant3(recovery)
+        }
+
+        fn reduce(
+            &mut self,
+            action: i8,
+            start_location: Option<&Self::Location>,
+            states: &mut alloc::vec::Vec<i8>,
+            symbols: &mut alloc::vec::Vec<__state_machine::SymbolTriple<Self>>,
+        ) -> Option<__state_machine::ParseResult<Self>> {
+            __reduce(
+                self.input,
+                self.errors,
+                action,
+                start_location,
+                states,
+                symbols,
+                core::marker::PhantomData::<(&(), &())>,
+            )
+        }
+
+        fn simulate_reduce(&self, action: i8) -> __state_machine::SimulatedReduce<Self> {
+            __simulate_reduce(action, core::marker::PhantomData::<(&(), &())>)
+        }
+    }
+    fn __token_to_integer<
+        'err,
+        'input,
+    >(
+        __token: &Token<'input>,
+        _: core::marker::PhantomData<(&'err (), &'input ())>,
+    ) -> Option<usize>
+    {
+        match *__token {
+            Token::FlatteningSign if true => Some(0),
+            Token::ValuePathSelector if true => Some(1),
+            Token::ValuePathStarter if true => Some(2),
+            Token::OpenSquareBracket if true => Some(3),
+            Token::CloseSquareBracket if true => Some(4),
+            Token::LengthFunctor if true => Some(5),
+            Token::NumberAccessor(_) if true => Some(6),
+            Token::StringAccessor(_) if true => Some(7),
+            _ => None,
+        }
+    }
+    fn __token_to_symbol<
+        'err,
+        'input,
+    >(
+        __token_index: usize,
+        __token: Token<'input>,
+        _: core::marker::PhantomData<(&'err (), &'input ())>,
+    ) -> __Symbol<'input>
+    {
+        match __token_index {
+            0 | 1 | 2 | 3 | 4 | 5 => __Symbol::Variant0(__token),
+            6 => match __token {
+                Token::NumberAccessor(__tok0) if true => __Symbol::Variant1(__tok0),
+                _ => unreachable!(),
+            },
+            7 => match __token {
+                Token::StringAccessor(__tok0) if true => __Symbol::Variant2(__tok0),
+                _ => unreachable!(),
+            },
+            _ => unreachable!(),
+        }
+    }
+    fn __simulate_reduce<
+        'err,
+        'input,
+    >(
+        __reduce_index: i8,
+        _: core::marker::PhantomData<(&'err (), &'input ())>,
+    ) -> __state_machine::SimulatedReduce<__StateMachine<'err, 'input>>
+    where
+        'input: 'err,
+    {
+        match __reduce_index {
+            0 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 0,
+                }
+            }
+            1 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 0,
+                    nonterminal_produced: 0,
+                }
+            }
+            2 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 1,
+                }
+            }
+            3 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 0,
+                    nonterminal_produced: 1,
+                }
+            }
+            4 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 2,
+                }
+            }
+            5 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 2,
+                }
+            }
+            6 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 2,
+                }
+            }
+            7 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 2,
+                }
+            }
+            8 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 5,
+                    nonterminal_produced: 3,
+                }
+            }
+            9 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 4,
+                    nonterminal_produced: 3,
+                }
+            }
+            10 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 4,
+                    nonterminal_produced: 3,
+                }
+            }
+            11 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 3,
+                    nonterminal_produced: 3,
+                }
+            }
+            12 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 5,
+                    nonterminal_produced: 3,
+                }
+            }
+            13 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 4,
+                    nonterminal_produced: 3,
+                }
+            }
+            14 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 4,
+                    nonterminal_produced: 3,
+                }
+            }
+            15 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 3,
+                    nonterminal_produced: 3,
+                }
+            }
+            16 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 3,
+                    nonterminal_produced: 3,
+                }
+            }
+            17 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 3,
+                }
+            }
+            18 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 3,
+                }
+            }
+            19 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 0,
+                    nonterminal_produced: 4,
+                }
+            }
+            20 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 4,
+                }
+            }
+            21 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 5,
+                }
+            }
+            22 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 5,
+                }
+            }
+            23 => __state_machine::SimulatedReduce::Accept,
+            _ => panic!("invalid reduction index {}", __reduce_index)
+        }
+    }
+    pub(crate) struct RawLambdaASTParser {
+        _priv: (),
+    }
+
+    impl RawLambdaASTParser {
+        pub(crate) fn new() -> RawLambdaASTParser {
+            RawLambdaASTParser {
+                _priv: (),
+            }
+        }
+
+        #[allow(dead_code)]
+        pub(crate) fn parse<
+            'err,
+            'input,
+            __TOKEN: __ToTriple<'err, 'input, >,
+            __TOKENS: IntoIterator<Item=__TOKEN>,
+        >(
+            &self,
+            input: &'input str,
+            errors: &'err mut Vec<ErrorRecovery<usize, Token<'input>, LexerError>>,
+            __tokens0: __TOKENS,
+        ) -> Result<RawLambdaAST<'input>, __lalrpop_util::ParseError<usize, Token<'input>, LexerError>>
+        {
+            let __tokens = __tokens0.into_iter();
+            let mut __tokens = __tokens.map(|t| __ToTriple::to_triple(t));
+            __state_machine::Parser::drive(
+                __StateMachine {
+                    input,
+                    errors,
+                    __phantom: core::marker::PhantomData::<(&(), &())>,
+                },
+                __tokens,
+            )
+        }
+    }
+    fn __accepts<
+        'err,
+        'input,
+    >(
+        __error_state: Option<i8>,
+        __states: &[i8],
+        __opt_integer: Option<usize>,
+        _: core::marker::PhantomData<(&'err (), &'input ())>,
+    ) -> bool
+    where
+        'input: 'err,
+    {
+        let mut __states = __states.to_vec();
+        __states.extend(__error_state);
+        loop {
+            let mut __states_len = __states.len();
+            let __top = __states[__states_len - 1];
+            let __action = match __opt_integer {
+                None => __EOF_ACTION[__top as usize],
+                Some(__integer) => __action(__top, __integer),
+            };
+            if __action == 0 { return false; }
+            if __action > 0 { return true; }
+            let (__to_pop, __nt) = match __simulate_reduce(-(__action + 1), core::marker::PhantomData::<(&(), &())>) {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop, nonterminal_produced
+                } => (states_to_pop, nonterminal_produced),
+                __state_machine::SimulatedReduce::Accept => return true,
+            };
+            __states_len -= __to_pop;
+            __states.truncate(__states_len);
+            let __top = __states[__states_len - 1];
+            let __next_state = __goto(__top, __nt);
+            __states.push(__next_state);
+        }
+    }
+    pub(crate) fn __reduce<
+        'err,
+        'input,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<usize, Token<'input>, LexerError>>,
+        __action: i8,
+        __lookahead_start: Option<&usize>,
+        __states: &mut alloc::vec::Vec<i8>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'err (), &'input ())>,
+    ) -> Option<Result<RawLambdaAST<'input>,__lalrpop_util::ParseError<usize, Token<'input>, LexerError>>>
+    {
+        let (__pop_states, __nonterminal) = match __action {
+            0 => {
+                __reduce0(input, errors, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &())>)
+            }
+            1 => {
+                __reduce1(input, errors, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &())>)
+            }
+            2 => {
+                __reduce2(input, errors, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &())>)
+            }
+            3 => {
+                __reduce3(input, errors, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &())>)
+            }
+            4 => {
+                __reduce4(input, errors, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &())>)
+            }
+            5 => {
+                __reduce5(input, errors, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &())>)
+            }
+            6 => {
+                __reduce6(input, errors, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &())>)
+            }
+            7 => {
+                __reduce7(input, errors, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &())>)
+            }
+            8 => {
+                __reduce8(input, errors, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &())>)
+            }
+            9 => {
+                __reduce9(input, errors, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &())>)
+            }
+            10 => {
+                __reduce10(input, errors, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &())>)
+            }
+            11 => {
+                __reduce11(input, errors, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &())>)
+            }
+            12 => {
+                __reduce12(input, errors, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &())>)
+            }
+            13 => {
+                __reduce13(input, errors, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &())>)
+            }
+            14 => {
+                __reduce14(input, errors, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &())>)
+            }
+            15 => {
+                __reduce15(input, errors, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &())>)
+            }
+            16 => {
+                __reduce16(input, errors, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &())>)
+            }
+            17 => {
+                __reduce17(input, errors, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &())>)
+            }
+            18 => {
+                __reduce18(input, errors, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &())>)
+            }
+            19 => {
+                __reduce19(input, errors, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &())>)
+            }
+            20 => {
+                __reduce20(input, errors, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &())>)
+            }
+            21 => {
+                __reduce21(input, errors, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &())>)
+            }
+            22 => {
+                __reduce22(input, errors, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &())>)
+            }
+            23 => {
+                // __RawLambdaAST = RawLambdaAST => ActionFn(0);
+                let __sym0 = __pop_Variant5(__symbols);
+                let __start = __sym0.0;
+                let __end = __sym0.2;
+                let __nt = super::__action0::<>(input, errors, __sym0);
+                return Some(Ok(__nt));
+            }
+            _ => panic!("invalid action code {}", __action)
+        };
+        let __states_len = __states.len();
+        __states.truncate(__states_len - __pop_states);
+        let __state = *__states.last().unwrap();
+        let __next_state = __goto(__state, __nonterminal);
+        __states.push(__next_state);
+        None
+    }
+    #[inline(never)]
+    fn __symbol_type_mismatch() -> ! {
+        panic!("symbol type mismatch")
+    }
+    fn __pop_Variant5<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, RawLambdaAST<'input>, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant5(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant0<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, Token<'input>, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant0(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant6<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, ValueAccessor<'input>, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant6(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant3<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, __lalrpop_util::ErrorRecovery<usize, Token<'input>, LexerError>, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant3(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant7<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, alloc::vec::Vec<ValueAccessor<'input>>, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant7(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant4<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, core::option::Option<Token<'input>>, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant4(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant1<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, u32, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant1(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant2<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, &'input str, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant2(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    pub(crate) fn __reduce0<
+        'err,
+        'input,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<usize, Token<'input>, LexerError>>,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'err (), &'input ())>,
+    ) -> (usize, usize)
+    {
+        // "!"? = "!" => ActionFn(8);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action8::<>(input, errors, __sym0);
+        __symbols.push((__start, __Symbol::Variant4(__nt), __end));
+        (1, 0)
+    }
+    pub(crate) fn __reduce1<
+        'err,
+        'input,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<usize, Token<'input>, LexerError>>,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'err (), &'input ())>,
+    ) -> (usize, usize)
+    {
+        // "!"? =  => ActionFn(9);
+        let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default();
+        let __end = __start.clone();
+        let __nt = super::__action9::<>(input, errors, &__start, &__end);
+        __symbols.push((__start, __Symbol::Variant4(__nt), __end));
+        (0, 0)
+    }
+    pub(crate) fn __reduce2<
+        'err,
+        'input,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<usize, Token<'input>, LexerError>>,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'err (), &'input ())>,
+    ) -> (usize, usize)
+    {
+        // "."? = "." => ActionFn(10);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action10::<>(input, errors, __sym0);
+        __symbols.push((__start, __Symbol::Variant4(__nt), __end));
+        (1, 1)
+    }
+    pub(crate) fn __reduce3<
+        'err,
+        'input,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<usize, Token<'input>, LexerError>>,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'err (), &'input ())>,
+    ) -> (usize, usize)
+    {
+        // "."? =  => ActionFn(11);
+        let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default();
+        let __end = __start.clone();
+        let __nt = super::__action11::<>(input, errors, &__start, &__end);
+        __symbols.push((__start, __Symbol::Variant4(__nt), __end));
+        (0, 1)
+    }
+    pub(crate) fn __reduce4<
+        'err,
+        'input,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<usize, Token<'input>, LexerError>>,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'err (), &'input ())>,
+    ) -> (usize, usize)
+    {
+        // RawLambdaAST = ".$" => ActionFn(30);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action30::<>(input, errors, __sym0);
+        __symbols.push((__start, __Symbol::Variant5(__nt), __end));
+        (1, 2)
+    }
+    pub(crate) fn __reduce5<
+        'err,
+        'input,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<usize, Token<'input>, LexerError>>,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'err (), &'input ())>,
+    ) -> (usize, usize)
+    {
+        // RawLambdaAST = ".$", ValueAccessor+ => ActionFn(31);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant7(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action31::<>(input, errors, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant5(__nt), __end));
+        (2, 2)
+    }
+    pub(crate) fn __reduce6<
+        'err,
+        'input,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<usize, Token<'input>, LexerError>>,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'err (), &'input ())>,
+    ) -> (usize, usize)
+    {
+        // RawLambdaAST = length_functor => ActionFn(2);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action2::<>(input, errors, __sym0);
+        __symbols.push((__start, __Symbol::Variant5(__nt), __end));
+        (1, 2)
+    }
+    pub(crate) fn __reduce7<
+        'err,
+        'input,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<usize, Token<'input>, LexerError>>,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'err (), &'input ())>,
+    ) -> (usize, usize)
+    {
+        // RawLambdaAST = error => ActionFn(3);
+        let __sym0 = __pop_Variant3(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action3::<>(input, errors, __sym0);
+        __symbols.push((__start, __Symbol::Variant5(__nt), __end));
+        (1, 2)
+    }
+    pub(crate) fn __reduce8<
+        'err,
+        'input,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<usize, Token<'input>, LexerError>>,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'err (), &'input ())>,
+    ) -> (usize, usize)
+    {
+        // ValueAccessor = ".", "[", number_accessor, "]", "!" => ActionFn(22);
+        assert!(__symbols.len() >= 5);
+        let __sym4 = __pop_Variant0(__symbols);
+        let __sym3 = __pop_Variant0(__symbols);
+        let __sym2 = __pop_Variant1(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym4.2;
+        let __nt = super::__action22::<>(input, errors, __sym0, __sym1, __sym2, __sym3, __sym4);
+        __symbols.push((__start, __Symbol::Variant6(__nt), __end));
+        (5, 3)
+    }
+    pub(crate) fn __reduce9<
+        'err,
+        'input,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<usize, Token<'input>, LexerError>>,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'err (), &'input ())>,
+    ) -> (usize, usize)
+    {
+        // ValueAccessor = "[", number_accessor, "]", "!" => ActionFn(23);
+        assert!(__symbols.len() >= 4);
+        let __sym3 = __pop_Variant0(__symbols);
+        let __sym2 = __pop_Variant0(__symbols);
+        let __sym1 = __pop_Variant1(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym3.2;
+        let __nt = super::__action23::<>(input, errors, __sym0, __sym1, __sym2, __sym3);
+        __symbols.push((__start, __Symbol::Variant6(__nt), __end));
+        (4, 3)
+    }
+    pub(crate) fn __reduce10<
+        'err,
+        'input,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<usize, Token<'input>, LexerError>>,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'err (), &'input ())>,
+    ) -> (usize, usize)
+    {
+        // ValueAccessor = ".", "[", number_accessor, "]" => ActionFn(24);
+        assert!(__symbols.len() >= 4);
+        let __sym3 = __pop_Variant0(__symbols);
+        let __sym2 = __pop_Variant1(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym3.2;
+        let __nt = super::__action24::<>(input, errors, __sym0, __sym1, __sym2, __sym3);
+        __symbols.push((__start, __Symbol::Variant6(__nt), __end));
+        (4, 3)
+    }
+    pub(crate) fn __reduce11<
+        'err,
+        'input,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<usize, Token<'input>, LexerError>>,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'err (), &'input ())>,
+    ) -> (usize, usize)
+    {
+        // ValueAccessor = "[", number_accessor, "]" => ActionFn(25);
+        assert!(__symbols.len() >= 3);
+        let __sym2 = __pop_Variant0(__symbols);
+        let __sym1 = __pop_Variant1(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym2.2;
+        let __nt = super::__action25::<>(input, errors, __sym0, __sym1, __sym2);
+        __symbols.push((__start, __Symbol::Variant6(__nt), __end));
+        (3, 3)
+    }
+    pub(crate) fn __reduce12<
+        'err,
+        'input,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<usize, Token<'input>, LexerError>>,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'err (), &'input ())>,
+    ) -> (usize, usize)
+    {
+        // ValueAccessor = ".", "[", string_accessor, "]", "!" => ActionFn(26);
+        assert!(__symbols.len() >= 5);
+        let __sym4 = __pop_Variant0(__symbols);
+        let __sym3 = __pop_Variant0(__symbols);
+        let __sym2 = __pop_Variant2(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym4.2;
+        let __nt = super::__action26::<>(input, errors, __sym0, __sym1, __sym2, __sym3, __sym4);
+        __symbols.push((__start, __Symbol::Variant6(__nt), __end));
+        (5, 3)
+    }
+    pub(crate) fn __reduce13<
+        'err,
+        'input,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<usize, Token<'input>, LexerError>>,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'err (), &'input ())>,
+    ) -> (usize, usize)
+    {
+        // ValueAccessor = "[", string_accessor, "]", "!" => ActionFn(27);
+        assert!(__symbols.len() >= 4);
+        let __sym3 = __pop_Variant0(__symbols);
+        let __sym2 = __pop_Variant0(__symbols);
+        let __sym1 = __pop_Variant2(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym3.2;
+        let __nt = super::__action27::<>(input, errors, __sym0, __sym1, __sym2, __sym3);
+        __symbols.push((__start, __Symbol::Variant6(__nt), __end));
+        (4, 3)
+    }
+    pub(crate) fn __reduce14<
+        'err,
+        'input,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<usize, Token<'input>, LexerError>>,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'err (), &'input ())>,
+    ) -> (usize, usize)
+    {
+        // ValueAccessor = ".", "[", string_accessor, "]" => ActionFn(28);
+        assert!(__symbols.len() >= 4);
+        let __sym3 = __pop_Variant0(__symbols);
+        let __sym2 = __pop_Variant2(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym3.2;
+        let __nt = super::__action28::<>(input, errors, __sym0, __sym1, __sym2, __sym3);
+        __symbols.push((__start, __Symbol::Variant6(__nt), __end));
+        (4, 3)
+    }
+    pub(crate) fn __reduce15<
+        'err,
+        'input,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<usize, Token<'input>, LexerError>>,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'err (), &'input ())>,
+    ) -> (usize, usize)
+    {
+        // ValueAccessor = "[", string_accessor, "]" => ActionFn(29);
+        assert!(__symbols.len() >= 3);
+        let __sym2 = __pop_Variant0(__symbols);
+        let __sym1 = __pop_Variant2(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym2.2;
+        let __nt = super::__action29::<>(input, errors, __sym0, __sym1, __sym2);
+        __symbols.push((__start, __Symbol::Variant6(__nt), __end));
+        (3, 3)
+    }
+    pub(crate) fn __reduce16<
+        'err,
+        'input,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<usize, Token<'input>, LexerError>>,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'err (), &'input ())>,
+    ) -> (usize, usize)
+    {
+        // ValueAccessor = ".", string_accessor, "!" => ActionFn(20);
+        assert!(__symbols.len() >= 3);
+        let __sym2 = __pop_Variant0(__symbols);
+        let __sym1 = __pop_Variant2(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym2.2;
+        let __nt = super::__action20::<>(input, errors, __sym0, __sym1, __sym2);
+        __symbols.push((__start, __Symbol::Variant6(__nt), __end));
+        (3, 3)
+    }
+    pub(crate) fn __reduce17<
+        'err,
+        'input,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<usize, Token<'input>, LexerError>>,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'err (), &'input ())>,
+    ) -> (usize, usize)
+    {
+        // ValueAccessor = ".", string_accessor => ActionFn(21);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant2(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action21::<>(input, errors, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant6(__nt), __end));
+        (2, 3)
+    }
+    pub(crate) fn __reduce18<
+        'err,
+        'input,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<usize, Token<'input>, LexerError>>,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'err (), &'input ())>,
+    ) -> (usize, usize)
+    {
+        // ValueAccessor = error => ActionFn(7);
+        let __sym0 = __pop_Variant3(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action7::<>(input, errors, __sym0);
+        __symbols.push((__start, __Symbol::Variant6(__nt), __end));
+        (1, 3)
+    }
+    pub(crate) fn __reduce19<
+        'err,
+        'input,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<usize, Token<'input>, LexerError>>,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'err (), &'input ())>,
+    ) -> (usize, usize)
+    {
+        // ValueAccessor* =  => ActionFn(12);
+        let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default();
+        let __end = __start.clone();
+        let __nt = super::__action12::<>(input, errors, &__start, &__end);
+        __symbols.push((__start, __Symbol::Variant7(__nt), __end));
+        (0, 4)
+    }
+    pub(crate) fn __reduce20<
+        'err,
+        'input,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<usize, Token<'input>, LexerError>>,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'err (), &'input ())>,
+    ) -> (usize, usize)
+    {
+        // ValueAccessor* = ValueAccessor+ => ActionFn(13);
+        let __sym0 = __pop_Variant7(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action13::<>(input, errors, __sym0);
+        __symbols.push((__start, __Symbol::Variant7(__nt), __end));
+        (1, 4)
+    }
+    pub(crate) fn __reduce21<
+        'err,
+        'input,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<usize, Token<'input>, LexerError>>,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'err (), &'input ())>,
+    ) -> (usize, usize)
+    {
+        // ValueAccessor+ = ValueAccessor => ActionFn(14);
+        let __sym0 = __pop_Variant6(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action14::<>(input, errors, __sym0);
+        __symbols.push((__start, __Symbol::Variant7(__nt), __end));
+        (1, 5)
+    }
+    pub(crate) fn __reduce22<
+        'err,
+        'input,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<usize, Token<'input>, LexerError>>,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'err (), &'input ())>,
+    ) -> (usize, usize)
+    {
+        // ValueAccessor+ = ValueAccessor+, ValueAccessor => ActionFn(15);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant6(__symbols);
+        let __sym0 = __pop_Variant7(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action15::<>(input, errors, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant7(__nt), __end));
+        (2, 5)
+    }
+}
+pub(crate) use self::__parse__RawLambdaAST::RawLambdaASTParser;
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action0<
+    'err,
+    'input,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<usize, Token<'input>, LexerError>>,
+    (_, __0, _): (usize, RawLambdaAST<'input>, usize),
+) -> RawLambdaAST<'input>
+{
+    __0
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action1<
+    'err,
+    'input,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<usize, Token<'input>, LexerError>>,
+    (_, value_path_starter, _): (usize, Token<'input>, usize),
+    (_, accessors, _): (usize, alloc::vec::Vec<ValueAccessor<'input>>, usize),
+) -> RawLambdaAST<'input>
+{
+    RawLambdaAST::ValuePath(accessors)
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action2<
+    'err,
+    'input,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<usize, Token<'input>, LexerError>>,
+    (_, __0, _): (usize, Token<'input>, usize),
+) -> RawLambdaAST<'input>
+{
+    RawLambdaAST::Functor(Functor::Length)
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action3<
+    'err,
+    'input,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<usize, Token<'input>, LexerError>>,
+    (_, __0, _): (usize, __lalrpop_util::ErrorRecovery<usize, Token<'input>, LexerError>, usize),
+) -> RawLambdaAST<'input>
+{
+    { errors.push(__0); RawLambdaAST::Error }
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action4<
+    'err,
+    'input,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<usize, Token<'input>, LexerError>>,
+    (_, maybe_dot_selector, _): (usize, core::option::Option<Token<'input>>, usize),
+    (_, _, _): (usize, Token<'input>, usize),
+    (_, idx, _): (usize, u32, usize),
+    (_, _, _): (usize, Token<'input>, usize),
+    (_, maybe_flatten_sign, _): (usize, core::option::Option<Token<'input>>, usize),
+) -> ValueAccessor<'input>
+{
+    {
+        ValueAccessor::ArrayAccess { idx }
+    }
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action5<
+    'err,
+    'input,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<usize, Token<'input>, LexerError>>,
+    (_, maybe_dot_selector, _): (usize, core::option::Option<Token<'input>>, usize),
+    (_, _, _): (usize, Token<'input>, usize),
+    (_, scalar_name, _): (usize, &'input str, usize),
+    (_, _, _): (usize, Token<'input>, usize),
+    (_, maybe_flatten_sign, _): (usize, core::option::Option<Token<'input>>, usize),
+) -> ValueAccessor<'input>
+{
+    {
+        ValueAccessor::FieldAccessByScalar { scalar_name }
+    }
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action6<
+    'err,
+    'input,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<usize, Token<'input>, LexerError>>,
+    (_, _, _): (usize, Token<'input>, usize),
+    (_, field_name, _): (usize, &'input str, usize),
+    (_, maybe_flatten_sign, _): (usize, core::option::Option<Token<'input>>, usize),
+) -> ValueAccessor<'input>
+{
+    {
+        ValueAccessor::FieldAccessByName { field_name }
+    }
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action7<
+    'err,
+    'input,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<usize, Token<'input>, LexerError>>,
+    (_, __0, _): (usize, __lalrpop_util::ErrorRecovery<usize, Token<'input>, LexerError>, usize),
+) -> ValueAccessor<'input>
+{
+    { errors.push(__0); ValueAccessor::Error }
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action8<
+    'err,
+    'input,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<usize, Token<'input>, LexerError>>,
+    (_, __0, _): (usize, Token<'input>, usize),
+) -> core::option::Option<Token<'input>>
+{
+    Some(__0)
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action9<
+    'err,
+    'input,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<usize, Token<'input>, LexerError>>,
+    __lookbehind: &usize,
+    __lookahead: &usize,
+) -> core::option::Option<Token<'input>>
+{
+    None
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action10<
+    'err,
+    'input,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<usize, Token<'input>, LexerError>>,
+    (_, __0, _): (usize, Token<'input>, usize),
+) -> core::option::Option<Token<'input>>
+{
+    Some(__0)
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action11<
+    'err,
+    'input,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<usize, Token<'input>, LexerError>>,
+    __lookbehind: &usize,
+    __lookahead: &usize,
+) -> core::option::Option<Token<'input>>
+{
+    None
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action12<
+    'err,
+    'input,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<usize, Token<'input>, LexerError>>,
+    __lookbehind: &usize,
+    __lookahead: &usize,
+) -> alloc::vec::Vec<ValueAccessor<'input>>
+{
+    alloc::vec![]
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action13<
+    'err,
+    'input,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<usize, Token<'input>, LexerError>>,
+    (_, v, _): (usize, alloc::vec::Vec<ValueAccessor<'input>>, usize),
+) -> alloc::vec::Vec<ValueAccessor<'input>>
+{
+    v
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action14<
+    'err,
+    'input,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<usize, Token<'input>, LexerError>>,
+    (_, __0, _): (usize, ValueAccessor<'input>, usize),
+) -> alloc::vec::Vec<ValueAccessor<'input>>
+{
+    alloc::vec![__0]
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action15<
+    'err,
+    'input,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<usize, Token<'input>, LexerError>>,
+    (_, v, _): (usize, alloc::vec::Vec<ValueAccessor<'input>>, usize),
+    (_, e, _): (usize, ValueAccessor<'input>, usize),
+) -> alloc::vec::Vec<ValueAccessor<'input>>
+{
+    { let mut v = v; v.push(e); v }
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action16<
+    'err,
+    'input,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<usize, Token<'input>, LexerError>>,
+    __0: (usize, core::option::Option<Token<'input>>, usize),
+    __1: (usize, Token<'input>, usize),
+    __2: (usize, u32, usize),
+    __3: (usize, Token<'input>, usize),
+    __4: (usize, Token<'input>, usize),
+) -> ValueAccessor<'input>
+{
+    let __start0 = __4.0;
+    let __end0 = __4.2;
+    let __temp0 = __action8(
+        input,
+        errors,
+        __4,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action4(
+        input,
+        errors,
+        __0,
+        __1,
+        __2,
+        __3,
+        __temp0,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action17<
+    'err,
+    'input,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<usize, Token<'input>, LexerError>>,
+    __0: (usize, core::option::Option<Token<'input>>, usize),
+    __1: (usize, Token<'input>, usize),
+    __2: (usize, u32, usize),
+    __3: (usize, Token<'input>, usize),
+) -> ValueAccessor<'input>
+{
+    let __start0 = __3.2;
+    let __end0 = __3.2;
+    let __temp0 = __action9(
+        input,
+        errors,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action4(
+        input,
+        errors,
+        __0,
+        __1,
+        __2,
+        __3,
+        __temp0,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action18<
+    'err,
+    'input,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<usize, Token<'input>, LexerError>>,
+    __0: (usize, core::option::Option<Token<'input>>, usize),
+    __1: (usize, Token<'input>, usize),
+    __2: (usize, &'input str, usize),
+    __3: (usize, Token<'input>, usize),
+    __4: (usize, Token<'input>, usize),
+) -> ValueAccessor<'input>
+{
+    let __start0 = __4.0;
+    let __end0 = __4.2;
+    let __temp0 = __action8(
+        input,
+        errors,
+        __4,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action5(
+        input,
+        errors,
+        __0,
+        __1,
+        __2,
+        __3,
+        __temp0,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action19<
+    'err,
+    'input,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<usize, Token<'input>, LexerError>>,
+    __0: (usize, core::option::Option<Token<'input>>, usize),
+    __1: (usize, Token<'input>, usize),
+    __2: (usize, &'input str, usize),
+    __3: (usize, Token<'input>, usize),
+) -> ValueAccessor<'input>
+{
+    let __start0 = __3.2;
+    let __end0 = __3.2;
+    let __temp0 = __action9(
+        input,
+        errors,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action5(
+        input,
+        errors,
+        __0,
+        __1,
+        __2,
+        __3,
+        __temp0,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action20<
+    'err,
+    'input,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<usize, Token<'input>, LexerError>>,
+    __0: (usize, Token<'input>, usize),
+    __1: (usize, &'input str, usize),
+    __2: (usize, Token<'input>, usize),
+) -> ValueAccessor<'input>
+{
+    let __start0 = __2.0;
+    let __end0 = __2.2;
+    let __temp0 = __action8(
+        input,
+        errors,
+        __2,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action6(
+        input,
+        errors,
+        __0,
+        __1,
+        __temp0,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action21<
+    'err,
+    'input,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<usize, Token<'input>, LexerError>>,
+    __0: (usize, Token<'input>, usize),
+    __1: (usize, &'input str, usize),
+) -> ValueAccessor<'input>
+{
+    let __start0 = __1.2;
+    let __end0 = __1.2;
+    let __temp0 = __action9(
+        input,
+        errors,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action6(
+        input,
+        errors,
+        __0,
+        __1,
+        __temp0,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action22<
+    'err,
+    'input,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<usize, Token<'input>, LexerError>>,
+    __0: (usize, Token<'input>, usize),
+    __1: (usize, Token<'input>, usize),
+    __2: (usize, u32, usize),
+    __3: (usize, Token<'input>, usize),
+    __4: (usize, Token<'input>, usize),
+) -> ValueAccessor<'input>
+{
+    let __start0 = __0.0;
+    let __end0 = __0.2;
+    let __temp0 = __action10(
+        input,
+        errors,
+        __0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action16(
+        input,
+        errors,
+        __temp0,
+        __1,
+        __2,
+        __3,
+        __4,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action23<
+    'err,
+    'input,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<usize, Token<'input>, LexerError>>,
+    __0: (usize, Token<'input>, usize),
+    __1: (usize, u32, usize),
+    __2: (usize, Token<'input>, usize),
+    __3: (usize, Token<'input>, usize),
+) -> ValueAccessor<'input>
+{
+    let __start0 = __0.0;
+    let __end0 = __0.0;
+    let __temp0 = __action11(
+        input,
+        errors,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action16(
+        input,
+        errors,
+        __temp0,
+        __0,
+        __1,
+        __2,
+        __3,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action24<
+    'err,
+    'input,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<usize, Token<'input>, LexerError>>,
+    __0: (usize, Token<'input>, usize),
+    __1: (usize, Token<'input>, usize),
+    __2: (usize, u32, usize),
+    __3: (usize, Token<'input>, usize),
+) -> ValueAccessor<'input>
+{
+    let __start0 = __0.0;
+    let __end0 = __0.2;
+    let __temp0 = __action10(
+        input,
+        errors,
+        __0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action17(
+        input,
+        errors,
+        __temp0,
+        __1,
+        __2,
+        __3,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action25<
+    'err,
+    'input,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<usize, Token<'input>, LexerError>>,
+    __0: (usize, Token<'input>, usize),
+    __1: (usize, u32, usize),
+    __2: (usize, Token<'input>, usize),
+) -> ValueAccessor<'input>
+{
+    let __start0 = __0.0;
+    let __end0 = __0.0;
+    let __temp0 = __action11(
+        input,
+        errors,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action17(
+        input,
+        errors,
+        __temp0,
+        __0,
+        __1,
+        __2,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action26<
+    'err,
+    'input,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<usize, Token<'input>, LexerError>>,
+    __0: (usize, Token<'input>, usize),
+    __1: (usize, Token<'input>, usize),
+    __2: (usize, &'input str, usize),
+    __3: (usize, Token<'input>, usize),
+    __4: (usize, Token<'input>, usize),
+) -> ValueAccessor<'input>
+{
+    let __start0 = __0.0;
+    let __end0 = __0.2;
+    let __temp0 = __action10(
+        input,
+        errors,
+        __0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action18(
+        input,
+        errors,
+        __temp0,
+        __1,
+        __2,
+        __3,
+        __4,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action27<
+    'err,
+    'input,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<usize, Token<'input>, LexerError>>,
+    __0: (usize, Token<'input>, usize),
+    __1: (usize, &'input str, usize),
+    __2: (usize, Token<'input>, usize),
+    __3: (usize, Token<'input>, usize),
+) -> ValueAccessor<'input>
+{
+    let __start0 = __0.0;
+    let __end0 = __0.0;
+    let __temp0 = __action11(
+        input,
+        errors,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action18(
+        input,
+        errors,
+        __temp0,
+        __0,
+        __1,
+        __2,
+        __3,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action28<
+    'err,
+    'input,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<usize, Token<'input>, LexerError>>,
+    __0: (usize, Token<'input>, usize),
+    __1: (usize, Token<'input>, usize),
+    __2: (usize, &'input str, usize),
+    __3: (usize, Token<'input>, usize),
+) -> ValueAccessor<'input>
+{
+    let __start0 = __0.0;
+    let __end0 = __0.2;
+    let __temp0 = __action10(
+        input,
+        errors,
+        __0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action19(
+        input,
+        errors,
+        __temp0,
+        __1,
+        __2,
+        __3,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action29<
+    'err,
+    'input,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<usize, Token<'input>, LexerError>>,
+    __0: (usize, Token<'input>, usize),
+    __1: (usize, &'input str, usize),
+    __2: (usize, Token<'input>, usize),
+) -> ValueAccessor<'input>
+{
+    let __start0 = __0.0;
+    let __end0 = __0.0;
+    let __temp0 = __action11(
+        input,
+        errors,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action19(
+        input,
+        errors,
+        __temp0,
+        __0,
+        __1,
+        __2,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action30<
+    'err,
+    'input,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<usize, Token<'input>, LexerError>>,
+    __0: (usize, Token<'input>, usize),
+) -> RawLambdaAST<'input>
+{
+    let __start0 = __0.2;
+    let __end0 = __0.2;
+    let __temp0 = __action12(
+        input,
+        errors,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action1(
+        input,
+        errors,
+        __0,
+        __temp0,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action31<
+    'err,
+    'input,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<usize, Token<'input>, LexerError>>,
+    __0: (usize, Token<'input>, usize),
+    __1: (usize, alloc::vec::Vec<ValueAccessor<'input>>, usize),
+) -> RawLambdaAST<'input>
+{
+    let __start0 = __1.0;
+    let __end0 = __1.2;
+    let __temp0 = __action13(
+        input,
+        errors,
+        __1,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action1(
+        input,
+        errors,
+        __0,
+        __temp0,
+    )
+}
+#[allow(clippy::type_complexity)]
+
+pub trait __ToTriple<'err, 'input, >
+{
+    fn to_triple(value: Self) -> Result<(usize,Token<'input>,usize), __lalrpop_util::ParseError<usize, Token<'input>, LexerError>>;
+}
+
+impl<'err, 'input, > __ToTriple<'err, 'input, > for (usize, Token<'input>, usize)
+{
+    fn to_triple(value: Self) -> Result<(usize,Token<'input>,usize), __lalrpop_util::ParseError<usize, Token<'input>, LexerError>> {
+        Ok(value)
+    }
+}
+impl<'err, 'input, > __ToTriple<'err, 'input, > for Result<(usize, Token<'input>, usize), LexerError>
+{
+    fn to_triple(value: Self) -> Result<(usize,Token<'input>,usize), __lalrpop_util::ParseError<usize, Token<'input>, LexerError>> {
+        match value {
+            Ok(v) => Ok(v),
+            Err(error) => Err(__lalrpop_util::ParseError::User { error }),
+        }
+    }
+}
+
\ No newline at end of file diff --git a/src/air_log_targets/lib.rs.html b/src/air_log_targets/lib.rs.html new file mode 100644 index 00000000..ff28dd1e --- /dev/null +++ b/src/air_log_targets/lib.rs.html @@ -0,0 +1,125 @@ +lib.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+/// Print out each instruction name at the beginning of its execution_step.
+pub const INSTRUCTION: &str = "instruction";
+
+/// Print out data cache at the beginning of each instruction execution_step.
+pub const DATA_CACHE: &str = "data_cache";
+
+/// Print out next_peer_pks at the beginning of each instruction execution_step.
+pub const NEXT_PEER_PKS: &str = "next_peer_pks";
+
+/// Print out subgraph_complete value at the beginning of each instruction execution_step.
+pub const SUBGRAPH_COMPLETE: &str = "subgraph_complete";
+
+/// Print out count of element in the current subgraph at the beginning of each instruction execution_step.
+pub const SUBGRAPH_ELEMENTS: &str = "subgraph_elements_count";
+
+/// Print out state of data cache at the beginning of each instruction execution_step.
+pub const NEW_EXECUTED_TRACE: &str = "new_executed_trace";
+
+/// Print out logs at the executed states merging stage.
+pub const EXECUTED_TRACE_MERGE: &str = "executed_trace_merge";
+
+/// Print out running arguments and params of a script.
+pub const RUN_PARAMS: &str = "initial_params";
+
+/// Print out state of data cache at the beginning of each instruction execution_step.
+pub const EXECUTED_STATE_CHANGING: &str = "executed_state_changing";
+
+/// Print log if call is postponed due the join behaviour.
+pub const JOIN_BEHAVIOUR: &str = "join_behaviour";
+
+/// This map should be used by rust-sdk logger that allows print only necessary targets by id.
+pub const TARGET_MAP: [(&str, i32); 10] = [
+    (INSTRUCTION, 1 << 1),
+    (DATA_CACHE, 1 << 2),
+    (NEXT_PEER_PKS, 1 << 3),
+    (SUBGRAPH_COMPLETE, 1 << 4),
+    (SUBGRAPH_ELEMENTS, 1 << 5),
+    (NEW_EXECUTED_TRACE, 1 << 6),
+    (EXECUTED_TRACE_MERGE, 1 << 7),
+    (RUN_PARAMS, 1 << 8),
+    (EXECUTED_STATE_CHANGING, 1 << 9),
+    (JOIN_BEHAVIOUR, 1 << 10),
+];
+
\ No newline at end of file diff --git a/src/air_parser/ast/instruction_arguments.rs.html b/src/air_parser/ast/instruction_arguments.rs.html new file mode 100644 index 00000000..c53a3e6b --- /dev/null +++ b/src/air_parser/ast/instruction_arguments.rs.html @@ -0,0 +1,339 @@ +instruction_arguments.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+mod impls;
+mod traits;
+
+use super::CanonStream;
+use super::CanonStreamMap;
+use super::CanonStreamMapWithLambda;
+use super::CanonStreamWithLambda;
+use super::ImmutableVariable;
+use super::ImmutableVariableWithLambda;
+use super::InstructionErrorAST;
+use super::Scalar;
+use super::ScalarWithLambda;
+use super::Stream;
+use super::StreamMap;
+
+use air_interpreter_value::JsonString;
+use air_lambda_ast::LambdaAST;
+
+use serde::Deserialize;
+use serde::Serialize;
+
+/// Contains all variable variants that could be resolved to a peer id.
+#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)]
+pub enum ResolvableToPeerIdVariable<'i> {
+    InitPeerId,
+    Literal(&'i str),
+    Scalar(Scalar<'i>),
+    ScalarWithLambda(ScalarWithLambda<'i>),
+    // canon without lambda can't be resolved to a string, since it represents an array of values
+    CanonStreamWithLambda(CanonStreamWithLambda<'i>),
+    CanonStreamMapWithLambda(CanonStreamMapWithLambda<'i>),
+}
+
+/// Contains all variable variants that could be resolved to a string type.
+#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)]
+pub enum ResolvableToStringVariable<'i> {
+    Literal(&'i str),
+    Scalar(Scalar<'i>),
+    ScalarWithLambda(ScalarWithLambda<'i>),
+    // canon without lambda can't be resolved to a string, since it represents an array of values
+    CanonStreamWithLambda(CanonStreamWithLambda<'i>),
+    CanonStreamMapWithLambda(CanonStreamMapWithLambda<'i>),
+}
+
+/// Triplet represents a location of the executable code in the network.
+/// It is build from `PeerPart` and `FunctionPart` of a `Call` instruction.
+#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)]
+pub struct Triplet<'i> {
+    #[serde(borrow)]
+    pub peer_id: ResolvableToPeerIdVariable<'i>,
+    #[serde(borrow)]
+    pub service_id: ResolvableToStringVariable<'i>,
+    #[serde(borrow)]
+    pub function_name: ResolvableToStringVariable<'i>,
+}
+
+/// Represents all immutable values that is possible to set in AIR scripts.
+#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
+pub enum ImmutableValue<'i> {
+    InitPeerId,
+    Error(#[serde(borrow)] InstructionErrorAST<'i>),
+    LastError(Option<LambdaAST<'i>>),
+    Timestamp,
+    TTL,
+    Literal(JsonString),
+    Number(Number),
+    Boolean(bool),
+    EmptyArray, // only empty arrays are allowed now
+    Variable(ImmutableVariable<'i>),
+    VariableWithLambda(ImmutableVariableWithLambda<'i>),
+}
+
+#[derive(Serialize, Debug, PartialEq, Eq, Clone)]
+pub enum CallOutputValue<'i> {
+    #[serde(borrow)]
+    Scalar(Scalar<'i>),
+    #[serde(borrow)]
+    Stream(Stream<'i>),
+    None,
+}
+
+#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
+pub enum ApArgument<'i> {
+    InitPeerId,
+    Timestamp,
+    TTL,
+    Error(#[serde(borrow)] InstructionErrorAST<'i>),
+    LastError(Option<LambdaAST<'i>>),
+    Literal(JsonString),
+    Number(Number),
+    Boolean(bool),
+    EmptyArray,
+    Scalar(Scalar<'i>),
+    ScalarWithLambda(ScalarWithLambda<'i>),
+    CanonStream(CanonStream<'i>),
+    CanonStreamMap(CanonStreamMap<'i>),
+    CanonStreamWithLambda(CanonStreamWithLambda<'i>),
+    CanonStreamMapWithLambda(CanonStreamMapWithLambda<'i>),
+}
+
+#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)]
+pub enum ApResult<'i> {
+    #[serde(borrow)]
+    Scalar(Scalar<'i>),
+    #[serde(borrow)]
+    Stream(Stream<'i>),
+}
+
+#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
+pub enum StreamMapKeyClause<'i> {
+    Literal(JsonString),
+    Int(i64),
+    Scalar(#[serde(borrow)] Scalar<'i>),
+    ScalarWithLambda(ScalarWithLambda<'i>),
+    CanonStreamWithLambda(CanonStreamWithLambda<'i>),
+}
+
+#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
+pub enum Number {
+    Int(i64),
+    Float(f64),
+}
+
+#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)]
+pub enum FoldScalarIterable<'i> {
+    #[serde(borrow)]
+    Scalar(Scalar<'i>),
+    #[serde(borrow)]
+    ScalarWithLambda(ScalarWithLambda<'i>),
+    // it's important not to have lambda here
+    #[serde(borrow)]
+    CanonStream(CanonStream<'i>),
+    CanonStreamMap(CanonStreamMap<'i>),
+    CanonStreamMapWithLambda(CanonStreamMapWithLambda<'i>),
+    EmptyArray,
+}
+
+#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)]
+pub enum NewArgument<'i> {
+    #[serde(borrow)]
+    Scalar(Scalar<'i>),
+    #[serde(borrow)]
+    Stream(Stream<'i>),
+    #[serde(borrow)]
+    StreamMap(StreamMap<'i>),
+    #[serde(borrow)]
+    CanonStream(CanonStream<'i>),
+    #[serde(borrow)]
+    CanonStreamMap(CanonStreamMap<'i>),
+}
+
\ No newline at end of file diff --git a/src/air_parser/ast/instruction_arguments/impls.rs.html b/src/air_parser/ast/instruction_arguments/impls.rs.html new file mode 100644 index 00000000..e222d24d --- /dev/null +++ b/src/air_parser/ast/instruction_arguments/impls.rs.html @@ -0,0 +1,129 @@ +impls.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::ApResult;
+use super::CallOutputValue;
+use super::NewArgument;
+use super::Scalar;
+use super::Stream;
+use crate::parser::lexer::AirPos;
+
+impl<'i> NewArgument<'i> {
+    pub fn name(&self) -> &'i str {
+        match self {
+            Self::Scalar(scalar) => scalar.name,
+            Self::Stream(stream) => stream.name,
+            Self::CanonStream(canon_stream) => canon_stream.name,
+            Self::StreamMap(stream_map) => stream_map.name,
+            Self::CanonStreamMap(canon_stream_map) => canon_stream_map.name,
+        }
+    }
+}
+
+impl<'i> ApResult<'i> {
+    pub fn scalar(name: &'i str, position: AirPos) -> Self {
+        Self::Scalar(Scalar { name, position })
+    }
+
+    pub fn stream(name: &'i str, position: AirPos) -> Self {
+        Self::Stream(Stream { name, position })
+    }
+
+    pub fn name(&self) -> &'i str {
+        match self {
+            Self::Scalar(scalar) => scalar.name,
+            Self::Stream(stream) => stream.name,
+        }
+    }
+}
+
+impl<'i> CallOutputValue<'i> {
+    pub fn scalar(name: &'i str, position: AirPos) -> Self {
+        Self::Scalar(Scalar { name, position })
+    }
+
+    pub fn stream(name: &'i str, position: AirPos) -> Self {
+        Self::Stream(Stream { name, position })
+    }
+}
+
\ No newline at end of file diff --git a/src/air_parser/ast/instruction_arguments/traits.rs.html b/src/air_parser/ast/instruction_arguments/traits.rs.html new file mode 100644 index 00000000..19a57570 --- /dev/null +++ b/src/air_parser/ast/instruction_arguments/traits.rs.html @@ -0,0 +1,449 @@ +traits.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::*;
+
+use std::fmt;
+
+impl fmt::Display for ApResult<'_> {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        use ApResult::*;
+
+        match self {
+            Scalar(scalar) => write!(f, "{scalar}"),
+            Stream(stream) => write!(f, "{stream}"),
+        }
+    }
+}
+
+impl fmt::Display for ImmutableValue<'_> {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        use ImmutableValue::*;
+
+        match self {
+            InitPeerId => write!(f, "%init_peer_id%"),
+            Error(error_accessor) => display_error(f, error_accessor),
+            LastError(error_accessor) => display_last_error(f, error_accessor),
+            Literal(literal) => write!(f, r#""{literal}""#),
+            Timestamp => write!(f, "%timestamp%"),
+            TTL => write!(f, "%ttl%"),
+            Number(number) => write!(f, "{number}"),
+            Boolean(bool) => write!(f, "{bool}"),
+            EmptyArray => write!(f, "[]"),
+            Variable(variable) => write!(f, "{variable}"),
+            VariableWithLambda(variable) => write!(f, "{variable}"),
+        }
+    }
+}
+
+impl fmt::Display for ResolvableToPeerIdVariable<'_> {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        use ResolvableToPeerIdVariable::*;
+
+        match self {
+            InitPeerId => write!(f, "%init_peer_id%"),
+            Literal(literal) => write!(f, r#""{literal}""#),
+            Scalar(scalar) => write!(f, "{scalar}"),
+            ScalarWithLambda(scalar) => write!(f, "{scalar}"),
+            CanonStreamWithLambda(canon_stream) => write!(f, "{canon_stream}"),
+            CanonStreamMapWithLambda(canon_stream_map) => write!(f, "{canon_stream_map}"),
+        }
+    }
+}
+
+impl fmt::Display for ResolvableToStringVariable<'_> {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        use ResolvableToStringVariable::*;
+
+        match self {
+            Literal(literal) => write!(f, r#""{literal}""#),
+            Scalar(scalar) => write!(f, "{scalar}"),
+            ScalarWithLambda(scalar) => write!(f, "{scalar}"),
+            CanonStreamWithLambda(canon_stream) => write!(f, "{canon_stream}"),
+            CanonStreamMapWithLambda(canon_stream_map) => write!(f, "{canon_stream_map}"),
+        }
+    }
+}
+
+impl fmt::Display for CallOutputValue<'_> {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        use CallOutputValue::*;
+
+        match self {
+            Scalar(scalar) => write!(f, "{scalar}"),
+            Stream(stream) => write!(f, "{stream}"),
+            None => Ok(()),
+        }
+    }
+}
+
+impl fmt::Display for ApArgument<'_> {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        use ApArgument::*;
+
+        match self {
+            InitPeerId => write!(f, "%init_peer_id%"),
+            Error(error_accessor) => display_error(f, error_accessor),
+            LastError(error_accessor) => display_last_error(f, error_accessor),
+            Literal(str) => write!(f, r#""{str}""#),
+            Timestamp => write!(f, "%timestamp%"),
+            TTL => write!(f, "%ttl%"),
+            Number(number) => write!(f, "{number}"),
+            Boolean(bool) => write!(f, "{bool}"),
+            EmptyArray => write!(f, "[]"),
+            Scalar(scalar) => write!(f, "{scalar}"),
+            ScalarWithLambda(scalar) => write!(f, "{scalar}"),
+            CanonStream(canon_stream) => write!(f, "{canon_stream}"),
+            CanonStreamWithLambda(canon_stream) => write!(f, "{canon_stream}"),
+            CanonStreamMap(canon_stream_map) => write!(f, "{canon_stream_map}"),
+            CanonStreamMapWithLambda(canon_stream_map) => write!(f, "{canon_stream_map}"),
+        }
+    }
+}
+
+impl fmt::Display for StreamMapKeyClause<'_> {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        use StreamMapKeyClause::*;
+
+        match self {
+            Literal(str) => write!(f, r#""{str}""#),
+            Int(int) => write!(f, "{int}"),
+            Scalar(scalar) => write!(f, "{scalar}"),
+            ScalarWithLambda(scalar) => write!(f, "{scalar}"),
+            CanonStreamWithLambda(canon_stream) => write!(f, "{canon_stream}"),
+        }
+    }
+}
+
+impl fmt::Display for Triplet<'_> {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        write!(
+            f,
+            "{} ({} {})",
+            self.peer_id, self.service_id, self.function_name
+        )
+    }
+}
+
+impl fmt::Display for NewArgument<'_> {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        match self {
+            Self::Scalar(scalar) => write!(f, "{scalar}"),
+            Self::Stream(stream) => write!(f, "{stream}"),
+            Self::CanonStream(canon_stream) => write!(f, "{canon_stream}"),
+            Self::StreamMap(stream_map) => write!(f, "{stream_map}"),
+            Self::CanonStreamMap(canon_stream_map) => write!(f, "{canon_stream_map}"),
+        }
+    }
+}
+
+impl fmt::Display for Number {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        use Number::*;
+
+        match self {
+            Int(number) => write!(f, "{number}"),
+            Float(number) => write!(f, "{number}"),
+        }
+    }
+}
+
+impl fmt::Display for FoldScalarIterable<'_> {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        use FoldScalarIterable::*;
+
+        match self {
+            Scalar(scalar) => write!(f, "{scalar}"),
+            ScalarWithLambda(scalar) => write!(f, "{scalar}"),
+            CanonStream(canon_stream) => write!(f, "{canon_stream}"),
+            CanonStreamMap(canon_stream_map) => write!(f, "{canon_stream_map}"),
+            CanonStreamMapWithLambda(canon_stream_map) => write!(f, "{canon_stream_map}"),
+            EmptyArray => write!(f, "[]"),
+        }
+    }
+}
+
+impl From<Number> for serde_json::Value {
+    fn from(number: Number) -> Self {
+        (&number).into()
+    }
+}
+
+impl From<&Number> for serde_json::Value {
+    fn from(number: &Number) -> Self {
+        match number {
+            Number::Int(value) => (*value).into(),
+            Number::Float(value) => (*value).into(),
+        }
+    }
+}
+
+impl From<&Number> for air_interpreter_value::JValue {
+    fn from(number: &Number) -> Self {
+        match number {
+            Number::Int(value) => (*value).into(),
+            Number::Float(value) => (*value).into(),
+        }
+    }
+}
+
+fn display_last_error(f: &mut fmt::Formatter, lambda_ast: &Option<LambdaAST>) -> fmt::Result {
+    use crate::parser::LAST_ERROR;
+
+    match lambda_ast {
+        Some(lambda_ast) => write!(f, "{LAST_ERROR}{lambda_ast}"),
+        None => write!(f, "{LAST_ERROR}"),
+    }
+}
+
+fn display_error(f: &mut fmt::Formatter, error: &InstructionErrorAST) -> fmt::Result {
+    use crate::parser::ERROR;
+
+    let InstructionErrorAST { lens } = error;
+
+    match lens {
+        Some(lens) => write!(f, "{ERROR}{lens}"),
+        None => write!(f, "{ERROR}"),
+    }
+}
+
\ No newline at end of file diff --git a/src/air_parser/ast/instructions.rs.html b/src/air_parser/ast/instructions.rs.html new file mode 100644 index 00000000..a897fb84 --- /dev/null +++ b/src/air_parser/ast/instructions.rs.html @@ -0,0 +1,415 @@ +instructions.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+mod impls;
+mod traits;
+
+use super::*;
+
+use serde::Serialize;
+
+use std::rc::Rc;
+
+// TODO: sort instruction in alphanumeric order
+#[allow(clippy::large_enum_variant)] // for Null and Error variants
+#[derive(Serialize, Debug, PartialEq)]
+pub enum Instruction<'i> {
+    Call(Box<Call<'i>>),
+    Ap(Box<Ap<'i>>),
+    ApMap(Box<ApMap<'i>>),
+    Canon(Box<Canon<'i>>),
+    CanonMap(Box<CanonMap<'i>>),
+    CanonStreamMapScalar(Box<CanonStreamMapScalar<'i>>),
+    Seq(Box<Seq<'i>>),
+    Par(Box<Par<'i>>),
+    Xor(Box<Xor<'i>>),
+    Match(Box<Match<'i>>),
+    MisMatch(Box<MisMatch<'i>>),
+    Fail(Box<Fail<'i>>),
+    FoldScalar(Box<FoldScalar<'i>>),
+    FoldStream(Box<FoldStream<'i>>),
+    FoldStreamMap(Box<FoldStreamMap<'i>>),
+    Never(Never),
+    New(Box<New<'i>>),
+    Next(Box<Next<'i>>),
+    Null(Null),
+    Error,
+}
+
+/// (call (peer part of a triplet: PeerPart) (function part of a triplet: FunctionPart) [arguments] output)
+#[derive(Serialize, Debug, PartialEq)]
+pub struct Call<'i> {
+    pub triplet: Triplet<'i>,
+    pub args: Rc<Vec<ImmutableValue<'i>>>,
+    pub output: CallOutputValue<'i>,
+}
+
+/// (ap argument result)
+#[derive(Serialize, Debug, PartialEq)]
+pub struct Ap<'i> {
+    pub argument: ApArgument<'i>,
+    pub result: ApResult<'i>,
+}
+
+/// (ap key value %map)
+#[derive(Serialize, Debug, PartialEq)]
+pub struct ApMap<'i> {
+    pub key: StreamMapKeyClause<'i>,
+    pub value: ApArgument<'i>,
+    pub map: StreamMap<'i>,
+}
+
+/// (canon peer_id $stream #canon_stream)
+#[derive(Serialize, Debug, PartialEq, Eq)]
+pub struct Canon<'i> {
+    pub peer_id: ResolvableToPeerIdVariable<'i>,
+    pub stream: Stream<'i>,
+    pub canon_stream: CanonStream<'i>,
+}
+
+/// (canon peer_id %stream_map #%canon_stream_map)
+#[derive(Serialize, Debug, PartialEq, Eq)]
+pub struct CanonMap<'i> {
+    pub peer_id: ResolvableToPeerIdVariable<'i>,
+    pub stream_map: StreamMap<'i>,
+    pub canon_stream_map: CanonStreamMap<'i>,
+}
+
+/// (canon peer_id %stream_map scalar)
+#[derive(Serialize, Debug, PartialEq, Eq)]
+pub struct CanonStreamMapScalar<'i> {
+    pub peer_id: ResolvableToPeerIdVariable<'i>,
+    pub stream_map: StreamMap<'i>,
+    pub scalar: Scalar<'i>,
+}
+
+/// (seq instruction instruction)
+#[derive(Serialize, Debug, PartialEq)]
+pub struct Seq<'i>(pub Instruction<'i>, pub Instruction<'i>);
+
+/// (par instruction instruction)
+#[derive(Serialize, Debug, PartialEq)]
+pub struct Par<'i>(pub Instruction<'i>, pub Instruction<'i>);
+
+/// (xor instruction instruction)
+#[derive(Serialize, Debug, PartialEq)]
+pub struct Xor<'i>(pub Instruction<'i>, pub Instruction<'i>);
+
+/// (match left_value right_value instruction)
+#[derive(Serialize, Debug, PartialEq)]
+pub struct Match<'i> {
+    pub left_value: ImmutableValue<'i>,
+    pub right_value: ImmutableValue<'i>,
+    pub instruction: Instruction<'i>,
+}
+
+/// (mismatch left_value right_value instruction)
+#[derive(Serialize, Debug, PartialEq)]
+pub struct MisMatch<'i> {
+    pub left_value: ImmutableValue<'i>,
+    pub right_value: ImmutableValue<'i>,
+    pub instruction: Instruction<'i>,
+}
+
+/// (fail 1337 "error message")
+/// (fail %last_error%)
+/// (fail value)
+#[derive(Serialize, Debug, PartialEq, Eq)]
+pub enum Fail<'i> {
+    Scalar(Scalar<'i>),
+    ScalarWithLambda(ScalarWithLambda<'i>),
+    Literal {
+        ret_code: i64,
+        error_message: &'i str,
+    },
+    CanonStreamWithLambda(CanonStreamWithLambda<'i>),
+    LastError,
+    Error,
+}
+
+/// (fold scalar_iterable iterator instruction)
+#[derive(Serialize, Debug, PartialEq)]
+pub struct FoldScalar<'i> {
+    #[serde(borrow)]
+    pub iterable: FoldScalarIterable<'i>,
+    #[serde(borrow)]
+    pub iterator: Scalar<'i>,
+    pub instruction: Rc<Instruction<'i>>,
+    // option is needed to provide a graceful period of adoption
+    pub last_instruction: Option<Rc<Instruction<'i>>>,
+    pub span: Span,
+}
+
+/// (fold stream_iterable iterator instruction)
+#[derive(Serialize, Debug, PartialEq)]
+pub struct FoldStream<'i> {
+    pub iterable: Stream<'i>,
+    #[serde(borrow)]
+    pub iterator: Scalar<'i>,
+    pub instruction: Rc<Instruction<'i>>,
+    // option is needed to provide a graceful period of adoption
+    pub last_instruction: Option<Rc<Instruction<'i>>>,
+    pub span: Span,
+}
+
+/// (fold stream_map_iterable iterator instruction)
+#[derive(Serialize, Debug, PartialEq)]
+pub struct FoldStreamMap<'i> {
+    pub iterable: StreamMap<'i>,
+    #[serde(borrow)]
+    pub iterator: Scalar<'i>,
+    pub instruction: Rc<Instruction<'i>>,
+    // option is needed to provide a graceful period of adoption
+    pub last_instruction: Option<Rc<Instruction<'i>>>,
+    pub span: Span,
+}
+
+/// (fold stream_iterable iterator instruction)
+#[derive(Serialize, Debug, PartialEq, Eq)]
+pub struct Next<'i> {
+    pub iterator: Scalar<'i>,
+}
+
+/// (never)
+#[derive(Serialize, Debug, PartialEq, Eq)]
+pub struct Never;
+
+/// (new variable instruction)
+#[derive(Serialize, Debug, PartialEq)]
+pub struct New<'i> {
+    pub argument: NewArgument<'i>,
+    pub instruction: Instruction<'i>,
+    pub span: Span,
+}
+
+/// (null)
+#[derive(Serialize, Debug, PartialEq, Eq)]
+pub struct Null;
+
+pub trait PeerIDErrorLogable {
+    fn log_errors_with_peer_id(&self) -> bool;
+}
+
\ No newline at end of file diff --git a/src/air_parser/ast/instructions/impls.rs.html b/src/air_parser/ast/instructions/impls.rs.html new file mode 100644 index 00000000..fe1899b0 --- /dev/null +++ b/src/air_parser/ast/instructions/impls.rs.html @@ -0,0 +1,411 @@ +impls.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::*;
+
+impl<'i> Ap<'i> {
+    pub fn new(argument: ApArgument<'i>, result: ApResult<'i>) -> Self {
+        Self { argument, result }
+    }
+}
+
+impl<'i> ApMap<'i> {
+    pub fn new(key: StreamMapKeyClause<'i>, value: ApArgument<'i>, map: StreamMap<'i>) -> Self {
+        Self { key, value, map }
+    }
+}
+
+impl<'i> Call<'i> {
+    pub fn new(
+        triplet: Triplet<'i>,
+        args: Rc<Vec<ImmutableValue<'i>>>,
+        output: CallOutputValue<'i>,
+    ) -> Self {
+        Self {
+            triplet,
+            args,
+            output,
+        }
+    }
+}
+
+impl<'i> Canon<'i> {
+    pub fn new(
+        peer_id: ResolvableToPeerIdVariable<'i>,
+        stream: Stream<'i>,
+        canon_stream: CanonStream<'i>,
+    ) -> Self {
+        Self {
+            peer_id,
+            stream,
+            canon_stream,
+        }
+    }
+}
+
+impl<'i> CanonMap<'i> {
+    pub fn new(
+        peer_id: ResolvableToPeerIdVariable<'i>,
+        stream_map: StreamMap<'i>,
+        canon_stream_map: CanonStreamMap<'i>,
+    ) -> Self {
+        Self {
+            peer_id,
+            stream_map,
+            canon_stream_map,
+        }
+    }
+}
+
+impl<'i> CanonStreamMapScalar<'i> {
+    pub fn new(
+        peer_id: ResolvableToPeerIdVariable<'i>,
+        stream_map: StreamMap<'i>,
+        scalar: Scalar<'i>,
+    ) -> Self {
+        Self {
+            peer_id,
+            stream_map,
+            scalar,
+        }
+    }
+}
+
+impl<'i> Seq<'i> {
+    pub fn new(left_instruction: Instruction<'i>, right_instruction: Instruction<'i>) -> Self {
+        Self(left_instruction, right_instruction)
+    }
+}
+
+impl<'i> Par<'i> {
+    pub fn new(left_instruction: Instruction<'i>, right_instruction: Instruction<'i>) -> Self {
+        Self(left_instruction, right_instruction)
+    }
+}
+
+impl<'i> Xor<'i> {
+    pub fn new(left_instruction: Instruction<'i>, right_instruction: Instruction<'i>) -> Self {
+        Self(left_instruction, right_instruction)
+    }
+}
+
+impl<'i> Match<'i> {
+    pub fn new(
+        left_value: ImmutableValue<'i>,
+        right_value: ImmutableValue<'i>,
+        instruction: Instruction<'i>,
+    ) -> Self {
+        Self {
+            left_value,
+            right_value,
+            instruction,
+        }
+    }
+}
+
+impl<'i> MisMatch<'i> {
+    pub fn new(
+        left_value: ImmutableValue<'i>,
+        right_value: ImmutableValue<'i>,
+        instruction: Instruction<'i>,
+    ) -> Self {
+        Self {
+            left_value,
+            right_value,
+            instruction,
+        }
+    }
+}
+
+impl<'i> FoldScalar<'i> {
+    pub fn new(
+        iterable: FoldScalarIterable<'i>,
+        iterator: Scalar<'i>,
+        instruction: Instruction<'i>,
+        last_instruction: Option<Instruction<'i>>,
+        span: Span,
+    ) -> Self {
+        Self {
+            iterable,
+            iterator,
+            instruction: Rc::new(instruction),
+            last_instruction: last_instruction.map(Rc::new),
+            span,
+        }
+    }
+}
+
+impl<'i> FoldStream<'i> {
+    pub fn new(
+        iterable: Stream<'i>,
+        iterator: Scalar<'i>,
+        instruction: Instruction<'i>,
+        last_instruction: Option<Instruction<'i>>,
+        span: Span,
+    ) -> Self {
+        Self {
+            iterable,
+            iterator,
+            instruction: Rc::new(instruction),
+            last_instruction: last_instruction.map(Rc::new),
+            span,
+        }
+    }
+}
+
+impl<'i> FoldStreamMap<'i> {
+    pub fn new(
+        iterable: StreamMap<'i>,
+        iterator: Scalar<'i>,
+        instruction: Instruction<'i>,
+        last_instruction: Option<Instruction<'i>>,
+        span: Span,
+    ) -> Self {
+        Self {
+            iterable,
+            iterator,
+            instruction: Rc::new(instruction),
+            last_instruction: last_instruction.map(Rc::new),
+            span,
+        }
+    }
+}
+
+impl<'i> Next<'i> {
+    pub fn new(iterator: Scalar<'i>) -> Self {
+        Self { iterator }
+    }
+}
+
+impl<'i> New<'i> {
+    #[allow(clippy::self_named_constructors)]
+    pub fn new(argument: NewArgument<'i>, instruction: Instruction<'i>, span: Span) -> Self {
+        Self {
+            argument,
+            instruction,
+            span,
+        }
+    }
+}
+
\ No newline at end of file diff --git a/src/air_parser/ast/instructions/traits.rs.html b/src/air_parser/ast/instructions/traits.rs.html new file mode 100644 index 00000000..a83c9b79 --- /dev/null +++ b/src/air_parser/ast/instructions/traits.rs.html @@ -0,0 +1,477 @@ +traits.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::*;
+
+use std::fmt;
+
+impl fmt::Display for Instruction<'_> {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        use Instruction::*;
+
+        match self {
+            Call(call) => write!(f, "{call}"),
+            Canon(canon) => write!(f, "{canon}"),
+            CanonMap(canon_map) => write!(f, "{canon_map}"),
+            CanonStreamMapScalar(canon_stream_map_scalar) => write!(f, "{canon_stream_map_scalar}"),
+            Ap(ap) => write!(f, "{ap}"),
+            ApMap(ap_map) => write!(f, "{ap_map}"),
+            Seq(seq) => write!(f, "{seq}"),
+            Par(par) => write!(f, "{par}"),
+            Xor(xor) => write!(f, "{xor}"),
+            Match(match_) => write!(f, "{match_}"),
+            MisMatch(mismatch) => write!(f, "{mismatch}"),
+            Fail(fail) => write!(f, "{fail}"),
+            FoldScalar(fold) => write!(f, "{fold}"),
+            FoldStream(fold) => write!(f, "{fold}"),
+            FoldStreamMap(fold) => write!(f, "{fold}"),
+            Never(never) => write!(f, "{never}"),
+            Next(next) => write!(f, "{next}"),
+            New(new) => write!(f, "{new}"),
+            Null(null) => write!(f, "{null}"),
+            Error => write!(f, "error"),
+        }
+    }
+}
+
+impl fmt::Display for Call<'_> {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        use itertools::Itertools;
+
+        let args = self.args.iter().map(|arg| format!("{arg}")).join(" ");
+        write!(f, "call {} [{}] {}", self.triplet, args, self.output)
+    }
+}
+
+impl fmt::Display for Canon<'_> {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        write!(
+            f,
+            "canon {} {} {}",
+            self.peer_id, self.stream, self.canon_stream
+        )
+    }
+}
+
+impl fmt::Display for CanonMap<'_> {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        write!(
+            f,
+            "canon {} {} {}",
+            self.peer_id, self.stream_map, self.canon_stream_map
+        )
+    }
+}
+
+impl fmt::Display for CanonStreamMapScalar<'_> {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        write!(
+            f,
+            "canon {} {} {}",
+            self.peer_id, self.stream_map, self.scalar
+        )
+    }
+}
+
+impl fmt::Display for Ap<'_> {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        write!(f, "ap {} {}", self.argument, self.result)
+    }
+}
+
+impl fmt::Display for ApMap<'_> {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        write!(f, "ap ({} {}) {}", self.key, self.value, self.map)
+    }
+}
+
+impl fmt::Display for Fail<'_> {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        match self {
+            Fail::Scalar(scalar) => write!(f, "fail {scalar}"),
+            Fail::ScalarWithLambda(scalar) => write!(f, "fail {scalar}"),
+            Fail::Literal {
+                ret_code,
+                error_message,
+            } => write!(f, r#"fail {ret_code} "{error_message}""#),
+            Fail::CanonStreamWithLambda(stream) => {
+                write!(f, "fail {stream}")
+            }
+            Fail::LastError => write!(f, "fail %last_error%"),
+            Fail::Error => write!(f, "fail :error:"),
+        }
+    }
+}
+
+impl fmt::Display for FoldScalar<'_> {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        write!(f, "fold {} {}", self.iterable, self.iterator)
+    }
+}
+
+impl fmt::Display for FoldStream<'_> {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        write!(f, "fold {} {}", self.iterable, self.iterator)
+    }
+}
+
+impl fmt::Display for FoldStreamMap<'_> {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        write!(f, "fold {} {}", self.iterable, self.iterator)
+    }
+}
+
+impl fmt::Display for Seq<'_> {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        write!(f, "seq")
+    }
+}
+
+impl fmt::Display for Par<'_> {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        write!(f, "par")
+    }
+}
+
+impl fmt::Display for Null {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        write!(f, "null")
+    }
+}
+
+impl fmt::Display for Xor<'_> {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        write!(f, "xor")
+    }
+}
+
+impl fmt::Display for Match<'_> {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        write!(f, "match {} {}", self.left_value, self.right_value)
+    }
+}
+
+impl fmt::Display for MisMatch<'_> {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        write!(f, "mismatch {} {}", self.left_value, self.right_value)
+    }
+}
+
+impl fmt::Display for Never {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        write!(f, "never")
+    }
+}
+
+impl fmt::Display for Next<'_> {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        write!(f, "next {}", self.iterator)
+    }
+}
+
+impl fmt::Display for New<'_> {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        write!(f, "new {}", self.argument)
+    }
+}
+
+macro_rules! peer_id_error_logable {
+    ($($t:ty),+) => {
+        $(
+            impl PeerIDErrorLogable for $t {
+                #[inline]
+                fn log_errors_with_peer_id(&self) -> bool {
+                    true
+                }
+            }
+        )+
+    };
+}
+
+macro_rules! no_peer_id_error_logable {
+    ($($t:ty),+) => {
+        $(
+            impl PeerIDErrorLogable for $t {
+                #[inline]
+                fn log_errors_with_peer_id(&self) -> bool {
+                    false
+                }
+            }
+        )+
+    };
+}
+
+peer_id_error_logable!(Call<'_>, Canon<'_>, CanonMap<'_>, CanonStreamMapScalar<'_>);
+
+no_peer_id_error_logable!(
+    Ap<'_>,
+    ApMap<'_>,
+    Fail<'_>,
+    FoldScalar<'_>,
+    FoldStream<'_>,
+    FoldStreamMap<'_>,
+    Seq<'_>,
+    Par<'_>,
+    Xor<'_>,
+    Match<'_>,
+    MisMatch<'_>,
+    Never,
+    Next<'_>,
+    New<'_>,
+    Null
+);
+
\ No newline at end of file diff --git a/src/air_parser/ast/mod.rs.html b/src/air_parser/ast/mod.rs.html new file mode 100644 index 00000000..ac420f6a --- /dev/null +++ b/src/air_parser/ast/mod.rs.html @@ -0,0 +1,63 @@ +mod.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+mod instruction_arguments;
+mod instructions;
+mod values;
+
+#[cfg(test)]
+pub mod tests;
+
+pub use instruction_arguments::*;
+pub use instructions::*;
+pub use values::*;
+
+pub use crate::parser::Span;
+
\ No newline at end of file diff --git a/src/air_parser/ast/values.rs.html b/src/air_parser/ast/values.rs.html new file mode 100644 index 00000000..49aceb05 --- /dev/null +++ b/src/air_parser/ast/values.rs.html @@ -0,0 +1,237 @@ +values.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+mod impls;
+mod traits;
+
+use crate::parser::lexer::AirPos;
+
+use air_lambda_parser::LambdaAST;
+use serde::Deserialize;
+use serde::Serialize;
+
+/// A scalar value without a lambda.
+#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)]
+pub struct Scalar<'i> {
+    pub name: &'i str,
+    pub position: AirPos,
+}
+
+/// A scalar value with a lambda expression.
+#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)]
+pub struct ScalarWithLambda<'i> {
+    pub name: &'i str,
+    #[serde(borrow)]
+    pub lambda: LambdaAST<'i>,
+    pub position: AirPos,
+}
+
+/// A stream without a lambda.
+#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)]
+pub struct Stream<'i> {
+    pub name: &'i str,
+    pub position: AirPos,
+}
+
+/// A canonicalized stream without a lambda.
+#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)]
+pub struct CanonStream<'i> {
+    pub name: &'i str,
+    pub position: AirPos,
+}
+
+/// A canonicalized stream map without a lambda.
+#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)]
+pub struct CanonStreamMap<'i> {
+    pub name: &'i str,
+    pub position: AirPos,
+}
+
+/// A canonicalized stream with a lambda.
+#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)]
+pub struct CanonStreamWithLambda<'i> {
+    pub name: &'i str,
+    #[serde(borrow)]
+    pub lambda: LambdaAST<'i>,
+    pub position: AirPos,
+}
+
+/// A canonicalized stream map with a lambda.
+#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)]
+pub struct CanonStreamMapWithLambda<'i> {
+    pub name: &'i str,
+    #[serde(borrow)]
+    pub lambda: LambdaAST<'i>,
+    pub position: AirPos,
+}
+
+/// A variable that could be either scalar or stream without lambda.
+#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)]
+pub enum ImmutableVariable<'i> {
+    #[serde(borrow)]
+    Scalar(Scalar<'i>),
+    #[serde(borrow)]
+    CanonStream(CanonStream<'i>),
+    #[serde(borrow)]
+    CanonStreamMap(CanonStreamMap<'i>),
+}
+
+/// A variable that could be either scalar or stream with possible lambda expression.
+#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)]
+pub enum ImmutableVariableWithLambda<'i> {
+    #[serde(borrow)]
+    Scalar(ScalarWithLambda<'i>),
+    #[serde(borrow)]
+    CanonStream(CanonStreamWithLambda<'i>),
+    #[serde(borrow)]
+    CanonStreamMap(CanonStreamMapWithLambda<'i>),
+}
+
+/// A map based on top of a stream.
+#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)]
+pub struct StreamMap<'i> {
+    pub name: &'i str,
+    pub position: AirPos,
+}
+
+/// An error wrapper with an optional lens.
+#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)]
+pub struct InstructionErrorAST<'lens> {
+    #[serde(borrow)]
+    pub lens: Option<LambdaAST<'lens>>,
+}
+
\ No newline at end of file diff --git a/src/air_parser/ast/values/impls.rs.html b/src/air_parser/ast/values/impls.rs.html new file mode 100644 index 00000000..ce699e12 --- /dev/null +++ b/src/air_parser/ast/values/impls.rs.html @@ -0,0 +1,331 @@ +impls.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::*;
+use air_lambda_parser::LambdaAST;
+
+impl<'i> ScalarWithLambda<'i> {
+    pub fn new(name: &'i str, lambda: LambdaAST<'i>, position: AirPos) -> Self {
+        Self {
+            name,
+            lambda,
+            position,
+        }
+    }
+
+    #[cfg(test)]
+    pub(crate) fn from_raw_lambda(
+        name: &'i str,
+        lambda: Vec<air_lambda_parser::ValueAccessor<'i>>,
+        position: AirPos,
+    ) -> Self {
+        let lambda = LambdaAST::try_from_accessors(lambda).unwrap();
+        Self {
+            name,
+            lambda,
+            position,
+        }
+    }
+}
+
+impl<'i> CanonStream<'i> {
+    pub fn new(name: &'i str, position: AirPos) -> Self {
+        Self { name, position }
+    }
+}
+
+impl<'i> CanonStreamWithLambda<'i> {
+    pub fn new(name: &'i str, lambda: LambdaAST<'i>, position: AirPos) -> Self {
+        Self {
+            name,
+            lambda,
+            position,
+        }
+    }
+}
+
+impl<'i> CanonStreamMap<'i> {
+    pub fn new(name: &'i str, position: AirPos) -> Self {
+        Self { name, position }
+    }
+}
+
+impl<'i> CanonStreamMapWithLambda<'i> {
+    pub fn new(name: &'i str, lambda: LambdaAST<'i>, position: AirPos) -> Self {
+        Self {
+            name,
+            lambda,
+            position,
+        }
+    }
+}
+
+impl<'i> Scalar<'i> {
+    pub fn new(name: &'i str, position: AirPos) -> Self {
+        Self { name, position }
+    }
+}
+
+impl<'i> Stream<'i> {
+    pub fn new(name: &'i str, position: AirPos) -> Self {
+        Self { name, position }
+    }
+}
+
+impl<'i> ImmutableVariable<'i> {
+    pub fn scalar(name: &'i str, position: AirPos) -> Self {
+        Self::Scalar(Scalar::new(name, position))
+    }
+
+    pub fn canon_stream(name: &'i str, position: AirPos) -> Self {
+        Self::CanonStream(CanonStream::new(name, position))
+    }
+
+    pub fn canon_stream_map(name: &'i str, position: AirPos) -> Self {
+        Self::CanonStreamMap(CanonStreamMap::new(name, position))
+    }
+
+    pub fn name(&self) -> &'i str {
+        match self {
+            ImmutableVariable::Scalar(scalar) => scalar.name,
+            ImmutableVariable::CanonStream(stream) => stream.name,
+            ImmutableVariable::CanonStreamMap(canon_stream_map) => canon_stream_map.name,
+        }
+    }
+}
+
+impl<'i> ImmutableVariableWithLambda<'i> {
+    pub fn scalar(name: &'i str, lambda: LambdaAST<'i>, position: AirPos) -> Self {
+        Self::Scalar(ScalarWithLambda::new(name, lambda, position))
+    }
+
+    pub fn canon_stream(name: &'i str, lambda: LambdaAST<'i>, position: AirPos) -> Self {
+        Self::CanonStream(CanonStreamWithLambda::new(name, lambda, position))
+    }
+
+    pub fn canon_stream_map(name: &'i str, lambda: LambdaAST<'i>, position: AirPos) -> Self {
+        Self::CanonStreamMap(CanonStreamMapWithLambda::new(name, lambda, position))
+    }
+
+    pub fn name(&self) -> &'i str {
+        match self {
+            ImmutableVariableWithLambda::Scalar(scalar) => scalar.name,
+            ImmutableVariableWithLambda::CanonStream(canon_stream) => canon_stream.name,
+            ImmutableVariableWithLambda::CanonStreamMap(canon_stream_map) => canon_stream_map.name,
+        }
+    }
+
+    pub fn lambda(&self) -> &LambdaAST<'i> {
+        match self {
+            ImmutableVariableWithLambda::Scalar(scalar) => &scalar.lambda,
+            ImmutableVariableWithLambda::CanonStream(canon_stream) => &canon_stream.lambda,
+            ImmutableVariableWithLambda::CanonStreamMap(canon_stream_map) => {
+                &canon_stream_map.lambda
+            }
+        }
+    }
+
+    #[cfg(test)]
+    pub(crate) fn from_raw_value_path(
+        name: &'i str,
+        lambda: Vec<air_lambda_parser::ValueAccessor<'i>>,
+        position: AirPos,
+    ) -> Self {
+        let scalar = ScalarWithLambda::from_raw_lambda(name, lambda, position);
+        Self::Scalar(scalar)
+    }
+}
+
+impl<'i> StreamMap<'i> {
+    pub fn new(name: &'i str, position: AirPos) -> Self {
+        Self { name, position }
+    }
+}
+
+impl<'lens> InstructionErrorAST<'lens> {
+    pub fn new(lens: Option<LambdaAST<'lens>>) -> Self {
+        Self { lens }
+    }
+}
+
\ No newline at end of file diff --git a/src/air_parser/ast/values/traits.rs.html b/src/air_parser/ast/values/traits.rs.html new file mode 100644 index 00000000..f18de18b --- /dev/null +++ b/src/air_parser/ast/values/traits.rs.html @@ -0,0 +1,187 @@ +traits.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::*;
+use std::fmt;
+
+impl fmt::Display for Scalar<'_> {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        write!(f, "{}", self.name)
+    }
+}
+
+impl fmt::Display for ScalarWithLambda<'_> {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        write!(f, "{}{}", self.name, self.lambda)
+    }
+}
+
+impl fmt::Display for Stream<'_> {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        write!(f, "{}", self.name)
+    }
+}
+
+impl fmt::Display for CanonStream<'_> {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        write!(f, "{}", self.name)
+    }
+}
+
+impl fmt::Display for CanonStreamWithLambda<'_> {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        write!(f, "{}{}", self.name, self.lambda)
+    }
+}
+
+impl fmt::Display for CanonStreamMap<'_> {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        write!(f, "{}", self.name)
+    }
+}
+
+impl fmt::Display for CanonStreamMapWithLambda<'_> {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        write!(f, "{}{}", self.name, self.lambda)
+    }
+}
+
+impl fmt::Display for ImmutableVariable<'_> {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        use ImmutableVariable::*;
+
+        match self {
+            Scalar(scalar) => write!(f, "{scalar}"),
+            CanonStream(canon_stream) => write!(f, "{canon_stream}"),
+            CanonStreamMap(canon_stream_map) => write!(f, "{canon_stream_map}"),
+        }
+    }
+}
+
+impl fmt::Display for ImmutableVariableWithLambda<'_> {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        use ImmutableVariableWithLambda::*;
+
+        match self {
+            Scalar(scalar) => write!(f, "{scalar}"),
+            CanonStream(canon_stream) => write!(f, "{canon_stream}"),
+            CanonStreamMap(canon_stream_map) => write!(f, "{canon_stream_map}"),
+        }
+    }
+}
+
+impl fmt::Display for StreamMap<'_> {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        write!(f, "{}", self.name)
+    }
+}
+
\ No newline at end of file diff --git a/src/air_parser/lib.rs.html b/src/air_parser/lib.rs.html new file mode 100644 index 00000000..80dc5840 --- /dev/null +++ b/src/air_parser/lib.rs.html @@ -0,0 +1,83 @@ +lib.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#![forbid(unsafe_code)]
+#![deny(
+    dead_code,
+    nonstandard_style,
+    unused_imports,
+    unused_mut,
+    unused_variables,
+    unused_unsafe,
+    unreachable_patterns
+)]
+
+pub mod ast;
+mod parser;
+
+pub use parser::lexer::AirPos;
+pub use parser::parse;
+pub use parser::AIRLexer;
+pub use parser::AIRParser;
+pub use parser::VariableValidator;
+
+use air_lambda_parser::parse as parse_lambda;
+use air_lambda_parser::LambdaAST;
+
\ No newline at end of file diff --git a/src/air_parser/parser/air.rs.html b/src/air_parser/parser/air.rs.html new file mode 100644 index 00000000..19c38380 --- /dev/null +++ b/src/air_parser/parser/air.rs.html @@ -0,0 +1,19301 @@ +air.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
+334
+335
+336
+337
+338
+339
+340
+341
+342
+343
+344
+345
+346
+347
+348
+349
+350
+351
+352
+353
+354
+355
+356
+357
+358
+359
+360
+361
+362
+363
+364
+365
+366
+367
+368
+369
+370
+371
+372
+373
+374
+375
+376
+377
+378
+379
+380
+381
+382
+383
+384
+385
+386
+387
+388
+389
+390
+391
+392
+393
+394
+395
+396
+397
+398
+399
+400
+401
+402
+403
+404
+405
+406
+407
+408
+409
+410
+411
+412
+413
+414
+415
+416
+417
+418
+419
+420
+421
+422
+423
+424
+425
+426
+427
+428
+429
+430
+431
+432
+433
+434
+435
+436
+437
+438
+439
+440
+441
+442
+443
+444
+445
+446
+447
+448
+449
+450
+451
+452
+453
+454
+455
+456
+457
+458
+459
+460
+461
+462
+463
+464
+465
+466
+467
+468
+469
+470
+471
+472
+473
+474
+475
+476
+477
+478
+479
+480
+481
+482
+483
+484
+485
+486
+487
+488
+489
+490
+491
+492
+493
+494
+495
+496
+497
+498
+499
+500
+501
+502
+503
+504
+505
+506
+507
+508
+509
+510
+511
+512
+513
+514
+515
+516
+517
+518
+519
+520
+521
+522
+523
+524
+525
+526
+527
+528
+529
+530
+531
+532
+533
+534
+535
+536
+537
+538
+539
+540
+541
+542
+543
+544
+545
+546
+547
+548
+549
+550
+551
+552
+553
+554
+555
+556
+557
+558
+559
+560
+561
+562
+563
+564
+565
+566
+567
+568
+569
+570
+571
+572
+573
+574
+575
+576
+577
+578
+579
+580
+581
+582
+583
+584
+585
+586
+587
+588
+589
+590
+591
+592
+593
+594
+595
+596
+597
+598
+599
+600
+601
+602
+603
+604
+605
+606
+607
+608
+609
+610
+611
+612
+613
+614
+615
+616
+617
+618
+619
+620
+621
+622
+623
+624
+625
+626
+627
+628
+629
+630
+631
+632
+633
+634
+635
+636
+637
+638
+639
+640
+641
+642
+643
+644
+645
+646
+647
+648
+649
+650
+651
+652
+653
+654
+655
+656
+657
+658
+659
+660
+661
+662
+663
+664
+665
+666
+667
+668
+669
+670
+671
+672
+673
+674
+675
+676
+677
+678
+679
+680
+681
+682
+683
+684
+685
+686
+687
+688
+689
+690
+691
+692
+693
+694
+695
+696
+697
+698
+699
+700
+701
+702
+703
+704
+705
+706
+707
+708
+709
+710
+711
+712
+713
+714
+715
+716
+717
+718
+719
+720
+721
+722
+723
+724
+725
+726
+727
+728
+729
+730
+731
+732
+733
+734
+735
+736
+737
+738
+739
+740
+741
+742
+743
+744
+745
+746
+747
+748
+749
+750
+751
+752
+753
+754
+755
+756
+757
+758
+759
+760
+761
+762
+763
+764
+765
+766
+767
+768
+769
+770
+771
+772
+773
+774
+775
+776
+777
+778
+779
+780
+781
+782
+783
+784
+785
+786
+787
+788
+789
+790
+791
+792
+793
+794
+795
+796
+797
+798
+799
+800
+801
+802
+803
+804
+805
+806
+807
+808
+809
+810
+811
+812
+813
+814
+815
+816
+817
+818
+819
+820
+821
+822
+823
+824
+825
+826
+827
+828
+829
+830
+831
+832
+833
+834
+835
+836
+837
+838
+839
+840
+841
+842
+843
+844
+845
+846
+847
+848
+849
+850
+851
+852
+853
+854
+855
+856
+857
+858
+859
+860
+861
+862
+863
+864
+865
+866
+867
+868
+869
+870
+871
+872
+873
+874
+875
+876
+877
+878
+879
+880
+881
+882
+883
+884
+885
+886
+887
+888
+889
+890
+891
+892
+893
+894
+895
+896
+897
+898
+899
+900
+901
+902
+903
+904
+905
+906
+907
+908
+909
+910
+911
+912
+913
+914
+915
+916
+917
+918
+919
+920
+921
+922
+923
+924
+925
+926
+927
+928
+929
+930
+931
+932
+933
+934
+935
+936
+937
+938
+939
+940
+941
+942
+943
+944
+945
+946
+947
+948
+949
+950
+951
+952
+953
+954
+955
+956
+957
+958
+959
+960
+961
+962
+963
+964
+965
+966
+967
+968
+969
+970
+971
+972
+973
+974
+975
+976
+977
+978
+979
+980
+981
+982
+983
+984
+985
+986
+987
+988
+989
+990
+991
+992
+993
+994
+995
+996
+997
+998
+999
+1000
+1001
+1002
+1003
+1004
+1005
+1006
+1007
+1008
+1009
+1010
+1011
+1012
+1013
+1014
+1015
+1016
+1017
+1018
+1019
+1020
+1021
+1022
+1023
+1024
+1025
+1026
+1027
+1028
+1029
+1030
+1031
+1032
+1033
+1034
+1035
+1036
+1037
+1038
+1039
+1040
+1041
+1042
+1043
+1044
+1045
+1046
+1047
+1048
+1049
+1050
+1051
+1052
+1053
+1054
+1055
+1056
+1057
+1058
+1059
+1060
+1061
+1062
+1063
+1064
+1065
+1066
+1067
+1068
+1069
+1070
+1071
+1072
+1073
+1074
+1075
+1076
+1077
+1078
+1079
+1080
+1081
+1082
+1083
+1084
+1085
+1086
+1087
+1088
+1089
+1090
+1091
+1092
+1093
+1094
+1095
+1096
+1097
+1098
+1099
+1100
+1101
+1102
+1103
+1104
+1105
+1106
+1107
+1108
+1109
+1110
+1111
+1112
+1113
+1114
+1115
+1116
+1117
+1118
+1119
+1120
+1121
+1122
+1123
+1124
+1125
+1126
+1127
+1128
+1129
+1130
+1131
+1132
+1133
+1134
+1135
+1136
+1137
+1138
+1139
+1140
+1141
+1142
+1143
+1144
+1145
+1146
+1147
+1148
+1149
+1150
+1151
+1152
+1153
+1154
+1155
+1156
+1157
+1158
+1159
+1160
+1161
+1162
+1163
+1164
+1165
+1166
+1167
+1168
+1169
+1170
+1171
+1172
+1173
+1174
+1175
+1176
+1177
+1178
+1179
+1180
+1181
+1182
+1183
+1184
+1185
+1186
+1187
+1188
+1189
+1190
+1191
+1192
+1193
+1194
+1195
+1196
+1197
+1198
+1199
+1200
+1201
+1202
+1203
+1204
+1205
+1206
+1207
+1208
+1209
+1210
+1211
+1212
+1213
+1214
+1215
+1216
+1217
+1218
+1219
+1220
+1221
+1222
+1223
+1224
+1225
+1226
+1227
+1228
+1229
+1230
+1231
+1232
+1233
+1234
+1235
+1236
+1237
+1238
+1239
+1240
+1241
+1242
+1243
+1244
+1245
+1246
+1247
+1248
+1249
+1250
+1251
+1252
+1253
+1254
+1255
+1256
+1257
+1258
+1259
+1260
+1261
+1262
+1263
+1264
+1265
+1266
+1267
+1268
+1269
+1270
+1271
+1272
+1273
+1274
+1275
+1276
+1277
+1278
+1279
+1280
+1281
+1282
+1283
+1284
+1285
+1286
+1287
+1288
+1289
+1290
+1291
+1292
+1293
+1294
+1295
+1296
+1297
+1298
+1299
+1300
+1301
+1302
+1303
+1304
+1305
+1306
+1307
+1308
+1309
+1310
+1311
+1312
+1313
+1314
+1315
+1316
+1317
+1318
+1319
+1320
+1321
+1322
+1323
+1324
+1325
+1326
+1327
+1328
+1329
+1330
+1331
+1332
+1333
+1334
+1335
+1336
+1337
+1338
+1339
+1340
+1341
+1342
+1343
+1344
+1345
+1346
+1347
+1348
+1349
+1350
+1351
+1352
+1353
+1354
+1355
+1356
+1357
+1358
+1359
+1360
+1361
+1362
+1363
+1364
+1365
+1366
+1367
+1368
+1369
+1370
+1371
+1372
+1373
+1374
+1375
+1376
+1377
+1378
+1379
+1380
+1381
+1382
+1383
+1384
+1385
+1386
+1387
+1388
+1389
+1390
+1391
+1392
+1393
+1394
+1395
+1396
+1397
+1398
+1399
+1400
+1401
+1402
+1403
+1404
+1405
+1406
+1407
+1408
+1409
+1410
+1411
+1412
+1413
+1414
+1415
+1416
+1417
+1418
+1419
+1420
+1421
+1422
+1423
+1424
+1425
+1426
+1427
+1428
+1429
+1430
+1431
+1432
+1433
+1434
+1435
+1436
+1437
+1438
+1439
+1440
+1441
+1442
+1443
+1444
+1445
+1446
+1447
+1448
+1449
+1450
+1451
+1452
+1453
+1454
+1455
+1456
+1457
+1458
+1459
+1460
+1461
+1462
+1463
+1464
+1465
+1466
+1467
+1468
+1469
+1470
+1471
+1472
+1473
+1474
+1475
+1476
+1477
+1478
+1479
+1480
+1481
+1482
+1483
+1484
+1485
+1486
+1487
+1488
+1489
+1490
+1491
+1492
+1493
+1494
+1495
+1496
+1497
+1498
+1499
+1500
+1501
+1502
+1503
+1504
+1505
+1506
+1507
+1508
+1509
+1510
+1511
+1512
+1513
+1514
+1515
+1516
+1517
+1518
+1519
+1520
+1521
+1522
+1523
+1524
+1525
+1526
+1527
+1528
+1529
+1530
+1531
+1532
+1533
+1534
+1535
+1536
+1537
+1538
+1539
+1540
+1541
+1542
+1543
+1544
+1545
+1546
+1547
+1548
+1549
+1550
+1551
+1552
+1553
+1554
+1555
+1556
+1557
+1558
+1559
+1560
+1561
+1562
+1563
+1564
+1565
+1566
+1567
+1568
+1569
+1570
+1571
+1572
+1573
+1574
+1575
+1576
+1577
+1578
+1579
+1580
+1581
+1582
+1583
+1584
+1585
+1586
+1587
+1588
+1589
+1590
+1591
+1592
+1593
+1594
+1595
+1596
+1597
+1598
+1599
+1600
+1601
+1602
+1603
+1604
+1605
+1606
+1607
+1608
+1609
+1610
+1611
+1612
+1613
+1614
+1615
+1616
+1617
+1618
+1619
+1620
+1621
+1622
+1623
+1624
+1625
+1626
+1627
+1628
+1629
+1630
+1631
+1632
+1633
+1634
+1635
+1636
+1637
+1638
+1639
+1640
+1641
+1642
+1643
+1644
+1645
+1646
+1647
+1648
+1649
+1650
+1651
+1652
+1653
+1654
+1655
+1656
+1657
+1658
+1659
+1660
+1661
+1662
+1663
+1664
+1665
+1666
+1667
+1668
+1669
+1670
+1671
+1672
+1673
+1674
+1675
+1676
+1677
+1678
+1679
+1680
+1681
+1682
+1683
+1684
+1685
+1686
+1687
+1688
+1689
+1690
+1691
+1692
+1693
+1694
+1695
+1696
+1697
+1698
+1699
+1700
+1701
+1702
+1703
+1704
+1705
+1706
+1707
+1708
+1709
+1710
+1711
+1712
+1713
+1714
+1715
+1716
+1717
+1718
+1719
+1720
+1721
+1722
+1723
+1724
+1725
+1726
+1727
+1728
+1729
+1730
+1731
+1732
+1733
+1734
+1735
+1736
+1737
+1738
+1739
+1740
+1741
+1742
+1743
+1744
+1745
+1746
+1747
+1748
+1749
+1750
+1751
+1752
+1753
+1754
+1755
+1756
+1757
+1758
+1759
+1760
+1761
+1762
+1763
+1764
+1765
+1766
+1767
+1768
+1769
+1770
+1771
+1772
+1773
+1774
+1775
+1776
+1777
+1778
+1779
+1780
+1781
+1782
+1783
+1784
+1785
+1786
+1787
+1788
+1789
+1790
+1791
+1792
+1793
+1794
+1795
+1796
+1797
+1798
+1799
+1800
+1801
+1802
+1803
+1804
+1805
+1806
+1807
+1808
+1809
+1810
+1811
+1812
+1813
+1814
+1815
+1816
+1817
+1818
+1819
+1820
+1821
+1822
+1823
+1824
+1825
+1826
+1827
+1828
+1829
+1830
+1831
+1832
+1833
+1834
+1835
+1836
+1837
+1838
+1839
+1840
+1841
+1842
+1843
+1844
+1845
+1846
+1847
+1848
+1849
+1850
+1851
+1852
+1853
+1854
+1855
+1856
+1857
+1858
+1859
+1860
+1861
+1862
+1863
+1864
+1865
+1866
+1867
+1868
+1869
+1870
+1871
+1872
+1873
+1874
+1875
+1876
+1877
+1878
+1879
+1880
+1881
+1882
+1883
+1884
+1885
+1886
+1887
+1888
+1889
+1890
+1891
+1892
+1893
+1894
+1895
+1896
+1897
+1898
+1899
+1900
+1901
+1902
+1903
+1904
+1905
+1906
+1907
+1908
+1909
+1910
+1911
+1912
+1913
+1914
+1915
+1916
+1917
+1918
+1919
+1920
+1921
+1922
+1923
+1924
+1925
+1926
+1927
+1928
+1929
+1930
+1931
+1932
+1933
+1934
+1935
+1936
+1937
+1938
+1939
+1940
+1941
+1942
+1943
+1944
+1945
+1946
+1947
+1948
+1949
+1950
+1951
+1952
+1953
+1954
+1955
+1956
+1957
+1958
+1959
+1960
+1961
+1962
+1963
+1964
+1965
+1966
+1967
+1968
+1969
+1970
+1971
+1972
+1973
+1974
+1975
+1976
+1977
+1978
+1979
+1980
+1981
+1982
+1983
+1984
+1985
+1986
+1987
+1988
+1989
+1990
+1991
+1992
+1993
+1994
+1995
+1996
+1997
+1998
+1999
+2000
+2001
+2002
+2003
+2004
+2005
+2006
+2007
+2008
+2009
+2010
+2011
+2012
+2013
+2014
+2015
+2016
+2017
+2018
+2019
+2020
+2021
+2022
+2023
+2024
+2025
+2026
+2027
+2028
+2029
+2030
+2031
+2032
+2033
+2034
+2035
+2036
+2037
+2038
+2039
+2040
+2041
+2042
+2043
+2044
+2045
+2046
+2047
+2048
+2049
+2050
+2051
+2052
+2053
+2054
+2055
+2056
+2057
+2058
+2059
+2060
+2061
+2062
+2063
+2064
+2065
+2066
+2067
+2068
+2069
+2070
+2071
+2072
+2073
+2074
+2075
+2076
+2077
+2078
+2079
+2080
+2081
+2082
+2083
+2084
+2085
+2086
+2087
+2088
+2089
+2090
+2091
+2092
+2093
+2094
+2095
+2096
+2097
+2098
+2099
+2100
+2101
+2102
+2103
+2104
+2105
+2106
+2107
+2108
+2109
+2110
+2111
+2112
+2113
+2114
+2115
+2116
+2117
+2118
+2119
+2120
+2121
+2122
+2123
+2124
+2125
+2126
+2127
+2128
+2129
+2130
+2131
+2132
+2133
+2134
+2135
+2136
+2137
+2138
+2139
+2140
+2141
+2142
+2143
+2144
+2145
+2146
+2147
+2148
+2149
+2150
+2151
+2152
+2153
+2154
+2155
+2156
+2157
+2158
+2159
+2160
+2161
+2162
+2163
+2164
+2165
+2166
+2167
+2168
+2169
+2170
+2171
+2172
+2173
+2174
+2175
+2176
+2177
+2178
+2179
+2180
+2181
+2182
+2183
+2184
+2185
+2186
+2187
+2188
+2189
+2190
+2191
+2192
+2193
+2194
+2195
+2196
+2197
+2198
+2199
+2200
+2201
+2202
+2203
+2204
+2205
+2206
+2207
+2208
+2209
+2210
+2211
+2212
+2213
+2214
+2215
+2216
+2217
+2218
+2219
+2220
+2221
+2222
+2223
+2224
+2225
+2226
+2227
+2228
+2229
+2230
+2231
+2232
+2233
+2234
+2235
+2236
+2237
+2238
+2239
+2240
+2241
+2242
+2243
+2244
+2245
+2246
+2247
+2248
+2249
+2250
+2251
+2252
+2253
+2254
+2255
+2256
+2257
+2258
+2259
+2260
+2261
+2262
+2263
+2264
+2265
+2266
+2267
+2268
+2269
+2270
+2271
+2272
+2273
+2274
+2275
+2276
+2277
+2278
+2279
+2280
+2281
+2282
+2283
+2284
+2285
+2286
+2287
+2288
+2289
+2290
+2291
+2292
+2293
+2294
+2295
+2296
+2297
+2298
+2299
+2300
+2301
+2302
+2303
+2304
+2305
+2306
+2307
+2308
+2309
+2310
+2311
+2312
+2313
+2314
+2315
+2316
+2317
+2318
+2319
+2320
+2321
+2322
+2323
+2324
+2325
+2326
+2327
+2328
+2329
+2330
+2331
+2332
+2333
+2334
+2335
+2336
+2337
+2338
+2339
+2340
+2341
+2342
+2343
+2344
+2345
+2346
+2347
+2348
+2349
+2350
+2351
+2352
+2353
+2354
+2355
+2356
+2357
+2358
+2359
+2360
+2361
+2362
+2363
+2364
+2365
+2366
+2367
+2368
+2369
+2370
+2371
+2372
+2373
+2374
+2375
+2376
+2377
+2378
+2379
+2380
+2381
+2382
+2383
+2384
+2385
+2386
+2387
+2388
+2389
+2390
+2391
+2392
+2393
+2394
+2395
+2396
+2397
+2398
+2399
+2400
+2401
+2402
+2403
+2404
+2405
+2406
+2407
+2408
+2409
+2410
+2411
+2412
+2413
+2414
+2415
+2416
+2417
+2418
+2419
+2420
+2421
+2422
+2423
+2424
+2425
+2426
+2427
+2428
+2429
+2430
+2431
+2432
+2433
+2434
+2435
+2436
+2437
+2438
+2439
+2440
+2441
+2442
+2443
+2444
+2445
+2446
+2447
+2448
+2449
+2450
+2451
+2452
+2453
+2454
+2455
+2456
+2457
+2458
+2459
+2460
+2461
+2462
+2463
+2464
+2465
+2466
+2467
+2468
+2469
+2470
+2471
+2472
+2473
+2474
+2475
+2476
+2477
+2478
+2479
+2480
+2481
+2482
+2483
+2484
+2485
+2486
+2487
+2488
+2489
+2490
+2491
+2492
+2493
+2494
+2495
+2496
+2497
+2498
+2499
+2500
+2501
+2502
+2503
+2504
+2505
+2506
+2507
+2508
+2509
+2510
+2511
+2512
+2513
+2514
+2515
+2516
+2517
+2518
+2519
+2520
+2521
+2522
+2523
+2524
+2525
+2526
+2527
+2528
+2529
+2530
+2531
+2532
+2533
+2534
+2535
+2536
+2537
+2538
+2539
+2540
+2541
+2542
+2543
+2544
+2545
+2546
+2547
+2548
+2549
+2550
+2551
+2552
+2553
+2554
+2555
+2556
+2557
+2558
+2559
+2560
+2561
+2562
+2563
+2564
+2565
+2566
+2567
+2568
+2569
+2570
+2571
+2572
+2573
+2574
+2575
+2576
+2577
+2578
+2579
+2580
+2581
+2582
+2583
+2584
+2585
+2586
+2587
+2588
+2589
+2590
+2591
+2592
+2593
+2594
+2595
+2596
+2597
+2598
+2599
+2600
+2601
+2602
+2603
+2604
+2605
+2606
+2607
+2608
+2609
+2610
+2611
+2612
+2613
+2614
+2615
+2616
+2617
+2618
+2619
+2620
+2621
+2622
+2623
+2624
+2625
+2626
+2627
+2628
+2629
+2630
+2631
+2632
+2633
+2634
+2635
+2636
+2637
+2638
+2639
+2640
+2641
+2642
+2643
+2644
+2645
+2646
+2647
+2648
+2649
+2650
+2651
+2652
+2653
+2654
+2655
+2656
+2657
+2658
+2659
+2660
+2661
+2662
+2663
+2664
+2665
+2666
+2667
+2668
+2669
+2670
+2671
+2672
+2673
+2674
+2675
+2676
+2677
+2678
+2679
+2680
+2681
+2682
+2683
+2684
+2685
+2686
+2687
+2688
+2689
+2690
+2691
+2692
+2693
+2694
+2695
+2696
+2697
+2698
+2699
+2700
+2701
+2702
+2703
+2704
+2705
+2706
+2707
+2708
+2709
+2710
+2711
+2712
+2713
+2714
+2715
+2716
+2717
+2718
+2719
+2720
+2721
+2722
+2723
+2724
+2725
+2726
+2727
+2728
+2729
+2730
+2731
+2732
+2733
+2734
+2735
+2736
+2737
+2738
+2739
+2740
+2741
+2742
+2743
+2744
+2745
+2746
+2747
+2748
+2749
+2750
+2751
+2752
+2753
+2754
+2755
+2756
+2757
+2758
+2759
+2760
+2761
+2762
+2763
+2764
+2765
+2766
+2767
+2768
+2769
+2770
+2771
+2772
+2773
+2774
+2775
+2776
+2777
+2778
+2779
+2780
+2781
+2782
+2783
+2784
+2785
+2786
+2787
+2788
+2789
+2790
+2791
+2792
+2793
+2794
+2795
+2796
+2797
+2798
+2799
+2800
+2801
+2802
+2803
+2804
+2805
+2806
+2807
+2808
+2809
+2810
+2811
+2812
+2813
+2814
+2815
+2816
+2817
+2818
+2819
+2820
+2821
+2822
+2823
+2824
+2825
+2826
+2827
+2828
+2829
+2830
+2831
+2832
+2833
+2834
+2835
+2836
+2837
+2838
+2839
+2840
+2841
+2842
+2843
+2844
+2845
+2846
+2847
+2848
+2849
+2850
+2851
+2852
+2853
+2854
+2855
+2856
+2857
+2858
+2859
+2860
+2861
+2862
+2863
+2864
+2865
+2866
+2867
+2868
+2869
+2870
+2871
+2872
+2873
+2874
+2875
+2876
+2877
+2878
+2879
+2880
+2881
+2882
+2883
+2884
+2885
+2886
+2887
+2888
+2889
+2890
+2891
+2892
+2893
+2894
+2895
+2896
+2897
+2898
+2899
+2900
+2901
+2902
+2903
+2904
+2905
+2906
+2907
+2908
+2909
+2910
+2911
+2912
+2913
+2914
+2915
+2916
+2917
+2918
+2919
+2920
+2921
+2922
+2923
+2924
+2925
+2926
+2927
+2928
+2929
+2930
+2931
+2932
+2933
+2934
+2935
+2936
+2937
+2938
+2939
+2940
+2941
+2942
+2943
+2944
+2945
+2946
+2947
+2948
+2949
+2950
+2951
+2952
+2953
+2954
+2955
+2956
+2957
+2958
+2959
+2960
+2961
+2962
+2963
+2964
+2965
+2966
+2967
+2968
+2969
+2970
+2971
+2972
+2973
+2974
+2975
+2976
+2977
+2978
+2979
+2980
+2981
+2982
+2983
+2984
+2985
+2986
+2987
+2988
+2989
+2990
+2991
+2992
+2993
+2994
+2995
+2996
+2997
+2998
+2999
+3000
+3001
+3002
+3003
+3004
+3005
+3006
+3007
+3008
+3009
+3010
+3011
+3012
+3013
+3014
+3015
+3016
+3017
+3018
+3019
+3020
+3021
+3022
+3023
+3024
+3025
+3026
+3027
+3028
+3029
+3030
+3031
+3032
+3033
+3034
+3035
+3036
+3037
+3038
+3039
+3040
+3041
+3042
+3043
+3044
+3045
+3046
+3047
+3048
+3049
+3050
+3051
+3052
+3053
+3054
+3055
+3056
+3057
+3058
+3059
+3060
+3061
+3062
+3063
+3064
+3065
+3066
+3067
+3068
+3069
+3070
+3071
+3072
+3073
+3074
+3075
+3076
+3077
+3078
+3079
+3080
+3081
+3082
+3083
+3084
+3085
+3086
+3087
+3088
+3089
+3090
+3091
+3092
+3093
+3094
+3095
+3096
+3097
+3098
+3099
+3100
+3101
+3102
+3103
+3104
+3105
+3106
+3107
+3108
+3109
+3110
+3111
+3112
+3113
+3114
+3115
+3116
+3117
+3118
+3119
+3120
+3121
+3122
+3123
+3124
+3125
+3126
+3127
+3128
+3129
+3130
+3131
+3132
+3133
+3134
+3135
+3136
+3137
+3138
+3139
+3140
+3141
+3142
+3143
+3144
+3145
+3146
+3147
+3148
+3149
+3150
+3151
+3152
+3153
+3154
+3155
+3156
+3157
+3158
+3159
+3160
+3161
+3162
+3163
+3164
+3165
+3166
+3167
+3168
+3169
+3170
+3171
+3172
+3173
+3174
+3175
+3176
+3177
+3178
+3179
+3180
+3181
+3182
+3183
+3184
+3185
+3186
+3187
+3188
+3189
+3190
+3191
+3192
+3193
+3194
+3195
+3196
+3197
+3198
+3199
+3200
+3201
+3202
+3203
+3204
+3205
+3206
+3207
+3208
+3209
+3210
+3211
+3212
+3213
+3214
+3215
+3216
+3217
+3218
+3219
+3220
+3221
+3222
+3223
+3224
+3225
+3226
+3227
+3228
+3229
+3230
+3231
+3232
+3233
+3234
+3235
+3236
+3237
+3238
+3239
+3240
+3241
+3242
+3243
+3244
+3245
+3246
+3247
+3248
+3249
+3250
+3251
+3252
+3253
+3254
+3255
+3256
+3257
+3258
+3259
+3260
+3261
+3262
+3263
+3264
+3265
+3266
+3267
+3268
+3269
+3270
+3271
+3272
+3273
+3274
+3275
+3276
+3277
+3278
+3279
+3280
+3281
+3282
+3283
+3284
+3285
+3286
+3287
+3288
+3289
+3290
+3291
+3292
+3293
+3294
+3295
+3296
+3297
+3298
+3299
+3300
+3301
+3302
+3303
+3304
+3305
+3306
+3307
+3308
+3309
+3310
+3311
+3312
+3313
+3314
+3315
+3316
+3317
+3318
+3319
+3320
+3321
+3322
+3323
+3324
+3325
+3326
+3327
+3328
+3329
+3330
+3331
+3332
+3333
+3334
+3335
+3336
+3337
+3338
+3339
+3340
+3341
+3342
+3343
+3344
+3345
+3346
+3347
+3348
+3349
+3350
+3351
+3352
+3353
+3354
+3355
+3356
+3357
+3358
+3359
+3360
+3361
+3362
+3363
+3364
+3365
+3366
+3367
+3368
+3369
+3370
+3371
+3372
+3373
+3374
+3375
+3376
+3377
+3378
+3379
+3380
+3381
+3382
+3383
+3384
+3385
+3386
+3387
+3388
+3389
+3390
+3391
+3392
+3393
+3394
+3395
+3396
+3397
+3398
+3399
+3400
+3401
+3402
+3403
+3404
+3405
+3406
+3407
+3408
+3409
+3410
+3411
+3412
+3413
+3414
+3415
+3416
+3417
+3418
+3419
+3420
+3421
+3422
+3423
+3424
+3425
+3426
+3427
+3428
+3429
+3430
+3431
+3432
+3433
+3434
+3435
+3436
+3437
+3438
+3439
+3440
+3441
+3442
+3443
+3444
+3445
+3446
+3447
+3448
+3449
+3450
+3451
+3452
+3453
+3454
+3455
+3456
+3457
+3458
+3459
+3460
+3461
+3462
+3463
+3464
+3465
+3466
+3467
+3468
+3469
+3470
+3471
+3472
+3473
+3474
+3475
+3476
+3477
+3478
+3479
+3480
+3481
+3482
+3483
+3484
+3485
+3486
+3487
+3488
+3489
+3490
+3491
+3492
+3493
+3494
+3495
+3496
+3497
+3498
+3499
+3500
+3501
+3502
+3503
+3504
+3505
+3506
+3507
+3508
+3509
+3510
+3511
+3512
+3513
+3514
+3515
+3516
+3517
+3518
+3519
+3520
+3521
+3522
+3523
+3524
+3525
+3526
+3527
+3528
+3529
+3530
+3531
+3532
+3533
+3534
+3535
+3536
+3537
+3538
+3539
+3540
+3541
+3542
+3543
+3544
+3545
+3546
+3547
+3548
+3549
+3550
+3551
+3552
+3553
+3554
+3555
+3556
+3557
+3558
+3559
+3560
+3561
+3562
+3563
+3564
+3565
+3566
+3567
+3568
+3569
+3570
+3571
+3572
+3573
+3574
+3575
+3576
+3577
+3578
+3579
+3580
+3581
+3582
+3583
+3584
+3585
+3586
+3587
+3588
+3589
+3590
+3591
+3592
+3593
+3594
+3595
+3596
+3597
+3598
+3599
+3600
+3601
+3602
+3603
+3604
+3605
+3606
+3607
+3608
+3609
+3610
+3611
+3612
+3613
+3614
+3615
+3616
+3617
+3618
+3619
+3620
+3621
+3622
+3623
+3624
+3625
+3626
+3627
+3628
+3629
+3630
+3631
+3632
+3633
+3634
+3635
+3636
+3637
+3638
+3639
+3640
+3641
+3642
+3643
+3644
+3645
+3646
+3647
+3648
+3649
+3650
+3651
+3652
+3653
+3654
+3655
+3656
+3657
+3658
+3659
+3660
+3661
+3662
+3663
+3664
+3665
+3666
+3667
+3668
+3669
+3670
+3671
+3672
+3673
+3674
+3675
+3676
+3677
+3678
+3679
+3680
+3681
+3682
+3683
+3684
+3685
+3686
+3687
+3688
+3689
+3690
+3691
+3692
+3693
+3694
+3695
+3696
+3697
+3698
+3699
+3700
+3701
+3702
+3703
+3704
+3705
+3706
+3707
+3708
+3709
+3710
+3711
+3712
+3713
+3714
+3715
+3716
+3717
+3718
+3719
+3720
+3721
+3722
+3723
+3724
+3725
+3726
+3727
+3728
+3729
+3730
+3731
+3732
+3733
+3734
+3735
+3736
+3737
+3738
+3739
+3740
+3741
+3742
+3743
+3744
+3745
+3746
+3747
+3748
+3749
+3750
+3751
+3752
+3753
+3754
+3755
+3756
+3757
+3758
+3759
+3760
+3761
+3762
+3763
+3764
+3765
+3766
+3767
+3768
+3769
+3770
+3771
+3772
+3773
+3774
+3775
+3776
+3777
+3778
+3779
+3780
+3781
+3782
+3783
+3784
+3785
+3786
+3787
+3788
+3789
+3790
+3791
+3792
+3793
+3794
+3795
+3796
+3797
+3798
+3799
+3800
+3801
+3802
+3803
+3804
+3805
+3806
+3807
+3808
+3809
+3810
+3811
+3812
+3813
+3814
+3815
+3816
+3817
+3818
+3819
+3820
+3821
+3822
+3823
+3824
+3825
+3826
+3827
+3828
+3829
+3830
+3831
+3832
+3833
+3834
+3835
+3836
+3837
+3838
+3839
+3840
+3841
+3842
+3843
+3844
+3845
+3846
+3847
+3848
+3849
+3850
+3851
+3852
+3853
+3854
+3855
+3856
+3857
+3858
+3859
+3860
+3861
+3862
+3863
+3864
+3865
+3866
+3867
+3868
+3869
+3870
+3871
+3872
+3873
+3874
+3875
+3876
+3877
+3878
+3879
+3880
+3881
+3882
+3883
+3884
+3885
+3886
+3887
+3888
+3889
+3890
+3891
+3892
+3893
+3894
+3895
+3896
+3897
+3898
+3899
+3900
+3901
+3902
+3903
+3904
+3905
+3906
+3907
+3908
+3909
+3910
+3911
+3912
+3913
+3914
+3915
+3916
+3917
+3918
+3919
+3920
+3921
+3922
+3923
+3924
+3925
+3926
+3927
+3928
+3929
+3930
+3931
+3932
+3933
+3934
+3935
+3936
+3937
+3938
+3939
+3940
+3941
+3942
+3943
+3944
+3945
+3946
+3947
+3948
+3949
+3950
+3951
+3952
+3953
+3954
+3955
+3956
+3957
+3958
+3959
+3960
+3961
+3962
+3963
+3964
+3965
+3966
+3967
+3968
+3969
+3970
+3971
+3972
+3973
+3974
+3975
+3976
+3977
+3978
+3979
+3980
+3981
+3982
+3983
+3984
+3985
+3986
+3987
+3988
+3989
+3990
+3991
+3992
+3993
+3994
+3995
+3996
+3997
+3998
+3999
+4000
+4001
+4002
+4003
+4004
+4005
+4006
+4007
+4008
+4009
+4010
+4011
+4012
+4013
+4014
+4015
+4016
+4017
+4018
+4019
+4020
+4021
+4022
+4023
+4024
+4025
+4026
+4027
+4028
+4029
+4030
+4031
+4032
+4033
+4034
+4035
+4036
+4037
+4038
+4039
+4040
+4041
+4042
+4043
+4044
+4045
+4046
+4047
+4048
+4049
+4050
+4051
+4052
+4053
+4054
+4055
+4056
+4057
+4058
+4059
+4060
+4061
+4062
+4063
+4064
+4065
+4066
+4067
+4068
+4069
+4070
+4071
+4072
+4073
+4074
+4075
+4076
+4077
+4078
+4079
+4080
+4081
+4082
+4083
+4084
+4085
+4086
+4087
+4088
+4089
+4090
+4091
+4092
+4093
+4094
+4095
+4096
+4097
+4098
+4099
+4100
+4101
+4102
+4103
+4104
+4105
+4106
+4107
+4108
+4109
+4110
+4111
+4112
+4113
+4114
+4115
+4116
+4117
+4118
+4119
+4120
+4121
+4122
+4123
+4124
+4125
+4126
+4127
+4128
+4129
+4130
+4131
+4132
+4133
+4134
+4135
+4136
+4137
+4138
+4139
+4140
+4141
+4142
+4143
+4144
+4145
+4146
+4147
+4148
+4149
+4150
+4151
+4152
+4153
+4154
+4155
+4156
+4157
+4158
+4159
+4160
+4161
+4162
+4163
+4164
+4165
+4166
+4167
+4168
+4169
+4170
+4171
+4172
+4173
+4174
+4175
+4176
+4177
+4178
+4179
+4180
+4181
+4182
+4183
+4184
+4185
+4186
+4187
+4188
+4189
+4190
+4191
+4192
+4193
+4194
+4195
+4196
+4197
+4198
+4199
+4200
+4201
+4202
+4203
+4204
+4205
+4206
+4207
+4208
+4209
+4210
+4211
+4212
+4213
+4214
+4215
+4216
+4217
+4218
+4219
+4220
+4221
+4222
+4223
+4224
+4225
+4226
+4227
+4228
+4229
+4230
+4231
+4232
+4233
+4234
+4235
+4236
+4237
+4238
+4239
+4240
+4241
+4242
+4243
+4244
+4245
+4246
+4247
+4248
+4249
+4250
+4251
+4252
+4253
+4254
+4255
+4256
+4257
+4258
+4259
+4260
+4261
+4262
+4263
+4264
+4265
+4266
+4267
+4268
+4269
+4270
+4271
+4272
+4273
+4274
+4275
+4276
+4277
+4278
+4279
+4280
+4281
+4282
+4283
+4284
+4285
+4286
+4287
+4288
+4289
+4290
+4291
+4292
+4293
+4294
+4295
+4296
+4297
+4298
+4299
+4300
+4301
+4302
+4303
+4304
+4305
+4306
+4307
+4308
+4309
+4310
+4311
+4312
+4313
+4314
+4315
+4316
+4317
+4318
+4319
+4320
+4321
+4322
+4323
+4324
+4325
+4326
+4327
+4328
+4329
+4330
+4331
+4332
+4333
+4334
+4335
+4336
+4337
+4338
+4339
+4340
+4341
+4342
+4343
+4344
+4345
+4346
+4347
+4348
+4349
+4350
+4351
+4352
+4353
+4354
+4355
+4356
+4357
+4358
+4359
+4360
+4361
+4362
+4363
+4364
+4365
+4366
+4367
+4368
+4369
+4370
+4371
+4372
+4373
+4374
+4375
+4376
+4377
+4378
+4379
+4380
+4381
+4382
+4383
+4384
+4385
+4386
+4387
+4388
+4389
+4390
+4391
+4392
+4393
+4394
+4395
+4396
+4397
+4398
+4399
+4400
+4401
+4402
+4403
+4404
+4405
+4406
+4407
+4408
+4409
+4410
+4411
+4412
+4413
+4414
+4415
+4416
+4417
+4418
+4419
+4420
+4421
+4422
+4423
+4424
+4425
+4426
+4427
+4428
+4429
+4430
+4431
+4432
+4433
+4434
+4435
+4436
+4437
+4438
+4439
+4440
+4441
+4442
+4443
+4444
+4445
+4446
+4447
+4448
+4449
+4450
+4451
+4452
+4453
+4454
+4455
+4456
+4457
+4458
+4459
+4460
+4461
+4462
+4463
+4464
+4465
+4466
+4467
+4468
+4469
+4470
+4471
+4472
+4473
+4474
+4475
+4476
+4477
+4478
+4479
+4480
+4481
+4482
+4483
+4484
+4485
+4486
+4487
+4488
+4489
+4490
+4491
+4492
+4493
+4494
+4495
+4496
+4497
+4498
+4499
+4500
+4501
+4502
+4503
+4504
+4505
+4506
+4507
+4508
+4509
+4510
+4511
+4512
+4513
+4514
+4515
+4516
+4517
+4518
+4519
+4520
+4521
+4522
+4523
+4524
+4525
+4526
+4527
+4528
+4529
+4530
+4531
+4532
+4533
+4534
+4535
+4536
+4537
+4538
+4539
+4540
+4541
+4542
+4543
+4544
+4545
+4546
+4547
+4548
+4549
+4550
+4551
+4552
+4553
+4554
+4555
+4556
+4557
+4558
+4559
+4560
+4561
+4562
+4563
+4564
+4565
+4566
+4567
+4568
+4569
+4570
+4571
+4572
+4573
+4574
+4575
+4576
+4577
+4578
+4579
+4580
+4581
+4582
+4583
+4584
+4585
+4586
+4587
+4588
+4589
+4590
+4591
+4592
+4593
+4594
+4595
+4596
+4597
+4598
+4599
+4600
+4601
+4602
+4603
+4604
+4605
+4606
+4607
+4608
+4609
+4610
+4611
+4612
+4613
+4614
+4615
+4616
+4617
+4618
+4619
+4620
+4621
+4622
+4623
+4624
+4625
+4626
+4627
+4628
+4629
+4630
+4631
+4632
+4633
+4634
+4635
+4636
+4637
+4638
+4639
+4640
+4641
+4642
+4643
+4644
+4645
+4646
+4647
+4648
+4649
+4650
+4651
+4652
+4653
+4654
+4655
+4656
+4657
+4658
+4659
+4660
+4661
+4662
+4663
+4664
+4665
+4666
+4667
+4668
+4669
+4670
+4671
+4672
+4673
+4674
+4675
+4676
+4677
+4678
+4679
+4680
+4681
+4682
+4683
+4684
+4685
+4686
+4687
+4688
+4689
+4690
+4691
+4692
+4693
+4694
+4695
+4696
+4697
+4698
+4699
+4700
+4701
+4702
+4703
+4704
+4705
+4706
+4707
+4708
+4709
+4710
+4711
+4712
+4713
+4714
+4715
+4716
+4717
+4718
+4719
+4720
+4721
+4722
+4723
+4724
+4725
+4726
+4727
+4728
+4729
+4730
+4731
+4732
+4733
+4734
+4735
+4736
+4737
+4738
+4739
+4740
+4741
+4742
+4743
+4744
+4745
+4746
+4747
+4748
+4749
+4750
+4751
+4752
+4753
+4754
+4755
+4756
+4757
+4758
+4759
+4760
+4761
+4762
+4763
+4764
+4765
+4766
+4767
+4768
+4769
+4770
+4771
+4772
+4773
+4774
+4775
+4776
+4777
+4778
+4779
+4780
+4781
+4782
+4783
+4784
+4785
+4786
+4787
+4788
+4789
+4790
+4791
+4792
+4793
+4794
+4795
+4796
+4797
+4798
+4799
+4800
+4801
+4802
+4803
+4804
+4805
+4806
+4807
+4808
+4809
+4810
+4811
+4812
+4813
+4814
+4815
+4816
+4817
+4818
+4819
+4820
+4821
+4822
+4823
+4824
+4825
+4826
+4827
+4828
+4829
+4830
+4831
+4832
+4833
+4834
+4835
+4836
+4837
+4838
+4839
+4840
+4841
+4842
+4843
+4844
+4845
+4846
+4847
+4848
+4849
+4850
+4851
+4852
+4853
+4854
+4855
+4856
+4857
+4858
+4859
+4860
+4861
+4862
+4863
+4864
+4865
+4866
+4867
+4868
+4869
+4870
+4871
+4872
+4873
+4874
+4875
+4876
+4877
+4878
+4879
+4880
+4881
+4882
+4883
+4884
+4885
+4886
+4887
+4888
+4889
+4890
+4891
+4892
+4893
+4894
+4895
+4896
+4897
+4898
+4899
+4900
+4901
+4902
+4903
+4904
+4905
+4906
+4907
+4908
+4909
+4910
+4911
+4912
+4913
+4914
+4915
+4916
+4917
+4918
+4919
+4920
+4921
+4922
+4923
+4924
+4925
+4926
+4927
+4928
+4929
+4930
+4931
+4932
+4933
+4934
+4935
+4936
+4937
+4938
+4939
+4940
+4941
+4942
+4943
+4944
+4945
+4946
+4947
+4948
+4949
+4950
+4951
+4952
+4953
+4954
+4955
+4956
+4957
+4958
+4959
+4960
+4961
+4962
+4963
+4964
+4965
+4966
+4967
+4968
+4969
+4970
+4971
+4972
+4973
+4974
+4975
+4976
+4977
+4978
+4979
+4980
+4981
+4982
+4983
+4984
+4985
+4986
+4987
+4988
+4989
+4990
+4991
+4992
+4993
+4994
+4995
+4996
+4997
+4998
+4999
+5000
+5001
+5002
+5003
+5004
+5005
+5006
+5007
+5008
+5009
+5010
+5011
+5012
+5013
+5014
+5015
+5016
+5017
+5018
+5019
+5020
+5021
+5022
+5023
+5024
+5025
+5026
+5027
+5028
+5029
+5030
+5031
+5032
+5033
+5034
+5035
+5036
+5037
+5038
+5039
+5040
+5041
+5042
+5043
+5044
+5045
+5046
+5047
+5048
+5049
+5050
+5051
+5052
+5053
+5054
+5055
+5056
+5057
+5058
+5059
+5060
+5061
+5062
+5063
+5064
+5065
+5066
+5067
+5068
+5069
+5070
+5071
+5072
+5073
+5074
+5075
+5076
+5077
+5078
+5079
+5080
+5081
+5082
+5083
+5084
+5085
+5086
+5087
+5088
+5089
+5090
+5091
+5092
+5093
+5094
+5095
+5096
+5097
+5098
+5099
+5100
+5101
+5102
+5103
+5104
+5105
+5106
+5107
+5108
+5109
+5110
+5111
+5112
+5113
+5114
+5115
+5116
+5117
+5118
+5119
+5120
+5121
+5122
+5123
+5124
+5125
+5126
+5127
+5128
+5129
+5130
+5131
+5132
+5133
+5134
+5135
+5136
+5137
+5138
+5139
+5140
+5141
+5142
+5143
+5144
+5145
+5146
+5147
+5148
+5149
+5150
+5151
+5152
+5153
+5154
+5155
+5156
+5157
+5158
+5159
+5160
+5161
+5162
+5163
+5164
+5165
+5166
+5167
+5168
+5169
+5170
+5171
+5172
+5173
+5174
+5175
+5176
+5177
+5178
+5179
+5180
+5181
+5182
+5183
+5184
+5185
+5186
+5187
+5188
+5189
+5190
+5191
+5192
+5193
+5194
+5195
+5196
+5197
+5198
+5199
+5200
+5201
+5202
+5203
+5204
+5205
+5206
+5207
+5208
+5209
+5210
+5211
+5212
+5213
+5214
+5215
+5216
+5217
+5218
+5219
+5220
+5221
+5222
+5223
+5224
+5225
+5226
+5227
+5228
+5229
+5230
+5231
+5232
+5233
+5234
+5235
+5236
+5237
+5238
+5239
+5240
+5241
+5242
+5243
+5244
+5245
+5246
+5247
+5248
+5249
+5250
+5251
+5252
+5253
+5254
+5255
+5256
+5257
+5258
+5259
+5260
+5261
+5262
+5263
+5264
+5265
+5266
+5267
+5268
+5269
+5270
+5271
+5272
+5273
+5274
+5275
+5276
+5277
+5278
+5279
+5280
+5281
+5282
+5283
+5284
+5285
+5286
+5287
+5288
+5289
+5290
+5291
+5292
+5293
+5294
+5295
+5296
+5297
+5298
+5299
+5300
+5301
+5302
+5303
+5304
+5305
+5306
+5307
+5308
+5309
+5310
+5311
+5312
+5313
+5314
+5315
+5316
+5317
+5318
+5319
+5320
+5321
+5322
+5323
+5324
+5325
+5326
+5327
+5328
+5329
+5330
+5331
+5332
+5333
+5334
+5335
+5336
+5337
+5338
+5339
+5340
+5341
+5342
+5343
+5344
+5345
+5346
+5347
+5348
+5349
+5350
+5351
+5352
+5353
+5354
+5355
+5356
+5357
+5358
+5359
+5360
+5361
+5362
+5363
+5364
+5365
+5366
+5367
+5368
+5369
+5370
+5371
+5372
+5373
+5374
+5375
+5376
+5377
+5378
+5379
+5380
+5381
+5382
+5383
+5384
+5385
+5386
+5387
+5388
+5389
+5390
+5391
+5392
+5393
+5394
+5395
+5396
+5397
+5398
+5399
+5400
+5401
+5402
+5403
+5404
+5405
+5406
+5407
+5408
+5409
+5410
+5411
+5412
+5413
+5414
+5415
+5416
+5417
+5418
+5419
+5420
+5421
+5422
+5423
+5424
+5425
+5426
+5427
+5428
+5429
+5430
+5431
+5432
+5433
+5434
+5435
+5436
+5437
+5438
+5439
+5440
+5441
+5442
+5443
+5444
+5445
+5446
+5447
+5448
+5449
+5450
+5451
+5452
+5453
+5454
+5455
+5456
+5457
+5458
+5459
+5460
+5461
+5462
+5463
+5464
+5465
+5466
+5467
+5468
+5469
+5470
+5471
+5472
+5473
+5474
+5475
+5476
+5477
+5478
+5479
+5480
+5481
+5482
+5483
+5484
+5485
+5486
+5487
+5488
+5489
+5490
+5491
+5492
+5493
+5494
+5495
+5496
+5497
+5498
+5499
+5500
+5501
+5502
+5503
+5504
+5505
+5506
+5507
+5508
+5509
+5510
+5511
+5512
+5513
+5514
+5515
+5516
+5517
+5518
+5519
+5520
+5521
+5522
+5523
+5524
+5525
+5526
+5527
+5528
+5529
+5530
+5531
+5532
+5533
+5534
+5535
+5536
+5537
+5538
+5539
+5540
+5541
+5542
+5543
+5544
+5545
+5546
+5547
+5548
+5549
+5550
+5551
+5552
+5553
+5554
+5555
+5556
+5557
+5558
+5559
+5560
+5561
+5562
+5563
+5564
+5565
+5566
+5567
+5568
+5569
+5570
+5571
+5572
+5573
+5574
+5575
+5576
+5577
+5578
+5579
+5580
+5581
+5582
+5583
+5584
+5585
+5586
+5587
+5588
+5589
+5590
+5591
+5592
+5593
+5594
+5595
+5596
+5597
+5598
+5599
+5600
+5601
+5602
+5603
+5604
+5605
+5606
+5607
+5608
+5609
+5610
+5611
+5612
+5613
+5614
+5615
+5616
+5617
+5618
+5619
+5620
+5621
+5622
+5623
+5624
+5625
+5626
+5627
+5628
+5629
+5630
+5631
+5632
+5633
+5634
+5635
+5636
+5637
+5638
+5639
+5640
+5641
+5642
+5643
+5644
+5645
+5646
+5647
+5648
+5649
+5650
+5651
+5652
+5653
+5654
+5655
+5656
+5657
+5658
+5659
+5660
+5661
+5662
+5663
+5664
+5665
+5666
+5667
+5668
+5669
+5670
+5671
+5672
+5673
+5674
+5675
+5676
+5677
+5678
+5679
+5680
+5681
+5682
+5683
+5684
+5685
+5686
+5687
+5688
+5689
+5690
+5691
+5692
+5693
+5694
+5695
+5696
+5697
+5698
+5699
+5700
+5701
+5702
+5703
+5704
+5705
+5706
+5707
+5708
+5709
+5710
+5711
+5712
+5713
+5714
+5715
+5716
+5717
+5718
+5719
+5720
+5721
+5722
+5723
+5724
+5725
+5726
+5727
+5728
+5729
+5730
+5731
+5732
+5733
+5734
+5735
+5736
+5737
+5738
+5739
+5740
+5741
+5742
+5743
+5744
+5745
+5746
+5747
+5748
+5749
+5750
+5751
+5752
+5753
+5754
+5755
+5756
+5757
+5758
+5759
+5760
+5761
+5762
+5763
+5764
+5765
+5766
+5767
+5768
+5769
+5770
+5771
+5772
+5773
+5774
+5775
+5776
+5777
+5778
+5779
+5780
+5781
+5782
+5783
+5784
+5785
+5786
+5787
+5788
+5789
+5790
+5791
+5792
+5793
+5794
+5795
+5796
+5797
+5798
+5799
+5800
+5801
+5802
+5803
+5804
+5805
+5806
+5807
+5808
+5809
+5810
+5811
+5812
+5813
+5814
+5815
+5816
+5817
+5818
+5819
+5820
+5821
+5822
+5823
+5824
+5825
+5826
+5827
+5828
+5829
+5830
+5831
+5832
+5833
+5834
+5835
+5836
+5837
+5838
+5839
+5840
+5841
+5842
+5843
+5844
+5845
+5846
+5847
+5848
+5849
+5850
+5851
+5852
+5853
+5854
+5855
+5856
+5857
+5858
+5859
+5860
+5861
+5862
+5863
+5864
+5865
+5866
+5867
+5868
+5869
+5870
+5871
+5872
+5873
+5874
+5875
+5876
+5877
+5878
+5879
+5880
+5881
+5882
+5883
+5884
+5885
+5886
+5887
+5888
+5889
+5890
+5891
+5892
+5893
+5894
+5895
+5896
+5897
+5898
+5899
+5900
+5901
+5902
+5903
+5904
+5905
+5906
+5907
+5908
+5909
+5910
+5911
+5912
+5913
+5914
+5915
+5916
+5917
+5918
+5919
+5920
+5921
+5922
+5923
+5924
+5925
+5926
+5927
+5928
+5929
+5930
+5931
+5932
+5933
+5934
+5935
+5936
+5937
+5938
+5939
+5940
+5941
+5942
+5943
+5944
+5945
+5946
+5947
+5948
+5949
+5950
+5951
+5952
+5953
+5954
+5955
+5956
+5957
+5958
+5959
+5960
+5961
+5962
+5963
+5964
+5965
+5966
+5967
+5968
+5969
+5970
+5971
+5972
+5973
+5974
+5975
+5976
+5977
+5978
+5979
+5980
+5981
+5982
+5983
+5984
+5985
+5986
+5987
+5988
+5989
+5990
+5991
+5992
+5993
+5994
+5995
+5996
+5997
+5998
+5999
+6000
+6001
+6002
+6003
+6004
+6005
+6006
+6007
+6008
+6009
+6010
+6011
+6012
+6013
+6014
+6015
+6016
+6017
+6018
+6019
+6020
+6021
+6022
+6023
+6024
+6025
+6026
+6027
+6028
+6029
+6030
+6031
+6032
+6033
+6034
+6035
+6036
+6037
+6038
+6039
+6040
+6041
+6042
+6043
+6044
+6045
+6046
+6047
+6048
+6049
+6050
+6051
+6052
+6053
+6054
+6055
+6056
+6057
+6058
+6059
+6060
+6061
+6062
+6063
+6064
+6065
+6066
+6067
+6068
+6069
+6070
+6071
+6072
+6073
+6074
+6075
+6076
+6077
+6078
+6079
+6080
+6081
+6082
+6083
+6084
+6085
+6086
+6087
+6088
+6089
+6090
+6091
+6092
+6093
+6094
+6095
+6096
+6097
+6098
+6099
+6100
+6101
+6102
+6103
+6104
+6105
+6106
+6107
+6108
+6109
+6110
+6111
+6112
+6113
+6114
+6115
+6116
+6117
+6118
+6119
+6120
+6121
+6122
+6123
+6124
+6125
+6126
+6127
+6128
+6129
+6130
+6131
+6132
+6133
+6134
+6135
+6136
+6137
+6138
+6139
+6140
+6141
+6142
+6143
+6144
+6145
+6146
+6147
+6148
+6149
+6150
+6151
+6152
+6153
+6154
+6155
+6156
+6157
+6158
+6159
+6160
+6161
+6162
+6163
+6164
+6165
+6166
+6167
+6168
+6169
+6170
+6171
+6172
+6173
+6174
+6175
+6176
+6177
+6178
+6179
+6180
+6181
+6182
+6183
+6184
+6185
+6186
+6187
+6188
+6189
+6190
+6191
+6192
+6193
+6194
+6195
+6196
+6197
+6198
+6199
+6200
+6201
+6202
+6203
+6204
+6205
+6206
+6207
+6208
+6209
+6210
+6211
+6212
+6213
+6214
+6215
+6216
+6217
+6218
+6219
+6220
+6221
+6222
+6223
+6224
+6225
+6226
+6227
+6228
+6229
+6230
+6231
+6232
+6233
+6234
+6235
+6236
+6237
+6238
+6239
+6240
+6241
+6242
+6243
+6244
+6245
+6246
+6247
+6248
+6249
+6250
+6251
+6252
+6253
+6254
+6255
+6256
+6257
+6258
+6259
+6260
+6261
+6262
+6263
+6264
+6265
+6266
+6267
+6268
+6269
+6270
+6271
+6272
+6273
+6274
+6275
+6276
+6277
+6278
+6279
+6280
+6281
+6282
+6283
+6284
+6285
+6286
+6287
+6288
+6289
+6290
+6291
+6292
+6293
+6294
+6295
+6296
+6297
+6298
+6299
+6300
+6301
+6302
+6303
+6304
+6305
+6306
+6307
+6308
+6309
+6310
+6311
+6312
+6313
+6314
+6315
+6316
+6317
+6318
+6319
+6320
+6321
+6322
+6323
+6324
+6325
+6326
+6327
+6328
+6329
+6330
+6331
+6332
+6333
+6334
+6335
+6336
+6337
+6338
+6339
+6340
+6341
+6342
+6343
+6344
+6345
+6346
+6347
+6348
+6349
+6350
+6351
+6352
+6353
+6354
+6355
+6356
+6357
+6358
+6359
+6360
+6361
+6362
+6363
+6364
+6365
+6366
+6367
+6368
+6369
+6370
+6371
+6372
+6373
+6374
+6375
+6376
+6377
+6378
+6379
+6380
+6381
+6382
+6383
+6384
+6385
+6386
+6387
+6388
+6389
+6390
+6391
+6392
+6393
+6394
+6395
+6396
+6397
+6398
+6399
+6400
+6401
+6402
+6403
+6404
+6405
+6406
+6407
+6408
+6409
+6410
+6411
+6412
+6413
+6414
+6415
+6416
+6417
+6418
+6419
+6420
+6421
+6422
+6423
+6424
+6425
+6426
+6427
+6428
+6429
+6430
+6431
+6432
+6433
+6434
+6435
+6436
+6437
+6438
+6439
+6440
+6441
+6442
+6443
+6444
+6445
+6446
+6447
+6448
+6449
+6450
+6451
+6452
+6453
+6454
+6455
+6456
+6457
+6458
+6459
+6460
+6461
+6462
+6463
+6464
+6465
+6466
+6467
+6468
+6469
+6470
+6471
+6472
+6473
+6474
+6475
+6476
+6477
+6478
+6479
+6480
+6481
+6482
+6483
+6484
+6485
+6486
+6487
+6488
+6489
+6490
+6491
+6492
+6493
+6494
+6495
+6496
+6497
+6498
+6499
+6500
+6501
+6502
+6503
+6504
+6505
+6506
+6507
+6508
+6509
+6510
+6511
+6512
+6513
+6514
+6515
+6516
+6517
+6518
+6519
+6520
+6521
+6522
+6523
+6524
+6525
+6526
+6527
+6528
+6529
+6530
+6531
+6532
+6533
+6534
+6535
+6536
+6537
+6538
+6539
+6540
+6541
+6542
+6543
+6544
+6545
+6546
+6547
+6548
+6549
+6550
+6551
+6552
+6553
+6554
+6555
+6556
+6557
+6558
+6559
+6560
+6561
+6562
+6563
+6564
+6565
+6566
+6567
+6568
+6569
+6570
+6571
+6572
+6573
+6574
+6575
+6576
+6577
+6578
+6579
+6580
+6581
+6582
+6583
+6584
+6585
+6586
+6587
+6588
+6589
+6590
+6591
+6592
+6593
+6594
+6595
+6596
+6597
+6598
+6599
+6600
+6601
+6602
+6603
+6604
+6605
+6606
+6607
+6608
+6609
+6610
+6611
+6612
+6613
+6614
+6615
+6616
+6617
+6618
+6619
+6620
+6621
+6622
+6623
+6624
+6625
+6626
+6627
+6628
+6629
+6630
+6631
+6632
+6633
+6634
+6635
+6636
+6637
+6638
+6639
+6640
+6641
+6642
+6643
+6644
+6645
+6646
+6647
+6648
+6649
+6650
+6651
+6652
+6653
+6654
+6655
+6656
+6657
+6658
+6659
+6660
+6661
+6662
+6663
+6664
+6665
+6666
+6667
+6668
+6669
+6670
+6671
+6672
+6673
+6674
+6675
+6676
+6677
+6678
+6679
+6680
+6681
+6682
+6683
+6684
+6685
+6686
+6687
+6688
+6689
+6690
+6691
+6692
+6693
+6694
+6695
+6696
+6697
+6698
+6699
+6700
+6701
+6702
+6703
+6704
+6705
+6706
+6707
+6708
+6709
+6710
+6711
+6712
+6713
+6714
+6715
+6716
+6717
+6718
+6719
+6720
+6721
+6722
+6723
+6724
+6725
+6726
+6727
+6728
+6729
+6730
+6731
+6732
+6733
+6734
+6735
+6736
+6737
+6738
+6739
+6740
+6741
+6742
+6743
+6744
+6745
+6746
+6747
+6748
+6749
+6750
+6751
+6752
+6753
+6754
+6755
+6756
+6757
+6758
+6759
+6760
+6761
+6762
+6763
+6764
+6765
+6766
+6767
+6768
+6769
+6770
+6771
+6772
+6773
+6774
+6775
+6776
+6777
+6778
+6779
+6780
+6781
+6782
+6783
+6784
+6785
+6786
+6787
+6788
+6789
+6790
+6791
+6792
+6793
+6794
+6795
+6796
+6797
+6798
+6799
+6800
+6801
+6802
+6803
+6804
+6805
+6806
+6807
+6808
+6809
+6810
+6811
+6812
+6813
+6814
+6815
+6816
+6817
+6818
+6819
+6820
+6821
+6822
+6823
+6824
+6825
+6826
+6827
+6828
+6829
+6830
+6831
+6832
+6833
+6834
+6835
+6836
+6837
+6838
+6839
+6840
+6841
+6842
+6843
+6844
+6845
+6846
+6847
+6848
+6849
+6850
+6851
+6852
+6853
+6854
+6855
+6856
+6857
+6858
+6859
+6860
+6861
+6862
+6863
+6864
+6865
+6866
+6867
+6868
+6869
+6870
+6871
+6872
+6873
+6874
+6875
+6876
+6877
+6878
+6879
+6880
+6881
+6882
+6883
+6884
+6885
+6886
+6887
+6888
+6889
+6890
+6891
+6892
+6893
+6894
+6895
+6896
+6897
+6898
+6899
+6900
+6901
+6902
+6903
+6904
+6905
+6906
+6907
+6908
+6909
+6910
+6911
+6912
+6913
+6914
+6915
+6916
+6917
+6918
+6919
+6920
+6921
+6922
+6923
+6924
+6925
+6926
+6927
+6928
+6929
+6930
+6931
+6932
+6933
+6934
+6935
+6936
+6937
+6938
+6939
+6940
+6941
+6942
+6943
+6944
+6945
+6946
+6947
+6948
+6949
+6950
+6951
+6952
+6953
+6954
+6955
+6956
+6957
+6958
+6959
+6960
+6961
+6962
+6963
+6964
+6965
+6966
+6967
+6968
+6969
+6970
+6971
+6972
+6973
+6974
+6975
+6976
+6977
+6978
+6979
+6980
+6981
+6982
+6983
+6984
+6985
+6986
+6987
+6988
+6989
+6990
+6991
+6992
+6993
+6994
+6995
+6996
+6997
+6998
+6999
+7000
+7001
+7002
+7003
+7004
+7005
+7006
+7007
+7008
+7009
+7010
+7011
+7012
+7013
+7014
+7015
+7016
+7017
+7018
+7019
+7020
+7021
+7022
+7023
+7024
+7025
+7026
+7027
+7028
+7029
+7030
+7031
+7032
+7033
+7034
+7035
+7036
+7037
+7038
+7039
+7040
+7041
+7042
+7043
+7044
+7045
+7046
+7047
+7048
+7049
+7050
+7051
+7052
+7053
+7054
+7055
+7056
+7057
+7058
+7059
+7060
+7061
+7062
+7063
+7064
+7065
+7066
+7067
+7068
+7069
+7070
+7071
+7072
+7073
+7074
+7075
+7076
+7077
+7078
+7079
+7080
+7081
+7082
+7083
+7084
+7085
+7086
+7087
+7088
+7089
+7090
+7091
+7092
+7093
+7094
+7095
+7096
+7097
+7098
+7099
+7100
+7101
+7102
+7103
+7104
+7105
+7106
+7107
+7108
+7109
+7110
+7111
+7112
+7113
+7114
+7115
+7116
+7117
+7118
+7119
+7120
+7121
+7122
+7123
+7124
+7125
+7126
+7127
+7128
+7129
+7130
+7131
+7132
+7133
+7134
+7135
+7136
+7137
+7138
+7139
+7140
+7141
+7142
+7143
+7144
+7145
+7146
+7147
+7148
+7149
+7150
+7151
+7152
+7153
+7154
+7155
+7156
+7157
+7158
+7159
+7160
+7161
+7162
+7163
+7164
+7165
+7166
+7167
+7168
+7169
+7170
+7171
+7172
+7173
+7174
+7175
+7176
+7177
+7178
+7179
+7180
+7181
+7182
+7183
+7184
+7185
+7186
+7187
+7188
+7189
+7190
+7191
+7192
+7193
+7194
+7195
+7196
+7197
+7198
+7199
+7200
+7201
+7202
+7203
+7204
+7205
+7206
+7207
+7208
+7209
+7210
+7211
+7212
+7213
+7214
+7215
+7216
+7217
+7218
+7219
+7220
+7221
+7222
+7223
+7224
+7225
+7226
+7227
+7228
+7229
+7230
+7231
+7232
+7233
+7234
+7235
+7236
+7237
+7238
+7239
+7240
+7241
+7242
+7243
+7244
+7245
+7246
+7247
+7248
+7249
+7250
+7251
+7252
+7253
+7254
+7255
+7256
+7257
+7258
+7259
+7260
+7261
+7262
+7263
+7264
+7265
+7266
+7267
+7268
+7269
+7270
+7271
+7272
+7273
+7274
+7275
+7276
+7277
+7278
+7279
+7280
+7281
+7282
+7283
+7284
+7285
+7286
+7287
+7288
+7289
+7290
+7291
+7292
+7293
+7294
+7295
+7296
+7297
+7298
+7299
+7300
+7301
+7302
+7303
+7304
+7305
+7306
+7307
+7308
+7309
+7310
+7311
+7312
+7313
+7314
+7315
+7316
+7317
+7318
+7319
+7320
+7321
+7322
+7323
+7324
+7325
+7326
+7327
+7328
+7329
+7330
+7331
+7332
+7333
+7334
+7335
+7336
+7337
+7338
+7339
+7340
+7341
+7342
+7343
+7344
+7345
+7346
+7347
+7348
+7349
+7350
+7351
+7352
+7353
+7354
+7355
+7356
+7357
+7358
+7359
+7360
+7361
+7362
+7363
+7364
+7365
+7366
+7367
+7368
+7369
+7370
+7371
+7372
+7373
+7374
+7375
+7376
+7377
+7378
+7379
+7380
+7381
+7382
+7383
+7384
+7385
+7386
+7387
+7388
+7389
+7390
+7391
+7392
+7393
+7394
+7395
+7396
+7397
+7398
+7399
+7400
+7401
+7402
+7403
+7404
+7405
+7406
+7407
+7408
+7409
+7410
+7411
+7412
+7413
+7414
+7415
+7416
+7417
+7418
+7419
+7420
+7421
+7422
+7423
+7424
+7425
+7426
+7427
+7428
+7429
+7430
+7431
+7432
+7433
+7434
+7435
+7436
+7437
+7438
+7439
+7440
+7441
+7442
+7443
+7444
+7445
+7446
+7447
+7448
+7449
+7450
+7451
+7452
+7453
+7454
+7455
+7456
+7457
+7458
+7459
+7460
+7461
+7462
+7463
+7464
+7465
+7466
+7467
+7468
+7469
+7470
+7471
+7472
+7473
+7474
+7475
+7476
+7477
+7478
+7479
+7480
+7481
+7482
+7483
+7484
+7485
+7486
+7487
+7488
+7489
+7490
+7491
+7492
+7493
+7494
+7495
+7496
+7497
+7498
+7499
+7500
+7501
+7502
+7503
+7504
+7505
+7506
+7507
+7508
+7509
+7510
+7511
+7512
+7513
+7514
+7515
+7516
+7517
+7518
+7519
+7520
+7521
+7522
+7523
+7524
+7525
+7526
+7527
+7528
+7529
+7530
+7531
+7532
+7533
+7534
+7535
+7536
+7537
+7538
+7539
+7540
+7541
+7542
+7543
+7544
+7545
+7546
+7547
+7548
+7549
+7550
+7551
+7552
+7553
+7554
+7555
+7556
+7557
+7558
+7559
+7560
+7561
+7562
+7563
+7564
+7565
+7566
+7567
+7568
+7569
+7570
+7571
+7572
+7573
+7574
+7575
+7576
+7577
+7578
+7579
+7580
+7581
+7582
+7583
+7584
+7585
+7586
+7587
+7588
+7589
+7590
+7591
+7592
+7593
+7594
+7595
+7596
+7597
+7598
+7599
+7600
+7601
+7602
+7603
+7604
+7605
+7606
+7607
+7608
+7609
+7610
+7611
+7612
+7613
+7614
+7615
+7616
+7617
+7618
+7619
+7620
+7621
+7622
+7623
+7624
+7625
+7626
+7627
+7628
+7629
+7630
+7631
+7632
+7633
+7634
+7635
+7636
+7637
+7638
+7639
+7640
+7641
+7642
+7643
+7644
+7645
+7646
+7647
+7648
+7649
+7650
+7651
+7652
+7653
+7654
+7655
+7656
+7657
+7658
+7659
+7660
+7661
+7662
+7663
+7664
+7665
+7666
+7667
+7668
+7669
+7670
+7671
+7672
+7673
+7674
+7675
+7676
+7677
+7678
+7679
+7680
+7681
+7682
+7683
+7684
+7685
+7686
+7687
+7688
+7689
+7690
+7691
+7692
+7693
+7694
+7695
+7696
+7697
+7698
+7699
+7700
+7701
+7702
+7703
+7704
+7705
+7706
+7707
+7708
+7709
+7710
+7711
+7712
+7713
+7714
+7715
+7716
+7717
+7718
+7719
+7720
+7721
+7722
+7723
+7724
+7725
+7726
+7727
+7728
+7729
+7730
+7731
+7732
+7733
+7734
+7735
+7736
+7737
+7738
+7739
+7740
+7741
+7742
+7743
+7744
+7745
+7746
+7747
+7748
+7749
+7750
+7751
+7752
+7753
+7754
+7755
+7756
+7757
+7758
+7759
+7760
+7761
+7762
+7763
+7764
+7765
+7766
+7767
+7768
+7769
+7770
+7771
+7772
+7773
+7774
+7775
+7776
+7777
+7778
+7779
+7780
+7781
+7782
+7783
+7784
+7785
+7786
+7787
+7788
+7789
+7790
+7791
+7792
+7793
+7794
+7795
+7796
+7797
+7798
+7799
+7800
+7801
+7802
+7803
+7804
+7805
+7806
+7807
+7808
+7809
+7810
+7811
+7812
+7813
+7814
+7815
+7816
+7817
+7818
+7819
+7820
+7821
+7822
+7823
+7824
+7825
+7826
+7827
+7828
+7829
+7830
+7831
+7832
+7833
+7834
+7835
+7836
+7837
+7838
+7839
+7840
+7841
+7842
+7843
+7844
+7845
+7846
+7847
+7848
+7849
+7850
+7851
+7852
+7853
+7854
+7855
+7856
+7857
+7858
+7859
+7860
+7861
+7862
+7863
+7864
+7865
+7866
+7867
+7868
+7869
+7870
+7871
+7872
+7873
+7874
+7875
+7876
+7877
+7878
+7879
+7880
+7881
+7882
+7883
+7884
+7885
+7886
+7887
+7888
+7889
+7890
+7891
+7892
+7893
+7894
+7895
+7896
+7897
+7898
+7899
+7900
+7901
+7902
+7903
+7904
+7905
+7906
+7907
+7908
+7909
+7910
+7911
+7912
+7913
+7914
+7915
+7916
+7917
+7918
+7919
+7920
+7921
+7922
+7923
+7924
+7925
+7926
+7927
+7928
+7929
+7930
+7931
+7932
+7933
+7934
+7935
+7936
+7937
+7938
+7939
+7940
+7941
+7942
+7943
+7944
+7945
+7946
+7947
+7948
+7949
+7950
+7951
+7952
+7953
+7954
+7955
+7956
+7957
+7958
+7959
+7960
+7961
+7962
+7963
+7964
+7965
+7966
+7967
+7968
+7969
+7970
+7971
+7972
+7973
+7974
+7975
+7976
+7977
+7978
+7979
+7980
+7981
+7982
+7983
+7984
+7985
+7986
+7987
+7988
+7989
+7990
+7991
+7992
+7993
+7994
+7995
+7996
+7997
+7998
+7999
+8000
+8001
+8002
+8003
+8004
+8005
+8006
+8007
+8008
+8009
+8010
+8011
+8012
+8013
+8014
+8015
+8016
+8017
+8018
+8019
+8020
+8021
+8022
+8023
+8024
+8025
+8026
+8027
+8028
+8029
+8030
+8031
+8032
+8033
+8034
+8035
+8036
+8037
+8038
+8039
+8040
+8041
+8042
+8043
+8044
+8045
+8046
+8047
+8048
+8049
+8050
+8051
+8052
+8053
+8054
+8055
+8056
+8057
+8058
+8059
+8060
+8061
+8062
+8063
+8064
+8065
+8066
+8067
+8068
+8069
+8070
+8071
+8072
+8073
+8074
+8075
+8076
+8077
+8078
+8079
+8080
+8081
+8082
+8083
+8084
+8085
+8086
+8087
+8088
+8089
+8090
+8091
+8092
+8093
+8094
+8095
+8096
+8097
+8098
+8099
+8100
+8101
+8102
+8103
+8104
+8105
+8106
+8107
+8108
+8109
+8110
+8111
+8112
+8113
+8114
+8115
+8116
+8117
+8118
+8119
+8120
+8121
+8122
+8123
+8124
+8125
+8126
+8127
+8128
+8129
+8130
+8131
+8132
+8133
+8134
+8135
+8136
+8137
+8138
+8139
+8140
+8141
+8142
+8143
+8144
+8145
+8146
+8147
+8148
+8149
+8150
+8151
+8152
+8153
+8154
+8155
+8156
+8157
+8158
+8159
+8160
+8161
+8162
+8163
+8164
+8165
+8166
+8167
+8168
+8169
+8170
+8171
+8172
+8173
+8174
+8175
+8176
+8177
+8178
+8179
+8180
+8181
+8182
+8183
+8184
+8185
+8186
+8187
+8188
+8189
+8190
+8191
+8192
+8193
+8194
+8195
+8196
+8197
+8198
+8199
+8200
+8201
+8202
+8203
+8204
+8205
+8206
+8207
+8208
+8209
+8210
+8211
+8212
+8213
+8214
+8215
+8216
+8217
+8218
+8219
+8220
+8221
+8222
+8223
+8224
+8225
+8226
+8227
+8228
+8229
+8230
+8231
+8232
+8233
+8234
+8235
+8236
+8237
+8238
+8239
+8240
+8241
+8242
+8243
+8244
+8245
+8246
+8247
+8248
+8249
+8250
+8251
+8252
+8253
+8254
+8255
+8256
+8257
+8258
+8259
+8260
+8261
+8262
+8263
+8264
+8265
+8266
+8267
+8268
+8269
+8270
+8271
+8272
+8273
+8274
+8275
+8276
+8277
+8278
+8279
+8280
+8281
+8282
+8283
+8284
+8285
+8286
+8287
+8288
+8289
+8290
+8291
+8292
+8293
+8294
+8295
+8296
+8297
+8298
+8299
+8300
+8301
+8302
+8303
+8304
+8305
+8306
+8307
+8308
+8309
+8310
+8311
+8312
+8313
+8314
+8315
+8316
+8317
+8318
+8319
+8320
+8321
+8322
+8323
+8324
+8325
+8326
+8327
+8328
+8329
+8330
+8331
+8332
+8333
+8334
+8335
+8336
+8337
+8338
+8339
+8340
+8341
+8342
+8343
+8344
+8345
+8346
+8347
+8348
+8349
+8350
+8351
+8352
+8353
+8354
+8355
+8356
+8357
+8358
+8359
+8360
+8361
+8362
+8363
+8364
+8365
+8366
+8367
+8368
+8369
+8370
+8371
+8372
+8373
+8374
+8375
+8376
+8377
+8378
+8379
+8380
+8381
+8382
+8383
+8384
+8385
+8386
+8387
+8388
+8389
+8390
+8391
+8392
+8393
+8394
+8395
+8396
+8397
+8398
+8399
+8400
+8401
+8402
+8403
+8404
+8405
+8406
+8407
+8408
+8409
+8410
+8411
+8412
+8413
+8414
+8415
+8416
+8417
+8418
+8419
+8420
+8421
+8422
+8423
+8424
+8425
+8426
+8427
+8428
+8429
+8430
+8431
+8432
+8433
+8434
+8435
+8436
+8437
+8438
+8439
+8440
+8441
+8442
+8443
+8444
+8445
+8446
+8447
+8448
+8449
+8450
+8451
+8452
+8453
+8454
+8455
+8456
+8457
+8458
+8459
+8460
+8461
+8462
+8463
+8464
+8465
+8466
+8467
+8468
+8469
+8470
+8471
+8472
+8473
+8474
+8475
+8476
+8477
+8478
+8479
+8480
+8481
+8482
+8483
+8484
+8485
+8486
+8487
+8488
+8489
+8490
+8491
+8492
+8493
+8494
+8495
+8496
+8497
+8498
+8499
+8500
+8501
+8502
+8503
+8504
+8505
+8506
+8507
+8508
+8509
+8510
+8511
+8512
+8513
+8514
+8515
+8516
+8517
+8518
+8519
+8520
+8521
+8522
+8523
+8524
+8525
+8526
+8527
+8528
+8529
+8530
+8531
+8532
+8533
+8534
+8535
+8536
+8537
+8538
+8539
+8540
+8541
+8542
+8543
+8544
+8545
+8546
+8547
+8548
+8549
+8550
+8551
+8552
+8553
+8554
+8555
+8556
+8557
+8558
+8559
+8560
+8561
+8562
+8563
+8564
+8565
+8566
+8567
+8568
+8569
+8570
+8571
+8572
+8573
+8574
+8575
+8576
+8577
+8578
+8579
+8580
+8581
+8582
+8583
+8584
+8585
+8586
+8587
+8588
+8589
+8590
+8591
+8592
+8593
+8594
+8595
+8596
+8597
+8598
+8599
+8600
+8601
+8602
+8603
+8604
+8605
+8606
+8607
+8608
+8609
+8610
+8611
+8612
+8613
+8614
+8615
+8616
+8617
+8618
+8619
+8620
+8621
+8622
+8623
+8624
+8625
+8626
+8627
+8628
+8629
+8630
+8631
+8632
+8633
+8634
+8635
+8636
+8637
+8638
+8639
+8640
+8641
+8642
+8643
+8644
+8645
+8646
+8647
+8648
+8649
+8650
+8651
+8652
+8653
+8654
+8655
+8656
+8657
+8658
+8659
+8660
+8661
+8662
+8663
+8664
+8665
+8666
+8667
+8668
+8669
+8670
+8671
+8672
+8673
+8674
+8675
+8676
+8677
+8678
+8679
+8680
+8681
+8682
+8683
+8684
+8685
+8686
+8687
+8688
+8689
+8690
+8691
+8692
+8693
+8694
+8695
+8696
+8697
+8698
+8699
+8700
+8701
+8702
+8703
+8704
+8705
+8706
+8707
+8708
+8709
+8710
+8711
+8712
+8713
+8714
+8715
+8716
+8717
+8718
+8719
+8720
+8721
+8722
+8723
+8724
+8725
+8726
+8727
+8728
+8729
+8730
+8731
+8732
+8733
+8734
+8735
+8736
+8737
+8738
+8739
+8740
+8741
+8742
+8743
+8744
+8745
+8746
+8747
+8748
+8749
+8750
+8751
+8752
+8753
+8754
+8755
+8756
+8757
+8758
+8759
+8760
+8761
+8762
+8763
+8764
+8765
+8766
+8767
+8768
+8769
+8770
+8771
+8772
+8773
+8774
+8775
+8776
+8777
+8778
+8779
+8780
+8781
+8782
+8783
+8784
+8785
+8786
+8787
+8788
+8789
+8790
+8791
+8792
+8793
+8794
+8795
+8796
+8797
+8798
+8799
+8800
+8801
+8802
+8803
+8804
+8805
+8806
+8807
+8808
+8809
+8810
+8811
+8812
+8813
+8814
+8815
+8816
+8817
+8818
+8819
+8820
+8821
+8822
+8823
+8824
+8825
+8826
+8827
+8828
+8829
+8830
+8831
+8832
+8833
+8834
+8835
+8836
+8837
+8838
+8839
+8840
+8841
+8842
+8843
+8844
+8845
+8846
+8847
+8848
+8849
+8850
+8851
+8852
+8853
+8854
+8855
+8856
+8857
+8858
+8859
+8860
+8861
+8862
+8863
+8864
+8865
+8866
+8867
+8868
+8869
+8870
+8871
+8872
+8873
+8874
+8875
+8876
+8877
+8878
+8879
+8880
+8881
+8882
+8883
+8884
+8885
+8886
+8887
+8888
+8889
+8890
+8891
+8892
+8893
+8894
+8895
+8896
+8897
+8898
+8899
+8900
+8901
+8902
+8903
+8904
+8905
+8906
+8907
+8908
+8909
+8910
+8911
+8912
+8913
+8914
+8915
+8916
+8917
+8918
+8919
+8920
+8921
+8922
+8923
+8924
+8925
+8926
+8927
+8928
+8929
+8930
+8931
+8932
+8933
+8934
+8935
+8936
+8937
+8938
+8939
+8940
+8941
+8942
+8943
+8944
+8945
+8946
+8947
+8948
+8949
+8950
+8951
+8952
+8953
+8954
+8955
+8956
+8957
+8958
+8959
+8960
+8961
+8962
+8963
+8964
+8965
+8966
+8967
+8968
+8969
+8970
+8971
+8972
+8973
+8974
+8975
+8976
+8977
+8978
+8979
+8980
+8981
+8982
+8983
+8984
+8985
+8986
+8987
+8988
+8989
+8990
+8991
+8992
+8993
+8994
+8995
+8996
+8997
+8998
+8999
+9000
+9001
+9002
+9003
+9004
+9005
+9006
+9007
+9008
+9009
+9010
+9011
+9012
+9013
+9014
+9015
+9016
+9017
+9018
+9019
+9020
+9021
+9022
+9023
+9024
+9025
+9026
+9027
+9028
+9029
+9030
+9031
+9032
+9033
+9034
+9035
+9036
+9037
+9038
+9039
+9040
+9041
+9042
+9043
+9044
+9045
+9046
+9047
+9048
+9049
+9050
+9051
+9052
+9053
+9054
+9055
+9056
+9057
+9058
+9059
+9060
+9061
+9062
+9063
+9064
+9065
+9066
+9067
+9068
+9069
+9070
+9071
+9072
+9073
+9074
+9075
+9076
+9077
+9078
+9079
+9080
+9081
+9082
+9083
+9084
+9085
+9086
+9087
+9088
+9089
+9090
+9091
+9092
+9093
+9094
+9095
+9096
+9097
+9098
+9099
+9100
+9101
+9102
+9103
+9104
+9105
+9106
+9107
+9108
+9109
+9110
+9111
+9112
+9113
+9114
+9115
+9116
+9117
+9118
+9119
+9120
+9121
+9122
+9123
+9124
+9125
+9126
+9127
+9128
+9129
+9130
+9131
+9132
+9133
+9134
+9135
+9136
+9137
+9138
+9139
+9140
+9141
+9142
+9143
+9144
+9145
+9146
+9147
+9148
+9149
+9150
+9151
+9152
+9153
+9154
+9155
+9156
+9157
+9158
+9159
+9160
+9161
+9162
+9163
+9164
+9165
+9166
+9167
+9168
+9169
+9170
+9171
+9172
+9173
+9174
+9175
+9176
+9177
+9178
+9179
+9180
+9181
+9182
+9183
+9184
+9185
+9186
+9187
+9188
+9189
+9190
+9191
+9192
+9193
+9194
+9195
+9196
+9197
+9198
+9199
+9200
+9201
+9202
+9203
+9204
+9205
+9206
+9207
+9208
+9209
+9210
+9211
+9212
+9213
+9214
+9215
+9216
+9217
+9218
+9219
+9220
+9221
+9222
+9223
+9224
+9225
+9226
+9227
+9228
+9229
+9230
+9231
+9232
+9233
+9234
+9235
+9236
+9237
+9238
+9239
+9240
+9241
+9242
+9243
+9244
+9245
+9246
+9247
+9248
+9249
+9250
+9251
+9252
+9253
+9254
+9255
+9256
+9257
+9258
+9259
+9260
+9261
+9262
+9263
+9264
+9265
+9266
+9267
+9268
+9269
+9270
+9271
+9272
+9273
+9274
+9275
+9276
+9277
+9278
+9279
+9280
+9281
+9282
+9283
+9284
+9285
+9286
+9287
+9288
+9289
+9290
+9291
+9292
+9293
+9294
+9295
+9296
+9297
+9298
+9299
+9300
+9301
+9302
+9303
+9304
+9305
+9306
+9307
+9308
+9309
+9310
+9311
+9312
+9313
+9314
+9315
+9316
+9317
+9318
+9319
+9320
+9321
+9322
+9323
+9324
+9325
+9326
+9327
+9328
+9329
+9330
+9331
+9332
+9333
+9334
+9335
+9336
+9337
+9338
+9339
+9340
+9341
+9342
+9343
+9344
+9345
+9346
+9347
+9348
+9349
+9350
+9351
+9352
+9353
+9354
+9355
+9356
+9357
+9358
+9359
+9360
+9361
+9362
+9363
+9364
+9365
+9366
+9367
+9368
+9369
+9370
+9371
+9372
+9373
+9374
+9375
+9376
+9377
+9378
+9379
+9380
+9381
+9382
+9383
+9384
+9385
+9386
+9387
+9388
+9389
+9390
+9391
+9392
+9393
+9394
+9395
+9396
+9397
+9398
+9399
+9400
+9401
+9402
+9403
+9404
+9405
+9406
+9407
+9408
+9409
+9410
+9411
+9412
+9413
+9414
+9415
+9416
+9417
+9418
+9419
+9420
+9421
+9422
+9423
+9424
+9425
+9426
+9427
+9428
+9429
+9430
+9431
+9432
+9433
+9434
+9435
+9436
+9437
+9438
+9439
+9440
+9441
+9442
+9443
+9444
+9445
+9446
+9447
+9448
+9449
+9450
+9451
+9452
+9453
+9454
+9455
+9456
+9457
+9458
+9459
+9460
+9461
+9462
+9463
+9464
+9465
+9466
+9467
+9468
+9469
+9470
+9471
+9472
+9473
+9474
+9475
+9476
+9477
+9478
+9479
+9480
+9481
+9482
+9483
+9484
+9485
+9486
+9487
+9488
+9489
+9490
+9491
+9492
+9493
+9494
+9495
+9496
+9497
+9498
+9499
+9500
+9501
+9502
+9503
+9504
+9505
+9506
+9507
+9508
+9509
+9510
+9511
+9512
+9513
+9514
+9515
+9516
+9517
+9518
+9519
+9520
+9521
+9522
+9523
+9524
+9525
+9526
+9527
+9528
+9529
+9530
+9531
+9532
+9533
+9534
+9535
+9536
+9537
+9538
+9539
+9540
+9541
+9542
+9543
+9544
+9545
+9546
+9547
+9548
+9549
+9550
+9551
+9552
+9553
+9554
+9555
+9556
+9557
+9558
+9559
+9560
+9561
+9562
+9563
+9564
+9565
+9566
+9567
+9568
+9569
+9570
+9571
+9572
+9573
+9574
+9575
+9576
+9577
+9578
+9579
+9580
+9581
+9582
+9583
+9584
+9585
+9586
+9587
+9588
+9589
+9590
+9591
+9592
+9593
+9594
+9595
+9596
+9597
+9598
+9599
+9600
+9601
+9602
+9603
+9604
+9605
+9606
+9607
+9608
+9609
+9610
+9611
+9612
+9613
+9614
+9615
+9616
+9617
+9618
+9619
+9620
+9621
+9622
+9623
+9624
+9625
+9626
+9627
+9628
+9629
+9630
+9631
+9632
+9633
+9634
+9635
+9636
+9637
+9638
+9639
+9640
+9641
+9642
+9643
+9644
+9645
+9646
+9647
+9648
+9649
+9650
+
// auto-generated: "lalrpop 0.20.0"
+// sha3: 074d8a0fdc394c3f63b6ccce743bbf683f56b3746be671af5294a676960dc2ac
+use crate::ast::*;
+use crate::parser::ParserError;
+use crate::parser::VariableValidator;
+use crate::parser::Span;
+use crate::parser::lexer::{AirPos, Token};
+use air_lambda_parser::LambdaAST;
+use lalrpop_util::ErrorRecovery;
+use std::rc::Rc;
+#[allow(unused_extern_crates)]
+extern crate lalrpop_util as __lalrpop_util;
+#[allow(unused_imports)]
+use self::__lalrpop_util::state_machine as __state_machine;
+extern crate core;
+extern crate alloc;
+
+#[rustfmt::skip]
+#[allow(non_snake_case, non_camel_case_types, unused_mut, unused_variables, unused_imports, unused_parens, clippy::all)]
+mod __parse__AIR {
+
+    use crate::ast::*;
+    use crate::parser::ParserError;
+    use crate::parser::VariableValidator;
+    use crate::parser::Span;
+    use crate::parser::lexer::{AirPos, Token};
+    use air_lambda_parser::LambdaAST;
+    use lalrpop_util::ErrorRecovery;
+    use std::rc::Rc;
+    #[allow(unused_extern_crates)]
+    extern crate lalrpop_util as __lalrpop_util;
+    #[allow(unused_imports)]
+    use self::__lalrpop_util::state_machine as __state_machine;
+    extern crate core;
+    extern crate alloc;
+    use super::__ToTriple;
+    #[allow(dead_code)]
+    pub(crate) enum __Symbol<'input>
+     {
+        Variant0(Token<'input>),
+        Variant1(bool),
+        Variant2((&'input str, AirPos)),
+        Variant3((&'input str, LambdaAST<'input>, AirPos)),
+        Variant4(LambdaAST<'input>),
+        Variant5(f64),
+        Variant6(i64),
+        Variant7(&'input str),
+        Variant8(__lalrpop_util::ErrorRecovery<AirPos, Token<'input>, ParserError>),
+        Variant9(ImmutableValue<'input>),
+        Variant10(alloc::vec::Vec<ImmutableValue<'input>>),
+        Variant11(AirPos),
+        Variant12(Instruction<'input>),
+        Variant13(ApArgument<'input>),
+        Variant14(ApResult<'input>),
+        Variant15(Vec<ImmutableValue<'input>>),
+        Variant16(CallOutputValue<'input>),
+        Variant17(core::option::Option<CallOutputValue<'input>>),
+        Variant18(CanonStream<'input>),
+        Variant19(CanonStreamMap<'input>),
+        Variant20(Fail<'input>),
+        Variant21(FoldScalarIterable<'input>),
+        Variant22(ResolvableToStringVariable<'input>),
+        Variant23(core::option::Option<Instruction<'input>>),
+        Variant24(NewArgument<'input>),
+        Variant25(Number),
+        Variant26(ResolvableToPeerIdVariable<'input>),
+        Variant27(Stream<'input>),
+        Variant28(StreamMap<'input>),
+        Variant29(StreamMapKeyClause<'input>),
+        Variant30(Triplet<'input>),
+    }
+    const __ACTION: &[i16] = &[
+        // State 0
+        41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42,
+        // State 1
+        14, 0, 47, 0, 48, 49, 0, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 0, 0, 62, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 2
+        0, 0, 0, 0, 0, 0, 0, 66, 67, 0, 0, 0, 0, 68, 0, 0, 69, 70, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 3
+        0, 0, 0, 0, 0, 0, 0, 66, 67, 0, 0, 0, 0, 68, 0, 0, 69, 70, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 4
+        0, 0, 0, 0, 0, 0, 0, 0, 73, 74, 0, 0, 75, 0, 76, 0, 0, 77, 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 5
+        0, 0, 80, 0, 0, 81, 82, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 85, 86, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 6
+        0, 0, 89, 0, 90, 91, 92, 93, 94, 95, 96, 54, 55, 97, 98, 99, 100, 101, 102, 0, 0, 103, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 7
+        0, 0, 89, 0, 90, 91, 92, 93, 94, 95, 96, 54, 55, 97, 98, 99, 100, 101, 102, 0, 0, 103, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 8
+        0, 0, 0, 0, 0, 106, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 109, 110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 9
+        41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42,
+        // State 10
+        41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42,
+        // State 11
+        41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42,
+        // State 12
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 114, 0, 115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 13
+        0, 0, 0, 0, 0, 0, 0, 0, 116, 0, 0, 0, 117, 0, 0, 0, 118, 119, 120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 14
+        0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 15
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 122, 123, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 16
+        0, 0, 89, 0, 90, 91, 92, 93, 94, 95, 96, 54, 55, 97, 98, 99, 100, 101, 102, 0, 0, 103, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 17
+        0, 0, 89, 0, 90, 91, 92, 93, 94, 95, 96, 54, 55, 97, 98, 99, 100, 101, 102, 0, 0, 103, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 18
+        41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42,
+        // State 19
+        41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42,
+        // State 20
+        41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42,
+        // State 21
+        41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42,
+        // State 22
+        0, 0, 47, 0, 48, 49, 0, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 0, 0, 62, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 23
+        0, 0, 0, 0, 0, 0, 0, 136, 137, 0, 0, 0, 0, 0, 0, 0, 138, 139, 140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 24
+        0, 142, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 143, 0, 144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 25
+        0, 0, 89, 147, 90, 91, 92, 93, 94, 95, 96, 54, 55, 97, 98, 99, 100, 101, 102, 0, 0, 103, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 26
+        0, 0, 0, 0, 0, 149, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 27
+        0, 0, 0, 0, 0, 0, 151, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 152, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 28
+        41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42,
+        // State 29
+        41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42,
+        // State 30
+        41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42,
+        // State 31
+        41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42,
+        // State 32
+        41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42,
+        // State 33
+        0, 0, 0, 0, 0, 0, 0, 136, 137, 0, 0, 0, 0, 0, 0, 0, 138, 139, 140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 34
+        0, 0, 89, 164, 90, 91, 92, 93, 94, 95, 96, 54, 55, 97, 98, 99, 100, 101, 102, 0, 0, 103, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 35
+        41, 169, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42,
+        // State 36
+        41, 171, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42,
+        // State 37
+        41, 173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42,
+        // State 38
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 39
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 40
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 4, 5, 6, 7, 8, 43, 9, 44, 45, 10, 11, 12, 0,
+        // State 41
+        -72, -72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -72,
+        // State 42
+        0, 105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 43
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 44
+        0, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 45
+        0, -17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -17, 0, -17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 46
+        0, 0, 0, 121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 47
+        0, -18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -18, 0, -18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 48
+        0, -22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -22, 0, -22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 49
+        0, -24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -24, 0, -24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 50
+        0, -23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -23, 0, -23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 51
+        0, -12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -12, 0, -12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 52
+        0, -13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -13, 0, -13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 53
+        -81, -81, -81, -81, -81, -81, -81, -81, -81, -81, -81, -81, -81, -81, -81, -81, -81, -81, -81, -81, 0, -81, -81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -81,
+        // State 54
+        -80, -80, -80, -80, -80, -80, -80, -80, -80, -80, -80, -80, -80, -80, -80, -80, -80, -80, -80, -80, 0, -80, -80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -80,
+        // State 55
+        0, -9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -9, 0, -9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 56
+        0, -10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -10, 0, -10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 57
+        0, -11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -11, 0, -11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 58
+        0, -16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -16, 0, -16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 59
+        0, -20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -20, 0, -20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 60
+        0, -21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -21, 0, -21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 61
+        0, -15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -15, 0, -15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 62
+        0, -14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -14, 0, -14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 63
+        24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 64
+        -82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 65
+        -88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -88, -88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 66
+        -87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -87, -87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 67
+        -83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -83, -83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 68
+        -84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -84, -84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 69
+        -85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -85, -85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 70
+        -86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -86, -86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 71
+        0, 124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 72
+        0, -39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 73
+        0, -41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 74
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 75
+        0, -40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 76
+        0, -36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 77
+        0, -37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 78
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 79
+        0, 0, 0, 126, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 80
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 81
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 82
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 83
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 84
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 85
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 86
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 87
+        -111, 0, -111, -111, -111, -111, -111, -111, -111, -111, -111, -111, -111, -111, -111, -111, -111, -111, -111, 0, 0, -111, -111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -111,
+        // State 88
+        0, 0, 0, 127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 89
+        -112, 0, -112, -112, -112, -112, -112, -112, -112, -112, -112, -112, -112, -112, -112, -112, -112, -112, -112, 0, 0, -112, -112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -112,
+        // State 90
+        -116, 0, -116, -116, -116, -116, -116, -116, -116, -116, -116, -116, -116, -116, -116, -116, -116, -116, -116, 0, 0, -116, -116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -116,
+        // State 91
+        -118, 0, -118, -118, -118, -118, -118, -118, -118, -118, -118, -118, -118, -118, -118, -118, -118, -118, -118, 0, 0, -118, -118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -118,
+        // State 92
+        -119, 0, -119, -119, -119, -119, -119, -119, -119, -119, -119, -119, -119, -119, -119, -119, -119, -119, -119, 0, 0, -119, -119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -119,
+        // State 93
+        -117, 0, -117, -117, -117, -117, -117, -117, -117, -117, -117, -117, -117, -117, -117, -117, -117, -117, -117, 0, 0, -117, -117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -117,
+        // State 94
+        -106, 0, -106, -106, -106, -106, -106, -106, -106, -106, -106, -106, -106, -106, -106, -106, -106, -106, -106, 0, 0, -106, -106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -106,
+        // State 95
+        -107, 0, -107, -107, -107, -107, -107, -107, -107, -107, -107, -107, -107, -107, -107, -107, -107, -107, -107, 0, 0, -107, -107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -107,
+        // State 96
+        -103, 0, -103, -103, -103, -103, -103, -103, -103, -103, -103, -103, -103, -103, -103, -103, -103, -103, -103, 0, 0, -103, -103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -103,
+        // State 97
+        -104, 0, -104, -104, -104, -104, -104, -104, -104, -104, -104, -104, -104, -104, -104, -104, -104, -104, -104, 0, 0, -104, -104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -104,
+        // State 98
+        -105, 0, -105, -105, -105, -105, -105, -105, -105, -105, -105, -105, -105, -105, -105, -105, -105, -105, -105, 0, 0, -105, -105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -105,
+        // State 99
+        -108, 0, -108, -108, -108, -108, -108, -108, -108, -108, -108, -108, -108, -108, -108, -108, -108, -108, -108, 0, 0, -108, -108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -108,
+        // State 100
+        -114, 0, -114, -114, -114, -114, -114, -114, -114, -114, -114, -114, -114, -114, -114, -114, -114, -114, -114, 0, 0, -114, -114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -114,
+        // State 101
+        -115, 0, -115, -115, -115, -115, -115, -115, -115, -115, -115, -115, -115, -115, -115, -115, -115, -115, -115, 0, 0, -115, -115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -115,
+        // State 102
+        -110, 0, -110, -110, -110, -110, -110, -110, -110, -110, -110, -110, -110, -110, -110, -110, -110, -110, -110, 0, 0, -110, -110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -110,
+        // State 103
+        -109, 0, -109, -109, -109, -109, -109, -109, -109, -109, -109, -109, -109, -109, -109, -109, -109, -109, -109, 0, 0, -109, -109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -109,
+        // State 104
+        -58, -58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -58,
+        // State 105
+        -78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -78,
+        // State 106
+        -79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -79,
+        // State 107
+        -75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -75,
+        // State 108
+        -76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -76,
+        // State 109
+        -77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -77,
+        // State 110
+        0, 129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 111
+        -59, -59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -59,
+        // State 112
+        0, 133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 113
+        0, -25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 114
+        0, -26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 115
+        0, 0, -101, 0, -101, -101, 0, -101, -101, -101, -101, -101, -101, -101, -101, -101, -101, -101, -101, 0, 0, -101, -101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 116
+        0, 0, -98, 0, -98, -98, 0, -98, -98, -98, -98, -98, -98, -98, -98, -98, -98, -98, -98, 0, 0, -98, -98, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 117
+        0, 0, -97, 0, -97, -97, 0, -97, -97, -97, -97, -97, -97, -97, -97, -97, -97, -97, -97, 0, 0, -97, -97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 118
+        0, 0, -99, 0, -99, -99, 0, -99, -99, -99, -99, -99, -99, -99, -99, -99, -99, -99, -99, 0, 0, -99, -99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 119
+        0, 0, -100, 0, -100, -100, 0, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, 0, 0, -100, -100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 120
+        0, -19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -19, 0, -19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 121
+        0, 0, 0, 0, 0, -95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 122
+        0, 0, 0, 0, 0, 0, -96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 123
+        -61, -61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -61,
+        // State 124
+        0, -38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 125
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 126
+        -113, 0, -113, -113, -113, -113, -113, -113, -113, -113, -113, -113, -113, -113, -113, -113, -113, -113, -113, 0, 0, -113, -113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -113,
+        // State 127
+        0, 155, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 128
+        -68, -68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -68,
+        // State 129
+        0, 156, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 130
+        0, 157, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 131
+        0, 158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 132
+        -54, -54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -54,
+        // State 133
+        0, 159, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 134
+        0, 0, 0, 0, 0, 0, 0, -94, -94, 0, 0, 0, 0, 0, 0, 0, -94, -94, -94, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 135
+        0, -93, 0, 0, 0, 0, 0, -93, -93, 0, 0, 0, 0, 0, 0, 0, -93, -93, -93, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 136
+        0, -92, 0, 0, 0, 0, 0, -92, -92, 0, 0, 0, 0, 0, 0, 0, -92, -92, -92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 137
+        0, -89, 0, 0, 0, 0, 0, -89, -89, 0, 0, 0, 0, 0, 0, 0, -89, -89, -89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 138
+        0, -90, 0, 0, 0, 0, 0, -90, -90, 0, 0, 0, 0, 0, 0, 0, -90, -90, -90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 139
+        0, -91, 0, 0, 0, 0, 0, -91, -91, 0, 0, 0, 0, 0, 0, 0, -91, -91, -91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 140
+        0, 162, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 141
+        -50, -50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -50,
+        // State 142
+        0, -30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 143
+        0, -31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 144
+        0, 0, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, 0, 0, -4, -4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 145
+        0, 0, -27, -27, -27, -27, -27, -27, -27, -27, -27, -27, -27, -27, -27, -27, -27, -27, -27, 0, 0, -27, -27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 146
+        0, -28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -28, 0, -28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 147
+        0, 165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 148
+        0, -34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 149
+        0, 166, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 150
+        0, -35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 151
+        0, 167, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 152
+        0, 174, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 153
+        0, 175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 154
+        -60, -60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -60,
+        // State 155
+        -57, -57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -57,
+        // State 156
+        -56, -56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -56,
+        // State 157
+        -69, -69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -69,
+        // State 158
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 176, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 159
+        0, 177, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 160
+        0, -48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 161
+        -49, -49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -49,
+        // State 162
+        0, 0, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, 0, 0, -5, -5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 163
+        0, -29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -29, 0, -29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 164
+        -51, -51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -51,
+        // State 165
+        -52, -52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -52,
+        // State 166
+        -53, -53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -53,
+        // State 167
+        0, 178, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 168
+        -63, -63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -63,
+        // State 169
+        0, 179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 170
+        -65, -65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -65,
+        // State 171
+        0, 180, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 172
+        -67, -67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -67,
+        // State 173
+        -70, -70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -70,
+        // State 174
+        -71, -71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -71,
+        // State 175
+        0, 181, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 176
+        0, 0, -102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 177
+        -62, -62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -62,
+        // State 178
+        -64, -64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -64,
+        // State 179
+        -66, -66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -66,
+        // State 180
+        -55, -55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -55,
+    ];
+    fn __action(state: i16, integer: usize) -> i16 {
+        __ACTION[(state as usize) * 38 + integer]
+    }
+    const __EOF_ACTION: &[i16] = &[
+        // State 0
+        0,
+        // State 1
+        0,
+        // State 2
+        0,
+        // State 3
+        0,
+        // State 4
+        0,
+        // State 5
+        0,
+        // State 6
+        0,
+        // State 7
+        0,
+        // State 8
+        0,
+        // State 9
+        0,
+        // State 10
+        0,
+        // State 11
+        0,
+        // State 12
+        0,
+        // State 13
+        0,
+        // State 14
+        0,
+        // State 15
+        0,
+        // State 16
+        0,
+        // State 17
+        0,
+        // State 18
+        0,
+        // State 19
+        0,
+        // State 20
+        0,
+        // State 21
+        0,
+        // State 22
+        0,
+        // State 23
+        0,
+        // State 24
+        0,
+        // State 25
+        0,
+        // State 26
+        0,
+        // State 27
+        0,
+        // State 28
+        0,
+        // State 29
+        0,
+        // State 30
+        0,
+        // State 31
+        0,
+        // State 32
+        0,
+        // State 33
+        0,
+        // State 34
+        0,
+        // State 35
+        0,
+        // State 36
+        0,
+        // State 37
+        0,
+        // State 38
+        -120,
+        // State 39
+        -8,
+        // State 40
+        0,
+        // State 41
+        -72,
+        // State 42
+        0,
+        // State 43
+        0,
+        // State 44
+        0,
+        // State 45
+        0,
+        // State 46
+        0,
+        // State 47
+        0,
+        // State 48
+        0,
+        // State 49
+        0,
+        // State 50
+        0,
+        // State 51
+        0,
+        // State 52
+        0,
+        // State 53
+        0,
+        // State 54
+        0,
+        // State 55
+        0,
+        // State 56
+        0,
+        // State 57
+        0,
+        // State 58
+        0,
+        // State 59
+        0,
+        // State 60
+        0,
+        // State 61
+        0,
+        // State 62
+        0,
+        // State 63
+        0,
+        // State 64
+        0,
+        // State 65
+        0,
+        // State 66
+        0,
+        // State 67
+        0,
+        // State 68
+        0,
+        // State 69
+        0,
+        // State 70
+        0,
+        // State 71
+        0,
+        // State 72
+        0,
+        // State 73
+        0,
+        // State 74
+        0,
+        // State 75
+        0,
+        // State 76
+        0,
+        // State 77
+        0,
+        // State 78
+        0,
+        // State 79
+        0,
+        // State 80
+        0,
+        // State 81
+        0,
+        // State 82
+        0,
+        // State 83
+        0,
+        // State 84
+        0,
+        // State 85
+        0,
+        // State 86
+        0,
+        // State 87
+        0,
+        // State 88
+        0,
+        // State 89
+        0,
+        // State 90
+        0,
+        // State 91
+        0,
+        // State 92
+        0,
+        // State 93
+        0,
+        // State 94
+        0,
+        // State 95
+        0,
+        // State 96
+        0,
+        // State 97
+        0,
+        // State 98
+        0,
+        // State 99
+        0,
+        // State 100
+        0,
+        // State 101
+        0,
+        // State 102
+        0,
+        // State 103
+        0,
+        // State 104
+        -58,
+        // State 105
+        0,
+        // State 106
+        0,
+        // State 107
+        0,
+        // State 108
+        0,
+        // State 109
+        0,
+        // State 110
+        0,
+        // State 111
+        -59,
+        // State 112
+        0,
+        // State 113
+        0,
+        // State 114
+        0,
+        // State 115
+        0,
+        // State 116
+        0,
+        // State 117
+        0,
+        // State 118
+        0,
+        // State 119
+        0,
+        // State 120
+        0,
+        // State 121
+        0,
+        // State 122
+        0,
+        // State 123
+        -61,
+        // State 124
+        0,
+        // State 125
+        0,
+        // State 126
+        0,
+        // State 127
+        0,
+        // State 128
+        -68,
+        // State 129
+        0,
+        // State 130
+        0,
+        // State 131
+        0,
+        // State 132
+        -54,
+        // State 133
+        0,
+        // State 134
+        0,
+        // State 135
+        0,
+        // State 136
+        0,
+        // State 137
+        0,
+        // State 138
+        0,
+        // State 139
+        0,
+        // State 140
+        0,
+        // State 141
+        -50,
+        // State 142
+        0,
+        // State 143
+        0,
+        // State 144
+        0,
+        // State 145
+        0,
+        // State 146
+        0,
+        // State 147
+        0,
+        // State 148
+        0,
+        // State 149
+        0,
+        // State 150
+        0,
+        // State 151
+        0,
+        // State 152
+        0,
+        // State 153
+        0,
+        // State 154
+        -60,
+        // State 155
+        -57,
+        // State 156
+        -56,
+        // State 157
+        -69,
+        // State 158
+        0,
+        // State 159
+        0,
+        // State 160
+        0,
+        // State 161
+        -49,
+        // State 162
+        0,
+        // State 163
+        0,
+        // State 164
+        -51,
+        // State 165
+        -52,
+        // State 166
+        -53,
+        // State 167
+        0,
+        // State 168
+        -63,
+        // State 169
+        0,
+        // State 170
+        -65,
+        // State 171
+        0,
+        // State 172
+        -67,
+        // State 173
+        -70,
+        // State 174
+        -71,
+        // State 175
+        0,
+        // State 176
+        0,
+        // State 177
+        -62,
+        // State 178
+        -64,
+        // State 179
+        -66,
+        // State 180
+        -55,
+    ];
+    fn __goto(state: i16, nt: usize) -> i16 {
+        match nt {
+            2 => 34,
+            5 => 38,
+            6 => match state {
+                22 => 133,
+                _ => 12,
+            },
+            7 => 112,
+            8 => match state {
+                34 => 162,
+                _ => 144,
+            },
+            9 => 24,
+            10 => 140,
+            12 => 147,
+            13 => 149,
+            14 => 71,
+            15 => 78,
+            16 => 159,
+            17 => match state {
+                10 => 20,
+                11 => 21,
+                28 => 35,
+                29 => 36,
+                30 => 37,
+                0 => 39,
+                18 => 127,
+                19 => 129,
+                20 => 130,
+                21 => 131,
+                31 => 152,
+                32 => 153,
+                35 => 167,
+                36 => 169,
+                37 => 171,
+                _ => 19,
+            },
+            19 => 18,
+            20 => match state {
+                1 | 22 => 45,
+                _ => 87,
+            },
+            21 => 63,
+            22 => match state {
+                2 => 64,
+                _ => 15,
+            },
+            23 => match state {
+                33 => 160,
+                _ => 134,
+            },
+            24 => 33,
+            25 => 26,
+            26 => 27,
+            27 => 22,
+            28 => 14,
+            29 => match state {
+                6 => 16,
+                7 => 17,
+                16 => 31,
+                17 => 32,
+                _ => 145,
+            },
+            _ => 0,
+        }
+    }
+    const __TERMINAL: &[&str] = &[
+        r###""(""###,
+        r###"")""###,
+        r###""[""###,
+        r###""]""###,
+        r###"Boolean"###,
+        r###"CanonStream"###,
+        r###"CanonStreamMap"###,
+        r###"CanonStreamMapWithLambda"###,
+        r###"CanonStreamWithLambda"###,
+        r###"Error"###,
+        r###"ErrorWithLambda"###,
+        r###"F64"###,
+        r###"I64"###,
+        r###"InitPeerId"###,
+        r###"LastError"###,
+        r###"LastErrorWithLambda"###,
+        r###"Literal"###,
+        r###"Scalar"###,
+        r###"ScalarWithLambda"###,
+        r###"Stream"###,
+        r###"StreamMap"###,
+        r###"TTL"###,
+        r###"Timestamp"###,
+        r###"ap"###,
+        r###"call"###,
+        r###"canon"###,
+        r###"fail"###,
+        r###"fold"###,
+        r###"match_"###,
+        r###"mismatch"###,
+        r###"never"###,
+        r###"new"###,
+        r###"next"###,
+        r###"null"###,
+        r###"par"###,
+        r###"seq"###,
+        r###"xor"###,
+    ];
+    fn __expected_tokens(__state: i16) -> alloc::vec::Vec<alloc::string::String> {
+        __TERMINAL.iter().enumerate().filter_map(|(index, terminal)| {
+            let next_state = __action(__state, index);
+            if next_state == 0 {
+                None
+            } else {
+                Some(alloc::string::ToString::to_string(terminal))
+            }
+        }).collect()
+    }
+    fn __expected_tokens_from_states<
+        'err,
+        'input,
+        'v,
+    >(
+        __states: &[i16],
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> alloc::vec::Vec<alloc::string::String>
+    where
+        'input: 'err,
+        'input: 'v,
+    {
+        __TERMINAL.iter().enumerate().filter_map(|(index, terminal)| {
+            if __accepts(None, __states, Some(index), core::marker::PhantomData::<(&(), &(), &())>) {
+                Some(alloc::string::ToString::to_string(terminal))
+            } else {
+                None
+            }
+        }).collect()
+    }
+    pub(crate) struct __StateMachine<'err, 'input, 'v>
+    where 'input: 'err, 'input: 'v
+    {
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __phantom: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    }
+    impl<'err, 'input, 'v> __state_machine::ParserDefinition for __StateMachine<'err, 'input, 'v>
+    where 'input: 'err, 'input: 'v
+    {
+        type Location = AirPos;
+        type Error = ParserError;
+        type Token = Token<'input>;
+        type TokenIndex = usize;
+        type Symbol = __Symbol<'input>;
+        type Success = Instruction<'input>;
+        type StateIndex = i16;
+        type Action = i16;
+        type ReduceIndex = i16;
+        type NonterminalIndex = usize;
+
+        #[inline]
+        fn start_location(&self) -> Self::Location {
+              Default::default()
+        }
+
+        #[inline]
+        fn start_state(&self) -> Self::StateIndex {
+              0
+        }
+
+        #[inline]
+        fn token_to_index(&self, token: &Self::Token) -> Option<usize> {
+            __token_to_integer(token, core::marker::PhantomData::<(&(), &(), &())>)
+        }
+
+        #[inline]
+        fn action(&self, state: i16, integer: usize) -> i16 {
+            __action(state, integer)
+        }
+
+        #[inline]
+        fn error_action(&self, state: i16) -> i16 {
+            __action(state, 38 - 1)
+        }
+
+        #[inline]
+        fn eof_action(&self, state: i16) -> i16 {
+            __EOF_ACTION[state as usize]
+        }
+
+        #[inline]
+        fn goto(&self, state: i16, nt: usize) -> i16 {
+            __goto(state, nt)
+        }
+
+        fn token_to_symbol(&self, token_index: usize, token: Self::Token) -> Self::Symbol {
+            __token_to_symbol(token_index, token, core::marker::PhantomData::<(&(), &(), &())>)
+        }
+
+        fn expected_tokens(&self, state: i16) -> alloc::vec::Vec<alloc::string::String> {
+            __expected_tokens(state)
+        }
+
+        fn expected_tokens_from_states(&self, states: &[i16]) -> alloc::vec::Vec<alloc::string::String> {
+            __expected_tokens_from_states(states, core::marker::PhantomData::<(&(), &(), &())>)
+        }
+
+        #[inline]
+        fn uses_error_recovery(&self) -> bool {
+            true
+        }
+
+        #[inline]
+        fn error_recovery_symbol(
+            &self,
+            recovery: __state_machine::ErrorRecovery<Self>,
+        ) -> Self::Symbol {
+            __Symbol::Variant8(recovery)
+        }
+
+        fn reduce(
+            &mut self,
+            action: i16,
+            start_location: Option<&Self::Location>,
+            states: &mut alloc::vec::Vec<i16>,
+            symbols: &mut alloc::vec::Vec<__state_machine::SymbolTriple<Self>>,
+        ) -> Option<__state_machine::ParseResult<Self>> {
+            __reduce(
+                self.input,
+                self.errors,
+                self.validator,
+                action,
+                start_location,
+                states,
+                symbols,
+                core::marker::PhantomData::<(&(), &(), &())>,
+            )
+        }
+
+        fn simulate_reduce(&self, action: i16) -> __state_machine::SimulatedReduce<Self> {
+            __simulate_reduce(action, core::marker::PhantomData::<(&(), &(), &())>)
+        }
+    }
+    fn __token_to_integer<
+        'err,
+        'input,
+        'v,
+    >(
+        __token: &Token<'input>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> Option<usize>
+    {
+        match *__token {
+            Token::OpenRoundBracket if true => Some(0),
+            Token::CloseRoundBracket if true => Some(1),
+            Token::OpenSquareBracket if true => Some(2),
+            Token::CloseSquareBracket if true => Some(3),
+            Token::Boolean(_) if true => Some(4),
+            Token::CanonStream { name: _, position: _ } if true => Some(5),
+            Token::CanonStreamMap { name: _, position: _ } if true => Some(6),
+            Token::CanonStreamMapWithLambda { name: _, lambda: _, position: _ } if true => Some(7),
+            Token::CanonStreamWithLambda { name: _, lambda: _, position: _ } if true => Some(8),
+            Token::Error if true => Some(9),
+            Token::ErrorWithLambda(_) if true => Some(10),
+            Token::F64(_) if true => Some(11),
+            Token::I64(_) if true => Some(12),
+            Token::InitPeerId if true => Some(13),
+            Token::LastError if true => Some(14),
+            Token::LastErrorWithLambda(_) if true => Some(15),
+            Token::StringLiteral(_) if true => Some(16),
+            Token::Scalar { name: _, position: _ } if true => Some(17),
+            Token::ScalarWithLambda { name: _, lambda: _, position: _ } if true => Some(18),
+            Token::Stream { name: _, position: _ } if true => Some(19),
+            Token::StreamMap { name: _, position: _ } if true => Some(20),
+            Token::TTL if true => Some(21),
+            Token::Timestamp if true => Some(22),
+            Token::Ap if true => Some(23),
+            Token::Call if true => Some(24),
+            Token::Canon if true => Some(25),
+            Token::Fail if true => Some(26),
+            Token::Fold if true => Some(27),
+            Token::Match if true => Some(28),
+            Token::MisMatch if true => Some(29),
+            Token::Never if true => Some(30),
+            Token::New if true => Some(31),
+            Token::Next if true => Some(32),
+            Token::Null if true => Some(33),
+            Token::Par if true => Some(34),
+            Token::Seq if true => Some(35),
+            Token::Xor if true => Some(36),
+            _ => None,
+        }
+    }
+    fn __token_to_symbol<
+        'err,
+        'input,
+        'v,
+    >(
+        __token_index: usize,
+        __token: Token<'input>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> __Symbol<'input>
+    {
+        match __token_index {
+            0 | 1 | 2 | 3 | 9 | 13 | 14 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 => __Symbol::Variant0(__token),
+            4 => match __token {
+                Token::Boolean(__tok0) if true => __Symbol::Variant1(__tok0),
+                _ => unreachable!(),
+            },
+            5 | 6 | 17 | 19 | 20 => match __token {
+                Token::CanonStream { name: __tok0, position: __tok1 } | Token::CanonStreamMap { name: __tok0, position: __tok1 } | Token::Scalar { name: __tok0, position: __tok1 } | Token::Stream { name: __tok0, position: __tok1 } | Token::StreamMap { name: __tok0, position: __tok1 } if true => __Symbol::Variant2((__tok0, __tok1)),
+                _ => unreachable!(),
+            },
+            7 | 8 | 18 => match __token {
+                Token::CanonStreamMapWithLambda { name: __tok0, lambda: __tok1, position: __tok2 } | Token::CanonStreamWithLambda { name: __tok0, lambda: __tok1, position: __tok2 } | Token::ScalarWithLambda { name: __tok0, lambda: __tok1, position: __tok2 } if true => __Symbol::Variant3((__tok0, __tok1, __tok2)),
+                _ => unreachable!(),
+            },
+            10 | 15 => match __token {
+                Token::ErrorWithLambda(__tok0) | Token::LastErrorWithLambda(__tok0) if true => __Symbol::Variant4(__tok0),
+                _ => unreachable!(),
+            },
+            11 => match __token {
+                Token::F64(__tok0) if true => __Symbol::Variant5(__tok0),
+                _ => unreachable!(),
+            },
+            12 => match __token {
+                Token::I64(__tok0) if true => __Symbol::Variant6(__tok0),
+                _ => unreachable!(),
+            },
+            16 => match __token {
+                Token::StringLiteral(__tok0) if true => __Symbol::Variant7(__tok0),
+                _ => unreachable!(),
+            },
+            _ => unreachable!(),
+        }
+    }
+    fn __simulate_reduce<
+        'err,
+        'input,
+        'v,
+    >(
+        __reduce_index: i16,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> __state_machine::SimulatedReduce<__StateMachine<'err, 'input, 'v>>
+    where
+        'input: 'err,
+        'input: 'v,
+    {
+        match __reduce_index {
+            0 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 0,
+                }
+            }
+            1 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 0,
+                    nonterminal_produced: 1,
+                }
+            }
+            2 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 1,
+                }
+            }
+            3 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 2,
+                }
+            }
+            4 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 2,
+                }
+            }
+            5 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 0,
+                    nonterminal_produced: 3,
+                }
+            }
+            6 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 0,
+                    nonterminal_produced: 4,
+                }
+            }
+            7 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 5,
+                }
+            }
+            8 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 6,
+                }
+            }
+            9 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 6,
+                }
+            }
+            10 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 6,
+                }
+            }
+            11 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 6,
+                }
+            }
+            12 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 6,
+                }
+            }
+            13 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 6,
+                }
+            }
+            14 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 6,
+                }
+            }
+            15 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 6,
+                }
+            }
+            16 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 6,
+                }
+            }
+            17 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 6,
+                }
+            }
+            18 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 6,
+                }
+            }
+            19 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 6,
+                }
+            }
+            20 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 6,
+                }
+            }
+            21 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 6,
+                }
+            }
+            22 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 6,
+                }
+            }
+            23 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 6,
+                }
+            }
+            24 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 7,
+                }
+            }
+            25 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 7,
+                }
+            }
+            26 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 8,
+                }
+            }
+            27 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 9,
+                }
+            }
+            28 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 3,
+                    nonterminal_produced: 9,
+                }
+            }
+            29 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 10,
+                }
+            }
+            30 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 10,
+                }
+            }
+            31 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 11,
+                }
+            }
+            32 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 0,
+                    nonterminal_produced: 11,
+                }
+            }
+            33 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 12,
+                }
+            }
+            34 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 13,
+                }
+            }
+            35 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 14,
+                }
+            }
+            36 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 14,
+                }
+            }
+            37 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 14,
+                }
+            }
+            38 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 14,
+                }
+            }
+            39 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 14,
+                }
+            }
+            40 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 14,
+                }
+            }
+            41 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 15,
+                }
+            }
+            42 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 15,
+                }
+            }
+            43 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 15,
+                }
+            }
+            44 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 15,
+                }
+            }
+            45 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 15,
+                }
+            }
+            46 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 15,
+                }
+            }
+            47 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 16,
+                }
+            }
+            48 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 6,
+                    nonterminal_produced: 17,
+                }
+            }
+            49 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 5,
+                    nonterminal_produced: 17,
+                }
+            }
+            50 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 6,
+                    nonterminal_produced: 17,
+                }
+            }
+            51 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 6,
+                    nonterminal_produced: 17,
+                }
+            }
+            52 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 6,
+                    nonterminal_produced: 17,
+                }
+            }
+            53 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 5,
+                    nonterminal_produced: 17,
+                }
+            }
+            54 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 8,
+                    nonterminal_produced: 17,
+                }
+            }
+            55 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 5,
+                    nonterminal_produced: 17,
+                }
+            }
+            56 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 5,
+                    nonterminal_produced: 17,
+                }
+            }
+            57 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 3,
+                    nonterminal_produced: 17,
+                }
+            }
+            58 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 3,
+                    nonterminal_produced: 17,
+                }
+            }
+            59 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 5,
+                    nonterminal_produced: 17,
+                }
+            }
+            60 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 4,
+                    nonterminal_produced: 17,
+                }
+            }
+            61 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 7,
+                    nonterminal_produced: 17,
+                }
+            }
+            62 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 6,
+                    nonterminal_produced: 17,
+                }
+            }
+            63 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 7,
+                    nonterminal_produced: 17,
+                }
+            }
+            64 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 6,
+                    nonterminal_produced: 17,
+                }
+            }
+            65 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 7,
+                    nonterminal_produced: 17,
+                }
+            }
+            66 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 6,
+                    nonterminal_produced: 17,
+                }
+            }
+            67 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 4,
+                    nonterminal_produced: 17,
+                }
+            }
+            68 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 5,
+                    nonterminal_produced: 17,
+                }
+            }
+            69 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 6,
+                    nonterminal_produced: 17,
+                }
+            }
+            70 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 6,
+                    nonterminal_produced: 17,
+                }
+            }
+            71 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 17,
+                }
+            }
+            72 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 18,
+                }
+            }
+            73 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 0,
+                    nonterminal_produced: 18,
+                }
+            }
+            74 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 19,
+                }
+            }
+            75 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 19,
+                }
+            }
+            76 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 19,
+                }
+            }
+            77 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 19,
+                }
+            }
+            78 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 19,
+                }
+            }
+            79 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 20,
+                }
+            }
+            80 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 20,
+                }
+            }
+            81 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 21,
+                }
+            }
+            82 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 22,
+                }
+            }
+            83 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 22,
+                }
+            }
+            84 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 22,
+                }
+            }
+            85 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 22,
+                }
+            }
+            86 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 22,
+                }
+            }
+            87 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 22,
+                }
+            }
+            88 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 23,
+                }
+            }
+            89 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 23,
+                }
+            }
+            90 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 23,
+                }
+            }
+            91 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 23,
+                }
+            }
+            92 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 23,
+                }
+            }
+            93 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 24,
+                }
+            }
+            94 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 25,
+                }
+            }
+            95 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 26,
+                }
+            }
+            96 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 27,
+                }
+            }
+            97 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 27,
+                }
+            }
+            98 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 27,
+                }
+            }
+            99 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 27,
+                }
+            }
+            100 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 27,
+                }
+            }
+            101 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 5,
+                    nonterminal_produced: 28,
+                }
+            }
+            102 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 29,
+                }
+            }
+            103 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 29,
+                }
+            }
+            104 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 29,
+                }
+            }
+            105 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 29,
+                }
+            }
+            106 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 29,
+                }
+            }
+            107 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 29,
+                }
+            }
+            108 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 29,
+                }
+            }
+            109 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 29,
+                }
+            }
+            110 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 29,
+                }
+            }
+            111 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 29,
+                }
+            }
+            112 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 29,
+                }
+            }
+            113 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 29,
+                }
+            }
+            114 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 29,
+                }
+            }
+            115 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 29,
+                }
+            }
+            116 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 29,
+                }
+            }
+            117 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 29,
+                }
+            }
+            118 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 29,
+                }
+            }
+            119 => __state_machine::SimulatedReduce::Accept,
+            _ => panic!("invalid reduction index {}", __reduce_index)
+        }
+    }
+    pub struct AIRParser {
+        _priv: (),
+    }
+
+    impl AIRParser {
+        pub fn new() -> AIRParser {
+            AIRParser {
+                _priv: (),
+            }
+        }
+
+        #[allow(dead_code)]
+        pub fn parse<
+            'err,
+            'input,
+            'v,
+            __TOKEN: __ToTriple<'err, 'input, 'v, >,
+            __TOKENS: IntoIterator<Item=__TOKEN>,
+        >(
+            &self,
+            input: &'input str,
+            errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+            validator: &'v mut VariableValidator<'input>,
+            __tokens0: __TOKENS,
+        ) -> Result<Instruction<'input>, __lalrpop_util::ParseError<AirPos, Token<'input>, ParserError>>
+        {
+            let __tokens = __tokens0.into_iter();
+            let mut __tokens = __tokens.map(|t| __ToTriple::to_triple(t));
+            __state_machine::Parser::drive(
+                __StateMachine {
+                    input,
+                    errors,
+                    validator,
+                    __phantom: core::marker::PhantomData::<(&(), &(), &())>,
+                },
+                __tokens,
+            )
+        }
+    }
+    fn __accepts<
+        'err,
+        'input,
+        'v,
+    >(
+        __error_state: Option<i16>,
+        __states: &[i16],
+        __opt_integer: Option<usize>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> bool
+    where
+        'input: 'err,
+        'input: 'v,
+    {
+        let mut __states = __states.to_vec();
+        __states.extend(__error_state);
+        loop {
+            let mut __states_len = __states.len();
+            let __top = __states[__states_len - 1];
+            let __action = match __opt_integer {
+                None => __EOF_ACTION[__top as usize],
+                Some(__integer) => __action(__top, __integer),
+            };
+            if __action == 0 { return false; }
+            if __action > 0 { return true; }
+            let (__to_pop, __nt) = match __simulate_reduce(-(__action + 1), core::marker::PhantomData::<(&(), &(), &())>) {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop, nonterminal_produced
+                } => (states_to_pop, nonterminal_produced),
+                __state_machine::SimulatedReduce::Accept => return true,
+            };
+            __states_len -= __to_pop;
+            __states.truncate(__states_len);
+            let __top = __states[__states_len - 1];
+            let __next_state = __goto(__top, __nt);
+            __states.push(__next_state);
+        }
+    }
+    pub(crate) fn __reduce<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __action: i16,
+        __lookahead_start: Option<&AirPos>,
+        __states: &mut alloc::vec::Vec<i16>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> Option<Result<Instruction<'input>,__lalrpop_util::ParseError<AirPos, Token<'input>, ParserError>>>
+    {
+        let (__pop_states, __nonterminal) = match __action {
+            0 => {
+                __reduce0(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            1 => {
+                __reduce1(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            2 => {
+                __reduce2(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            3 => {
+                __reduce3(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            4 => {
+                __reduce4(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            5 => {
+                __reduce5(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            6 => {
+                __reduce6(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            7 => {
+                __reduce7(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            8 => {
+                __reduce8(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            9 => {
+                __reduce9(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            10 => {
+                __reduce10(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            11 => {
+                __reduce11(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            12 => {
+                __reduce12(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            13 => {
+                __reduce13(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            14 => {
+                __reduce14(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            15 => {
+                __reduce15(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            16 => {
+                __reduce16(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            17 => {
+                __reduce17(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            18 => {
+                __reduce18(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            19 => {
+                __reduce19(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            20 => {
+                __reduce20(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            21 => {
+                __reduce21(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            22 => {
+                __reduce22(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            23 => {
+                __reduce23(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            24 => {
+                __reduce24(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            25 => {
+                __reduce25(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            26 => {
+                __reduce26(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            27 => {
+                __reduce27(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            28 => {
+                __reduce28(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            29 => {
+                __reduce29(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            30 => {
+                __reduce30(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            31 => {
+                __reduce31(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            32 => {
+                __reduce32(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            33 => {
+                __reduce33(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            34 => {
+                __reduce34(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            35 => {
+                __reduce35(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            36 => {
+                __reduce36(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            37 => {
+                __reduce37(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            38 => {
+                __reduce38(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            39 => {
+                __reduce39(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            40 => {
+                __reduce40(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            41 => {
+                __reduce41(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            42 => {
+                __reduce42(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            43 => {
+                __reduce43(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            44 => {
+                __reduce44(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            45 => {
+                __reduce45(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            46 => {
+                __reduce46(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            47 => {
+                __reduce47(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            48 => {
+                __reduce48(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            49 => {
+                __reduce49(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            50 => {
+                __reduce50(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            51 => {
+                __reduce51(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            52 => {
+                __reduce52(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            53 => {
+                __reduce53(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            54 => {
+                __reduce54(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            55 => {
+                __reduce55(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            56 => {
+                __reduce56(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            57 => {
+                __reduce57(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            58 => {
+                __reduce58(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            59 => {
+                __reduce59(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            60 => {
+                __reduce60(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            61 => {
+                __reduce61(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            62 => {
+                __reduce62(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            63 => {
+                __reduce63(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            64 => {
+                __reduce64(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            65 => {
+                __reduce65(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            66 => {
+                __reduce66(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            67 => {
+                __reduce67(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            68 => {
+                __reduce68(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            69 => {
+                __reduce69(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            70 => {
+                __reduce70(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            71 => {
+                __reduce71(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            72 => {
+                __reduce72(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            73 => {
+                __reduce73(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            74 => {
+                __reduce74(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            75 => {
+                __reduce75(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            76 => {
+                __reduce76(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            77 => {
+                __reduce77(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            78 => {
+                __reduce78(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            79 => {
+                __reduce79(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            80 => {
+                __reduce80(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            81 => {
+                __reduce81(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            82 => {
+                __reduce82(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            83 => {
+                __reduce83(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            84 => {
+                __reduce84(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            85 => {
+                __reduce85(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            86 => {
+                __reduce86(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            87 => {
+                __reduce87(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            88 => {
+                __reduce88(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            89 => {
+                __reduce89(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            90 => {
+                __reduce90(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            91 => {
+                __reduce91(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            92 => {
+                __reduce92(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            93 => {
+                __reduce93(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            94 => {
+                __reduce94(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            95 => {
+                __reduce95(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            96 => {
+                __reduce96(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            97 => {
+                __reduce97(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            98 => {
+                __reduce98(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            99 => {
+                __reduce99(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            100 => {
+                __reduce100(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            101 => {
+                __reduce101(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            102 => {
+                __reduce102(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            103 => {
+                __reduce103(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            104 => {
+                __reduce104(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            105 => {
+                __reduce105(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            106 => {
+                __reduce106(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            107 => {
+                __reduce107(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            108 => {
+                __reduce108(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            109 => {
+                __reduce109(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            110 => {
+                __reduce110(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            111 => {
+                __reduce111(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            112 => {
+                __reduce112(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            113 => {
+                __reduce113(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            114 => {
+                __reduce114(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            115 => {
+                __reduce115(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            116 => {
+                __reduce116(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            117 => {
+                __reduce117(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            118 => {
+                __reduce118(input, errors, validator, __lookahead_start, __symbols, core::marker::PhantomData::<(&(), &(), &())>)
+            }
+            119 => {
+                // __AIR = AIR => ActionFn(0);
+                let __sym0 = __pop_Variant12(__symbols);
+                let __start = __sym0.0;
+                let __end = __sym0.2;
+                let __nt = super::__action0::<>(input, errors, validator, __sym0);
+                return Some(Ok(__nt));
+            }
+            _ => panic!("invalid action code {}", __action)
+        };
+        let __states_len = __states.len();
+        __states.truncate(__states_len - __pop_states);
+        let __state = *__states.last().unwrap();
+        let __next_state = __goto(__state, __nonterminal);
+        __states.push(__next_state);
+        None
+    }
+    #[inline(never)]
+    fn __symbol_type_mismatch() -> ! {
+        panic!("symbol type mismatch")
+    }
+    fn __pop_Variant2<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>
+    ) -> (AirPos, (&'input str, AirPos), AirPos)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant2(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant3<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>
+    ) -> (AirPos, (&'input str, LambdaAST<'input>, AirPos), AirPos)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant3(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant11<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>
+    ) -> (AirPos, AirPos, AirPos)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant11(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant13<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>
+    ) -> (AirPos, ApArgument<'input>, AirPos)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant13(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant14<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>
+    ) -> (AirPos, ApResult<'input>, AirPos)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant14(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant16<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>
+    ) -> (AirPos, CallOutputValue<'input>, AirPos)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant16(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant18<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>
+    ) -> (AirPos, CanonStream<'input>, AirPos)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant18(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant19<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>
+    ) -> (AirPos, CanonStreamMap<'input>, AirPos)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant19(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant20<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>
+    ) -> (AirPos, Fail<'input>, AirPos)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant20(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant21<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>
+    ) -> (AirPos, FoldScalarIterable<'input>, AirPos)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant21(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant9<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>
+    ) -> (AirPos, ImmutableValue<'input>, AirPos)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant9(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant12<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>
+    ) -> (AirPos, Instruction<'input>, AirPos)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant12(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant4<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>
+    ) -> (AirPos, LambdaAST<'input>, AirPos)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant4(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant24<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>
+    ) -> (AirPos, NewArgument<'input>, AirPos)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant24(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant25<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>
+    ) -> (AirPos, Number, AirPos)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant25(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant26<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>
+    ) -> (AirPos, ResolvableToPeerIdVariable<'input>, AirPos)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant26(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant22<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>
+    ) -> (AirPos, ResolvableToStringVariable<'input>, AirPos)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant22(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant27<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>
+    ) -> (AirPos, Stream<'input>, AirPos)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant27(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant28<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>
+    ) -> (AirPos, StreamMap<'input>, AirPos)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant28(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant29<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>
+    ) -> (AirPos, StreamMapKeyClause<'input>, AirPos)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant29(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant0<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>
+    ) -> (AirPos, Token<'input>, AirPos)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant0(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant30<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>
+    ) -> (AirPos, Triplet<'input>, AirPos)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant30(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant15<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>
+    ) -> (AirPos, Vec<ImmutableValue<'input>>, AirPos)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant15(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant8<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>
+    ) -> (AirPos, __lalrpop_util::ErrorRecovery<AirPos, Token<'input>, ParserError>, AirPos)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant8(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant10<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>
+    ) -> (AirPos, alloc::vec::Vec<ImmutableValue<'input>>, AirPos)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant10(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant1<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>
+    ) -> (AirPos, bool, AirPos)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant1(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant17<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>
+    ) -> (AirPos, core::option::Option<CallOutputValue<'input>>, AirPos)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant17(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant23<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>
+    ) -> (AirPos, core::option::Option<Instruction<'input>>, AirPos)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant23(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant5<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>
+    ) -> (AirPos, f64, AirPos)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant5(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant6<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>
+    ) -> (AirPos, i64, AirPos)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant6(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant7<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>
+    ) -> (AirPos, &'input str, AirPos)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant7(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    pub(crate) fn __reduce0<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // (<Arg>) = Arg => ActionFn(106);
+        let __sym0 = __pop_Variant9(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action106::<>(input, errors, validator, __sym0);
+        __symbols.push((__start, __Symbol::Variant9(__nt), __end));
+        (1, 0)
+    }
+    pub(crate) fn __reduce1<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // (<Arg>)* =  => ActionFn(104);
+        let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default();
+        let __end = __start.clone();
+        let __nt = super::__action104::<>(input, errors, validator, &__start, &__end);
+        __symbols.push((__start, __Symbol::Variant10(__nt), __end));
+        (0, 1)
+    }
+    pub(crate) fn __reduce2<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // (<Arg>)* = (<Arg>)+ => ActionFn(105);
+        let __sym0 = __pop_Variant10(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action105::<>(input, errors, validator, __sym0);
+        __symbols.push((__start, __Symbol::Variant10(__nt), __end));
+        (1, 1)
+    }
+    pub(crate) fn __reduce3<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // (<Arg>)+ = Arg => ActionFn(115);
+        let __sym0 = __pop_Variant9(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action115::<>(input, errors, validator, __sym0);
+        __symbols.push((__start, __Symbol::Variant10(__nt), __end));
+        (1, 2)
+    }
+    pub(crate) fn __reduce4<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // (<Arg>)+ = (<Arg>)+, Arg => ActionFn(116);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant9(__symbols);
+        let __sym0 = __pop_Variant10(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action116::<>(input, errors, validator, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant10(__nt), __end));
+        (2, 2)
+    }
+    pub(crate) fn __reduce5<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // @L =  => ActionFn(112);
+        let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default();
+        let __end = __start.clone();
+        let __nt = super::__action112::<>(input, errors, validator, &__start, &__end);
+        __symbols.push((__start, __Symbol::Variant11(__nt), __end));
+        (0, 3)
+    }
+    pub(crate) fn __reduce6<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // @R =  => ActionFn(109);
+        let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default();
+        let __end = __start.clone();
+        let __nt = super::__action109::<>(input, errors, validator, &__start, &__end);
+        __symbols.push((__start, __Symbol::Variant11(__nt), __end));
+        (0, 4)
+    }
+    pub(crate) fn __reduce7<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // AIR = Instr => ActionFn(1);
+        let __sym0 = __pop_Variant12(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action1::<>(input, errors, validator, __sym0);
+        __symbols.push((__start, __Symbol::Variant12(__nt), __end));
+        (1, 5)
+    }
+    pub(crate) fn __reduce8<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // ApArgument = InitPeerId => ActionFn(84);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action84::<>(input, errors, validator, __sym0);
+        __symbols.push((__start, __Symbol::Variant13(__nt), __end));
+        (1, 6)
+    }
+    pub(crate) fn __reduce9<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // ApArgument = LastError => ActionFn(85);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action85::<>(input, errors, validator, __sym0);
+        __symbols.push((__start, __Symbol::Variant13(__nt), __end));
+        (1, 6)
+    }
+    pub(crate) fn __reduce10<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // ApArgument = LastErrorWithLambda => ActionFn(86);
+        let __sym0 = __pop_Variant4(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action86::<>(input, errors, validator, __sym0);
+        __symbols.push((__start, __Symbol::Variant13(__nt), __end));
+        (1, 6)
+    }
+    pub(crate) fn __reduce11<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // ApArgument = Error => ActionFn(87);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action87::<>(input, errors, validator, __sym0);
+        __symbols.push((__start, __Symbol::Variant13(__nt), __end));
+        (1, 6)
+    }
+    pub(crate) fn __reduce12<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // ApArgument = ErrorWithLambda => ActionFn(88);
+        let __sym0 = __pop_Variant4(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action88::<>(input, errors, validator, __sym0);
+        __symbols.push((__start, __Symbol::Variant13(__nt), __end));
+        (1, 6)
+    }
+    pub(crate) fn __reduce13<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // ApArgument = Timestamp => ActionFn(89);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action89::<>(input, errors, validator, __sym0);
+        __symbols.push((__start, __Symbol::Variant13(__nt), __end));
+        (1, 6)
+    }
+    pub(crate) fn __reduce14<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // ApArgument = TTL => ActionFn(90);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action90::<>(input, errors, validator, __sym0);
+        __symbols.push((__start, __Symbol::Variant13(__nt), __end));
+        (1, 6)
+    }
+    pub(crate) fn __reduce15<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // ApArgument = Literal => ActionFn(91);
+        let __sym0 = __pop_Variant7(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action91::<>(input, errors, validator, __sym0);
+        __symbols.push((__start, __Symbol::Variant13(__nt), __end));
+        (1, 6)
+    }
+    pub(crate) fn __reduce16<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // ApArgument = Number => ActionFn(92);
+        let __sym0 = __pop_Variant25(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action92::<>(input, errors, validator, __sym0);
+        __symbols.push((__start, __Symbol::Variant13(__nt), __end));
+        (1, 6)
+    }
+    pub(crate) fn __reduce17<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // ApArgument = Boolean => ActionFn(93);
+        let __sym0 = __pop_Variant1(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action93::<>(input, errors, validator, __sym0);
+        __symbols.push((__start, __Symbol::Variant13(__nt), __end));
+        (1, 6)
+    }
+    pub(crate) fn __reduce18<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // ApArgument = "[", "]" => ActionFn(94);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action94::<>(input, errors, validator, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant13(__nt), __end));
+        (2, 6)
+    }
+    pub(crate) fn __reduce19<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // ApArgument = Scalar => ActionFn(95);
+        let __sym0 = __pop_Variant2(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action95::<>(input, errors, validator, __sym0);
+        __symbols.push((__start, __Symbol::Variant13(__nt), __end));
+        (1, 6)
+    }
+    pub(crate) fn __reduce20<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // ApArgument = ScalarWithLambda => ActionFn(96);
+        let __sym0 = __pop_Variant3(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action96::<>(input, errors, validator, __sym0);
+        __symbols.push((__start, __Symbol::Variant13(__nt), __end));
+        (1, 6)
+    }
+    pub(crate) fn __reduce21<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // ApArgument = CanonStream => ActionFn(97);
+        let __sym0 = __pop_Variant2(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action97::<>(input, errors, validator, __sym0);
+        __symbols.push((__start, __Symbol::Variant13(__nt), __end));
+        (1, 6)
+    }
+    pub(crate) fn __reduce22<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // ApArgument = CanonStreamWithLambda => ActionFn(98);
+        let __sym0 = __pop_Variant3(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action98::<>(input, errors, validator, __sym0);
+        __symbols.push((__start, __Symbol::Variant13(__nt), __end));
+        (1, 6)
+    }
+    pub(crate) fn __reduce23<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // ApArgument = CanonStreamMapWithLambda => ActionFn(99);
+        let __sym0 = __pop_Variant3(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action99::<>(input, errors, validator, __sym0);
+        __symbols.push((__start, __Symbol::Variant13(__nt), __end));
+        (1, 6)
+    }
+    pub(crate) fn __reduce24<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // ApResult = Scalar => ActionFn(24);
+        let __sym0 = __pop_Variant2(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action24::<>(input, errors, validator, __sym0);
+        __symbols.push((__start, __Symbol::Variant14(__nt), __end));
+        (1, 7)
+    }
+    pub(crate) fn __reduce25<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // ApResult = Stream => ActionFn(25);
+        let __sym0 = __pop_Variant2(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action25::<>(input, errors, validator, __sym0);
+        __symbols.push((__start, __Symbol::Variant14(__nt), __end));
+        (1, 7)
+    }
+    pub(crate) fn __reduce26<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // Arg = Value => ActionFn(66);
+        let __sym0 = __pop_Variant9(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action66::<>(input, errors, validator, __sym0);
+        __symbols.push((__start, __Symbol::Variant9(__nt), __end));
+        (1, 8)
+    }
+    pub(crate) fn __reduce27<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // Args = "[", "]" => ActionFn(117);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action117::<>(input, errors, validator, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant15(__nt), __end));
+        (2, 9)
+    }
+    pub(crate) fn __reduce28<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // Args = "[", (<Arg>)+, "]" => ActionFn(118);
+        assert!(__symbols.len() >= 3);
+        let __sym2 = __pop_Variant0(__symbols);
+        let __sym1 = __pop_Variant10(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym2.2;
+        let __nt = super::__action118::<>(input, errors, validator, __sym0, __sym1, __sym2);
+        __symbols.push((__start, __Symbol::Variant15(__nt), __end));
+        (3, 9)
+    }
+    pub(crate) fn __reduce29<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // CallOutput = Scalar => ActionFn(31);
+        let __sym0 = __pop_Variant2(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action31::<>(input, errors, validator, __sym0);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (1, 10)
+    }
+    pub(crate) fn __reduce30<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // CallOutput = Stream => ActionFn(32);
+        let __sym0 = __pop_Variant2(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action32::<>(input, errors, validator, __sym0);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (1, 10)
+    }
+    pub(crate) fn __reduce31<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // CallOutput? = CallOutput => ActionFn(110);
+        let __sym0 = __pop_Variant16(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action110::<>(input, errors, validator, __sym0);
+        __symbols.push((__start, __Symbol::Variant17(__nt), __end));
+        (1, 11)
+    }
+    pub(crate) fn __reduce32<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // CallOutput? =  => ActionFn(111);
+        let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default();
+        let __end = __start.clone();
+        let __nt = super::__action111::<>(input, errors, validator, &__start, &__end);
+        __symbols.push((__start, __Symbol::Variant17(__nt), __end));
+        (0, 11)
+    }
+    pub(crate) fn __reduce33<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // CanonStreamArgument = CanonStream => ActionFn(102);
+        let __sym0 = __pop_Variant2(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action102::<>(input, errors, validator, __sym0);
+        __symbols.push((__start, __Symbol::Variant18(__nt), __end));
+        (1, 12)
+    }
+    pub(crate) fn __reduce34<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // CanonStreamMapArgument = CanonStreamMap => ActionFn(103);
+        let __sym0 = __pop_Variant2(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action103::<>(input, errors, validator, __sym0);
+        __symbols.push((__start, __Symbol::Variant19(__nt), __end));
+        (1, 13)
+    }
+    pub(crate) fn __reduce35<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // FailBody = Scalar => ActionFn(33);
+        let __sym0 = __pop_Variant2(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action33::<>(input, errors, validator, __sym0);
+        __symbols.push((__start, __Symbol::Variant20(__nt), __end));
+        (1, 14)
+    }
+    pub(crate) fn __reduce36<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // FailBody = ScalarWithLambda => ActionFn(34);
+        let __sym0 = __pop_Variant3(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action34::<>(input, errors, validator, __sym0);
+        __symbols.push((__start, __Symbol::Variant20(__nt), __end));
+        (1, 14)
+    }
+    pub(crate) fn __reduce37<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // FailBody = I64, Literal => ActionFn(35);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant7(__symbols);
+        let __sym0 = __pop_Variant6(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action35::<>(input, errors, validator, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant20(__nt), __end));
+        (2, 14)
+    }
+    pub(crate) fn __reduce38<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // FailBody = CanonStreamWithLambda => ActionFn(36);
+        let __sym0 = __pop_Variant3(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action36::<>(input, errors, validator, __sym0);
+        __symbols.push((__start, __Symbol::Variant20(__nt), __end));
+        (1, 14)
+    }
+    pub(crate) fn __reduce39<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // FailBody = LastError => ActionFn(140);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action140::<>(input, errors, validator, __sym0);
+        __symbols.push((__start, __Symbol::Variant20(__nt), __end));
+        (1, 14)
+    }
+    pub(crate) fn __reduce40<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // FailBody = Error => ActionFn(141);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action141::<>(input, errors, validator, __sym0);
+        __symbols.push((__start, __Symbol::Variant20(__nt), __end));
+        (1, 14)
+    }
+    pub(crate) fn __reduce41<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // FoldScalarIterable = Scalar => ActionFn(39);
+        let __sym0 = __pop_Variant2(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action39::<>(input, errors, validator, __sym0);
+        __symbols.push((__start, __Symbol::Variant21(__nt), __end));
+        (1, 15)
+    }
+    pub(crate) fn __reduce42<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // FoldScalarIterable = ScalarWithLambda => ActionFn(40);
+        let __sym0 = __pop_Variant3(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action40::<>(input, errors, validator, __sym0);
+        __symbols.push((__start, __Symbol::Variant21(__nt), __end));
+        (1, 15)
+    }
+    pub(crate) fn __reduce43<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // FoldScalarIterable = CanonStream => ActionFn(41);
+        let __sym0 = __pop_Variant2(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action41::<>(input, errors, validator, __sym0);
+        __symbols.push((__start, __Symbol::Variant21(__nt), __end));
+        (1, 15)
+    }
+    pub(crate) fn __reduce44<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // FoldScalarIterable = CanonStreamMap => ActionFn(42);
+        let __sym0 = __pop_Variant2(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action42::<>(input, errors, validator, __sym0);
+        __symbols.push((__start, __Symbol::Variant21(__nt), __end));
+        (1, 15)
+    }
+    pub(crate) fn __reduce45<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // FoldScalarIterable = CanonStreamMapWithLambda => ActionFn(43);
+        let __sym0 = __pop_Variant3(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action43::<>(input, errors, validator, __sym0);
+        __symbols.push((__start, __Symbol::Variant21(__nt), __end));
+        (1, 15)
+    }
+    pub(crate) fn __reduce46<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // FoldScalarIterable = "[", "]" => ActionFn(44);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action44::<>(input, errors, validator, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant21(__nt), __end));
+        (2, 15)
+    }
+    pub(crate) fn __reduce47<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // Function = ResolvableToStringVariable => ActionFn(46);
+        let __sym0 = __pop_Variant22(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action46::<>(input, errors, validator, __sym0);
+        __symbols.push((__start, __Symbol::Variant22(__nt), __end));
+        (1, 16)
+    }
+    pub(crate) fn __reduce48<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // Instr = "(", call, Triplet, Args, CallOutput, ")" => ActionFn(161);
+        assert!(__symbols.len() >= 6);
+        let __sym5 = __pop_Variant0(__symbols);
+        let __sym4 = __pop_Variant16(__symbols);
+        let __sym3 = __pop_Variant15(__symbols);
+        let __sym2 = __pop_Variant30(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym5.2;
+        let __nt = super::__action161::<>(input, errors, validator, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5);
+        __symbols.push((__start, __Symbol::Variant12(__nt), __end));
+        (6, 17)
+    }
+    pub(crate) fn __reduce49<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // Instr = "(", call, Triplet, Args, ")" => ActionFn(162);
+        assert!(__symbols.len() >= 5);
+        let __sym4 = __pop_Variant0(__symbols);
+        let __sym3 = __pop_Variant15(__symbols);
+        let __sym2 = __pop_Variant30(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym4.2;
+        let __nt = super::__action162::<>(input, errors, validator, __sym0, __sym1, __sym2, __sym3, __sym4);
+        __symbols.push((__start, __Symbol::Variant12(__nt), __end));
+        (5, 17)
+    }
+    pub(crate) fn __reduce50<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // Instr = "(", canon, ResolvableToPeerIdVariable, StreamArgument, CanonStreamArgument, ")" => ActionFn(143);
+        assert!(__symbols.len() >= 6);
+        let __sym5 = __pop_Variant0(__symbols);
+        let __sym4 = __pop_Variant18(__symbols);
+        let __sym3 = __pop_Variant27(__symbols);
+        let __sym2 = __pop_Variant26(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym5.2;
+        let __nt = super::__action143::<>(input, errors, validator, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5);
+        __symbols.push((__start, __Symbol::Variant12(__nt), __end));
+        (6, 17)
+    }
+    pub(crate) fn __reduce51<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // Instr = "(", canon, ResolvableToPeerIdVariable, StreamMapArgument, CanonStreamMapArgument, ")" => ActionFn(144);
+        assert!(__symbols.len() >= 6);
+        let __sym5 = __pop_Variant0(__symbols);
+        let __sym4 = __pop_Variant19(__symbols);
+        let __sym3 = __pop_Variant28(__symbols);
+        let __sym2 = __pop_Variant26(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym5.2;
+        let __nt = super::__action144::<>(input, errors, validator, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5);
+        __symbols.push((__start, __Symbol::Variant12(__nt), __end));
+        (6, 17)
+    }
+    pub(crate) fn __reduce52<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // Instr = "(", canon, ResolvableToPeerIdVariable, StreamMapArgument, Scalar, ")" => ActionFn(145);
+        assert!(__symbols.len() >= 6);
+        let __sym5 = __pop_Variant0(__symbols);
+        let __sym4 = __pop_Variant2(__symbols);
+        let __sym3 = __pop_Variant28(__symbols);
+        let __sym2 = __pop_Variant26(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym5.2;
+        let __nt = super::__action145::<>(input, errors, validator, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5);
+        __symbols.push((__start, __Symbol::Variant12(__nt), __end));
+        (6, 17)
+    }
+    pub(crate) fn __reduce53<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // Instr = "(", ap, ApArgument, ApResult, ")" => ActionFn(146);
+        assert!(__symbols.len() >= 5);
+        let __sym4 = __pop_Variant0(__symbols);
+        let __sym3 = __pop_Variant14(__symbols);
+        let __sym2 = __pop_Variant13(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym4.2;
+        let __nt = super::__action146::<>(input, errors, validator, __sym0, __sym1, __sym2, __sym3, __sym4);
+        __symbols.push((__start, __Symbol::Variant12(__nt), __end));
+        (5, 17)
+    }
+    pub(crate) fn __reduce54<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // Instr = "(", ap, "(", StreamMapKeyClause, ApArgument, ")", StreamMap, ")" => ActionFn(147);
+        assert!(__symbols.len() >= 8);
+        let __sym7 = __pop_Variant0(__symbols);
+        let __sym6 = __pop_Variant2(__symbols);
+        let __sym5 = __pop_Variant0(__symbols);
+        let __sym4 = __pop_Variant13(__symbols);
+        let __sym3 = __pop_Variant29(__symbols);
+        let __sym2 = __pop_Variant0(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym7.2;
+        let __nt = super::__action147::<>(input, errors, validator, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7);
+        __symbols.push((__start, __Symbol::Variant12(__nt), __end));
+        (8, 17)
+    }
+    pub(crate) fn __reduce55<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // Instr = "(", seq, Instr, Instr, ")" => ActionFn(148);
+        assert!(__symbols.len() >= 5);
+        let __sym4 = __pop_Variant0(__symbols);
+        let __sym3 = __pop_Variant12(__symbols);
+        let __sym2 = __pop_Variant12(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym4.2;
+        let __nt = super::__action148::<>(input, errors, validator, __sym0, __sym1, __sym2, __sym3, __sym4);
+        __symbols.push((__start, __Symbol::Variant12(__nt), __end));
+        (5, 17)
+    }
+    pub(crate) fn __reduce56<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // Instr = "(", par, Instr, Instr, ")" => ActionFn(149);
+        assert!(__symbols.len() >= 5);
+        let __sym4 = __pop_Variant0(__symbols);
+        let __sym3 = __pop_Variant12(__symbols);
+        let __sym2 = __pop_Variant12(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym4.2;
+        let __nt = super::__action149::<>(input, errors, validator, __sym0, __sym1, __sym2, __sym3, __sym4);
+        __symbols.push((__start, __Symbol::Variant12(__nt), __end));
+        (5, 17)
+    }
+    pub(crate) fn __reduce57<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // Instr = "(", never, ")" => ActionFn(150);
+        assert!(__symbols.len() >= 3);
+        let __sym2 = __pop_Variant0(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym2.2;
+        let __nt = super::__action150::<>(input, errors, validator, __sym0, __sym1, __sym2);
+        __symbols.push((__start, __Symbol::Variant12(__nt), __end));
+        (3, 17)
+    }
+    pub(crate) fn __reduce58<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // Instr = "(", null, ")" => ActionFn(151);
+        assert!(__symbols.len() >= 3);
+        let __sym2 = __pop_Variant0(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym2.2;
+        let __nt = super::__action151::<>(input, errors, validator, __sym0, __sym1, __sym2);
+        __symbols.push((__start, __Symbol::Variant12(__nt), __end));
+        (3, 17)
+    }
+    pub(crate) fn __reduce59<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // Instr = "(", new, NewArgument, Instr, ")" => ActionFn(152);
+        assert!(__symbols.len() >= 5);
+        let __sym4 = __pop_Variant0(__symbols);
+        let __sym3 = __pop_Variant12(__symbols);
+        let __sym2 = __pop_Variant24(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym4.2;
+        let __nt = super::__action152::<>(input, errors, validator, __sym0, __sym1, __sym2, __sym3, __sym4);
+        __symbols.push((__start, __Symbol::Variant12(__nt), __end));
+        (5, 17)
+    }
+    pub(crate) fn __reduce60<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // Instr = "(", fail, FailBody, ")" => ActionFn(153);
+        assert!(__symbols.len() >= 4);
+        let __sym3 = __pop_Variant0(__symbols);
+        let __sym2 = __pop_Variant20(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym3.2;
+        let __nt = super::__action153::<>(input, errors, validator, __sym0, __sym1, __sym2, __sym3);
+        __symbols.push((__start, __Symbol::Variant12(__nt), __end));
+        (4, 17)
+    }
+    pub(crate) fn __reduce61<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // Instr = "(", fold, FoldScalarIterable, Scalar, Instr, Instr, ")" => ActionFn(163);
+        assert!(__symbols.len() >= 7);
+        let __sym6 = __pop_Variant0(__symbols);
+        let __sym5 = __pop_Variant12(__symbols);
+        let __sym4 = __pop_Variant12(__symbols);
+        let __sym3 = __pop_Variant2(__symbols);
+        let __sym2 = __pop_Variant21(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym6.2;
+        let __nt = super::__action163::<>(input, errors, validator, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6);
+        __symbols.push((__start, __Symbol::Variant12(__nt), __end));
+        (7, 17)
+    }
+    pub(crate) fn __reduce62<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // Instr = "(", fold, FoldScalarIterable, Scalar, Instr, ")" => ActionFn(164);
+        assert!(__symbols.len() >= 6);
+        let __sym5 = __pop_Variant0(__symbols);
+        let __sym4 = __pop_Variant12(__symbols);
+        let __sym3 = __pop_Variant2(__symbols);
+        let __sym2 = __pop_Variant21(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym5.2;
+        let __nt = super::__action164::<>(input, errors, validator, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5);
+        __symbols.push((__start, __Symbol::Variant12(__nt), __end));
+        (6, 17)
+    }
+    pub(crate) fn __reduce63<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // Instr = "(", fold, Stream, Scalar, Instr, Instr, ")" => ActionFn(165);
+        assert!(__symbols.len() >= 7);
+        let __sym6 = __pop_Variant0(__symbols);
+        let __sym5 = __pop_Variant12(__symbols);
+        let __sym4 = __pop_Variant12(__symbols);
+        let __sym3 = __pop_Variant2(__symbols);
+        let __sym2 = __pop_Variant2(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym6.2;
+        let __nt = super::__action165::<>(input, errors, validator, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6);
+        __symbols.push((__start, __Symbol::Variant12(__nt), __end));
+        (7, 17)
+    }
+    pub(crate) fn __reduce64<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // Instr = "(", fold, Stream, Scalar, Instr, ")" => ActionFn(166);
+        assert!(__symbols.len() >= 6);
+        let __sym5 = __pop_Variant0(__symbols);
+        let __sym4 = __pop_Variant12(__symbols);
+        let __sym3 = __pop_Variant2(__symbols);
+        let __sym2 = __pop_Variant2(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym5.2;
+        let __nt = super::__action166::<>(input, errors, validator, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5);
+        __symbols.push((__start, __Symbol::Variant12(__nt), __end));
+        (6, 17)
+    }
+    pub(crate) fn __reduce65<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // Instr = "(", fold, StreamMap, Scalar, Instr, Instr, ")" => ActionFn(167);
+        assert!(__symbols.len() >= 7);
+        let __sym6 = __pop_Variant0(__symbols);
+        let __sym5 = __pop_Variant12(__symbols);
+        let __sym4 = __pop_Variant12(__symbols);
+        let __sym3 = __pop_Variant2(__symbols);
+        let __sym2 = __pop_Variant2(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym6.2;
+        let __nt = super::__action167::<>(input, errors, validator, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6);
+        __symbols.push((__start, __Symbol::Variant12(__nt), __end));
+        (7, 17)
+    }
+    pub(crate) fn __reduce66<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // Instr = "(", fold, StreamMap, Scalar, Instr, ")" => ActionFn(168);
+        assert!(__symbols.len() >= 6);
+        let __sym5 = __pop_Variant0(__symbols);
+        let __sym4 = __pop_Variant12(__symbols);
+        let __sym3 = __pop_Variant2(__symbols);
+        let __sym2 = __pop_Variant2(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym5.2;
+        let __nt = super::__action168::<>(input, errors, validator, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5);
+        __symbols.push((__start, __Symbol::Variant12(__nt), __end));
+        (6, 17)
+    }
+    pub(crate) fn __reduce67<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // Instr = "(", next, Scalar, ")" => ActionFn(157);
+        assert!(__symbols.len() >= 4);
+        let __sym3 = __pop_Variant0(__symbols);
+        let __sym2 = __pop_Variant2(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym3.2;
+        let __nt = super::__action157::<>(input, errors, validator, __sym0, __sym1, __sym2, __sym3);
+        __symbols.push((__start, __Symbol::Variant12(__nt), __end));
+        (4, 17)
+    }
+    pub(crate) fn __reduce68<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // Instr = "(", xor, Instr, Instr, ")" => ActionFn(158);
+        assert!(__symbols.len() >= 5);
+        let __sym4 = __pop_Variant0(__symbols);
+        let __sym3 = __pop_Variant12(__symbols);
+        let __sym2 = __pop_Variant12(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym4.2;
+        let __nt = super::__action158::<>(input, errors, validator, __sym0, __sym1, __sym2, __sym3, __sym4);
+        __symbols.push((__start, __Symbol::Variant12(__nt), __end));
+        (5, 17)
+    }
+    pub(crate) fn __reduce69<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // Instr = "(", match_, Value, Value, Instr, ")" => ActionFn(159);
+        assert!(__symbols.len() >= 6);
+        let __sym5 = __pop_Variant0(__symbols);
+        let __sym4 = __pop_Variant12(__symbols);
+        let __sym3 = __pop_Variant9(__symbols);
+        let __sym2 = __pop_Variant9(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym5.2;
+        let __nt = super::__action159::<>(input, errors, validator, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5);
+        __symbols.push((__start, __Symbol::Variant12(__nt), __end));
+        (6, 17)
+    }
+    pub(crate) fn __reduce70<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // Instr = "(", mismatch, Value, Value, Instr, ")" => ActionFn(160);
+        assert!(__symbols.len() >= 6);
+        let __sym5 = __pop_Variant0(__symbols);
+        let __sym4 = __pop_Variant12(__symbols);
+        let __sym3 = __pop_Variant9(__symbols);
+        let __sym2 = __pop_Variant9(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym5.2;
+        let __nt = super::__action160::<>(input, errors, validator, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5);
+        __symbols.push((__start, __Symbol::Variant12(__nt), __end));
+        (6, 17)
+    }
+    pub(crate) fn __reduce71<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // Instr = error => ActionFn(21);
+        let __sym0 = __pop_Variant8(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action21::<>(input, errors, validator, __sym0);
+        __symbols.push((__start, __Symbol::Variant12(__nt), __end));
+        (1, 17)
+    }
+    pub(crate) fn __reduce72<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // Instr? = Instr => ActionFn(107);
+        let __sym0 = __pop_Variant12(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action107::<>(input, errors, validator, __sym0);
+        __symbols.push((__start, __Symbol::Variant23(__nt), __end));
+        (1, 18)
+    }
+    pub(crate) fn __reduce73<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // Instr? =  => ActionFn(108);
+        let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default();
+        let __end = __start.clone();
+        let __nt = super::__action108::<>(input, errors, validator, &__start, &__end);
+        __symbols.push((__start, __Symbol::Variant23(__nt), __end));
+        (0, 18)
+    }
+    pub(crate) fn __reduce74<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // NewArgument = Scalar => ActionFn(59);
+        let __sym0 = __pop_Variant2(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action59::<>(input, errors, validator, __sym0);
+        __symbols.push((__start, __Symbol::Variant24(__nt), __end));
+        (1, 19)
+    }
+    pub(crate) fn __reduce75<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // NewArgument = Stream => ActionFn(60);
+        let __sym0 = __pop_Variant2(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action60::<>(input, errors, validator, __sym0);
+        __symbols.push((__start, __Symbol::Variant24(__nt), __end));
+        (1, 19)
+    }
+    pub(crate) fn __reduce76<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // NewArgument = StreamMap => ActionFn(61);
+        let __sym0 = __pop_Variant2(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action61::<>(input, errors, validator, __sym0);
+        __symbols.push((__start, __Symbol::Variant24(__nt), __end));
+        (1, 19)
+    }
+    pub(crate) fn __reduce77<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // NewArgument = CanonStream => ActionFn(62);
+        let __sym0 = __pop_Variant2(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action62::<>(input, errors, validator, __sym0);
+        __symbols.push((__start, __Symbol::Variant24(__nt), __end));
+        (1, 19)
+    }
+    pub(crate) fn __reduce78<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // NewArgument = CanonStreamMap => ActionFn(63);
+        let __sym0 = __pop_Variant2(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action63::<>(input, errors, validator, __sym0);
+        __symbols.push((__start, __Symbol::Variant24(__nt), __end));
+        (1, 19)
+    }
+    pub(crate) fn __reduce79<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // Number = I64 => ActionFn(64);
+        let __sym0 = __pop_Variant6(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action64::<>(input, errors, validator, __sym0);
+        __symbols.push((__start, __Symbol::Variant25(__nt), __end));
+        (1, 20)
+    }
+    pub(crate) fn __reduce80<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // Number = F64 => ActionFn(65);
+        let __sym0 = __pop_Variant5(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action65::<>(input, errors, validator, __sym0);
+        __symbols.push((__start, __Symbol::Variant25(__nt), __end));
+        (1, 20)
+    }
+    pub(crate) fn __reduce81<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // PeerId = ResolvableToPeerIdVariable => ActionFn(45);
+        let __sym0 = __pop_Variant26(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action45::<>(input, errors, validator, __sym0);
+        __symbols.push((__start, __Symbol::Variant26(__nt), __end));
+        (1, 21)
+    }
+    pub(crate) fn __reduce82<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // ResolvableToPeerIdVariable = InitPeerId => ActionFn(48);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action48::<>(input, errors, validator, __sym0);
+        __symbols.push((__start, __Symbol::Variant26(__nt), __end));
+        (1, 22)
+    }
+    pub(crate) fn __reduce83<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // ResolvableToPeerIdVariable = Literal => ActionFn(49);
+        let __sym0 = __pop_Variant7(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action49::<>(input, errors, validator, __sym0);
+        __symbols.push((__start, __Symbol::Variant26(__nt), __end));
+        (1, 22)
+    }
+    pub(crate) fn __reduce84<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // ResolvableToPeerIdVariable = Scalar => ActionFn(50);
+        let __sym0 = __pop_Variant2(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action50::<>(input, errors, validator, __sym0);
+        __symbols.push((__start, __Symbol::Variant26(__nt), __end));
+        (1, 22)
+    }
+    pub(crate) fn __reduce85<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // ResolvableToPeerIdVariable = ScalarWithLambda => ActionFn(51);
+        let __sym0 = __pop_Variant3(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action51::<>(input, errors, validator, __sym0);
+        __symbols.push((__start, __Symbol::Variant26(__nt), __end));
+        (1, 22)
+    }
+    pub(crate) fn __reduce86<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // ResolvableToPeerIdVariable = CanonStreamWithLambda => ActionFn(52);
+        let __sym0 = __pop_Variant3(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action52::<>(input, errors, validator, __sym0);
+        __symbols.push((__start, __Symbol::Variant26(__nt), __end));
+        (1, 22)
+    }
+    pub(crate) fn __reduce87<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // ResolvableToPeerIdVariable = CanonStreamMapWithLambda => ActionFn(53);
+        let __sym0 = __pop_Variant3(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action53::<>(input, errors, validator, __sym0);
+        __symbols.push((__start, __Symbol::Variant26(__nt), __end));
+        (1, 22)
+    }
+    pub(crate) fn __reduce88<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // ResolvableToStringVariable = Literal => ActionFn(54);
+        let __sym0 = __pop_Variant7(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action54::<>(input, errors, validator, __sym0);
+        __symbols.push((__start, __Symbol::Variant22(__nt), __end));
+        (1, 23)
+    }
+    pub(crate) fn __reduce89<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // ResolvableToStringVariable = Scalar => ActionFn(55);
+        let __sym0 = __pop_Variant2(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action55::<>(input, errors, validator, __sym0);
+        __symbols.push((__start, __Symbol::Variant22(__nt), __end));
+        (1, 23)
+    }
+    pub(crate) fn __reduce90<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // ResolvableToStringVariable = ScalarWithLambda => ActionFn(56);
+        let __sym0 = __pop_Variant3(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action56::<>(input, errors, validator, __sym0);
+        __symbols.push((__start, __Symbol::Variant22(__nt), __end));
+        (1, 23)
+    }
+    pub(crate) fn __reduce91<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // ResolvableToStringVariable = CanonStreamWithLambda => ActionFn(57);
+        let __sym0 = __pop_Variant3(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action57::<>(input, errors, validator, __sym0);
+        __symbols.push((__start, __Symbol::Variant22(__nt), __end));
+        (1, 23)
+    }
+    pub(crate) fn __reduce92<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // ResolvableToStringVariable = CanonStreamMapWithLambda => ActionFn(58);
+        let __sym0 = __pop_Variant3(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action58::<>(input, errors, validator, __sym0);
+        __symbols.push((__start, __Symbol::Variant22(__nt), __end));
+        (1, 23)
+    }
+    pub(crate) fn __reduce93<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // ServiceId = ResolvableToStringVariable => ActionFn(47);
+        let __sym0 = __pop_Variant22(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action47::<>(input, errors, validator, __sym0);
+        __symbols.push((__start, __Symbol::Variant22(__nt), __end));
+        (1, 24)
+    }
+    pub(crate) fn __reduce94<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // StreamArgument = Stream => ActionFn(100);
+        let __sym0 = __pop_Variant2(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action100::<>(input, errors, validator, __sym0);
+        __symbols.push((__start, __Symbol::Variant27(__nt), __end));
+        (1, 25)
+    }
+    pub(crate) fn __reduce95<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // StreamMapArgument = StreamMap => ActionFn(101);
+        let __sym0 = __pop_Variant2(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action101::<>(input, errors, validator, __sym0);
+        __symbols.push((__start, __Symbol::Variant28(__nt), __end));
+        (1, 26)
+    }
+    pub(crate) fn __reduce96<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // StreamMapKeyClause = Literal => ActionFn(26);
+        let __sym0 = __pop_Variant7(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action26::<>(input, errors, validator, __sym0);
+        __symbols.push((__start, __Symbol::Variant29(__nt), __end));
+        (1, 27)
+    }
+    pub(crate) fn __reduce97<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // StreamMapKeyClause = I64 => ActionFn(27);
+        let __sym0 = __pop_Variant6(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action27::<>(input, errors, validator, __sym0);
+        __symbols.push((__start, __Symbol::Variant29(__nt), __end));
+        (1, 27)
+    }
+    pub(crate) fn __reduce98<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // StreamMapKeyClause = Scalar => ActionFn(28);
+        let __sym0 = __pop_Variant2(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action28::<>(input, errors, validator, __sym0);
+        __symbols.push((__start, __Symbol::Variant29(__nt), __end));
+        (1, 27)
+    }
+    pub(crate) fn __reduce99<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // StreamMapKeyClause = ScalarWithLambda => ActionFn(29);
+        let __sym0 = __pop_Variant3(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action29::<>(input, errors, validator, __sym0);
+        __symbols.push((__start, __Symbol::Variant29(__nt), __end));
+        (1, 27)
+    }
+    pub(crate) fn __reduce100<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // StreamMapKeyClause = CanonStreamWithLambda => ActionFn(30);
+        let __sym0 = __pop_Variant3(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action30::<>(input, errors, validator, __sym0);
+        __symbols.push((__start, __Symbol::Variant29(__nt), __end));
+        (1, 27)
+    }
+    pub(crate) fn __reduce101<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // Triplet = PeerId, "(", ServiceId, Function, ")" => ActionFn(23);
+        assert!(__symbols.len() >= 5);
+        let __sym4 = __pop_Variant0(__symbols);
+        let __sym3 = __pop_Variant22(__symbols);
+        let __sym2 = __pop_Variant22(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant26(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym4.2;
+        let __nt = super::__action23::<>(input, errors, validator, __sym0, __sym1, __sym2, __sym3, __sym4);
+        __symbols.push((__start, __Symbol::Variant30(__nt), __end));
+        (5, 28)
+    }
+    pub(crate) fn __reduce102<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // Value = InitPeerId => ActionFn(67);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action67::<>(input, errors, validator, __sym0);
+        __symbols.push((__start, __Symbol::Variant9(__nt), __end));
+        (1, 29)
+    }
+    pub(crate) fn __reduce103<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // Value = LastError => ActionFn(68);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action68::<>(input, errors, validator, __sym0);
+        __symbols.push((__start, __Symbol::Variant9(__nt), __end));
+        (1, 29)
+    }
+    pub(crate) fn __reduce104<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // Value = LastErrorWithLambda => ActionFn(69);
+        let __sym0 = __pop_Variant4(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action69::<>(input, errors, validator, __sym0);
+        __symbols.push((__start, __Symbol::Variant9(__nt), __end));
+        (1, 29)
+    }
+    pub(crate) fn __reduce105<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // Value = Error => ActionFn(70);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action70::<>(input, errors, validator, __sym0);
+        __symbols.push((__start, __Symbol::Variant9(__nt), __end));
+        (1, 29)
+    }
+    pub(crate) fn __reduce106<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // Value = ErrorWithLambda => ActionFn(71);
+        let __sym0 = __pop_Variant4(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action71::<>(input, errors, validator, __sym0);
+        __symbols.push((__start, __Symbol::Variant9(__nt), __end));
+        (1, 29)
+    }
+    pub(crate) fn __reduce107<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // Value = Literal => ActionFn(72);
+        let __sym0 = __pop_Variant7(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action72::<>(input, errors, validator, __sym0);
+        __symbols.push((__start, __Symbol::Variant9(__nt), __end));
+        (1, 29)
+    }
+    pub(crate) fn __reduce108<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // Value = Timestamp => ActionFn(73);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action73::<>(input, errors, validator, __sym0);
+        __symbols.push((__start, __Symbol::Variant9(__nt), __end));
+        (1, 29)
+    }
+    pub(crate) fn __reduce109<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // Value = TTL => ActionFn(74);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action74::<>(input, errors, validator, __sym0);
+        __symbols.push((__start, __Symbol::Variant9(__nt), __end));
+        (1, 29)
+    }
+    pub(crate) fn __reduce110<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // Value = Number => ActionFn(75);
+        let __sym0 = __pop_Variant25(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action75::<>(input, errors, validator, __sym0);
+        __symbols.push((__start, __Symbol::Variant9(__nt), __end));
+        (1, 29)
+    }
+    pub(crate) fn __reduce111<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // Value = Boolean => ActionFn(76);
+        let __sym0 = __pop_Variant1(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action76::<>(input, errors, validator, __sym0);
+        __symbols.push((__start, __Symbol::Variant9(__nt), __end));
+        (1, 29)
+    }
+    pub(crate) fn __reduce112<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // Value = "[", "]" => ActionFn(77);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action77::<>(input, errors, validator, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant9(__nt), __end));
+        (2, 29)
+    }
+    pub(crate) fn __reduce113<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // Value = Scalar => ActionFn(78);
+        let __sym0 = __pop_Variant2(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action78::<>(input, errors, validator, __sym0);
+        __symbols.push((__start, __Symbol::Variant9(__nt), __end));
+        (1, 29)
+    }
+    pub(crate) fn __reduce114<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // Value = ScalarWithLambda => ActionFn(79);
+        let __sym0 = __pop_Variant3(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action79::<>(input, errors, validator, __sym0);
+        __symbols.push((__start, __Symbol::Variant9(__nt), __end));
+        (1, 29)
+    }
+    pub(crate) fn __reduce115<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // Value = CanonStream => ActionFn(80);
+        let __sym0 = __pop_Variant2(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action80::<>(input, errors, validator, __sym0);
+        __symbols.push((__start, __Symbol::Variant9(__nt), __end));
+        (1, 29)
+    }
+    pub(crate) fn __reduce116<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // Value = CanonStreamWithLambda => ActionFn(81);
+        let __sym0 = __pop_Variant3(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action81::<>(input, errors, validator, __sym0);
+        __symbols.push((__start, __Symbol::Variant9(__nt), __end));
+        (1, 29)
+    }
+    pub(crate) fn __reduce117<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // Value = CanonStreamMap => ActionFn(82);
+        let __sym0 = __pop_Variant2(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action82::<>(input, errors, validator, __sym0);
+        __symbols.push((__start, __Symbol::Variant9(__nt), __end));
+        (1, 29)
+    }
+    pub(crate) fn __reduce118<
+        'err,
+        'input,
+        'v,
+    >(
+        input: &'input str,
+        errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+        validator: &'v mut VariableValidator<'input>,
+        __lookahead_start: Option<&AirPos>,
+        __symbols: &mut alloc::vec::Vec<(AirPos,__Symbol<'input>,AirPos)>,
+        _: core::marker::PhantomData<(&'err (), &'input (), &'v ())>,
+    ) -> (usize, usize)
+    {
+        // Value = CanonStreamMapWithLambda => ActionFn(83);
+        let __sym0 = __pop_Variant3(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action83::<>(input, errors, validator, __sym0);
+        __symbols.push((__start, __Symbol::Variant9(__nt), __end));
+        (1, 29)
+    }
+}
+pub use self::__parse__AIR::AIRParser;
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action0<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, __0, _): (AirPos, Instruction<'input>, AirPos),
+) -> Instruction<'input>
+{
+    __0
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action1<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, __0, _): (AirPos, Instruction<'input>, AirPos),
+) -> Instruction<'input>
+{
+    __0
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action2<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, left, _): (AirPos, AirPos, AirPos),
+    (_, _, _): (AirPos, Token<'input>, AirPos),
+    (_, _, _): (AirPos, Token<'input>, AirPos),
+    (_, triplet, _): (AirPos, Triplet<'input>, AirPos),
+    (_, args, _): (AirPos, Vec<ImmutableValue<'input>>, AirPos),
+    (_, output, _): (AirPos, core::option::Option<CallOutputValue<'input>>, AirPos),
+    (_, _, _): (AirPos, Token<'input>, AirPos),
+    (_, right, _): (AirPos, AirPos, AirPos),
+) -> Instruction<'input>
+{
+    {
+        let args = Rc::new(args);
+        let output = output.unwrap_or(CallOutputValue::None);
+        let call = Call::new(triplet, args, output);
+        let span = Span::new(left, right);
+
+        validator.met_call(&call, span);
+
+        Instruction::Call(call.into())
+    }
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action3<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, left, _): (AirPos, AirPos, AirPos),
+    (_, _, _): (AirPos, Token<'input>, AirPos),
+    (_, _, _): (AirPos, Token<'input>, AirPos),
+    (_, peer_id, _): (AirPos, ResolvableToPeerIdVariable<'input>, AirPos),
+    (_, stream, _): (AirPos, Stream<'input>, AirPos),
+    (_, canon_stream, _): (AirPos, CanonStream<'input>, AirPos),
+    (_, _, _): (AirPos, Token<'input>, AirPos),
+    (_, right, _): (AirPos, AirPos, AirPos),
+) -> Instruction<'input>
+{
+    {
+        let canon = Canon::new(peer_id, stream, canon_stream);
+
+        let span = Span::new(left, right);
+        validator.met_canon(&canon, span);
+
+        Instruction::Canon(canon.into())
+    }
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action4<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, left, _): (AirPos, AirPos, AirPos),
+    (_, _, _): (AirPos, Token<'input>, AirPos),
+    (_, _, _): (AirPos, Token<'input>, AirPos),
+    (_, peer_id, _): (AirPos, ResolvableToPeerIdVariable<'input>, AirPos),
+    (_, stream_map, _): (AirPos, StreamMap<'input>, AirPos),
+    (_, canon_stream_map, _): (AirPos, CanonStreamMap<'input>, AirPos),
+    (_, _, _): (AirPos, Token<'input>, AirPos),
+    (_, right, _): (AirPos, AirPos, AirPos),
+) -> Instruction<'input>
+{
+    {
+        let canon_map = CanonMap::new(peer_id, stream_map, canon_stream_map);
+
+        let span = Span::new(left, right);
+        validator.met_canon_map(&canon_map, span);
+
+        Instruction::CanonMap(canon_map.into())
+    }
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action5<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, left, _): (AirPos, AirPos, AirPos),
+    (_, _, _): (AirPos, Token<'input>, AirPos),
+    (_, _, _): (AirPos, Token<'input>, AirPos),
+    (_, peer_id, _): (AirPos, ResolvableToPeerIdVariable<'input>, AirPos),
+    (_, stream_map, _): (AirPos, StreamMap<'input>, AirPos),
+    (_, scalar_pair, _): (AirPos, (&'input str, AirPos), AirPos),
+    (_, _, _): (AirPos, Token<'input>, AirPos),
+    (_, right, _): (AirPos, AirPos, AirPos),
+) -> Instruction<'input>
+{
+    {
+        let scalar = Scalar::new(scalar_pair.0, scalar_pair.1);
+        let canon = CanonStreamMapScalar::new(peer_id, stream_map, scalar);
+
+        let span = Span::new(left, right);
+        validator.met_canon_map_scalar(&canon, span);
+
+        Instruction::CanonStreamMapScalar(canon.into())
+    }
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action6<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, left, _): (AirPos, AirPos, AirPos),
+    (_, _, _): (AirPos, Token<'input>, AirPos),
+    (_, _, _): (AirPos, Token<'input>, AirPos),
+    (_, arg, _): (AirPos, ApArgument<'input>, AirPos),
+    (_, result, _): (AirPos, ApResult<'input>, AirPos),
+    (_, _, _): (AirPos, Token<'input>, AirPos),
+    (_, right, _): (AirPos, AirPos, AirPos),
+) -> Instruction<'input>
+{
+    {
+        let apply = Ap::new(arg, result);
+
+        let span = Span::new(left, right);
+        validator.met_ap(&apply, span);
+
+        Instruction::Ap(apply.into())
+    }
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action7<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, left, _): (AirPos, AirPos, AirPos),
+    (_, _, _): (AirPos, Token<'input>, AirPos),
+    (_, _, _): (AirPos, Token<'input>, AirPos),
+    (_, _, _): (AirPos, Token<'input>, AirPos),
+    (_, key, _): (AirPos, StreamMapKeyClause<'input>, AirPos),
+    (_, value, _): (AirPos, ApArgument<'input>, AirPos),
+    (_, _, _): (AirPos, Token<'input>, AirPos),
+    (_, map, _): (AirPos, (&'input str, AirPos), AirPos),
+    (_, _, _): (AirPos, Token<'input>, AirPos),
+    (_, right, _): (AirPos, AirPos, AirPos),
+) -> Instruction<'input>
+{
+    {
+        let map = StreamMap::new(map.0, map.1);
+        let apply = ApMap::new(key, value, map);
+
+        let span = Span::new(left, right);
+        validator.met_ap_map(&apply, span);
+
+        Instruction::ApMap(apply.into())
+    }
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action8<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, left, _): (AirPos, AirPos, AirPos),
+    (_, _, _): (AirPos, Token<'input>, AirPos),
+    (_, _, _): (AirPos, Token<'input>, AirPos),
+    (_, l, _): (AirPos, Instruction<'input>, AirPos),
+    (_, r, _): (AirPos, Instruction<'input>, AirPos),
+    (_, _, _): (AirPos, Token<'input>, AirPos),
+    (_, right, _): (AirPos, AirPos, AirPos),
+) -> Instruction<'input>
+{
+    {
+        let span = Span::new(left, right);
+        validator.met_merging_instr(span);
+
+        Instruction::Seq(Seq::new(l, r).into())
+    }
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action9<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, left, _): (AirPos, AirPos, AirPos),
+    (_, _, _): (AirPos, Token<'input>, AirPos),
+    (_, _, _): (AirPos, Token<'input>, AirPos),
+    (_, l, _): (AirPos, Instruction<'input>, AirPos),
+    (_, r, _): (AirPos, Instruction<'input>, AirPos),
+    (_, _, _): (AirPos, Token<'input>, AirPos),
+    (_, right, _): (AirPos, AirPos, AirPos),
+) -> Instruction<'input>
+{
+    {
+        let span = Span::new(left, right);
+        validator.met_merging_instr(span);
+
+        Instruction::Par(Par::new(l, r).into())
+    }
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action10<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, left, _): (AirPos, AirPos, AirPos),
+    (_, _, _): (AirPos, Token<'input>, AirPos),
+    (_, _, _): (AirPos, Token<'input>, AirPos),
+    (_, _, _): (AirPos, Token<'input>, AirPos),
+    (_, right, _): (AirPos, AirPos, AirPos),
+) -> Instruction<'input>
+{
+    {
+        let span = Span::new(left, right);
+        validator.met_simple_instr(span);
+
+        Instruction::Never(Never)
+    }
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action11<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, left, _): (AirPos, AirPos, AirPos),
+    (_, _, _): (AirPos, Token<'input>, AirPos),
+    (_, _, _): (AirPos, Token<'input>, AirPos),
+    (_, _, _): (AirPos, Token<'input>, AirPos),
+    (_, right, _): (AirPos, AirPos, AirPos),
+) -> Instruction<'input>
+{
+    {
+        let span = Span::new(left, right);
+        validator.met_simple_instr(span);
+
+        Instruction::Null(Null)
+    }
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action12<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, left, _): (AirPos, AirPos, AirPos),
+    (_, _, _): (AirPos, Token<'input>, AirPos),
+    (_, _, _): (AirPos, Token<'input>, AirPos),
+    (_, argument, _): (AirPos, NewArgument<'input>, AirPos),
+    (_, instruction, _): (AirPos, Instruction<'input>, AirPos),
+    (_, _, _): (AirPos, Token<'input>, AirPos),
+    (_, right, _): (AirPos, AirPos, AirPos),
+) -> Instruction<'input>
+{
+    {
+        let span = Span::new(left, right);
+        let new = New::new(argument, instruction, span);
+
+        validator.met_new(&new, span);
+
+        Instruction::New(new.into())
+    }
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action13<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, left, _): (AirPos, AirPos, AirPos),
+    (_, _, _): (AirPos, Token<'input>, AirPos),
+    (_, _, _): (AirPos, Token<'input>, AirPos),
+    (_, fail_body, _): (AirPos, Fail<'input>, AirPos),
+    (_, _, _): (AirPos, Token<'input>, AirPos),
+    (_, right, _): (AirPos, AirPos, AirPos),
+) -> Instruction<'input>
+{
+    {
+        let span = Span::new(left, right);
+        validator.met_fail_literal(&fail_body, span);
+
+        Instruction::Fail(fail_body.into())
+    }
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action14<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, left, _): (AirPos, AirPos, AirPos),
+    (_, _, _): (AirPos, Token<'input>, AirPos),
+    (_, _, _): (AirPos, Token<'input>, AirPos),
+    (_, iterable, _): (AirPos, FoldScalarIterable<'input>, AirPos),
+    (_, iterator, _): (AirPos, (&'input str, AirPos), AirPos),
+    (_, instruction, _): (AirPos, Instruction<'input>, AirPos),
+    (_, last_instruction, _): (AirPos, core::option::Option<Instruction<'input>>, AirPos),
+    (_, _, _): (AirPos, Token<'input>, AirPos),
+    (_, right, _): (AirPos, AirPos, AirPos),
+) -> Instruction<'input>
+{
+    {
+        let iterator = Scalar::new(iterator.0, iterator.1);
+        let span = Span::new(left, right);
+        let fold = FoldScalar::new(iterable, iterator, instruction, last_instruction, span);
+
+        validator.met_fold_scalar(&fold, span);
+
+        Instruction::FoldScalar(fold.into())
+    }
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action15<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, left, _): (AirPos, AirPos, AirPos),
+    (_, _, _): (AirPos, Token<'input>, AirPos),
+    (_, _, _): (AirPos, Token<'input>, AirPos),
+    (_, stream, _): (AirPos, (&'input str, AirPos), AirPos),
+    (_, iterator, _): (AirPos, (&'input str, AirPos), AirPos),
+    (_, instruction, _): (AirPos, Instruction<'input>, AirPos),
+    (_, last_instruction, _): (AirPos, core::option::Option<Instruction<'input>>, AirPos),
+    (_, _, _): (AirPos, Token<'input>, AirPos),
+    (_, right, _): (AirPos, AirPos, AirPos),
+) -> Instruction<'input>
+{
+    {
+        let iterable = Stream::new(stream.0, stream.1);
+        let iterator = Scalar::new(iterator.0, iterator.1);
+        let span = Span::new(left, right);
+        let fold = FoldStream::new(iterable, iterator, instruction, last_instruction, span);
+
+        validator.meet_fold_stream(&fold, span);
+
+        Instruction::FoldStream(fold.into())
+    }
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action16<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, left, _): (AirPos, AirPos, AirPos),
+    (_, _, _): (AirPos, Token<'input>, AirPos),
+    (_, _, _): (AirPos, Token<'input>, AirPos),
+    (_, stream_map, _): (AirPos, (&'input str, AirPos), AirPos),
+    (_, iterator, _): (AirPos, (&'input str, AirPos), AirPos),
+    (_, instruction, _): (AirPos, Instruction<'input>, AirPos),
+    (_, last_instruction, _): (AirPos, core::option::Option<Instruction<'input>>, AirPos),
+    (_, _, _): (AirPos, Token<'input>, AirPos),
+    (_, right, _): (AirPos, AirPos, AirPos),
+) -> Instruction<'input>
+{
+    {
+        let iterator = Scalar::new(iterator.0, iterator.1);
+        let span = Span::new(left, right);
+        let iterable = StreamMap::new(stream_map.0, stream_map.1);
+        let fold = FoldStreamMap::new(iterable, iterator, instruction, last_instruction, span);
+        validator.meet_fold_stream_map(&fold, span);
+        Instruction::FoldStreamMap(fold.into())
+    }
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action17<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, left, _): (AirPos, AirPos, AirPos),
+    (_, _, _): (AirPos, Token<'input>, AirPos),
+    (_, _, _): (AirPos, Token<'input>, AirPos),
+    (_, iterator, _): (AirPos, (&'input str, AirPos), AirPos),
+    (_, _, _): (AirPos, Token<'input>, AirPos),
+    (_, right, _): (AirPos, AirPos, AirPos),
+) -> Instruction<'input>
+{
+    {
+        let iterator = Scalar::new(iterator.0, iterator.1);
+        let next = Next::new(iterator);
+        let span = Span::new(left, right);
+        validator.met_next(&next, span);
+
+        Instruction::Next(next.into())
+    }
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action18<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, left, _): (AirPos, AirPos, AirPos),
+    (_, _, _): (AirPos, Token<'input>, AirPos),
+    (_, _, _): (AirPos, Token<'input>, AirPos),
+    (_, l, _): (AirPos, Instruction<'input>, AirPos),
+    (_, r, _): (AirPos, Instruction<'input>, AirPos),
+    (_, _, _): (AirPos, Token<'input>, AirPos),
+    (_, right, _): (AirPos, AirPos, AirPos),
+) -> Instruction<'input>
+{
+    {
+        let span = Span::new(left, right);
+        validator.met_xoring_instr(span);
+
+        Instruction::Xor(Xor(l, r).into())
+    }
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action19<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, left, _): (AirPos, AirPos, AirPos),
+    (_, _, _): (AirPos, Token<'input>, AirPos),
+    (_, _, _): (AirPos, Token<'input>, AirPos),
+    (_, l, _): (AirPos, ImmutableValue<'input>, AirPos),
+    (_, r, _): (AirPos, ImmutableValue<'input>, AirPos),
+    (_, i, _): (AirPos, Instruction<'input>, AirPos),
+    (_, _, _): (AirPos, Token<'input>, AirPos),
+    (_, right, _): (AirPos, AirPos, AirPos),
+) -> Instruction<'input>
+{
+    {
+        let match_ = Match::new(l, r, i);
+        let span = Span::new(left, right);
+        validator.met_match(&match_, span);
+
+        Instruction::Match(match_.into())
+    }
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action20<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, left, _): (AirPos, AirPos, AirPos),
+    (_, _, _): (AirPos, Token<'input>, AirPos),
+    (_, _, _): (AirPos, Token<'input>, AirPos),
+    (_, l, _): (AirPos, ImmutableValue<'input>, AirPos),
+    (_, r, _): (AirPos, ImmutableValue<'input>, AirPos),
+    (_, i, _): (AirPos, Instruction<'input>, AirPos),
+    (_, _, _): (AirPos, Token<'input>, AirPos),
+    (_, right, _): (AirPos, AirPos, AirPos),
+) -> Instruction<'input>
+{
+    {
+        let mismatch = MisMatch::new(l, r, i);
+        let span = Span::new(left, right);
+        validator.met_mismatch(&mismatch, span);
+
+        Instruction::MisMatch(mismatch.into())
+     }
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action21<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, __0, _): (AirPos, __lalrpop_util::ErrorRecovery<AirPos, Token<'input>, ParserError>, AirPos),
+) -> Instruction<'input>
+{
+    { errors.push(__0); Instruction::Error }
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action22<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, _, _): (AirPos, Token<'input>, AirPos),
+    (_, args, _): (AirPos, alloc::vec::Vec<ImmutableValue<'input>>, AirPos),
+    (_, _, _): (AirPos, Token<'input>, AirPos),
+) -> Vec<ImmutableValue<'input>>
+{
+    args
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action23<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, peer_id, _): (AirPos, ResolvableToPeerIdVariable<'input>, AirPos),
+    (_, _, _): (AirPos, Token<'input>, AirPos),
+    (_, service_id, _): (AirPos, ResolvableToStringVariable<'input>, AirPos),
+    (_, function_name, _): (AirPos, ResolvableToStringVariable<'input>, AirPos),
+    (_, _, _): (AirPos, Token<'input>, AirPos),
+) -> Triplet<'input>
+{
+    Triplet {
+        peer_id,
+        service_id,
+        function_name
+    }
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action24<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, scalar, _): (AirPos, (&'input str, AirPos), AirPos),
+) -> ApResult<'input>
+{
+    ApResult::scalar(scalar.0, scalar.1)
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action25<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, stream, _): (AirPos, (&'input str, AirPos), AirPos),
+) -> ApResult<'input>
+{
+    ApResult::stream(stream.0, stream.1)
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action26<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, l, _): (AirPos, &'input str, AirPos),
+) -> StreamMapKeyClause<'input>
+{
+    StreamMapKeyClause::Literal(l.into())
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action27<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, integer, _): (AirPos, i64, AirPos),
+) -> StreamMapKeyClause<'input>
+{
+    StreamMapKeyClause::Int(integer)
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action28<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, scalar, _): (AirPos, (&'input str, AirPos), AirPos),
+) -> StreamMapKeyClause<'input>
+{
+    StreamMapKeyClause::Scalar(Scalar::new(scalar.0, scalar.1))
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action29<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, scalar, _): (AirPos, (&'input str, LambdaAST<'input>, AirPos), AirPos),
+) -> StreamMapKeyClause<'input>
+{
+    StreamMapKeyClause::ScalarWithLambda(ScalarWithLambda::new(scalar.0, scalar.1, scalar.2))
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action30<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, canon_stream, _): (AirPos, (&'input str, LambdaAST<'input>, AirPos), AirPos),
+) -> StreamMapKeyClause<'input>
+{
+    StreamMapKeyClause::CanonStreamWithLambda(CanonStreamWithLambda::new(canon_stream.0, canon_stream.1, canon_stream.2))
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action31<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, scalar, _): (AirPos, (&'input str, AirPos), AirPos),
+) -> CallOutputValue<'input>
+{
+    CallOutputValue::scalar(scalar.0, scalar.1)
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action32<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, stream, _): (AirPos, (&'input str, AirPos), AirPos),
+) -> CallOutputValue<'input>
+{
+    CallOutputValue::stream(stream.0, stream.1)
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action33<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, scalar, _): (AirPos, (&'input str, AirPos), AirPos),
+) -> Fail<'input>
+{
+    Fail::Scalar(Scalar::new(scalar.0, scalar.1))
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action34<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, scalar, _): (AirPos, (&'input str, LambdaAST<'input>, AirPos), AirPos),
+) -> Fail<'input>
+{
+    Fail::ScalarWithLambda(ScalarWithLambda::new(scalar.0, scalar.1, scalar.2))
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action35<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, ret_code, _): (AirPos, i64, AirPos),
+    (_, error_message, _): (AirPos, &'input str, AirPos),
+) -> Fail<'input>
+{
+    Fail::Literal {
+        ret_code,
+        error_message,
+    }
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action36<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, canon_stream, _): (AirPos, (&'input str, LambdaAST<'input>, AirPos), AirPos),
+) -> Fail<'input>
+{
+    Fail::CanonStreamWithLambda(CanonStreamWithLambda::new(canon_stream.0, canon_stream.1, canon_stream.2))
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action37<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, left, _): (AirPos, AirPos, AirPos),
+    (_, l, _): (AirPos, Token<'input>, AirPos),
+    (_, right, _): (AirPos, AirPos, AirPos),
+) -> Fail<'input>
+{
+    {
+        Fail::LastError
+    }
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action38<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, left, _): (AirPos, AirPos, AirPos),
+    (_, l, _): (AirPos, Token<'input>, AirPos),
+    (_, right, _): (AirPos, AirPos, AirPos),
+) -> Fail<'input>
+{
+    {
+        Fail::Error
+    }
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action39<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, scalar, _): (AirPos, (&'input str, AirPos), AirPos),
+) -> FoldScalarIterable<'input>
+{
+    FoldScalarIterable::Scalar(Scalar::new(scalar.0, scalar.1))
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action40<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, scalar, _): (AirPos, (&'input str, LambdaAST<'input>, AirPos), AirPos),
+) -> FoldScalarIterable<'input>
+{
+    FoldScalarIterable::ScalarWithLambda(ScalarWithLambda::new(scalar.0, scalar.1, scalar.2))
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action41<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, canon_stream, _): (AirPos, (&'input str, AirPos), AirPos),
+) -> FoldScalarIterable<'input>
+{
+    FoldScalarIterable::CanonStream(CanonStream::new(canon_stream.0, canon_stream.1))
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action42<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, canon_stream_map, _): (AirPos, (&'input str, AirPos), AirPos),
+) -> FoldScalarIterable<'input>
+{
+    FoldScalarIterable::CanonStreamMap(CanonStreamMap::new(canon_stream_map.0, canon_stream_map.1))
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action43<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, canon_stream_map, _): (AirPos, (&'input str, LambdaAST<'input>, AirPos), AirPos),
+) -> FoldScalarIterable<'input>
+{
+    FoldScalarIterable::CanonStreamMapWithLambda(CanonStreamMapWithLambda::new(canon_stream_map.0, canon_stream_map.1, canon_stream_map.2))
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action44<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, __0, _): (AirPos, Token<'input>, AirPos),
+    (_, __1, _): (AirPos, Token<'input>, AirPos),
+) -> FoldScalarIterable<'input>
+{
+    FoldScalarIterable::EmptyArray
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action45<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, __0, _): (AirPos, ResolvableToPeerIdVariable<'input>, AirPos),
+) -> ResolvableToPeerIdVariable<'input>
+{
+    __0
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action46<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, __0, _): (AirPos, ResolvableToStringVariable<'input>, AirPos),
+) -> ResolvableToStringVariable<'input>
+{
+    __0
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action47<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, __0, _): (AirPos, ResolvableToStringVariable<'input>, AirPos),
+) -> ResolvableToStringVariable<'input>
+{
+    __0
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action48<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, __0, _): (AirPos, Token<'input>, AirPos),
+) -> ResolvableToPeerIdVariable<'input>
+{
+    ResolvableToPeerIdVariable::InitPeerId
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action49<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, literal, _): (AirPos, &'input str, AirPos),
+) -> ResolvableToPeerIdVariable<'input>
+{
+    ResolvableToPeerIdVariable::Literal(literal)
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action50<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, scalar, _): (AirPos, (&'input str, AirPos), AirPos),
+) -> ResolvableToPeerIdVariable<'input>
+{
+    ResolvableToPeerIdVariable::Scalar(Scalar::new(scalar.0, scalar.1))
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action51<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, scalar, _): (AirPos, (&'input str, LambdaAST<'input>, AirPos), AirPos),
+) -> ResolvableToPeerIdVariable<'input>
+{
+    ResolvableToPeerIdVariable::ScalarWithLambda(ScalarWithLambda::new(scalar.0, scalar.1, scalar.2))
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action52<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, canon_stream, _): (AirPos, (&'input str, LambdaAST<'input>, AirPos), AirPos),
+) -> ResolvableToPeerIdVariable<'input>
+{
+    ResolvableToPeerIdVariable::CanonStreamWithLambda(CanonStreamWithLambda::new(canon_stream.0, canon_stream.1, canon_stream.2))
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action53<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, canon_stream_map, _): (AirPos, (&'input str, LambdaAST<'input>, AirPos), AirPos),
+) -> ResolvableToPeerIdVariable<'input>
+{
+    ResolvableToPeerIdVariable::CanonStreamMapWithLambda(CanonStreamMapWithLambda::new(canon_stream_map.0, canon_stream_map.1, canon_stream_map.2))
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action54<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, literal, _): (AirPos, &'input str, AirPos),
+) -> ResolvableToStringVariable<'input>
+{
+    ResolvableToStringVariable::Literal(literal)
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action55<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, scalar, _): (AirPos, (&'input str, AirPos), AirPos),
+) -> ResolvableToStringVariable<'input>
+{
+    ResolvableToStringVariable::Scalar(Scalar::new(scalar.0, scalar.1))
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action56<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, scalar, _): (AirPos, (&'input str, LambdaAST<'input>, AirPos), AirPos),
+) -> ResolvableToStringVariable<'input>
+{
+    ResolvableToStringVariable::ScalarWithLambda(ScalarWithLambda::new(scalar.0, scalar.1, scalar.2))
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action57<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, canon_stream, _): (AirPos, (&'input str, LambdaAST<'input>, AirPos), AirPos),
+) -> ResolvableToStringVariable<'input>
+{
+    ResolvableToStringVariable::CanonStreamWithLambda(CanonStreamWithLambda::new(canon_stream.0, canon_stream.1, canon_stream.2))
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action58<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, canon_stream_map, _): (AirPos, (&'input str, LambdaAST<'input>, AirPos), AirPos),
+) -> ResolvableToStringVariable<'input>
+{
+    ResolvableToStringVariable::CanonStreamMapWithLambda(CanonStreamMapWithLambda::new(canon_stream_map.0, canon_stream_map.1, canon_stream_map.2))
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action59<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, scalar, _): (AirPos, (&'input str, AirPos), AirPos),
+) -> NewArgument<'input>
+{
+    NewArgument::Scalar(Scalar::new(scalar.0, scalar.1))
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action60<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, stream, _): (AirPos, (&'input str, AirPos), AirPos),
+) -> NewArgument<'input>
+{
+    NewArgument::Stream(Stream::new(stream.0, stream.1))
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action61<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, stream, _): (AirPos, (&'input str, AirPos), AirPos),
+) -> NewArgument<'input>
+{
+    NewArgument::StreamMap(StreamMap::new(stream.0, stream.1))
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action62<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, canon_stream, _): (AirPos, (&'input str, AirPos), AirPos),
+) -> NewArgument<'input>
+{
+    NewArgument::CanonStream(CanonStream::new(canon_stream.0, canon_stream.1))
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action63<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, canon_stream_map, _): (AirPos, (&'input str, AirPos), AirPos),
+) -> NewArgument<'input>
+{
+    NewArgument::CanonStreamMap(CanonStreamMap::new(canon_stream_map.0, canon_stream_map.1))
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action64<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, integer, _): (AirPos, i64, AirPos),
+) -> Number
+{
+    Number::Int(integer)
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action65<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, float, _): (AirPos, f64, AirPos),
+) -> Number
+{
+    Number::Float(float)
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action66<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, __0, _): (AirPos, ImmutableValue<'input>, AirPos),
+) -> ImmutableValue<'input>
+{
+    __0
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action67<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, __0, _): (AirPos, Token<'input>, AirPos),
+) -> ImmutableValue<'input>
+{
+    ImmutableValue::InitPeerId
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action68<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, __0, _): (AirPos, Token<'input>, AirPos),
+) -> ImmutableValue<'input>
+{
+    ImmutableValue::LastError(None)
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action69<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, le, _): (AirPos, LambdaAST<'input>, AirPos),
+) -> ImmutableValue<'input>
+{
+    ImmutableValue::LastError(Some(le))
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action70<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, __0, _): (AirPos, Token<'input>, AirPos),
+) -> ImmutableValue<'input>
+{
+    ImmutableValue::Error(InstructionErrorAST::new(None))
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action71<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, le, _): (AirPos, LambdaAST<'input>, AirPos),
+) -> ImmutableValue<'input>
+{
+    ImmutableValue::Error(InstructionErrorAST::new(Some(le)))
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action72<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, l, _): (AirPos, &'input str, AirPos),
+) -> ImmutableValue<'input>
+{
+    ImmutableValue::Literal(l.into())
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action73<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, __0, _): (AirPos, Token<'input>, AirPos),
+) -> ImmutableValue<'input>
+{
+    ImmutableValue::Timestamp
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action74<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, __0, _): (AirPos, Token<'input>, AirPos),
+) -> ImmutableValue<'input>
+{
+    ImmutableValue::TTL
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action75<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, n, _): (AirPos, Number, AirPos),
+) -> ImmutableValue<'input>
+{
+    ImmutableValue::Number(n)
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action76<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, b, _): (AirPos, bool, AirPos),
+) -> ImmutableValue<'input>
+{
+    ImmutableValue::Boolean(b)
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action77<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, __0, _): (AirPos, Token<'input>, AirPos),
+    (_, __1, _): (AirPos, Token<'input>, AirPos),
+) -> ImmutableValue<'input>
+{
+    ImmutableValue::EmptyArray
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action78<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, scalar, _): (AirPos, (&'input str, AirPos), AirPos),
+) -> ImmutableValue<'input>
+{
+    ImmutableValue::Variable(ImmutableVariable::scalar(scalar.0, scalar.1))
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action79<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, scalar, _): (AirPos, (&'input str, LambdaAST<'input>, AirPos), AirPos),
+) -> ImmutableValue<'input>
+{
+    ImmutableValue::VariableWithLambda(ImmutableVariableWithLambda::scalar(scalar.0, scalar.1, scalar.2))
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action80<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, canon_stream, _): (AirPos, (&'input str, AirPos), AirPos),
+) -> ImmutableValue<'input>
+{
+    ImmutableValue::Variable(ImmutableVariable::canon_stream(canon_stream.0, canon_stream.1))
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action81<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, canon_stream, _): (AirPos, (&'input str, LambdaAST<'input>, AirPos), AirPos),
+) -> ImmutableValue<'input>
+{
+    ImmutableValue::VariableWithLambda(ImmutableVariableWithLambda::canon_stream(canon_stream.0, canon_stream.1, canon_stream.2))
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action82<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, canon_stream_map, _): (AirPos, (&'input str, AirPos), AirPos),
+) -> ImmutableValue<'input>
+{
+    ImmutableValue::Variable(ImmutableVariable::canon_stream_map(canon_stream_map.0, canon_stream_map.1))
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action83<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, canon_stream_map, _): (AirPos, (&'input str, LambdaAST<'input>, AirPos), AirPos),
+) -> ImmutableValue<'input>
+{
+    ImmutableValue::VariableWithLambda(ImmutableVariableWithLambda::canon_stream_map(canon_stream_map.0, canon_stream_map.1, canon_stream_map.2))
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action84<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, __0, _): (AirPos, Token<'input>, AirPos),
+) -> ApArgument<'input>
+{
+    ApArgument::InitPeerId
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action85<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, __0, _): (AirPos, Token<'input>, AirPos),
+) -> ApArgument<'input>
+{
+    ApArgument::LastError(None)
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action86<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, le, _): (AirPos, LambdaAST<'input>, AirPos),
+) -> ApArgument<'input>
+{
+    ApArgument::LastError(Some(le))
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action87<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, __0, _): (AirPos, Token<'input>, AirPos),
+) -> ApArgument<'input>
+{
+    ApArgument::Error(InstructionErrorAST::new(None))
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action88<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, le, _): (AirPos, LambdaAST<'input>, AirPos),
+) -> ApArgument<'input>
+{
+    ApArgument::Error(InstructionErrorAST::new(Some(le)))
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action89<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, __0, _): (AirPos, Token<'input>, AirPos),
+) -> ApArgument<'input>
+{
+    ApArgument::Timestamp
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action90<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, __0, _): (AirPos, Token<'input>, AirPos),
+) -> ApArgument<'input>
+{
+    ApArgument::TTL
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action91<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, l, _): (AirPos, &'input str, AirPos),
+) -> ApArgument<'input>
+{
+    ApArgument::Literal(l.into())
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action92<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, n, _): (AirPos, Number, AirPos),
+) -> ApArgument<'input>
+{
+    ApArgument::Number(n)
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action93<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, b, _): (AirPos, bool, AirPos),
+) -> ApArgument<'input>
+{
+    ApArgument::Boolean(b)
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action94<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, __0, _): (AirPos, Token<'input>, AirPos),
+    (_, __1, _): (AirPos, Token<'input>, AirPos),
+) -> ApArgument<'input>
+{
+    ApArgument::EmptyArray
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action95<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, scalar, _): (AirPos, (&'input str, AirPos), AirPos),
+) -> ApArgument<'input>
+{
+    ApArgument::Scalar(Scalar::new(scalar.0, scalar.1))
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action96<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, scalar, _): (AirPos, (&'input str, LambdaAST<'input>, AirPos), AirPos),
+) -> ApArgument<'input>
+{
+    ApArgument::ScalarWithLambda(ScalarWithLambda::new(scalar.0, scalar.1, scalar.2))
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action97<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, canon_stream, _): (AirPos, (&'input str, AirPos), AirPos),
+) -> ApArgument<'input>
+{
+    ApArgument::CanonStream(CanonStream::new(canon_stream.0, canon_stream.1))
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action98<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, canon_stream, _): (AirPos, (&'input str, LambdaAST<'input>, AirPos), AirPos),
+) -> ApArgument<'input>
+{
+    ApArgument::CanonStreamWithLambda(CanonStreamWithLambda::new(canon_stream.0, canon_stream.1, canon_stream.2))
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action99<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, canon_stream_map, _): (AirPos, (&'input str, LambdaAST<'input>, AirPos), AirPos),
+) -> ApArgument<'input>
+{
+    ApArgument::CanonStreamMapWithLambda(CanonStreamMapWithLambda::new(canon_stream_map.0, canon_stream_map.1, canon_stream_map.2))
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action100<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, stream, _): (AirPos, (&'input str, AirPos), AirPos),
+) -> Stream<'input>
+{
+    Stream::new(stream.0, stream.1)
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action101<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, stream_map, _): (AirPos, (&'input str, AirPos), AirPos),
+) -> StreamMap<'input>
+{
+    StreamMap::new(stream_map.0, stream_map.1)
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action102<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, canon_stream, _): (AirPos, (&'input str, AirPos), AirPos),
+) -> CanonStream<'input>
+{
+    CanonStream::new(canon_stream.0, canon_stream.1)
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action103<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, canon_stream_map, _): (AirPos, (&'input str, AirPos), AirPos),
+) -> CanonStreamMap<'input>
+{
+    CanonStreamMap::new(canon_stream_map.0, canon_stream_map.1)
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action104<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    __lookbehind: &AirPos,
+    __lookahead: &AirPos,
+) -> alloc::vec::Vec<ImmutableValue<'input>>
+{
+    alloc::vec![]
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action105<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, v, _): (AirPos, alloc::vec::Vec<ImmutableValue<'input>>, AirPos),
+) -> alloc::vec::Vec<ImmutableValue<'input>>
+{
+    v
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action106<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, __0, _): (AirPos, ImmutableValue<'input>, AirPos),
+) -> ImmutableValue<'input>
+{
+    __0
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action107<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, __0, _): (AirPos, Instruction<'input>, AirPos),
+) -> core::option::Option<Instruction<'input>>
+{
+    Some(__0)
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action108<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    __lookbehind: &AirPos,
+    __lookahead: &AirPos,
+) -> core::option::Option<Instruction<'input>>
+{
+    None
+}
+
+#[allow(unused_variables)]
+fn __action109<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    __lookbehind: &AirPos,
+    __lookahead: &AirPos,
+) -> AirPos
+{
+    *__lookbehind
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action110<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, __0, _): (AirPos, CallOutputValue<'input>, AirPos),
+) -> core::option::Option<CallOutputValue<'input>>
+{
+    Some(__0)
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action111<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    __lookbehind: &AirPos,
+    __lookahead: &AirPos,
+) -> core::option::Option<CallOutputValue<'input>>
+{
+    None
+}
+
+#[allow(unused_variables)]
+fn __action112<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    __lookbehind: &AirPos,
+    __lookahead: &AirPos,
+) -> AirPos
+{
+    *__lookahead
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action113<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, __0, _): (AirPos, ImmutableValue<'input>, AirPos),
+) -> alloc::vec::Vec<ImmutableValue<'input>>
+{
+    alloc::vec![__0]
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action114<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    (_, v, _): (AirPos, alloc::vec::Vec<ImmutableValue<'input>>, AirPos),
+    (_, e, _): (AirPos, ImmutableValue<'input>, AirPos),
+) -> alloc::vec::Vec<ImmutableValue<'input>>
+{
+    { let mut v = v; v.push(e); v }
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action115<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    __0: (AirPos, ImmutableValue<'input>, AirPos),
+) -> alloc::vec::Vec<ImmutableValue<'input>>
+{
+    let __start0 = __0.0;
+    let __end0 = __0.2;
+    let __temp0 = __action106(
+        input,
+        errors,
+        validator,
+        __0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action113(
+        input,
+        errors,
+        validator,
+        __temp0,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action116<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    __0: (AirPos, alloc::vec::Vec<ImmutableValue<'input>>, AirPos),
+    __1: (AirPos, ImmutableValue<'input>, AirPos),
+) -> alloc::vec::Vec<ImmutableValue<'input>>
+{
+    let __start0 = __1.0;
+    let __end0 = __1.2;
+    let __temp0 = __action106(
+        input,
+        errors,
+        validator,
+        __1,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action114(
+        input,
+        errors,
+        validator,
+        __0,
+        __temp0,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action117<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    __0: (AirPos, Token<'input>, AirPos),
+    __1: (AirPos, Token<'input>, AirPos),
+) -> Vec<ImmutableValue<'input>>
+{
+    let __start0 = __0.2;
+    let __end0 = __1.0;
+    let __temp0 = __action104(
+        input,
+        errors,
+        validator,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action22(
+        input,
+        errors,
+        validator,
+        __0,
+        __temp0,
+        __1,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action118<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    __0: (AirPos, Token<'input>, AirPos),
+    __1: (AirPos, alloc::vec::Vec<ImmutableValue<'input>>, AirPos),
+    __2: (AirPos, Token<'input>, AirPos),
+) -> Vec<ImmutableValue<'input>>
+{
+    let __start0 = __1.0;
+    let __end0 = __1.2;
+    let __temp0 = __action105(
+        input,
+        errors,
+        validator,
+        __1,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action22(
+        input,
+        errors,
+        validator,
+        __0,
+        __temp0,
+        __2,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action119<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    __0: (AirPos, Token<'input>, AirPos),
+    __1: (AirPos, AirPos, AirPos),
+) -> Fail<'input>
+{
+    let __start0 = __0.0;
+    let __end0 = __0.0;
+    let __temp0 = __action112(
+        input,
+        errors,
+        validator,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action37(
+        input,
+        errors,
+        validator,
+        __temp0,
+        __0,
+        __1,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action120<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    __0: (AirPos, Token<'input>, AirPos),
+    __1: (AirPos, AirPos, AirPos),
+) -> Fail<'input>
+{
+    let __start0 = __0.0;
+    let __end0 = __0.0;
+    let __temp0 = __action112(
+        input,
+        errors,
+        validator,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action38(
+        input,
+        errors,
+        validator,
+        __temp0,
+        __0,
+        __1,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action121<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    __0: (AirPos, Token<'input>, AirPos),
+    __1: (AirPos, Token<'input>, AirPos),
+    __2: (AirPos, Triplet<'input>, AirPos),
+    __3: (AirPos, Vec<ImmutableValue<'input>>, AirPos),
+    __4: (AirPos, core::option::Option<CallOutputValue<'input>>, AirPos),
+    __5: (AirPos, Token<'input>, AirPos),
+    __6: (AirPos, AirPos, AirPos),
+) -> Instruction<'input>
+{
+    let __start0 = __0.0;
+    let __end0 = __0.0;
+    let __temp0 = __action112(
+        input,
+        errors,
+        validator,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action2(
+        input,
+        errors,
+        validator,
+        __temp0,
+        __0,
+        __1,
+        __2,
+        __3,
+        __4,
+        __5,
+        __6,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action122<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    __0: (AirPos, Token<'input>, AirPos),
+    __1: (AirPos, Token<'input>, AirPos),
+    __2: (AirPos, ResolvableToPeerIdVariable<'input>, AirPos),
+    __3: (AirPos, Stream<'input>, AirPos),
+    __4: (AirPos, CanonStream<'input>, AirPos),
+    __5: (AirPos, Token<'input>, AirPos),
+    __6: (AirPos, AirPos, AirPos),
+) -> Instruction<'input>
+{
+    let __start0 = __0.0;
+    let __end0 = __0.0;
+    let __temp0 = __action112(
+        input,
+        errors,
+        validator,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action3(
+        input,
+        errors,
+        validator,
+        __temp0,
+        __0,
+        __1,
+        __2,
+        __3,
+        __4,
+        __5,
+        __6,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action123<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    __0: (AirPos, Token<'input>, AirPos),
+    __1: (AirPos, Token<'input>, AirPos),
+    __2: (AirPos, ResolvableToPeerIdVariable<'input>, AirPos),
+    __3: (AirPos, StreamMap<'input>, AirPos),
+    __4: (AirPos, CanonStreamMap<'input>, AirPos),
+    __5: (AirPos, Token<'input>, AirPos),
+    __6: (AirPos, AirPos, AirPos),
+) -> Instruction<'input>
+{
+    let __start0 = __0.0;
+    let __end0 = __0.0;
+    let __temp0 = __action112(
+        input,
+        errors,
+        validator,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action4(
+        input,
+        errors,
+        validator,
+        __temp0,
+        __0,
+        __1,
+        __2,
+        __3,
+        __4,
+        __5,
+        __6,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action124<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    __0: (AirPos, Token<'input>, AirPos),
+    __1: (AirPos, Token<'input>, AirPos),
+    __2: (AirPos, ResolvableToPeerIdVariable<'input>, AirPos),
+    __3: (AirPos, StreamMap<'input>, AirPos),
+    __4: (AirPos, (&'input str, AirPos), AirPos),
+    __5: (AirPos, Token<'input>, AirPos),
+    __6: (AirPos, AirPos, AirPos),
+) -> Instruction<'input>
+{
+    let __start0 = __0.0;
+    let __end0 = __0.0;
+    let __temp0 = __action112(
+        input,
+        errors,
+        validator,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action5(
+        input,
+        errors,
+        validator,
+        __temp0,
+        __0,
+        __1,
+        __2,
+        __3,
+        __4,
+        __5,
+        __6,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action125<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    __0: (AirPos, Token<'input>, AirPos),
+    __1: (AirPos, Token<'input>, AirPos),
+    __2: (AirPos, ApArgument<'input>, AirPos),
+    __3: (AirPos, ApResult<'input>, AirPos),
+    __4: (AirPos, Token<'input>, AirPos),
+    __5: (AirPos, AirPos, AirPos),
+) -> Instruction<'input>
+{
+    let __start0 = __0.0;
+    let __end0 = __0.0;
+    let __temp0 = __action112(
+        input,
+        errors,
+        validator,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action6(
+        input,
+        errors,
+        validator,
+        __temp0,
+        __0,
+        __1,
+        __2,
+        __3,
+        __4,
+        __5,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action126<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    __0: (AirPos, Token<'input>, AirPos),
+    __1: (AirPos, Token<'input>, AirPos),
+    __2: (AirPos, Token<'input>, AirPos),
+    __3: (AirPos, StreamMapKeyClause<'input>, AirPos),
+    __4: (AirPos, ApArgument<'input>, AirPos),
+    __5: (AirPos, Token<'input>, AirPos),
+    __6: (AirPos, (&'input str, AirPos), AirPos),
+    __7: (AirPos, Token<'input>, AirPos),
+    __8: (AirPos, AirPos, AirPos),
+) -> Instruction<'input>
+{
+    let __start0 = __0.0;
+    let __end0 = __0.0;
+    let __temp0 = __action112(
+        input,
+        errors,
+        validator,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action7(
+        input,
+        errors,
+        validator,
+        __temp0,
+        __0,
+        __1,
+        __2,
+        __3,
+        __4,
+        __5,
+        __6,
+        __7,
+        __8,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action127<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    __0: (AirPos, Token<'input>, AirPos),
+    __1: (AirPos, Token<'input>, AirPos),
+    __2: (AirPos, Instruction<'input>, AirPos),
+    __3: (AirPos, Instruction<'input>, AirPos),
+    __4: (AirPos, Token<'input>, AirPos),
+    __5: (AirPos, AirPos, AirPos),
+) -> Instruction<'input>
+{
+    let __start0 = __0.0;
+    let __end0 = __0.0;
+    let __temp0 = __action112(
+        input,
+        errors,
+        validator,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action8(
+        input,
+        errors,
+        validator,
+        __temp0,
+        __0,
+        __1,
+        __2,
+        __3,
+        __4,
+        __5,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action128<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    __0: (AirPos, Token<'input>, AirPos),
+    __1: (AirPos, Token<'input>, AirPos),
+    __2: (AirPos, Instruction<'input>, AirPos),
+    __3: (AirPos, Instruction<'input>, AirPos),
+    __4: (AirPos, Token<'input>, AirPos),
+    __5: (AirPos, AirPos, AirPos),
+) -> Instruction<'input>
+{
+    let __start0 = __0.0;
+    let __end0 = __0.0;
+    let __temp0 = __action112(
+        input,
+        errors,
+        validator,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action9(
+        input,
+        errors,
+        validator,
+        __temp0,
+        __0,
+        __1,
+        __2,
+        __3,
+        __4,
+        __5,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action129<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    __0: (AirPos, Token<'input>, AirPos),
+    __1: (AirPos, Token<'input>, AirPos),
+    __2: (AirPos, Token<'input>, AirPos),
+    __3: (AirPos, AirPos, AirPos),
+) -> Instruction<'input>
+{
+    let __start0 = __0.0;
+    let __end0 = __0.0;
+    let __temp0 = __action112(
+        input,
+        errors,
+        validator,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action10(
+        input,
+        errors,
+        validator,
+        __temp0,
+        __0,
+        __1,
+        __2,
+        __3,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action130<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    __0: (AirPos, Token<'input>, AirPos),
+    __1: (AirPos, Token<'input>, AirPos),
+    __2: (AirPos, Token<'input>, AirPos),
+    __3: (AirPos, AirPos, AirPos),
+) -> Instruction<'input>
+{
+    let __start0 = __0.0;
+    let __end0 = __0.0;
+    let __temp0 = __action112(
+        input,
+        errors,
+        validator,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action11(
+        input,
+        errors,
+        validator,
+        __temp0,
+        __0,
+        __1,
+        __2,
+        __3,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action131<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    __0: (AirPos, Token<'input>, AirPos),
+    __1: (AirPos, Token<'input>, AirPos),
+    __2: (AirPos, NewArgument<'input>, AirPos),
+    __3: (AirPos, Instruction<'input>, AirPos),
+    __4: (AirPos, Token<'input>, AirPos),
+    __5: (AirPos, AirPos, AirPos),
+) -> Instruction<'input>
+{
+    let __start0 = __0.0;
+    let __end0 = __0.0;
+    let __temp0 = __action112(
+        input,
+        errors,
+        validator,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action12(
+        input,
+        errors,
+        validator,
+        __temp0,
+        __0,
+        __1,
+        __2,
+        __3,
+        __4,
+        __5,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action132<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    __0: (AirPos, Token<'input>, AirPos),
+    __1: (AirPos, Token<'input>, AirPos),
+    __2: (AirPos, Fail<'input>, AirPos),
+    __3: (AirPos, Token<'input>, AirPos),
+    __4: (AirPos, AirPos, AirPos),
+) -> Instruction<'input>
+{
+    let __start0 = __0.0;
+    let __end0 = __0.0;
+    let __temp0 = __action112(
+        input,
+        errors,
+        validator,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action13(
+        input,
+        errors,
+        validator,
+        __temp0,
+        __0,
+        __1,
+        __2,
+        __3,
+        __4,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action133<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    __0: (AirPos, Token<'input>, AirPos),
+    __1: (AirPos, Token<'input>, AirPos),
+    __2: (AirPos, FoldScalarIterable<'input>, AirPos),
+    __3: (AirPos, (&'input str, AirPos), AirPos),
+    __4: (AirPos, Instruction<'input>, AirPos),
+    __5: (AirPos, core::option::Option<Instruction<'input>>, AirPos),
+    __6: (AirPos, Token<'input>, AirPos),
+    __7: (AirPos, AirPos, AirPos),
+) -> Instruction<'input>
+{
+    let __start0 = __0.0;
+    let __end0 = __0.0;
+    let __temp0 = __action112(
+        input,
+        errors,
+        validator,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action14(
+        input,
+        errors,
+        validator,
+        __temp0,
+        __0,
+        __1,
+        __2,
+        __3,
+        __4,
+        __5,
+        __6,
+        __7,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action134<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    __0: (AirPos, Token<'input>, AirPos),
+    __1: (AirPos, Token<'input>, AirPos),
+    __2: (AirPos, (&'input str, AirPos), AirPos),
+    __3: (AirPos, (&'input str, AirPos), AirPos),
+    __4: (AirPos, Instruction<'input>, AirPos),
+    __5: (AirPos, core::option::Option<Instruction<'input>>, AirPos),
+    __6: (AirPos, Token<'input>, AirPos),
+    __7: (AirPos, AirPos, AirPos),
+) -> Instruction<'input>
+{
+    let __start0 = __0.0;
+    let __end0 = __0.0;
+    let __temp0 = __action112(
+        input,
+        errors,
+        validator,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action15(
+        input,
+        errors,
+        validator,
+        __temp0,
+        __0,
+        __1,
+        __2,
+        __3,
+        __4,
+        __5,
+        __6,
+        __7,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action135<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    __0: (AirPos, Token<'input>, AirPos),
+    __1: (AirPos, Token<'input>, AirPos),
+    __2: (AirPos, (&'input str, AirPos), AirPos),
+    __3: (AirPos, (&'input str, AirPos), AirPos),
+    __4: (AirPos, Instruction<'input>, AirPos),
+    __5: (AirPos, core::option::Option<Instruction<'input>>, AirPos),
+    __6: (AirPos, Token<'input>, AirPos),
+    __7: (AirPos, AirPos, AirPos),
+) -> Instruction<'input>
+{
+    let __start0 = __0.0;
+    let __end0 = __0.0;
+    let __temp0 = __action112(
+        input,
+        errors,
+        validator,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action16(
+        input,
+        errors,
+        validator,
+        __temp0,
+        __0,
+        __1,
+        __2,
+        __3,
+        __4,
+        __5,
+        __6,
+        __7,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action136<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    __0: (AirPos, Token<'input>, AirPos),
+    __1: (AirPos, Token<'input>, AirPos),
+    __2: (AirPos, (&'input str, AirPos), AirPos),
+    __3: (AirPos, Token<'input>, AirPos),
+    __4: (AirPos, AirPos, AirPos),
+) -> Instruction<'input>
+{
+    let __start0 = __0.0;
+    let __end0 = __0.0;
+    let __temp0 = __action112(
+        input,
+        errors,
+        validator,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action17(
+        input,
+        errors,
+        validator,
+        __temp0,
+        __0,
+        __1,
+        __2,
+        __3,
+        __4,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action137<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    __0: (AirPos, Token<'input>, AirPos),
+    __1: (AirPos, Token<'input>, AirPos),
+    __2: (AirPos, Instruction<'input>, AirPos),
+    __3: (AirPos, Instruction<'input>, AirPos),
+    __4: (AirPos, Token<'input>, AirPos),
+    __5: (AirPos, AirPos, AirPos),
+) -> Instruction<'input>
+{
+    let __start0 = __0.0;
+    let __end0 = __0.0;
+    let __temp0 = __action112(
+        input,
+        errors,
+        validator,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action18(
+        input,
+        errors,
+        validator,
+        __temp0,
+        __0,
+        __1,
+        __2,
+        __3,
+        __4,
+        __5,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action138<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    __0: (AirPos, Token<'input>, AirPos),
+    __1: (AirPos, Token<'input>, AirPos),
+    __2: (AirPos, ImmutableValue<'input>, AirPos),
+    __3: (AirPos, ImmutableValue<'input>, AirPos),
+    __4: (AirPos, Instruction<'input>, AirPos),
+    __5: (AirPos, Token<'input>, AirPos),
+    __6: (AirPos, AirPos, AirPos),
+) -> Instruction<'input>
+{
+    let __start0 = __0.0;
+    let __end0 = __0.0;
+    let __temp0 = __action112(
+        input,
+        errors,
+        validator,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action19(
+        input,
+        errors,
+        validator,
+        __temp0,
+        __0,
+        __1,
+        __2,
+        __3,
+        __4,
+        __5,
+        __6,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action139<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    __0: (AirPos, Token<'input>, AirPos),
+    __1: (AirPos, Token<'input>, AirPos),
+    __2: (AirPos, ImmutableValue<'input>, AirPos),
+    __3: (AirPos, ImmutableValue<'input>, AirPos),
+    __4: (AirPos, Instruction<'input>, AirPos),
+    __5: (AirPos, Token<'input>, AirPos),
+    __6: (AirPos, AirPos, AirPos),
+) -> Instruction<'input>
+{
+    let __start0 = __0.0;
+    let __end0 = __0.0;
+    let __temp0 = __action112(
+        input,
+        errors,
+        validator,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action20(
+        input,
+        errors,
+        validator,
+        __temp0,
+        __0,
+        __1,
+        __2,
+        __3,
+        __4,
+        __5,
+        __6,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action140<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    __0: (AirPos, Token<'input>, AirPos),
+) -> Fail<'input>
+{
+    let __start0 = __0.2;
+    let __end0 = __0.2;
+    let __temp0 = __action109(
+        input,
+        errors,
+        validator,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action119(
+        input,
+        errors,
+        validator,
+        __0,
+        __temp0,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action141<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    __0: (AirPos, Token<'input>, AirPos),
+) -> Fail<'input>
+{
+    let __start0 = __0.2;
+    let __end0 = __0.2;
+    let __temp0 = __action109(
+        input,
+        errors,
+        validator,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action120(
+        input,
+        errors,
+        validator,
+        __0,
+        __temp0,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action142<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    __0: (AirPos, Token<'input>, AirPos),
+    __1: (AirPos, Token<'input>, AirPos),
+    __2: (AirPos, Triplet<'input>, AirPos),
+    __3: (AirPos, Vec<ImmutableValue<'input>>, AirPos),
+    __4: (AirPos, core::option::Option<CallOutputValue<'input>>, AirPos),
+    __5: (AirPos, Token<'input>, AirPos),
+) -> Instruction<'input>
+{
+    let __start0 = __5.2;
+    let __end0 = __5.2;
+    let __temp0 = __action109(
+        input,
+        errors,
+        validator,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action121(
+        input,
+        errors,
+        validator,
+        __0,
+        __1,
+        __2,
+        __3,
+        __4,
+        __5,
+        __temp0,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action143<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    __0: (AirPos, Token<'input>, AirPos),
+    __1: (AirPos, Token<'input>, AirPos),
+    __2: (AirPos, ResolvableToPeerIdVariable<'input>, AirPos),
+    __3: (AirPos, Stream<'input>, AirPos),
+    __4: (AirPos, CanonStream<'input>, AirPos),
+    __5: (AirPos, Token<'input>, AirPos),
+) -> Instruction<'input>
+{
+    let __start0 = __5.2;
+    let __end0 = __5.2;
+    let __temp0 = __action109(
+        input,
+        errors,
+        validator,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action122(
+        input,
+        errors,
+        validator,
+        __0,
+        __1,
+        __2,
+        __3,
+        __4,
+        __5,
+        __temp0,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action144<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    __0: (AirPos, Token<'input>, AirPos),
+    __1: (AirPos, Token<'input>, AirPos),
+    __2: (AirPos, ResolvableToPeerIdVariable<'input>, AirPos),
+    __3: (AirPos, StreamMap<'input>, AirPos),
+    __4: (AirPos, CanonStreamMap<'input>, AirPos),
+    __5: (AirPos, Token<'input>, AirPos),
+) -> Instruction<'input>
+{
+    let __start0 = __5.2;
+    let __end0 = __5.2;
+    let __temp0 = __action109(
+        input,
+        errors,
+        validator,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action123(
+        input,
+        errors,
+        validator,
+        __0,
+        __1,
+        __2,
+        __3,
+        __4,
+        __5,
+        __temp0,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action145<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    __0: (AirPos, Token<'input>, AirPos),
+    __1: (AirPos, Token<'input>, AirPos),
+    __2: (AirPos, ResolvableToPeerIdVariable<'input>, AirPos),
+    __3: (AirPos, StreamMap<'input>, AirPos),
+    __4: (AirPos, (&'input str, AirPos), AirPos),
+    __5: (AirPos, Token<'input>, AirPos),
+) -> Instruction<'input>
+{
+    let __start0 = __5.2;
+    let __end0 = __5.2;
+    let __temp0 = __action109(
+        input,
+        errors,
+        validator,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action124(
+        input,
+        errors,
+        validator,
+        __0,
+        __1,
+        __2,
+        __3,
+        __4,
+        __5,
+        __temp0,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action146<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    __0: (AirPos, Token<'input>, AirPos),
+    __1: (AirPos, Token<'input>, AirPos),
+    __2: (AirPos, ApArgument<'input>, AirPos),
+    __3: (AirPos, ApResult<'input>, AirPos),
+    __4: (AirPos, Token<'input>, AirPos),
+) -> Instruction<'input>
+{
+    let __start0 = __4.2;
+    let __end0 = __4.2;
+    let __temp0 = __action109(
+        input,
+        errors,
+        validator,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action125(
+        input,
+        errors,
+        validator,
+        __0,
+        __1,
+        __2,
+        __3,
+        __4,
+        __temp0,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action147<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    __0: (AirPos, Token<'input>, AirPos),
+    __1: (AirPos, Token<'input>, AirPos),
+    __2: (AirPos, Token<'input>, AirPos),
+    __3: (AirPos, StreamMapKeyClause<'input>, AirPos),
+    __4: (AirPos, ApArgument<'input>, AirPos),
+    __5: (AirPos, Token<'input>, AirPos),
+    __6: (AirPos, (&'input str, AirPos), AirPos),
+    __7: (AirPos, Token<'input>, AirPos),
+) -> Instruction<'input>
+{
+    let __start0 = __7.2;
+    let __end0 = __7.2;
+    let __temp0 = __action109(
+        input,
+        errors,
+        validator,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action126(
+        input,
+        errors,
+        validator,
+        __0,
+        __1,
+        __2,
+        __3,
+        __4,
+        __5,
+        __6,
+        __7,
+        __temp0,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action148<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    __0: (AirPos, Token<'input>, AirPos),
+    __1: (AirPos, Token<'input>, AirPos),
+    __2: (AirPos, Instruction<'input>, AirPos),
+    __3: (AirPos, Instruction<'input>, AirPos),
+    __4: (AirPos, Token<'input>, AirPos),
+) -> Instruction<'input>
+{
+    let __start0 = __4.2;
+    let __end0 = __4.2;
+    let __temp0 = __action109(
+        input,
+        errors,
+        validator,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action127(
+        input,
+        errors,
+        validator,
+        __0,
+        __1,
+        __2,
+        __3,
+        __4,
+        __temp0,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action149<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    __0: (AirPos, Token<'input>, AirPos),
+    __1: (AirPos, Token<'input>, AirPos),
+    __2: (AirPos, Instruction<'input>, AirPos),
+    __3: (AirPos, Instruction<'input>, AirPos),
+    __4: (AirPos, Token<'input>, AirPos),
+) -> Instruction<'input>
+{
+    let __start0 = __4.2;
+    let __end0 = __4.2;
+    let __temp0 = __action109(
+        input,
+        errors,
+        validator,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action128(
+        input,
+        errors,
+        validator,
+        __0,
+        __1,
+        __2,
+        __3,
+        __4,
+        __temp0,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action150<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    __0: (AirPos, Token<'input>, AirPos),
+    __1: (AirPos, Token<'input>, AirPos),
+    __2: (AirPos, Token<'input>, AirPos),
+) -> Instruction<'input>
+{
+    let __start0 = __2.2;
+    let __end0 = __2.2;
+    let __temp0 = __action109(
+        input,
+        errors,
+        validator,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action129(
+        input,
+        errors,
+        validator,
+        __0,
+        __1,
+        __2,
+        __temp0,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action151<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    __0: (AirPos, Token<'input>, AirPos),
+    __1: (AirPos, Token<'input>, AirPos),
+    __2: (AirPos, Token<'input>, AirPos),
+) -> Instruction<'input>
+{
+    let __start0 = __2.2;
+    let __end0 = __2.2;
+    let __temp0 = __action109(
+        input,
+        errors,
+        validator,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action130(
+        input,
+        errors,
+        validator,
+        __0,
+        __1,
+        __2,
+        __temp0,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action152<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    __0: (AirPos, Token<'input>, AirPos),
+    __1: (AirPos, Token<'input>, AirPos),
+    __2: (AirPos, NewArgument<'input>, AirPos),
+    __3: (AirPos, Instruction<'input>, AirPos),
+    __4: (AirPos, Token<'input>, AirPos),
+) -> Instruction<'input>
+{
+    let __start0 = __4.2;
+    let __end0 = __4.2;
+    let __temp0 = __action109(
+        input,
+        errors,
+        validator,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action131(
+        input,
+        errors,
+        validator,
+        __0,
+        __1,
+        __2,
+        __3,
+        __4,
+        __temp0,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action153<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    __0: (AirPos, Token<'input>, AirPos),
+    __1: (AirPos, Token<'input>, AirPos),
+    __2: (AirPos, Fail<'input>, AirPos),
+    __3: (AirPos, Token<'input>, AirPos),
+) -> Instruction<'input>
+{
+    let __start0 = __3.2;
+    let __end0 = __3.2;
+    let __temp0 = __action109(
+        input,
+        errors,
+        validator,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action132(
+        input,
+        errors,
+        validator,
+        __0,
+        __1,
+        __2,
+        __3,
+        __temp0,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action154<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    __0: (AirPos, Token<'input>, AirPos),
+    __1: (AirPos, Token<'input>, AirPos),
+    __2: (AirPos, FoldScalarIterable<'input>, AirPos),
+    __3: (AirPos, (&'input str, AirPos), AirPos),
+    __4: (AirPos, Instruction<'input>, AirPos),
+    __5: (AirPos, core::option::Option<Instruction<'input>>, AirPos),
+    __6: (AirPos, Token<'input>, AirPos),
+) -> Instruction<'input>
+{
+    let __start0 = __6.2;
+    let __end0 = __6.2;
+    let __temp0 = __action109(
+        input,
+        errors,
+        validator,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action133(
+        input,
+        errors,
+        validator,
+        __0,
+        __1,
+        __2,
+        __3,
+        __4,
+        __5,
+        __6,
+        __temp0,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action155<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    __0: (AirPos, Token<'input>, AirPos),
+    __1: (AirPos, Token<'input>, AirPos),
+    __2: (AirPos, (&'input str, AirPos), AirPos),
+    __3: (AirPos, (&'input str, AirPos), AirPos),
+    __4: (AirPos, Instruction<'input>, AirPos),
+    __5: (AirPos, core::option::Option<Instruction<'input>>, AirPos),
+    __6: (AirPos, Token<'input>, AirPos),
+) -> Instruction<'input>
+{
+    let __start0 = __6.2;
+    let __end0 = __6.2;
+    let __temp0 = __action109(
+        input,
+        errors,
+        validator,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action134(
+        input,
+        errors,
+        validator,
+        __0,
+        __1,
+        __2,
+        __3,
+        __4,
+        __5,
+        __6,
+        __temp0,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action156<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    __0: (AirPos, Token<'input>, AirPos),
+    __1: (AirPos, Token<'input>, AirPos),
+    __2: (AirPos, (&'input str, AirPos), AirPos),
+    __3: (AirPos, (&'input str, AirPos), AirPos),
+    __4: (AirPos, Instruction<'input>, AirPos),
+    __5: (AirPos, core::option::Option<Instruction<'input>>, AirPos),
+    __6: (AirPos, Token<'input>, AirPos),
+) -> Instruction<'input>
+{
+    let __start0 = __6.2;
+    let __end0 = __6.2;
+    let __temp0 = __action109(
+        input,
+        errors,
+        validator,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action135(
+        input,
+        errors,
+        validator,
+        __0,
+        __1,
+        __2,
+        __3,
+        __4,
+        __5,
+        __6,
+        __temp0,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action157<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    __0: (AirPos, Token<'input>, AirPos),
+    __1: (AirPos, Token<'input>, AirPos),
+    __2: (AirPos, (&'input str, AirPos), AirPos),
+    __3: (AirPos, Token<'input>, AirPos),
+) -> Instruction<'input>
+{
+    let __start0 = __3.2;
+    let __end0 = __3.2;
+    let __temp0 = __action109(
+        input,
+        errors,
+        validator,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action136(
+        input,
+        errors,
+        validator,
+        __0,
+        __1,
+        __2,
+        __3,
+        __temp0,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action158<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    __0: (AirPos, Token<'input>, AirPos),
+    __1: (AirPos, Token<'input>, AirPos),
+    __2: (AirPos, Instruction<'input>, AirPos),
+    __3: (AirPos, Instruction<'input>, AirPos),
+    __4: (AirPos, Token<'input>, AirPos),
+) -> Instruction<'input>
+{
+    let __start0 = __4.2;
+    let __end0 = __4.2;
+    let __temp0 = __action109(
+        input,
+        errors,
+        validator,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action137(
+        input,
+        errors,
+        validator,
+        __0,
+        __1,
+        __2,
+        __3,
+        __4,
+        __temp0,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action159<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    __0: (AirPos, Token<'input>, AirPos),
+    __1: (AirPos, Token<'input>, AirPos),
+    __2: (AirPos, ImmutableValue<'input>, AirPos),
+    __3: (AirPos, ImmutableValue<'input>, AirPos),
+    __4: (AirPos, Instruction<'input>, AirPos),
+    __5: (AirPos, Token<'input>, AirPos),
+) -> Instruction<'input>
+{
+    let __start0 = __5.2;
+    let __end0 = __5.2;
+    let __temp0 = __action109(
+        input,
+        errors,
+        validator,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action138(
+        input,
+        errors,
+        validator,
+        __0,
+        __1,
+        __2,
+        __3,
+        __4,
+        __5,
+        __temp0,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action160<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    __0: (AirPos, Token<'input>, AirPos),
+    __1: (AirPos, Token<'input>, AirPos),
+    __2: (AirPos, ImmutableValue<'input>, AirPos),
+    __3: (AirPos, ImmutableValue<'input>, AirPos),
+    __4: (AirPos, Instruction<'input>, AirPos),
+    __5: (AirPos, Token<'input>, AirPos),
+) -> Instruction<'input>
+{
+    let __start0 = __5.2;
+    let __end0 = __5.2;
+    let __temp0 = __action109(
+        input,
+        errors,
+        validator,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action139(
+        input,
+        errors,
+        validator,
+        __0,
+        __1,
+        __2,
+        __3,
+        __4,
+        __5,
+        __temp0,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action161<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    __0: (AirPos, Token<'input>, AirPos),
+    __1: (AirPos, Token<'input>, AirPos),
+    __2: (AirPos, Triplet<'input>, AirPos),
+    __3: (AirPos, Vec<ImmutableValue<'input>>, AirPos),
+    __4: (AirPos, CallOutputValue<'input>, AirPos),
+    __5: (AirPos, Token<'input>, AirPos),
+) -> Instruction<'input>
+{
+    let __start0 = __4.0;
+    let __end0 = __4.2;
+    let __temp0 = __action110(
+        input,
+        errors,
+        validator,
+        __4,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action142(
+        input,
+        errors,
+        validator,
+        __0,
+        __1,
+        __2,
+        __3,
+        __temp0,
+        __5,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action162<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    __0: (AirPos, Token<'input>, AirPos),
+    __1: (AirPos, Token<'input>, AirPos),
+    __2: (AirPos, Triplet<'input>, AirPos),
+    __3: (AirPos, Vec<ImmutableValue<'input>>, AirPos),
+    __4: (AirPos, Token<'input>, AirPos),
+) -> Instruction<'input>
+{
+    let __start0 = __3.2;
+    let __end0 = __4.0;
+    let __temp0 = __action111(
+        input,
+        errors,
+        validator,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action142(
+        input,
+        errors,
+        validator,
+        __0,
+        __1,
+        __2,
+        __3,
+        __temp0,
+        __4,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action163<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    __0: (AirPos, Token<'input>, AirPos),
+    __1: (AirPos, Token<'input>, AirPos),
+    __2: (AirPos, FoldScalarIterable<'input>, AirPos),
+    __3: (AirPos, (&'input str, AirPos), AirPos),
+    __4: (AirPos, Instruction<'input>, AirPos),
+    __5: (AirPos, Instruction<'input>, AirPos),
+    __6: (AirPos, Token<'input>, AirPos),
+) -> Instruction<'input>
+{
+    let __start0 = __5.0;
+    let __end0 = __5.2;
+    let __temp0 = __action107(
+        input,
+        errors,
+        validator,
+        __5,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action154(
+        input,
+        errors,
+        validator,
+        __0,
+        __1,
+        __2,
+        __3,
+        __4,
+        __temp0,
+        __6,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action164<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    __0: (AirPos, Token<'input>, AirPos),
+    __1: (AirPos, Token<'input>, AirPos),
+    __2: (AirPos, FoldScalarIterable<'input>, AirPos),
+    __3: (AirPos, (&'input str, AirPos), AirPos),
+    __4: (AirPos, Instruction<'input>, AirPos),
+    __5: (AirPos, Token<'input>, AirPos),
+) -> Instruction<'input>
+{
+    let __start0 = __4.2;
+    let __end0 = __5.0;
+    let __temp0 = __action108(
+        input,
+        errors,
+        validator,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action154(
+        input,
+        errors,
+        validator,
+        __0,
+        __1,
+        __2,
+        __3,
+        __4,
+        __temp0,
+        __5,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action165<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    __0: (AirPos, Token<'input>, AirPos),
+    __1: (AirPos, Token<'input>, AirPos),
+    __2: (AirPos, (&'input str, AirPos), AirPos),
+    __3: (AirPos, (&'input str, AirPos), AirPos),
+    __4: (AirPos, Instruction<'input>, AirPos),
+    __5: (AirPos, Instruction<'input>, AirPos),
+    __6: (AirPos, Token<'input>, AirPos),
+) -> Instruction<'input>
+{
+    let __start0 = __5.0;
+    let __end0 = __5.2;
+    let __temp0 = __action107(
+        input,
+        errors,
+        validator,
+        __5,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action155(
+        input,
+        errors,
+        validator,
+        __0,
+        __1,
+        __2,
+        __3,
+        __4,
+        __temp0,
+        __6,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action166<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    __0: (AirPos, Token<'input>, AirPos),
+    __1: (AirPos, Token<'input>, AirPos),
+    __2: (AirPos, (&'input str, AirPos), AirPos),
+    __3: (AirPos, (&'input str, AirPos), AirPos),
+    __4: (AirPos, Instruction<'input>, AirPos),
+    __5: (AirPos, Token<'input>, AirPos),
+) -> Instruction<'input>
+{
+    let __start0 = __4.2;
+    let __end0 = __5.0;
+    let __temp0 = __action108(
+        input,
+        errors,
+        validator,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action155(
+        input,
+        errors,
+        validator,
+        __0,
+        __1,
+        __2,
+        __3,
+        __4,
+        __temp0,
+        __5,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action167<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    __0: (AirPos, Token<'input>, AirPos),
+    __1: (AirPos, Token<'input>, AirPos),
+    __2: (AirPos, (&'input str, AirPos), AirPos),
+    __3: (AirPos, (&'input str, AirPos), AirPos),
+    __4: (AirPos, Instruction<'input>, AirPos),
+    __5: (AirPos, Instruction<'input>, AirPos),
+    __6: (AirPos, Token<'input>, AirPos),
+) -> Instruction<'input>
+{
+    let __start0 = __5.0;
+    let __end0 = __5.2;
+    let __temp0 = __action107(
+        input,
+        errors,
+        validator,
+        __5,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action156(
+        input,
+        errors,
+        validator,
+        __0,
+        __1,
+        __2,
+        __3,
+        __4,
+        __temp0,
+        __6,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action168<
+    'err,
+    'input,
+    'v,
+>(
+    input: &'input str,
+    errors: &'err mut Vec<ErrorRecovery<AirPos, Token<'input>, ParserError>>,
+    validator: &'v mut VariableValidator<'input>,
+    __0: (AirPos, Token<'input>, AirPos),
+    __1: (AirPos, Token<'input>, AirPos),
+    __2: (AirPos, (&'input str, AirPos), AirPos),
+    __3: (AirPos, (&'input str, AirPos), AirPos),
+    __4: (AirPos, Instruction<'input>, AirPos),
+    __5: (AirPos, Token<'input>, AirPos),
+) -> Instruction<'input>
+{
+    let __start0 = __4.2;
+    let __end0 = __5.0;
+    let __temp0 = __action108(
+        input,
+        errors,
+        validator,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action156(
+        input,
+        errors,
+        validator,
+        __0,
+        __1,
+        __2,
+        __3,
+        __4,
+        __temp0,
+        __5,
+    )
+}
+#[allow(clippy::type_complexity)]
+
+pub trait __ToTriple<'err, 'input, 'v, >
+{
+    fn to_triple(value: Self) -> Result<(AirPos,Token<'input>,AirPos), __lalrpop_util::ParseError<AirPos, Token<'input>, ParserError>>;
+}
+
+impl<'err, 'input, 'v, > __ToTriple<'err, 'input, 'v, > for (AirPos, Token<'input>, AirPos)
+{
+    fn to_triple(value: Self) -> Result<(AirPos,Token<'input>,AirPos), __lalrpop_util::ParseError<AirPos, Token<'input>, ParserError>> {
+        Ok(value)
+    }
+}
+impl<'err, 'input, 'v, > __ToTriple<'err, 'input, 'v, > for Result<(AirPos, Token<'input>, AirPos), ParserError>
+{
+    fn to_triple(value: Self) -> Result<(AirPos,Token<'input>,AirPos), __lalrpop_util::ParseError<AirPos, Token<'input>, ParserError>> {
+        match value {
+            Ok(v) => Ok(v),
+            Err(error) => Err(__lalrpop_util::ParseError::User { error }),
+        }
+    }
+}
+
\ No newline at end of file diff --git a/src/air_parser/parser/air_parser.rs.html b/src/air_parser/parser/air_parser.rs.html new file mode 100644 index 00000000..1de3926c --- /dev/null +++ b/src/air_parser/parser/air_parser.rs.html @@ -0,0 +1,257 @@ +air_parser.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::air;
+use super::lexer::AIRLexer;
+use super::lexer::AirPos;
+use super::lexer::Token;
+use super::ParserError;
+use crate::ast::Instruction;
+use crate::parser::VariableValidator;
+use air::AIRParser;
+
+use codespan_reporting::diagnostic::{Diagnostic, Label};
+use codespan_reporting::files::SimpleFiles;
+use codespan_reporting::term;
+use codespan_reporting::term::termcolor::{Buffer, ColorChoice, StandardStream};
+use lalrpop_util::{ErrorRecovery, ParseError};
+
+// caching parser to improve instantiation time
+thread_local!(static PARSER: AIRParser = AIRParser::new());
+
+/// Parse AIR `source_code` to `Box<Instruction>`
+#[tracing::instrument(skip_all)]
+pub fn parse(air_script: &str) -> Result<Instruction<'_>, String> {
+    let mut files = SimpleFiles::new();
+    let file_id = files.add("script.air", air_script);
+
+    PARSER.with(|parser| {
+        let mut errors: Vec<ErrorRecovery<AirPos, Token<'_>, ParserError>> = Vec::new();
+        let lexer = AIRLexer::new(air_script);
+        let mut validator = VariableValidator::new();
+        let result = parser.parse(air_script, &mut errors, &mut validator, lexer);
+
+        let validator_errors = validator.finalize();
+        errors.extend(validator_errors);
+
+        match result {
+            Ok(r) if errors.is_empty() => Ok(r),
+            Ok(_) => Err(report_errors(file_id, files, errors)),
+            Err(error) => Err(report_errors(
+                file_id,
+                files,
+                vec![ErrorRecovery {
+                    error,
+                    dropped_tokens: vec![],
+                }],
+            )),
+        }
+    })
+}
+
+fn report_errors(
+    file_id: usize,
+    files: SimpleFiles<&str, &str>,
+    errors: Vec<ErrorRecovery<AirPos, Token<'_>, ParserError>>,
+) -> String {
+    let labels = errors_to_labels(file_id, errors);
+    let diagnostic = Diagnostic::error().with_labels(labels);
+
+    // Write to stderr
+    let writer = StandardStream::stderr(ColorChoice::Auto);
+    let config = codespan_reporting::term::Config::default();
+    term::emit(&mut writer.lock(), &config, &files, &diagnostic).expect("term emit to stderr");
+
+    // Return as a string
+    let mut buffer = Buffer::no_color();
+    term::emit(&mut buffer, &config, &files, &diagnostic).expect("term emit to buffer");
+    String::from_utf8_lossy(buffer.as_slice())
+        .as_ref()
+        .to_string()
+}
+
+fn errors_to_labels(
+    file_id: usize,
+    errors: Vec<ErrorRecovery<AirPos, Token<'_>, ParserError>>,
+) -> Vec<Label<usize>> {
+    errors
+        .into_iter()
+        .map(|err| match err.error {
+            ParseError::UnrecognizedToken {
+                token: (start, _, end),
+                expected,
+            } => Label::primary(file_id, start.into()..end.into())
+                .with_message(format!("expected {}", pretty_expected(expected))),
+            ParseError::InvalidToken { location } => {
+                Label::primary(file_id, location.into()..(location + 1).into())
+                    .with_message("unexpected token")
+            }
+            ParseError::ExtraToken {
+                token: (start, _, end),
+            } => Label::primary(file_id, start.into()..end.into()).with_message("extra token"),
+            ParseError::UnrecognizedEof { location, expected } => {
+                Label::primary(file_id, location.into()..(location + 1).into())
+                    .with_message(format!("expected {}", pretty_expected(expected)))
+            }
+            ParseError::User { error } => parser_error_to_label(file_id, error),
+        })
+        .collect()
+}
+
+fn pretty_expected(expected: Vec<String>) -> String {
+    if expected.is_empty() {
+        "<nothing>".to_string()
+    } else {
+        expected.join(" or ")
+    }
+}
+
+fn parser_error_to_label(file_id: usize, error: ParserError) -> Label<usize> {
+    let span = error.span();
+    Label::primary(file_id, span.left.into()..span.right.into()).with_message(error.to_string())
+}
+
\ No newline at end of file diff --git a/src/air_parser/parser/air_utils/mod.rs.html b/src/air_parser/parser/air_utils/mod.rs.html new file mode 100644 index 00000000..510ed0af --- /dev/null +++ b/src/air_parser/parser/air_utils/mod.rs.html @@ -0,0 +1,67 @@ +mod.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#[macro_export]
+macro_rules! make_user_error(
+    ($error_type:ident, $start_pos: ident, $token:expr, $end_pos: ident) => { {
+        let error = $crate::parser::ParserError::$error_type($crate::parser::Span::new($start_pos, $end_pos));
+        let error = lalrpop_util::ParseError::User { error };
+
+        let dropped_tokens = vec![($start_pos, $token, $end_pos)];
+
+        ErrorRecovery {
+            error,
+            dropped_tokens,
+        }
+    }}
+);
+
\ No newline at end of file diff --git a/src/air_parser/parser/errors.rs.html b/src/air_parser/parser/errors.rs.html new file mode 100644 index 00000000..e3d35150 --- /dev/null +++ b/src/air_parser/parser/errors.rs.html @@ -0,0 +1,289 @@ +errors.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use crate::parser::lexer::LexerError;
+use crate::parser::Span;
+
+use thiserror::Error as ThisError;
+
+#[derive(ThisError, Debug, Clone, PartialEq, Eq)]
+pub enum ParserError {
+    #[error(transparent)]
+    LexerError(#[from] LexerError),
+
+    #[error("lambda can't be applied to streams in this position")]
+    LambdaAppliedToStream(Span),
+
+    #[error("variable '{variable_name}' wasn't defined")]
+    UndefinedVariable { span: Span, variable_name: String },
+
+    #[error("iterable '{variable_name}' wasn't defined")]
+    UndefinedIterable { span: Span, variable_name: String },
+
+    #[error("last error with non-empty path is ambiguous, please use just %last_error%")]
+    AmbiguousFailLastError(Span),
+
+    #[error("new can't be applied to a '{iterator_name}' because it's an iterator")]
+    IteratorRestrictionNotAllowed { span: Span, iterator_name: String },
+
+    #[error("multiple iterable values found for iterator name '{iterator_name}'")]
+    MultipleIterableValuesForOneIterator { span: Span, iterator_name: String },
+
+    #[error(
+        "multiple next instructions for iterator '{iterator_name}' found for one fold, that is prohibited"
+    )]
+    MultipleNextInFold { span: Span, iterator_name: String },
+
+    #[error("unsupported variable key type in (ap {ap_key_type} value {ap_result_name})")]
+    UnsupportedMapKeyType {
+        span: Span,
+        ap_key_type: String,
+        ap_result_name: String,
+    },
+
+    #[error("error code 0 with fail is unsupported")]
+    UnsupportedLiteralErrCodes { span: Span },
+
+    #[error("fold can not have instructions after next")]
+    FoldHasInstructionAfterNext(Span),
+}
+
+impl ParserError {
+    pub fn span(&self) -> Span {
+        match self {
+            Self::LexerError(lexer_error) => lexer_error.span(),
+            Self::LambdaAppliedToStream(span) => *span,
+            Self::UndefinedVariable { span, .. } => *span,
+            Self::UndefinedIterable { span, .. } => *span,
+            Self::AmbiguousFailLastError(span) => *span,
+            Self::IteratorRestrictionNotAllowed { span, .. } => *span,
+            Self::MultipleIterableValuesForOneIterator { span, .. } => *span,
+            Self::MultipleNextInFold { span, .. } => *span,
+            Self::UnsupportedMapKeyType { span, .. } => *span,
+            Self::UnsupportedLiteralErrCodes { span } => *span,
+            Self::FoldHasInstructionAfterNext(span) => *span,
+        }
+    }
+
+    pub fn undefined_variable(span: Span, variable_name: impl Into<String>) -> Self {
+        Self::UndefinedVariable {
+            span,
+            variable_name: variable_name.into(),
+        }
+    }
+
+    pub fn undefined_iterable(span: Span, variable_name: impl Into<String>) -> Self {
+        Self::UndefinedIterable {
+            span,
+            variable_name: variable_name.into(),
+        }
+    }
+
+    pub fn invalid_iterator_restriction(span: Span, iterator_name: impl Into<String>) -> Self {
+        Self::IteratorRestrictionNotAllowed {
+            span,
+            iterator_name: iterator_name.into(),
+        }
+    }
+
+    pub fn multiple_iterables(span: Span, iterator_name: impl Into<String>) -> Self {
+        Self::MultipleIterableValuesForOneIterator {
+            span,
+            iterator_name: iterator_name.into(),
+        }
+    }
+
+    pub fn multiple_next_in_fold(span: Span, iterator_name: impl Into<String>) -> Self {
+        Self::MultipleNextInFold {
+            span,
+            iterator_name: iterator_name.into(),
+        }
+    }
+
+    pub fn unsupported_map_key_type(
+        span: Span,
+        ap_key_type: impl Into<String>,
+        ap_result_name: impl Into<String>,
+    ) -> Self {
+        Self::UnsupportedMapKeyType {
+            span,
+            ap_key_type: ap_key_type.into(),
+            ap_result_name: ap_result_name.into(),
+        }
+    }
+
+    pub fn unsupported_literal_errcodes(span: Span) -> Self {
+        Self::UnsupportedLiteralErrCodes { span }
+    }
+
+    pub fn fold_has_instruction_after_next(span: Span) -> Self {
+        Self::FoldHasInstructionAfterNext(span)
+    }
+}
+
+impl From<std::convert::Infallible> for ParserError {
+    fn from(_: std::convert::Infallible) -> Self {
+        unreachable!()
+    }
+}
+
\ No newline at end of file diff --git a/src/air_parser/parser/lexer/air_lexer.rs.html b/src/air_parser/parser/lexer/air_lexer.rs.html new file mode 100644 index 00000000..35ef56b8 --- /dev/null +++ b/src/air_parser/parser/lexer/air_lexer.rs.html @@ -0,0 +1,541 @@ +air_lexer.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::errors::LexerError;
+use super::token::Token;
+use super::{AirPos, LexerResult};
+
+use std::iter::Peekable;
+use std::str::CharIndices;
+
+pub type Spanned<Token, Loc, Error> = Result<(Loc, Token, Loc), Error>;
+
+pub struct AIRLexer<'input> {
+    input: &'input str,
+    chars: Peekable<CharIndices<'input>>,
+}
+
+impl<'input> Iterator for AIRLexer<'input> {
+    type Item = Spanned<Token<'input>, AirPos, LexerError>;
+
+    fn next(&mut self) -> Option<Self::Item> {
+        self.next_token()
+    }
+}
+
+impl<'input> AIRLexer<'input> {
+    pub fn new(input: &'input str) -> Self {
+        Self {
+            input,
+            chars: input.char_indices().peekable(),
+        }
+    }
+
+    pub fn next_token(&mut self) -> Option<Spanned<Token<'input>, AirPos, LexerError>> {
+        while let Some((start_pos, ch)) = self.chars.next() {
+            let start_pos = AirPos::from(start_pos);
+            match ch {
+                '(' => return Some(Ok((start_pos, Token::OpenRoundBracket, start_pos + 1))),
+                ')' => return Some(Ok((start_pos, Token::CloseRoundBracket, start_pos + 1))),
+
+                '[' => return Some(Ok((start_pos, Token::OpenSquareBracket, start_pos + 1))),
+                ']' => return Some(Ok((start_pos, Token::CloseSquareBracket, start_pos + 1))),
+
+                ';' => self.skip_comment(),
+
+                ch if ch.is_whitespace() => {}
+
+                '"' => return self.tokenize_string_literal(start_pos),
+
+                _ => return self.tokenize_string(start_pos, false),
+            }
+        }
+
+        None
+    }
+
+    fn skip_comment(&mut self) {
+        const NEW_LINE: char = '\n'; // TODO: consider '\n\r'
+
+        for (_, ch) in &mut self.chars {
+            if ch == NEW_LINE {
+                break;
+            }
+        }
+    }
+
+    #[allow(clippy::unnecessary_wraps)]
+    fn tokenize_string_literal(
+        &mut self,
+        start_pos: AirPos,
+    ) -> Option<Spanned<Token<'input>, AirPos, LexerError>> {
+        for (pos, ch) in &mut self.chars {
+            let pos = AirPos::from(pos);
+            if ch == '"' {
+                // + 1 to count an open double quote
+                let string_size = pos - start_pos + 1;
+
+                return Some(Ok((
+                    start_pos,
+                    Token::StringLiteral(&self.input[(start_pos + 1).into()..pos.into()]),
+                    start_pos + string_size,
+                )));
+            }
+        }
+
+        Some(Err(LexerError::unclosed_quote(
+            start_pos..self.input.len().into(),
+        )))
+    }
+
+    #[allow(clippy::unnecessary_wraps)]
+    fn tokenize_string(
+        &mut self,
+        start_pos: AirPos,
+        open_square_bracket_met: bool,
+    ) -> Option<Spanned<Token<'input>, AirPos, LexerError>> {
+        let end_pos = self.advance_to_token_end(start_pos, open_square_bracket_met);
+
+        // this slicing is safe here because borders come from the chars iterator
+        let token_str = &self.input[start_pos.into()..end_pos.into()];
+
+        let token = match string_to_token(token_str, start_pos) {
+            Ok(token) => token,
+            Err(e) => return Some(Err(e)),
+        };
+
+        let token_str_len = end_pos - start_pos;
+        Some(Ok((start_pos, token, start_pos + token_str_len)))
+    }
+
+    fn advance_to_token_end(&mut self, start_pos: AirPos, square_met: bool) -> AirPos {
+        let mut end_pos = start_pos;
+        let mut round_brackets_balance: i64 = 0;
+        let mut square_brackets_balance = i64::from(square_met);
+
+        while let Some((pos, ch)) = self.chars.peek() {
+            end_pos = (*pos).into();
+            let ch = *ch;
+
+            update_brackets_count(
+                ch,
+                &mut round_brackets_balance,
+                &mut square_brackets_balance,
+            );
+
+            if should_stop(ch, round_brackets_balance, square_brackets_balance) {
+                break;
+            }
+
+            self.chars.next();
+        }
+
+        self.advance_end_pos(&mut end_pos);
+        end_pos
+    }
+
+    // if it was the last char, advance the end position.
+    fn advance_end_pos(&mut self, end_pos: &mut AirPos) {
+        if self.chars.peek().is_none() {
+            *end_pos = self.input.len().into();
+        }
+    }
+}
+
+fn update_brackets_count(
+    ch: char,
+    round_brackets_balance: &mut i64,
+    square_brackets_balance: &mut i64,
+) {
+    if ch == '(' {
+        *round_brackets_balance += 1;
+    } else if ch == ')' {
+        *round_brackets_balance -= 1;
+    } else if ch == '[' {
+        *square_brackets_balance += 1;
+    } else if ch == ']' {
+        *square_brackets_balance -= 1;
+    }
+}
+
+fn should_stop(ch: char, round_brackets_balance: i64, open_square_brackets_balance: i64) -> bool {
+    ch.is_whitespace() || round_brackets_balance < 0 || open_square_brackets_balance < 0
+}
+
+fn string_to_token(input: &str, start_pos: AirPos) -> LexerResult<Token> {
+    match input {
+        "" => Err(LexerError::empty_string(start_pos..start_pos)),
+
+        CALL_INSTR => Ok(Token::Call),
+        CANON_INSTR => Ok(Token::Canon),
+        AP_INSTR => Ok(Token::Ap),
+        SEQ_INSTR => Ok(Token::Seq),
+        PAR_INSTR => Ok(Token::Par),
+        FAIL_INSTR => Ok(Token::Fail),
+        FOLD_INSTR => Ok(Token::Fold),
+        XOR_INSTR => Ok(Token::Xor),
+        NEVER_INSTR => Ok(Token::Never),
+        NEW_INSTR => Ok(Token::New),
+        NEXT_INSTR => Ok(Token::Next),
+        NULL_INSTR => Ok(Token::Null),
+        MATCH_INSTR => Ok(Token::Match),
+        MISMATCH_INSTR => Ok(Token::MisMatch),
+
+        INIT_PEER_ID => Ok(Token::InitPeerId),
+        _ if input.starts_with(ERROR) => parse_error(input, start_pos, ERROR, Token::Error),
+        _ if input.starts_with(LAST_ERROR) => {
+            parse_error(input, start_pos, LAST_ERROR, Token::LastError)
+        }
+        TIMESTAMP => Ok(Token::Timestamp),
+        TTL => Ok(Token::TTL),
+
+        TRUE_VALUE => Ok(Token::Boolean(true)),
+        FALSE_VALUE => Ok(Token::Boolean(false)),
+
+        str => super::call_variable_parser::try_parse_call_variable(str, start_pos),
+    }
+}
+
+fn parse_error<'input>(
+    input: &'input str,
+    start_pos: AirPos,
+    token_str: &str,
+    token_wo_lens: Token<'static>,
+) -> LexerResult<Token<'input>> {
+    let token_wo_lens_len = token_str.len();
+
+    if input.len() == token_wo_lens_len {
+        return Ok(token_wo_lens);
+    }
+
+    if input.len() <= token_wo_lens_len {
+        return Err(LexerError::lambda_parser_error(
+            start_pos + token_wo_lens_len..start_pos + input.len(),
+            "lambda AST applied to last error has not enough size",
+        ));
+    }
+
+    let last_error_accessor = crate::parse_lambda(&input[token_wo_lens_len..]).map_err(|e| {
+        LexerError::lambda_parser_error(
+            start_pos + token_wo_lens_len..start_pos + input.len(),
+            e.to_string(),
+        )
+    })?;
+
+    match token_wo_lens {
+        Token::Error => Ok(Token::ErrorWithLambda(last_error_accessor)),
+        Token::LastError => Ok(Token::LastErrorWithLambda(last_error_accessor)),
+        _ => unreachable!(),
+    }
+}
+
+const CALL_INSTR: &str = "call";
+const CANON_INSTR: &str = "canon";
+const AP_INSTR: &str = "ap";
+const SEQ_INSTR: &str = "seq";
+const PAR_INSTR: &str = "par";
+const FAIL_INSTR: &str = "fail";
+const FOLD_INSTR: &str = "fold";
+const XOR_INSTR: &str = "xor";
+const NEVER_INSTR: &str = "never";
+const NEW_INSTR: &str = "new";
+const NEXT_INSTR: &str = "next";
+const NULL_INSTR: &str = "null";
+const MATCH_INSTR: &str = "match";
+const MISMATCH_INSTR: &str = "mismatch";
+
+const INIT_PEER_ID: &str = "%init_peer_id%";
+pub(crate) const LAST_ERROR: &str = "%last_error%";
+pub(crate) const ERROR: &str = ":error:";
+const TIMESTAMP: &str = "%timestamp%";
+const TTL: &str = "%ttl%";
+
+const TRUE_VALUE: &str = "true";
+const FALSE_VALUE: &str = "false";
+
\ No newline at end of file diff --git a/src/air_parser/parser/lexer/call_variable_parser.rs.html b/src/air_parser/parser/lexer/call_variable_parser.rs.html new file mode 100644 index 00000000..0518a1e8 --- /dev/null +++ b/src/air_parser/parser/lexer/call_variable_parser.rs.html @@ -0,0 +1,905 @@ +call_variable_parser.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
+334
+335
+336
+337
+338
+339
+340
+341
+342
+343
+344
+345
+346
+347
+348
+349
+350
+351
+352
+353
+354
+355
+356
+357
+358
+359
+360
+361
+362
+363
+364
+365
+366
+367
+368
+369
+370
+371
+372
+373
+374
+375
+376
+377
+378
+379
+380
+381
+382
+383
+384
+385
+386
+387
+388
+389
+390
+391
+392
+393
+394
+395
+396
+397
+398
+399
+400
+401
+402
+403
+404
+405
+406
+407
+408
+409
+410
+411
+412
+413
+414
+415
+416
+417
+418
+419
+420
+421
+422
+423
+424
+425
+426
+427
+428
+429
+430
+431
+432
+433
+434
+435
+436
+437
+438
+439
+440
+441
+442
+443
+444
+445
+446
+447
+448
+449
+450
+451
+452
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::AirPos;
+use super::LexerError;
+use super::LexerResult;
+use super::Token;
+use crate::LambdaAST;
+
+use std::iter::Peekable;
+use std::str::CharIndices;
+
+pub(super) fn try_parse_call_variable(
+    string_to_parse: &str,
+    start_pos: AirPos,
+) -> LexerResult<Token<'_>> {
+    CallVariableParser::try_parse(string_to_parse, start_pos)
+}
+
+#[derive(Debug, Clone, Copy, PartialEq, Eq)]
+enum MetTag {
+    None,
+    Stream,
+    StreamMap,
+    Canon,
+    CanonStream,
+    CanonStreamMap,
+}
+
+#[derive(Debug)]
+struct ParserState {
+    first_dot_met_pos: Option<usize>,
+    non_numeric_met: bool,
+    digit_met: bool,
+    flattening_met: bool,
+    met_tag: MetTag,
+    is_first_char: bool,
+    current_char: char,
+    current_offset: usize,
+}
+
+struct CallVariableParser<'input> {
+    string_to_parse_iter: Peekable<CharIndices<'input>>,
+    string_to_parse: &'input str,
+    start_pos: AirPos,
+    state: ParserState,
+}
+
+impl<'input> CallVariableParser<'input> {
+    fn new(string_to_parse: &'input str, start_pos: AirPos) -> LexerResult<Self> {
+        let mut string_to_parse_iter = string_to_parse.char_indices().peekable();
+        let (current_offset, current_char) = match string_to_parse_iter.next() {
+            Some(pos_and_ch) => pos_and_ch,
+            None => return Err(LexerError::empty_variable_or_const(start_pos..start_pos)),
+        };
+
+        let state = ParserState {
+            first_dot_met_pos: None,
+            non_numeric_met: false,
+            digit_met: false,
+            flattening_met: false,
+            is_first_char: true,
+            met_tag: MetTag::None,
+            current_char,
+            current_offset,
+        };
+
+        let parser = Self {
+            string_to_parse_iter,
+            string_to_parse,
+            start_pos,
+            state,
+        };
+
+        Ok(parser)
+    }
+
+    fn try_parse(string_to_parse: &'input str, start_pos: AirPos) -> LexerResult<Token<'input>> {
+        let mut parser = Self::new(string_to_parse, start_pos)?;
+
+        loop {
+            if parser.is_possible_to_parse_as_number() {
+                parser.try_parse_as_number()?;
+            } else {
+                parser.try_parse_as_variable()?;
+            }
+
+            if !parser.next_char() {
+                break;
+            }
+        }
+
+        parser.to_token()
+    }
+
+    fn next_char(&mut self) -> bool {
+        let (pos, ch) = match self.string_to_parse_iter.next() {
+            Some(pos_and_ch) => pos_and_ch,
+            None => return false,
+        };
+
+        self.state.current_char = ch;
+        self.state.current_offset = pos;
+        self.state.is_first_char = false;
+
+        true
+    }
+
+    fn is_possible_to_parse_as_number(&self) -> bool {
+        !self.state.non_numeric_met
+    }
+
+    fn try_parse_as_number(&mut self) -> LexerResult<()> {
+        if self.try_parse_as_sign() || self.try_parse_as_digit() || self.try_parse_as_float_dot()? {
+            return Ok(());
+        }
+
+        self.handle_non_digit()
+    }
+
+    fn try_parse_as_sign(&self) -> bool {
+        let ch = self.current_char();
+        self.state.is_first_char && (ch == '-' || ch == '+')
+    }
+
+    fn try_parse_as_digit(&mut self) -> bool {
+        if self.current_char().is_numeric() {
+            self.state.digit_met = true;
+            return true;
+        }
+
+        false
+    }
+
+    fn try_parse_as_float_dot(&mut self) -> LexerResult<bool> {
+        let is_first_dot = self.try_parse_first_met_dot()?;
+
+        // filter out +.12 -.2315 variants
+        if is_first_dot && !self.state.digit_met {
+            let error_pos = self.pos_in_string_to_parse();
+            return Err(LexerError::leading_dot(error_pos..error_pos));
+        }
+
+        Ok(is_first_dot)
+    }
+
+    fn handle_non_digit(&mut self) -> LexerResult<()> {
+        self.check_fallback_to_variable()?;
+
+        self.state.non_numeric_met = true;
+        self.try_parse_as_variable()
+    }
+
+    fn check_fallback_to_variable(&self) -> LexerResult<()> {
+        if self.dot_met() {
+            let error_pos = self.pos_in_string_to_parse();
+            return Err(LexerError::unallowed_char_in_number(error_pos..error_pos));
+        }
+
+        Ok(())
+    }
+
+    fn try_parse_as_variable(&mut self) -> LexerResult<()> {
+        if self.try_parse_as_canon()?
+            || self.try_parse_as_stream()?
+            || self.try_parse_as_lens_start()?
+        {
+            return Ok(());
+        } else if self.is_lens_started() {
+            self.try_parse_as_lens()?;
+        } else {
+            self.try_parse_as_alphanumeric()?;
+        }
+
+        Ok(())
+    }
+
+    fn try_parse_as_stream(&mut self) -> LexerResult<bool> {
+        let tag = MetTag::from_tag(self.current_char());
+        if self.current_offset() == 0 && tag.is_tag() {
+            if self.string_to_parse.len() == 1 {
+                let error_pos = self.pos_in_string_to_parse();
+                return Err(LexerError::empty_tagged_name(error_pos..error_pos));
+            }
+
+            self.state.met_tag = tag;
+            return Ok(true);
+        }
+
+        Ok(false)
+    }
+
+    fn try_parse_as_canon(&mut self) -> LexerResult<bool> {
+        let tag = self.state.met_tag.deduce_tag(self.current_char());
+
+        if self.current_offset() == 1 && tag.is_canon_type() {
+            if self.string_to_parse.len() == 2 && tag.is_tag() {
+                let error_pos = self.pos_in_string_to_parse();
+                return Err(LexerError::empty_canon_name(error_pos..error_pos));
+            }
+
+            self.state.met_tag = tag;
+            return Ok(true);
+        }
+
+        Ok(false)
+    }
+
+    fn try_parse_as_lens_start(&mut self) -> LexerResult<bool> {
+        self.try_parse_first_met_dot()
+    }
+
+    fn try_parse_as_alphanumeric(&self) -> LexerResult<()> {
+        if !self.air_alphanumeric() {
+            let error_pos = self.pos_in_string_to_parse();
+            return Err(LexerError::is_not_alphanumeric(error_pos..error_pos));
+        }
+
+        Ok(())
+    }
+
+    fn try_parse_as_lens(&mut self) -> LexerResult<()> {
+        if !self.lens_allowed_char() && !self.try_parse_as_flattening() {
+            let error_pos = self.pos_in_string_to_parse();
+            return Err(LexerError::invalid_lambda(error_pos..error_pos));
+        }
+
+        Ok(())
+    }
+
+    fn try_parse_as_flattening(&mut self) -> bool {
+        if self.is_last_char() && self.current_char() == '!' {
+            self.state.flattening_met = true;
+            return true;
+        }
+
+        false
+    }
+
+    fn try_parse_first_met_dot(&mut self) -> LexerResult<bool> {
+        if !self.dot_met() && self.current_char() == '.' {
+            if self.current_offset() == 0 {
+                return Err(LexerError::leading_dot(
+                    self.start_pos..self.pos_in_string_to_parse(),
+                ));
+            } else if self.state.met_tag.is_tag() && self.current_offset() <= 2 {
+                let prev_pos = self.pos_in_string_to_parse() - 1;
+                return Err(LexerError::empty_canon_name(prev_pos..prev_pos));
+            }
+            self.state.first_dot_met_pos = Some(self.current_offset());
+            return Ok(true);
+        }
+
+        Ok(false)
+    }
+
+    fn is_lens_started(&self) -> bool {
+        self.dot_met()
+    }
+
+    fn dot_met(&self) -> bool {
+        self.state.first_dot_met_pos.is_some()
+    }
+
+    fn air_alphanumeric(&self) -> bool {
+        super::is_air_alphanumeric(self.current_char())
+    }
+
+    fn lens_allowed_char(&self) -> bool {
+        super::is_lens_allowed_char(self.current_char())
+    }
+
+    fn pos_in_string_to_parse(&self) -> AirPos {
+        self.start_pos + self.current_offset()
+    }
+
+    fn current_offset(&self) -> usize {
+        self.state.current_offset
+    }
+
+    fn current_char(&self) -> char {
+        self.state.current_char
+    }
+
+    fn is_last_char(&self) -> bool {
+        self.current_offset() == self.string_to_parse.len() - 1
+    }
+
+    fn to_variable_token<'v>(&self, name: &'v str) -> Token<'v> {
+        match self.state.met_tag {
+            MetTag::None => Token::Scalar {
+                name,
+                position: self.start_pos,
+            },
+            MetTag::Stream => Token::Stream {
+                name,
+                position: self.start_pos,
+            },
+            MetTag::CanonStream | MetTag::Canon => Token::CanonStream {
+                name,
+                position: self.start_pos,
+            },
+            MetTag::CanonStreamMap => Token::CanonStreamMap {
+                name,
+                position: self.start_pos,
+            },
+            MetTag::StreamMap => Token::StreamMap {
+                name,
+                position: self.start_pos,
+            },
+        }
+    }
+
+    fn to_variable_token_with_lambda<'v>(&self, name: &'v str, lambda: LambdaAST<'v>) -> Token<'v> {
+        match self.state.met_tag {
+            MetTag::None => Token::ScalarWithLambda {
+                name,
+                lambda,
+                position: self.start_pos,
+            },
+            MetTag::Stream => Token::StreamWithLambda {
+                name,
+                lambda,
+                position: self.start_pos,
+            },
+            MetTag::CanonStream | MetTag::Canon => Token::CanonStreamWithLambda {
+                name,
+                lambda,
+                position: self.start_pos,
+            },
+            MetTag::CanonStreamMap => Token::CanonStreamMapWithLambda {
+                name,
+                lambda,
+                position: self.start_pos,
+            },
+            MetTag::StreamMap => Token::StreamMapWithLambda {
+                name,
+                lambda,
+                position: self.start_pos,
+            },
+        }
+    }
+
+    fn try_to_variable_and_lambda(&self, lambda_start_offset: usize) -> LexerResult<Token<'input>> {
+        let lambda =
+            crate::parse_lambda(&self.string_to_parse[lambda_start_offset..]).map_err(|e| {
+                LexerError::lambda_parser_error(
+                    self.start_pos + lambda_start_offset
+                        ..self.start_pos + self.string_to_parse.len(),
+                    e.to_string(),
+                )
+            })?;
+
+        let token = self
+            .to_variable_token_with_lambda(&self.string_to_parse[0..lambda_start_offset], lambda);
+        Ok(token)
+    }
+
+    fn try_to_i64(&self) -> LexerResult<Token<'input>> {
+        let raw_value = self.string_to_parse;
+        let number = raw_value.parse::<i64>().map_err(|e| {
+            let start_pos = self.start_pos;
+            LexerError::parse_int_error(start_pos..start_pos + raw_value.len(), e)
+        })?;
+
+        let token = Token::I64(number);
+        Ok(token)
+    }
+
+    fn try_to_f64(&self) -> LexerResult<Token<'input>> {
+        // safe threshold for floating-point numbers to obtain determinism
+        const SAFE_FLOAT_SIGNIFICAND_SIZE: usize = 11;
+
+        let raw_value = self.string_to_parse;
+        let start_pos = self.start_pos;
+        if raw_value.len() > SAFE_FLOAT_SIGNIFICAND_SIZE {
+            return Err(LexerError::too_big_float(
+                start_pos..start_pos + raw_value.len(),
+            ));
+        }
+
+        let number = raw_value.parse::<f64>().map_err(|e| {
+            LexerError::parse_float_error(start_pos..start_pos + raw_value.len(), e)
+        })?;
+
+        let token = Token::F64(number);
+        Ok(token)
+    }
+
+    fn to_token(&self) -> LexerResult<Token<'input>> {
+        let is_number = self.is_possible_to_parse_as_number();
+        match (is_number, self.state.first_dot_met_pos) {
+            (true, None) => self.try_to_i64(),
+            (true, Some(_)) => self.try_to_f64(),
+            (false, None) => Ok(self.to_variable_token(self.string_to_parse)),
+            (false, Some(lambda_start_offset)) => {
+                self.try_to_variable_and_lambda(lambda_start_offset)
+            }
+        }
+    }
+}
+
+/// There are two kinds of tags ATM, namely tag and canon tag.
+/// Tag defines the first level and comes first in a variable name, e.g. $stream.
+/// Canon tag is the only tag that ATM defines the second level.
+/// Canon tag comes second in a variable name, e.g. #$canon_stream.
+impl MetTag {
+    fn from_tag(tag: char) -> Self {
+        match tag {
+            '$' => Self::Stream,
+            '#' => Self::Canon,
+            '%' => Self::StreamMap,
+            _ => Self::None,
+        }
+    }
+
+    fn deduce_tag(&self, tag: char) -> Self {
+        match tag {
+            '$' if self.is_canon() => Self::CanonStream,
+            '%' => Self::CanonStreamMap,
+            _ => self.to_owned(),
+        }
+    }
+
+    fn is_canon(&self) -> bool {
+        *self == Self::Canon
+    }
+
+    fn is_canon_type(&self) -> bool {
+        *self == Self::CanonStream || *self == Self::CanonStreamMap
+    }
+
+    fn is_tag(&self) -> bool {
+        *self != Self::None
+    }
+}
+
\ No newline at end of file diff --git a/src/air_parser/parser/lexer/errors.rs.html b/src/air_parser/parser/lexer/errors.rs.html new file mode 100644 index 00000000..5102c425 --- /dev/null +++ b/src/air_parser/parser/lexer/errors.rs.html @@ -0,0 +1,389 @@ +errors.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::AirPos;
+use crate::parser::Span;
+
+use thiserror::Error as ThisError;
+
+use std::num::ParseFloatError;
+use std::num::ParseIntError;
+use std::ops::Range;
+
+#[derive(ThisError, Debug, Clone, PartialEq, Eq)]
+pub enum LexerError {
+    #[error("this string literal has unclosed quote")]
+    UnclosedQuote(Span),
+
+    #[error("empty string aren't allowed in this position")]
+    EmptyString(Span),
+
+    #[error("only alphanumeric, '_', and '-' characters are allowed in this position")]
+    IsNotAlphanumeric(Span),
+
+    #[error("a tagged name should be non empty")]
+    EmptyTaggedName(Span),
+
+    #[error("a canon name should be non empty")]
+    EmptyCanonName(Span),
+
+    #[error("this variable or constant shouldn't have empty name")]
+    EmptyVariableOrConst(Span),
+
+    #[error("invalid character in lambda")]
+    InvalidLambda(Span),
+
+    #[error("a digit could contain only digits or one dot")]
+    UnallowedCharInNumber(Span),
+
+    #[error("{1}")]
+    ParseIntError(Span, #[source] ParseIntError),
+
+    #[error("{1}")]
+    ParseFloatError(Span, #[source] ParseFloatError),
+
+    // TODO: use LambdaParserError directly here (it'll require introducing a lifetime)
+    #[error("{se_lambda_parser_error}")]
+    LambdaParserError {
+        span: Span,
+        se_lambda_parser_error: String,
+    },
+
+    #[error("{error_path} is an incorrect path for %last_error%, only .$.instruction, .$.msg, and .$.peer_id are allowed")]
+    LastErrorPathError { span: Span, error_path: String },
+
+    #[error("this float is too big, a float could contain less than 12 digits")]
+    TooBigFloat(Span),
+
+    #[error("leading dot without any symbols before - please write 0 if it's float or variable name if it's a lambda")]
+    LeadingDot(Span),
+}
+
+impl LexerError {
+    pub fn span(&self) -> Span {
+        let span = match self {
+            Self::UnclosedQuote(span) => span,
+            Self::EmptyString(span) => span,
+            Self::IsNotAlphanumeric(span) => span,
+            Self::EmptyTaggedName(span) => span,
+            Self::EmptyCanonName(span) => span,
+            Self::EmptyVariableOrConst(span) => span,
+            Self::InvalidLambda(span) => span,
+            Self::UnallowedCharInNumber(span) => span,
+            Self::ParseIntError(span, _) => span,
+            Self::ParseFloatError(span, _) => span,
+            Self::LambdaParserError { span, .. } => span,
+            Self::LastErrorPathError { span, .. } => span,
+            Self::TooBigFloat(span) => span,
+            Self::LeadingDot(span) => span,
+        };
+
+        *span
+    }
+
+    pub fn unclosed_quote(range: Range<AirPos>) -> Self {
+        Self::UnclosedQuote(range.into())
+    }
+
+    pub fn empty_string(range: Range<AirPos>) -> Self {
+        Self::EmptyString(range.into())
+    }
+
+    pub fn is_not_alphanumeric(range: Range<AirPos>) -> Self {
+        Self::IsNotAlphanumeric(range.into())
+    }
+
+    pub fn empty_tagged_name(range: Range<AirPos>) -> Self {
+        Self::EmptyTaggedName(range.into())
+    }
+
+    pub fn empty_canon_name(range: Range<AirPos>) -> Self {
+        Self::EmptyCanonName(range.into())
+    }
+
+    pub fn empty_variable_or_const(range: Range<AirPos>) -> Self {
+        Self::EmptyVariableOrConst(range.into())
+    }
+
+    pub fn invalid_lambda(range: Range<AirPos>) -> Self {
+        Self::InvalidLambda(range.into())
+    }
+
+    pub fn unallowed_char_in_number(range: Range<AirPos>) -> Self {
+        Self::UnallowedCharInNumber(range.into())
+    }
+
+    pub fn parse_int_error(range: Range<AirPos>, parse_int_error: ParseIntError) -> Self {
+        Self::ParseIntError(range.into(), parse_int_error)
+    }
+
+    pub fn parse_float_error(range: Range<AirPos>, parse_float_error: ParseFloatError) -> Self {
+        Self::ParseFloatError(range.into(), parse_float_error)
+    }
+
+    pub fn lambda_parser_error(
+        range: Range<AirPos>,
+        se_lambda_parser_error: impl Into<String>,
+    ) -> Self {
+        Self::LambdaParserError {
+            span: range.into(),
+            se_lambda_parser_error: se_lambda_parser_error.into(),
+        }
+    }
+
+    pub fn last_error_path_error(range: Range<AirPos>, error_path: String) -> Self {
+        Self::LastErrorPathError {
+            span: range.into(),
+            error_path,
+        }
+    }
+
+    pub fn too_big_float(range: Range<AirPos>) -> Self {
+        Self::TooBigFloat(range.into())
+    }
+
+    pub fn leading_dot(range: Range<AirPos>) -> Self {
+        Self::LeadingDot(range.into())
+    }
+}
+
+use super::Token;
+use crate::parser::air::__ToTriple;
+use crate::parser::ParserError;
+
+impl<'err, 'input, 'i> __ToTriple<'err, 'input, 'i>
+    for Result<(AirPos, Token<'input>, AirPos), LexerError>
+{
+    #[allow(clippy::wrong_self_convention)]
+    fn to_triple(
+        value: Self,
+    ) -> Result<
+        (AirPos, Token<'input>, AirPos),
+        lalrpop_util::ParseError<AirPos, Token<'input>, ParserError>,
+    > {
+        match value {
+            Ok(v) => Ok(v),
+            Err(error) => {
+                let error = ParserError::LexerError(error);
+                Err(lalrpop_util::ParseError::User { error })
+            }
+        }
+    }
+}
+
+impl From<std::convert::Infallible> for LexerError {
+    fn from(_: std::convert::Infallible) -> Self {
+        unreachable!()
+    }
+}
+
\ No newline at end of file diff --git a/src/air_parser/parser/lexer/mod.rs.html b/src/air_parser/parser/lexer/mod.rs.html new file mode 100644 index 00000000..70537ead --- /dev/null +++ b/src/air_parser/parser/lexer/mod.rs.html @@ -0,0 +1,81 @@ +mod.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+mod air_lexer;
+mod call_variable_parser;
+mod errors;
+mod token;
+mod utils;
+
+#[cfg(test)]
+mod tests;
+pub mod text_pos;
+
+pub use air_lexer::AIRLexer;
+pub(crate) use air_lexer::ERROR;
+pub(crate) use air_lexer::LAST_ERROR;
+pub use errors::LexerError;
+pub use text_pos::AirPos;
+pub use token::Token;
+
+pub(super) type LexerResult<T> = std::result::Result<T, LexerError>;
+
+use utils::is_air_alphanumeric;
+use utils::is_lens_allowed_char;
+
\ No newline at end of file diff --git a/src/air_parser/parser/lexer/text_pos.rs.html b/src/air_parser/parser/lexer/text_pos.rs.html new file mode 100644 index 00000000..fa0d84b4 --- /dev/null +++ b/src/air_parser/parser/lexer/text_pos.rs.html @@ -0,0 +1,157 @@ +text_pos.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use std::ops::{Add, Sub};
+
+use serde::{Deserialize, Serialize};
+
+/// Character position in the AIR script text.
+#[derive(
+    Clone, Copy, Debug, Default, Hash, PartialEq, Eq, Serialize, Deserialize, PartialOrd, Ord,
+)]
+#[serde(transparent)]
+#[repr(transparent)]
+pub struct AirPos(usize);
+
+impl From<usize> for AirPos {
+    fn from(value: usize) -> Self {
+        Self(value)
+    }
+}
+
+impl From<AirPos> for usize {
+    fn from(p: AirPos) -> Self {
+        p.0
+    }
+}
+
+impl Add<usize> for AirPos {
+    type Output = Self;
+
+    fn add(self, rhs: usize) -> Self::Output {
+        Self(self.0 + rhs)
+    }
+}
+
+impl Sub<usize> for AirPos {
+    type Output = AirPos;
+
+    fn sub(self, rhs: usize) -> Self::Output {
+        Self(self.0 - rhs)
+    }
+}
+
+impl Sub<AirPos> for AirPos {
+    type Output = usize;
+
+    fn sub(self, rhs: AirPos) -> Self::Output {
+        self.0 - rhs.0
+    }
+}
+
+impl PartialEq<usize> for AirPos {
+    fn eq(&self, other: &usize) -> bool {
+        self.0 == *other
+    }
+}
+
+impl std::fmt::Display for AirPos {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        std::fmt::Display::fmt(&self.0, f)
+    }
+}
+
\ No newline at end of file diff --git a/src/air_parser/parser/lexer/token.rs.html b/src/air_parser/parser/lexer/token.rs.html new file mode 100644 index 00000000..debb2015 --- /dev/null +++ b/src/air_parser/parser/lexer/token.rs.html @@ -0,0 +1,215 @@ +token.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::AirPos;
+use crate::LambdaAST;
+
+use serde::Deserialize;
+use serde::Serialize;
+
+#[allow(clippy::upper_case_acronyms)]
+#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
+pub enum Token<'input> {
+    OpenRoundBracket,
+    CloseRoundBracket,
+    OpenSquareBracket,
+    CloseSquareBracket,
+
+    Scalar {
+        name: &'input str,
+        position: AirPos,
+    },
+    ScalarWithLambda {
+        name: &'input str,
+        lambda: LambdaAST<'input>,
+        position: AirPos,
+    },
+    Stream {
+        name: &'input str,
+        position: AirPos,
+    },
+    StreamWithLambda {
+        name: &'input str,
+        lambda: LambdaAST<'input>,
+        position: AirPos,
+    },
+    StreamMapWithLambda {
+        name: &'input str,
+        lambda: LambdaAST<'input>,
+        position: AirPos,
+    },
+    CanonStream {
+        name: &'input str,
+        position: AirPos,
+    },
+    CanonStreamWithLambda {
+        name: &'input str,
+        lambda: LambdaAST<'input>,
+        position: AirPos,
+    },
+    StreamMap {
+        name: &'input str,
+        position: AirPos,
+    },
+    CanonStreamMap {
+        name: &'input str,
+        position: AirPos,
+    },
+    CanonStreamMapWithLambda {
+        name: &'input str,
+        lambda: LambdaAST<'input>,
+        position: AirPos,
+    },
+
+    StringLiteral(&'input str),
+    I64(i64),
+    F64(f64),
+    Boolean(bool),
+
+    InitPeerId,
+    LastError,
+    Error,
+    LastErrorWithLambda(LambdaAST<'input>),
+    ErrorWithLambda(LambdaAST<'input>),
+    Timestamp,
+    TTL,
+
+    Call,
+    Canon,
+    Ap,
+    Seq,
+    Par,
+    Fail,
+    Fold,
+    Xor,
+    Never,
+    New,
+    Next,
+    Null,
+    Match,
+    MisMatch,
+}
+
\ No newline at end of file diff --git a/src/air_parser/parser/lexer/utils.rs.html b/src/air_parser/parser/lexer/utils.rs.html new file mode 100644 index 00000000..3d9efc6f --- /dev/null +++ b/src/air_parser/parser/lexer/utils.rs.html @@ -0,0 +1,85 @@ +utils.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+pub(super) fn is_air_alphanumeric(ch: char) -> bool {
+    ch.is_alphanumeric() || ch == '_' || ch == '-'
+}
+
+pub(super) fn is_lens_allowed_char(ch: char) -> bool {
+    // good old switch faster here than hash set
+    match ch {
+        '$' => true,
+        '@' => true,
+        '[' => true,
+        ']' => true,
+        '(' => true,
+        ')' => true,
+        ':' => true,
+        '?' => true,
+        '.' => true,
+        '*' => true,
+        ',' => true,
+        '"' => true,
+        '\'' => true,
+        ch => is_air_alphanumeric(ch),
+    }
+}
+
\ No newline at end of file diff --git a/src/air_parser/parser/mod.rs.html b/src/air_parser/parser/mod.rs.html new file mode 100644 index 00000000..470b6b3f --- /dev/null +++ b/src/air_parser/parser/mod.rs.html @@ -0,0 +1,89 @@ +mod.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+pub mod air_parser;
+mod air_utils;
+pub(crate) mod lexer;
+mod span;
+
+// air is auto-generated, so exclude it from `cargo fmt -- --check` and `cargo clippy`
+#[rustfmt::skip]
+#[allow(clippy::all)]
+mod air;
+
+mod errors;
+mod validator;
+
+#[cfg(test)]
+pub mod tests;
+
+pub use self::air_parser::parse;
+pub use air::AIRParser;
+pub use lexer::AIRLexer;
+pub(crate) use lexer::ERROR;
+pub(crate) use lexer::LAST_ERROR;
+pub use span::Span;
+pub use validator::VariableValidator;
+
+use errors::ParserError;
+
\ No newline at end of file diff --git a/src/air_parser/parser/span.rs.html b/src/air_parser/parser/span.rs.html new file mode 100644 index 00000000..140bd62e --- /dev/null +++ b/src/air_parser/parser/span.rs.html @@ -0,0 +1,155 @@ +span.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::lexer::AirPos;
+
+use serde::Deserialize;
+use serde::Serialize;
+
+use std::ops::Range;
+
+#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
+pub struct Span {
+    pub left: AirPos,
+    pub right: AirPos,
+}
+
+impl Span {
+    pub fn new(left: AirPos, right: AirPos) -> Self {
+        Self { left, right }
+    }
+
+    pub fn contains_position(&self, position: AirPos) -> bool {
+        self.left < position && position < self.right
+    }
+
+    pub fn contains_span(&self, span: Self) -> bool {
+        self.contains_position(span.left) && self.contains_position(span.right)
+    }
+}
+
+impl From<Range<AirPos>> for Span {
+    fn from(range: Range<AirPos>) -> Self {
+        Self {
+            left: range.start,
+            right: range.end,
+        }
+    }
+}
+
+use std::cmp::Ordering;
+
+impl PartialOrd for Span {
+    fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
+        Some(self.cmp(other))
+    }
+}
+
+impl Ord for Span {
+    fn cmp(&self, other: &Self) -> Ordering {
+        let self_min = std::cmp::min(self.left, self.right);
+        let other_min = std::cmp::min(other.left, other.right);
+
+        if self_min < other_min {
+            Ordering::Less
+        } else if self == other {
+            Ordering::Equal
+        } else {
+            Ordering::Greater
+        }
+    }
+}
+
\ No newline at end of file diff --git a/src/air_parser/parser/validator.rs.html b/src/air_parser/parser/validator.rs.html new file mode 100644 index 00000000..a664fa4b --- /dev/null +++ b/src/air_parser/parser/validator.rs.html @@ -0,0 +1,1711 @@ +validator.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
+334
+335
+336
+337
+338
+339
+340
+341
+342
+343
+344
+345
+346
+347
+348
+349
+350
+351
+352
+353
+354
+355
+356
+357
+358
+359
+360
+361
+362
+363
+364
+365
+366
+367
+368
+369
+370
+371
+372
+373
+374
+375
+376
+377
+378
+379
+380
+381
+382
+383
+384
+385
+386
+387
+388
+389
+390
+391
+392
+393
+394
+395
+396
+397
+398
+399
+400
+401
+402
+403
+404
+405
+406
+407
+408
+409
+410
+411
+412
+413
+414
+415
+416
+417
+418
+419
+420
+421
+422
+423
+424
+425
+426
+427
+428
+429
+430
+431
+432
+433
+434
+435
+436
+437
+438
+439
+440
+441
+442
+443
+444
+445
+446
+447
+448
+449
+450
+451
+452
+453
+454
+455
+456
+457
+458
+459
+460
+461
+462
+463
+464
+465
+466
+467
+468
+469
+470
+471
+472
+473
+474
+475
+476
+477
+478
+479
+480
+481
+482
+483
+484
+485
+486
+487
+488
+489
+490
+491
+492
+493
+494
+495
+496
+497
+498
+499
+500
+501
+502
+503
+504
+505
+506
+507
+508
+509
+510
+511
+512
+513
+514
+515
+516
+517
+518
+519
+520
+521
+522
+523
+524
+525
+526
+527
+528
+529
+530
+531
+532
+533
+534
+535
+536
+537
+538
+539
+540
+541
+542
+543
+544
+545
+546
+547
+548
+549
+550
+551
+552
+553
+554
+555
+556
+557
+558
+559
+560
+561
+562
+563
+564
+565
+566
+567
+568
+569
+570
+571
+572
+573
+574
+575
+576
+577
+578
+579
+580
+581
+582
+583
+584
+585
+586
+587
+588
+589
+590
+591
+592
+593
+594
+595
+596
+597
+598
+599
+600
+601
+602
+603
+604
+605
+606
+607
+608
+609
+610
+611
+612
+613
+614
+615
+616
+617
+618
+619
+620
+621
+622
+623
+624
+625
+626
+627
+628
+629
+630
+631
+632
+633
+634
+635
+636
+637
+638
+639
+640
+641
+642
+643
+644
+645
+646
+647
+648
+649
+650
+651
+652
+653
+654
+655
+656
+657
+658
+659
+660
+661
+662
+663
+664
+665
+666
+667
+668
+669
+670
+671
+672
+673
+674
+675
+676
+677
+678
+679
+680
+681
+682
+683
+684
+685
+686
+687
+688
+689
+690
+691
+692
+693
+694
+695
+696
+697
+698
+699
+700
+701
+702
+703
+704
+705
+706
+707
+708
+709
+710
+711
+712
+713
+714
+715
+716
+717
+718
+719
+720
+721
+722
+723
+724
+725
+726
+727
+728
+729
+730
+731
+732
+733
+734
+735
+736
+737
+738
+739
+740
+741
+742
+743
+744
+745
+746
+747
+748
+749
+750
+751
+752
+753
+754
+755
+756
+757
+758
+759
+760
+761
+762
+763
+764
+765
+766
+767
+768
+769
+770
+771
+772
+773
+774
+775
+776
+777
+778
+779
+780
+781
+782
+783
+784
+785
+786
+787
+788
+789
+790
+791
+792
+793
+794
+795
+796
+797
+798
+799
+800
+801
+802
+803
+804
+805
+806
+807
+808
+809
+810
+811
+812
+813
+814
+815
+816
+817
+818
+819
+820
+821
+822
+823
+824
+825
+826
+827
+828
+829
+830
+831
+832
+833
+834
+835
+836
+837
+838
+839
+840
+841
+842
+843
+844
+845
+846
+847
+848
+849
+850
+851
+852
+853
+854
+855
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use crate::ast::*;
+
+use super::lexer::AirPos;
+use crate::parser::lexer::Token;
+use crate::parser::ParserError;
+use crate::parser::Span;
+
+use air_lambda_ast::LambdaAST;
+use air_lambda_ast::ValueAccessor;
+use lalrpop_util::ErrorRecovery;
+use lalrpop_util::ParseError;
+use multimap::MultiMap;
+
+use std::collections::HashMap;
+use std::ops::Deref;
+
+#[derive(Clone, Copy, Debug)]
+pub enum CheckInstructionKind<'names> {
+    PivotalNext(&'names str),
+    Merging,
+    PopStack1,
+    PopStack2,
+    Replacing,
+    ReplacingWithCheck(&'names str),
+    Xoring,
+    PopStack1ReplacingWithCheck(&'names str),
+    Simple,
+}
+
+/// This machine is used to check that there are no instructions after next
+/// in a fold block over stream and map, e.g.
+/// (fold $iterable iterator
+///  (seq
+///    (next iterator)
+///    (call  ...)  <- instruction after next
+///  )
+/// )
+/// Note that the fold over scalar doesn't have this restriction.
+#[derive(Clone, Debug)]
+struct AfterNextCheckMachine<'name> {
+    /// stack for the machine.
+    stack: Vec<(CheckInstructionKind<'name>, Span)>,
+
+    /// lalrpop parses AIR so that `next`
+    /// is met before `fold``. At the moment when `next` is met
+    /// it is impossible to tell whether it belongs to a stream/map fold or not.
+    /// This field stores iterator name to span mapping to be used when `fold` is met.
+    potentially_malformed_spans: HashMap<&'name str, Span>,
+
+    /// This vector contains all spans where an instruction after next was met.
+    malformed_spans: Vec<Span>,
+
+    /// This flag disables the machine if invariants are broken, e.g. par/seq must see
+    /// at least 2 instruction kinds in the stack.
+    is_enabled: bool,
+}
+
+impl<'name> Default for AfterNextCheckMachine<'name> {
+    fn default() -> Self {
+        Self {
+            stack: Default::default(),
+            potentially_malformed_spans: Default::default(),
+            malformed_spans: Default::default(),
+            is_enabled: true,
+        }
+    }
+}
+
+impl<'name> AfterNextCheckMachine<'name> {
+    fn disable(&mut self) {
+        self.stack.clear();
+        self.is_enabled = false;
+    }
+
+    fn malformed_spans_iter(&self) -> std::slice::Iter<Span> {
+        self.malformed_spans.iter()
+    }
+
+    fn met_instruction_kind(&mut self, instr_kind: CheckInstructionKind<'name>, span: Span) {
+        use CheckInstructionKind::*;
+
+        if !self.is_enabled {
+            return;
+        }
+        match instr_kind {
+            CheckInstructionKind::Replacing => {
+                self.process_replacing(span);
+            }
+            CheckInstructionKind::Xoring => {
+                self.process_xoring(span);
+            }
+            CheckInstructionKind::Merging => {
+                self.process_merging(span);
+            }
+            CheckInstructionKind::ReplacingWithCheck(iterator_name) => {
+                self.replacing_with_check_common(iterator_name, span, &instr_kind);
+            }
+            PopStack1ReplacingWithCheck(iterator_name) => {
+                self.stack.pop();
+                self.replacing_with_check_common(iterator_name, span, &instr_kind);
+            }
+            PivotalNext(_) | Simple => self.stack.push((instr_kind, span)),
+            PopStack1 => {
+                self.stack.pop();
+                self.stack.push((instr_kind, span))
+            }
+            PopStack2 => {
+                self.stack.pop();
+                self.stack.pop();
+                self.stack.push((instr_kind, span))
+            }
+        }
+    }
+
+    fn process_replacing(&mut self, span: Span) {
+        use CheckInstructionKind::*;
+
+        let child = self.stack.pop();
+        match child {
+            Some((pattern_kind @ PivotalNext(_), ..)) => {
+                self.stack.push((pattern_kind, span));
+            }
+            Some(_) => {
+                self.stack.push((Replacing, span));
+            }
+            None => self.disable(),
+        }
+    }
+
+    fn process_xoring(&mut self, span: Span) {
+        use CheckInstructionKind::*;
+
+        let right_branch = self.stack.pop();
+        let left_branch = self.stack.pop();
+        let left_right = left_branch.zip(right_branch);
+
+        match left_right {
+            Some(((PivotalNext(_), ..), (PivotalNext(_), ..))) => {
+                // `xor` has `next` in both branches. It is impossible
+                // to tell which branch should poped up.
+                self.disable();
+            }
+            Some(((pattern_kind @ PivotalNext(_), ..), ..))
+            | Some((_, (pattern_kind @ PivotalNext(_), _))) => {
+                // potential failure but need to check when fold pops up.
+                self.stack.push((pattern_kind, span));
+            }
+            Some(_) => {
+                self.stack.push((Xoring, span));
+            }
+            _ => {
+                // disable machine if Xoring invariant, namely there must be 2 kinds on a stack, is broken.
+                self.disable();
+            }
+        }
+    }
+
+    fn process_merging(&mut self, span: Span) {
+        use CheckInstructionKind::*;
+
+        let right_branch = self.stack.pop();
+        let left_branch = self.stack.pop();
+        let left_right = left_branch.zip(right_branch);
+        match left_right {
+            Some((
+                (pattern_kind @ PivotalNext(left_iterable), ..),
+                (PivotalNext(right_iterable), ..),
+            )) if left_iterable == right_iterable => {
+                self.stack.push((pattern_kind, span));
+            }
+            Some(((PivotalNext(iterator), _), ..)) => {
+                // potential failure but need to check when fold pops up.
+                self.stack.push((Merging, span));
+                self.potentially_malformed_spans
+                    .entry(iterator)
+                    .or_insert(span);
+            }
+            Some((_, (pattern_kind @ PivotalNext(_), ..))) => {
+                self.stack.push((pattern_kind, span));
+            }
+            Some(_) => {
+                self.stack.push((Merging, span));
+            }
+            _ => {
+                // disable machine if Merging invariant, namely there must be 2 kinds on a stack, is broken.
+                self.disable();
+            }
+        }
+    }
+
+    fn after_next_check(&mut self, iterable: &'name str) {
+        let malformed_span = self.potentially_malformed_spans.get(iterable);
+        if let Some(span) = malformed_span {
+            self.malformed_spans.push(*span);
+        }
+    }
+
+    fn replacing_with_check_common(
+        &mut self,
+        iterator_name: &'name str,
+        span: Span,
+        instr_kind: &CheckInstructionKind<'name>,
+    ) {
+        use CheckInstructionKind::*;
+
+        let child = self.stack.pop();
+        match child {
+            Some((PivotalNext(pivotal_next_iterator_name), ..))
+                if pivotal_next_iterator_name == iterator_name =>
+            {
+                self.after_next_check(iterator_name);
+                self.potentially_malformed_spans.remove(iterator_name);
+                self.stack.push((Simple, span));
+            }
+            Some((pattern_kind @ PivotalNext(_), ..)) => {
+                self.after_next_check(iterator_name);
+                self.stack.push((pattern_kind, span));
+            }
+            Some(_) => {
+                self.after_next_check(iterator_name);
+                self.stack.push((*instr_kind, span));
+            }
+            None => self.is_enabled = false,
+        }
+    }
+}
+
+/// Intermediate implementation of variable validator.
+///
+/// It is intended to track variables (i.e., those that were defined as
+/// a result of the `call` instruction) and iterables (i.e., those X's defined
+/// in a `fold array X` call).
+///
+/// Validator will catch any undefined variables or iterables and raise an error.
+#[derive(Debug, Default, Clone)]
+pub struct VariableValidator<'i> {
+    /// Contains the most left definition of a variables met in call outputs.
+    met_variable_definitions: HashMap<&'i str, Span>,
+
+    /// Contains iterators defined in a fold block.
+    met_iterator_definitions: MultiMap<&'i str, Span>,
+
+    /// These variables from calls and folds haven't been resolved at the first meet.
+    unresolved_variables: MultiMap<&'i str, Span>,
+
+    /// Contains all met iterable in call and next, they will be resolved after the whole parsing
+    /// due to the way how lalrpop work.
+    unresolved_iterables: MultiMap<&'i str, Span>,
+
+    /// Contains all met iterable in call and next, they will be resolved after the whole parsing
+    /// due to the way how lalrpop work.
+    multiple_next_candidates: MultiMap<&'i str, Span>,
+
+    /// Contains all names that should be checked that they are not iterators.
+    not_iterators_candidates: Vec<(&'i str, Span)>,
+
+    /// This contains info about unssuported map key arguments used with ap instruction,
+    /// namely (key map ApArgument).
+    unsupported_map_keys: Vec<(String, &'i str, Span)>,
+
+    /// This vector contains all literal error codes used with fail.
+    unsupported_literal_errcodes: Vec<(i64, Span)>,
+
+    /// This machine is for after next instruction check.
+    after_next_machine: AfterNextCheckMachine<'i>,
+}
+
+impl<'i> VariableValidator<'i> {
+    pub fn new() -> Self {
+        <_>::default()
+    }
+
+    pub(super) fn met_call(&mut self, call: &Call<'i>, span: Span) {
+        self.met_peer_id_resolvable_value(&call.triplet.peer_id, span);
+        self.met_string_resolvable_value(&call.triplet.service_id, span);
+        self.met_string_resolvable_value(&call.triplet.function_name, span);
+
+        self.met_args(call.args.deref(), span);
+
+        self.met_simple_instr(span);
+
+        match &call.output {
+            CallOutputValue::Scalar(scalar) => self.met_variable_name_definition(scalar.name, span),
+            CallOutputValue::Stream(stream) => self.met_variable_name_definition(stream.name, span),
+            CallOutputValue::None => {}
+        };
+    }
+
+    // canon doesn't check stream to be defined, because empty streams are considered to be empty
+    // and it is useful for code generation
+    pub(super) fn met_canon(&mut self, canon: &Canon<'i>, span: Span) {
+        self.met_variable_name_definition(canon.canon_stream.name, span);
+        self.met_simple_instr(span);
+    }
+
+    pub(super) fn met_canon_map(&mut self, canon_map: &CanonMap<'i>, span: Span) {
+        self.met_variable_name_definition(canon_map.canon_stream_map.name, span);
+        self.met_simple_instr(span);
+    }
+
+    pub(super) fn met_canon_map_scalar(
+        &mut self,
+        canon_stream_map_scalar: &CanonStreamMapScalar<'i>,
+        span: Span,
+    ) {
+        self.met_variable_name_definition(canon_stream_map_scalar.scalar.name, span);
+
+        self.met_simple_instr(span);
+    }
+
+    pub(super) fn met_match(&mut self, match_: &Match<'i>, span: Span) {
+        self.met_matchable(&match_.left_value, span);
+        self.met_matchable(&match_.right_value, span);
+        self.met_replacing_instr(span);
+    }
+
+    pub(super) fn met_mismatch(&mut self, mismatch: &MisMatch<'i>, span: Span) {
+        self.met_matchable(&mismatch.left_value, span);
+        self.met_matchable(&mismatch.right_value, span);
+        self.met_replacing_instr(span);
+    }
+
+    pub(super) fn met_fold_scalar(&mut self, fold: &FoldScalar<'i>, span: Span) {
+        use FoldScalarIterable::*;
+
+        match &fold.iterable {
+            Scalar(scalar) => self.met_scalar(scalar, span),
+            ScalarWithLambda(scalar) => self.met_scalar_wl(scalar, span),
+            CanonStream(canon_stream) => self.met_canon_stream(canon_stream, span),
+            CanonStreamMap(canon_stream_map) => self.met_canon_stream_map(canon_stream_map, span),
+            CanonStreamMapWithLambda(canon_stream) => {
+                self.met_canon_stream_map_wl(canon_stream, span)
+            }
+            EmptyArray => {}
+        };
+        self.met_iterator_definition(&fold.iterator, span);
+        self.met_popstack_instr(fold, span);
+    }
+
+    pub(super) fn meet_fold_stream(&mut self, fold: &FoldStream<'i>, span: Span) {
+        self.met_variable_name(fold.iterable.name, span);
+        self.met_iterator_definition(&fold.iterator, span);
+
+        match fold.last_instruction {
+            Some(_) => self.met_popstack_replacing_with_check_instr(fold.iterator.name, span),
+            None => self.met_replacing_with_check_instr(fold.iterator.name, span),
+        }
+    }
+
+    pub(super) fn meet_fold_stream_map(&mut self, fold: &FoldStreamMap<'i>, span: Span) {
+        self.met_variable_name(fold.iterable.name, span);
+        self.met_iterator_definition(&fold.iterator, span);
+
+        match fold.last_instruction {
+            Some(_) => self.met_popstack_replacing_with_check_instr(fold.iterator.name, span),
+            None => self.met_replacing_with_check_instr(fold.iterator.name, span),
+        }
+    }
+
+    pub(super) fn met_new(&mut self, new: &New<'i>, span: Span) {
+        self.not_iterators_candidates
+            .push((new.argument.name(), span));
+        // new defines a new variable
+        self.met_variable_name_definition(new.argument.name(), span);
+        self.met_replacing_instr(span);
+    }
+
+    pub(super) fn met_next(&mut self, next: &Next<'i>, span: Span) {
+        let iterable_name = next.iterator.name;
+        // due to the right to left convolution in lalrpop, a next instruction will be met earlier
+        // than a corresponding fold instruction with the definition of this iterable, so they're
+        // just put without a check for being already met
+        self.unresolved_iterables.insert(iterable_name, span);
+        self.multiple_next_candidates.insert(iterable_name, span);
+        self.met_pivotalnext_instr(iterable_name, span);
+    }
+
+    pub(super) fn met_ap(&mut self, ap: &Ap<'i>, span: Span) {
+        match &ap.argument {
+            ApArgument::Number(_)
+            | ApArgument::Timestamp
+            | ApArgument::TTL
+            | ApArgument::InitPeerId
+            | ApArgument::Boolean(_)
+            | ApArgument::Literal(_)
+            | ApArgument::EmptyArray
+            | ApArgument::LastError(_) => {}
+            ApArgument::Error(_) => {}
+            ApArgument::Scalar(scalar) => self.met_scalar(scalar, span),
+            ApArgument::ScalarWithLambda(scalar) => self.met_scalar_wl(scalar, span),
+            ApArgument::CanonStream(canon_stream) => self.met_canon_stream(canon_stream, span),
+            ApArgument::CanonStreamWithLambda(canon_stream) => {
+                self.met_canon_stream_wl(canon_stream, span)
+            }
+            ApArgument::CanonStreamMap(canon_stream_map) => {
+                self.met_canon_stream_map(canon_stream_map, span)
+            }
+            ApArgument::CanonStreamMapWithLambda(canon_stream_map) => {
+                self.met_canon_stream_map_wl(canon_stream_map, span)
+            }
+        }
+        self.met_variable_name_definition(ap.result.name(), span);
+        self.met_simple_instr(span);
+    }
+
+    pub(super) fn met_ap_map(&mut self, ap_map: &ApMap<'i>, span: Span) {
+        let key = &ap_map.key;
+        self.met_map_key(key, span);
+        self.met_variable_name_definition(ap_map.map.name, span);
+        self.met_simple_instr(span);
+    }
+
+    fn met_map_key(&mut self, key: &StreamMapKeyClause<'i>, span: Span) {
+        match key {
+            StreamMapKeyClause::Literal(_) | StreamMapKeyClause::Int(_) => {}
+            StreamMapKeyClause::Scalar(scalar) => self.met_scalar(scalar, span),
+            StreamMapKeyClause::ScalarWithLambda(scalar) => self.met_scalar_wl(scalar, span),
+            StreamMapKeyClause::CanonStreamWithLambda(stream) => {
+                self.met_canon_stream_wl(stream, span)
+            }
+        }
+    }
+
+    pub(super) fn met_fail_literal(&mut self, fail: &Fail<'i>, span: Span) {
+        match fail {
+            Fail::Literal { ret_code, .. } if *ret_code == 0 => {
+                self.unsupported_literal_errcodes.push((*ret_code, span))
+            }
+            _ => {}
+        }
+        self.met_simple_instr(span);
+    }
+
+    pub(super) fn met_merging_instr(&mut self, span: Span) {
+        self.after_next_machine
+            .met_instruction_kind(CheckInstructionKind::Merging, span);
+    }
+
+    pub(super) fn met_pivotalnext_instr(&mut self, iterable_name: &'i str, span: Span) {
+        self.after_next_machine
+            .met_instruction_kind(CheckInstructionKind::PivotalNext(iterable_name), span);
+    }
+
+    fn met_popstack_instr(&mut self, fold: &FoldScalar<'i>, span: Span) {
+        let instruction_kind = match fold.last_instruction {
+            Some(_) => CheckInstructionKind::PopStack2,
+            None => CheckInstructionKind::PopStack1,
+        };
+        self.after_next_machine
+            .met_instruction_kind(instruction_kind, span);
+    }
+
+    fn met_popstack_replacing_with_check_instr(&mut self, iterator_name: &'i str, span: Span) {
+        self.after_next_machine.met_instruction_kind(
+            CheckInstructionKind::PopStack1ReplacingWithCheck(iterator_name),
+            span,
+        );
+    }
+
+    pub(super) fn met_replacing_instr(&mut self, span: Span) {
+        self.after_next_machine
+            .met_instruction_kind(CheckInstructionKind::Replacing, span);
+    }
+
+    pub(super) fn met_replacing_with_check_instr(&mut self, iterator_name: &'i str, span: Span) {
+        self.after_next_machine.met_instruction_kind(
+            CheckInstructionKind::ReplacingWithCheck(iterator_name),
+            span,
+        );
+    }
+
+    pub(super) fn met_xoring_instr(&mut self, span: Span) {
+        self.after_next_machine
+            .met_instruction_kind(CheckInstructionKind::Xoring, span);
+    }
+
+    pub(super) fn met_simple_instr(&mut self, span: Span) {
+        self.after_next_machine
+            .met_instruction_kind(CheckInstructionKind::Simple, span);
+    }
+
+    pub(super) fn finalize(self) -> Vec<ErrorRecovery<AirPos, Token<'i>, ParserError>> {
+        ValidatorErrorBuilder::new(self)
+            .check_undefined_variables()
+            .check_undefined_iterables()
+            .check_multiple_next_in_fold()
+            .check_new_on_iterators()
+            .check_iterator_for_multiple_definitions()
+            .check_for_unsupported_map_keys()
+            .check_for_unsupported_literal_errcodes()
+            .check_after_next_instr()
+            .build()
+    }
+
+    fn met_args(&mut self, args: &[ImmutableValue<'i>], span: Span) {
+        for arg in args {
+            self.met_instr_arg_value(arg, span);
+        }
+    }
+
+    fn met_peer_id_resolvable_value(
+        &mut self,
+        variable: &ResolvableToPeerIdVariable<'i>,
+        span: Span,
+    ) {
+        use ResolvableToPeerIdVariable::*;
+
+        match variable {
+            InitPeerId | Literal(_) => {}
+            Scalar(scalar) => self.met_scalar(scalar, span),
+            ScalarWithLambda(scalar) => self.met_scalar_wl(scalar, span),
+            CanonStreamWithLambda(stream) => self.met_canon_stream_wl(stream, span),
+            CanonStreamMapWithLambda(canon_stream_map) => {
+                self.met_canon_stream_map_wl(canon_stream_map, span)
+            }
+        }
+    }
+
+    fn met_string_resolvable_value(
+        &mut self,
+        variable: &ResolvableToStringVariable<'i>,
+        span: Span,
+    ) {
+        use ResolvableToStringVariable::*;
+
+        match variable {
+            Literal(_) => {}
+            Scalar(scalar) => self.met_scalar(scalar, span),
+            ScalarWithLambda(scalar) => self.met_scalar_wl(scalar, span),
+            CanonStreamWithLambda(stream) => self.met_canon_stream_wl(stream, span),
+            CanonStreamMapWithLambda(canon_stream_map) => {
+                self.met_canon_stream_map_wl(canon_stream_map, span)
+            }
+        }
+    }
+
+    fn met_instr_arg_value(&mut self, instr_arg_value: &ImmutableValue<'i>, span: Span) {
+        use ImmutableValue::*;
+
+        match instr_arg_value {
+            InitPeerId | Error(_) | LastError(_) | Timestamp | TTL | Literal(_) | Number(_)
+            | Boolean(_) | EmptyArray => {}
+            Variable(variable) => self.met_variable(variable, span),
+            VariableWithLambda(variable) => self.met_variable_wl(variable, span),
+        }
+    }
+
+    fn met_variable(&mut self, variable: &ImmutableVariable<'i>, span: Span) {
+        self.met_variable_name(variable.name(), span);
+    }
+
+    fn met_variable_wl(&mut self, variable: &ImmutableVariableWithLambda<'i>, span: Span) {
+        self.met_variable_name(variable.name(), span);
+        self.met_lambda(variable.lambda(), span);
+    }
+
+    fn met_scalar(&mut self, scalar: &Scalar<'i>, span: Span) {
+        self.met_variable_name(scalar.name, span);
+    }
+
+    fn met_scalar_wl(&mut self, scalar: &ScalarWithLambda<'i>, span: Span) {
+        self.met_variable_name(scalar.name, span);
+        self.met_lambda(&scalar.lambda, span);
+    }
+
+    fn met_canon_stream(&mut self, stream: &CanonStream<'i>, span: Span) {
+        self.met_variable_name(stream.name, span);
+    }
+
+    fn met_canon_stream_map(&mut self, canon_stream_map: &CanonStreamMap<'i>, span: Span) {
+        self.met_variable_name(canon_stream_map.name, span);
+    }
+
+    fn met_canon_stream_wl(&mut self, stream: &CanonStreamWithLambda<'i>, span: Span) {
+        self.met_variable_name(stream.name, span);
+        self.met_lambda(&stream.lambda, span);
+    }
+
+    fn met_canon_stream_map_wl(&mut self, stream_map: &CanonStreamMapWithLambda<'i>, span: Span) {
+        self.met_variable_name(stream_map.name, span);
+        self.met_lambda(&stream_map.lambda, span);
+    }
+
+    fn met_variable_name(&mut self, name: &'i str, span: Span) {
+        if !self.contains_variable(name, span) {
+            self.unresolved_variables.insert(name, span);
+        }
+    }
+
+    fn met_lambda(&mut self, lambda: &LambdaAST<'i>, span: Span) {
+        let accessors = match lambda {
+            LambdaAST::ValuePath(accessors) => accessors,
+            LambdaAST::Functor(_) => return,
+        };
+
+        for accessor in accessors.iter() {
+            match accessor {
+                &ValueAccessor::FieldAccessByScalar { scalar_name } => {
+                    self.met_variable_name(scalar_name, span)
+                }
+                ValueAccessor::ArrayAccess { .. }
+                | ValueAccessor::FieldAccessByName { .. }
+                | ValueAccessor::Error => {}
+            }
+        }
+    }
+
+    fn contains_variable(&self, key: &str, key_span: Span) -> bool {
+        if let Some(found_span) = self.met_variable_definitions.get(key) {
+            if found_span < &key_span {
+                return true;
+            }
+        }
+
+        let found_spans = match self.met_iterator_definitions.get_vec(key) {
+            Some(found_spans) => found_spans,
+            None => return false,
+        };
+
+        found_spans.iter().any(|s| s < &key_span)
+    }
+
+    fn met_variable_name_definition(&mut self, name: &'i str, span: Span) {
+        use std::collections::hash_map::Entry;
+
+        match self.met_variable_definitions.entry(name) {
+            Entry::Occupied(occupied) => {
+                if occupied.get() > &span {
+                    *occupied.into_mut() = span;
+                }
+            }
+            Entry::Vacant(vacant) => {
+                vacant.insert(span);
+            }
+        }
+    }
+
+    fn met_matchable(&mut self, matchable: &ImmutableValue<'i>, span: Span) {
+        match matchable {
+            ImmutableValue::InitPeerId
+            | ImmutableValue::Timestamp
+            | ImmutableValue::TTL
+            | ImmutableValue::Number(_)
+            | ImmutableValue::Boolean(_)
+            | ImmutableValue::Literal(_)
+            | ImmutableValue::Error(_)
+            | ImmutableValue::LastError(_)
+            | ImmutableValue::EmptyArray => {}
+            ImmutableValue::Variable(variable) => self.met_variable(variable, span),
+            ImmutableValue::VariableWithLambda(variable) => self.met_variable_wl(variable, span),
+        }
+    }
+
+    fn met_iterator_definition(&mut self, iterator: &Scalar<'i>, span: Span) {
+        self.met_iterator_definitions.insert(iterator.name, span);
+    }
+}
+
+struct ValidatorErrorBuilder<'i> {
+    errors: Vec<ErrorRecovery<AirPos, Token<'i>, ParserError>>,
+    validator: VariableValidator<'i>,
+}
+
+impl<'i> ValidatorErrorBuilder<'i> {
+    fn new(validator: VariableValidator<'i>) -> Self {
+        let mut builder = Self {
+            errors: Vec::new(),
+            validator,
+        };
+        builder.sort_iterator_definitions();
+
+        builder
+    }
+
+    fn sort_iterator_definitions(&mut self) {
+        for (_, spans) in self.validator.met_iterator_definitions.iter_all_mut() {
+            spans.sort()
+        }
+    }
+
+    /// Check that all variables were defined.
+    fn check_undefined_variables(mut self) -> Self {
+        for (name, span) in self.validator.unresolved_variables.iter() {
+            if !self.validator.contains_variable(name, *span) {
+                let error = ParserError::undefined_variable(*span, *name);
+                add_to_errors(&mut self.errors, *span, Token::Call, error);
+            }
+        }
+
+        self
+    }
+
+    /// Check that all iterables in fold blocks were defined.
+    fn check_undefined_iterables(mut self) -> Self {
+        for (name, span) in self.validator.unresolved_iterables.iter() {
+            if self.find_closest_fold_span(name, *span).is_none() {
+                let error = ParserError::undefined_iterable(*span, *name);
+                add_to_errors(&mut self.errors, *span, Token::New, error);
+            }
+        }
+
+        self
+    }
+
+    /// Check that a fold block contains not more than one next with a corresponding iterator.
+    fn check_multiple_next_in_fold(mut self) -> Self {
+        // Approach used here is based on an assumption that each one iterator belongs only to one
+        // fold block at any depth. This is checked by check_iterator_for_multiple_definitions and
+        // allows to consider only one fold block where this variable was defined. Then a error
+        // is produced if there are more than one suck block.
+        for (name, spans) in self.validator.multiple_next_candidates.iter_all() {
+            let mut collected_fold_spans = std::collections::HashSet::new();
+            for span in spans {
+                let current_span = match self.find_closest_fold_span(name, *span) {
+                    Some(fold_span) => fold_span,
+                    // this would be checked in check_undefined_iterables
+                    None => {
+                        continue;
+                    }
+                };
+
+                if !collected_fold_spans.insert(current_span) {
+                    let error = ParserError::multiple_next_in_fold(*span, *name);
+                    add_to_errors(&mut self.errors, *span, Token::Next, error);
+                }
+            }
+        }
+
+        self
+    }
+
+    /// Check that a new operator wasn't applied to iterators.
+    fn check_new_on_iterators(mut self) -> Self {
+        for (name, span) in self.validator.not_iterators_candidates.iter() {
+            if self.find_closest_fold_span(name, *span).is_some() {
+                let error = ParserError::invalid_iterator_restriction(*span, *name);
+                add_to_errors(&mut self.errors, *span, Token::New, error);
+            }
+        }
+
+        self
+    }
+
+    /// Check that one iterator belongs to only one fold.
+    /// F.e. such cases are prohibited
+    /// (fold iterable_1 iterator
+    ///     ...
+    ///     (fold iterable_2 iterator
+    ///         ...
+    ///     )
+    /// )
+    fn check_iterator_for_multiple_definitions(mut self) -> Self {
+        for (name, spans) in self.validator.met_iterator_definitions.iter_all_mut() {
+            spans.sort();
+            let mut prev_span: Option<Span> = None;
+            for &span in spans.iter() {
+                match prev_span {
+                    Some(prev_span) if prev_span.contains_span(span) => {
+                        let error = ParserError::multiple_iterables(span, *name);
+                        add_to_errors(&mut self.errors, span, Token::Fold, error);
+                    }
+                    Some(_) | None => prev_span = Some(span),
+                }
+            }
+        }
+
+        self
+    }
+
+    // Unsupported StreamMap keys check, e.g. Stream can not be a map key (ap ($stream "value") %map)
+    fn check_for_unsupported_map_keys(mut self) -> Self {
+        for (arg_key_type, ap_result_name, span) in self.validator.unsupported_map_keys.iter_mut() {
+            let error = ParserError::unsupported_map_key_type(
+                *span,
+                arg_key_type.to_string(),
+                *ap_result_name,
+            );
+            add_to_errors(&mut self.errors, *span, Token::New, error);
+        }
+        self
+    }
+
+    fn check_for_unsupported_literal_errcodes(mut self) -> Self {
+        for (_, span) in self.validator.unsupported_literal_errcodes.iter_mut() {
+            let error = ParserError::unsupported_literal_errcodes(*span);
+            add_to_errors(&mut self.errors, *span, Token::New, error);
+        }
+        self
+    }
+
+    fn check_after_next_instr(mut self) -> Self {
+        for span in self.validator.after_next_machine.malformed_spans_iter() {
+            let error = ParserError::fold_has_instruction_after_next(*span);
+            add_to_errors(&mut self.errors, *span, Token::Next, error);
+        }
+        self
+    }
+
+    fn build(self) -> Vec<ErrorRecovery<AirPos, Token<'i>, ParserError>> {
+        self.errors
+    }
+
+    /// Checks that met_iterator_definitions contains a span for given key such that provided
+    /// span lies inside it. This functions assumes that spans are sorted and that why returns
+    /// the closest span in the list.
+    fn find_closest_fold_span(&self, key: &str, key_span: Span) -> Option<Span> {
+        let found_spans = match self.validator.met_iterator_definitions.get_vec(key) {
+            Some(found_spans) => found_spans,
+            None => return None,
+        };
+
+        found_spans
+            .iter()
+            .filter(|&s| s.contains_span(key_span))
+            .last()
+            .cloned()
+    }
+}
+
+fn add_to_errors<'i>(
+    errors: &mut Vec<ErrorRecovery<AirPos, Token<'i>, ParserError>>,
+    span: Span,
+    token: Token<'i>,
+    error: ParserError,
+) {
+    let error = ParseError::User { error };
+
+    let dropped_tokens = vec![(span.left, token, span.right)];
+
+    let error = ErrorRecovery {
+        error,
+        dropped_tokens,
+    };
+
+    errors.push(error);
+}
+
\ No newline at end of file diff --git a/src/air_test_framework/asserts/behavior.rs.html b/src/air_test_framework/asserts/behavior.rs.html new file mode 100644 index 00000000..5be2df86 --- /dev/null +++ b/src/air_test_framework/asserts/behavior.rs.html @@ -0,0 +1,271 @@ +behavior.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use air_test_utils::{
+    prelude::{echo_call_service, unit_call_service},
+    CallServiceResult,
+};
+use nom::IResult;
+use serde_json::json;
+use strum::{AsRefStr, EnumDiscriminants, EnumString};
+
+#[derive(Debug, Clone, PartialEq, Eq, EnumDiscriminants)]
+#[strum_discriminants(strum(serialize_all = "snake_case"))]
+#[strum_discriminants(derive(AsRefStr, EnumString))]
+#[strum_discriminants(name(BehaviorTagName))]
+pub enum Behavior {
+    Echo,
+    Unit,
+    Service,
+    Function,
+    Arg(usize),
+    Tetraplet,
+}
+
+pub(crate) fn parse_behaviour(inp: &str) -> IResult<&str, Behavior, super::parser::ParseError> {
+    use nom::branch::alt;
+    use nom::bytes::complete::tag;
+    use nom::character::complete::u32 as u32_parse;
+    use nom::combinator::{map, value};
+    use nom::sequence::{pair, preceded};
+
+    alt((
+        value(Behavior::Echo, tag(BehaviorTagName::Echo.as_ref())),
+        value(Behavior::Unit, tag(BehaviorTagName::Unit.as_ref())),
+        value(Behavior::Function, tag(BehaviorTagName::Function.as_ref())),
+        value(Behavior::Service, tag(BehaviorTagName::Service.as_ref())),
+        map(
+            preceded(
+                pair(tag(BehaviorTagName::Arg.as_ref()), tag(".")),
+                u32_parse,
+            ),
+            |n| Behavior::Arg(n as _),
+        ),
+        value(
+            Behavior::Tetraplet,
+            tag(BehaviorTagName::Tetraplet.as_ref()),
+        ),
+    ))(inp)
+}
+
+impl Behavior {
+    pub(crate) async fn call(
+        &self,
+        params: air_test_utils::CallRequestParams,
+    ) -> CallServiceResult {
+        use Behavior::*;
+
+        match self {
+            Echo => echo_call_service()(params).await,
+            Unit => unit_call_service()(params).await,
+            Function => CallServiceResult::ok(params.function_name.into()),
+            Service => CallServiceResult::ok(params.service_id.into()),
+            Arg(n) => match params.arguments.get(*n) {
+                Some(val) => CallServiceResult::ok(val.clone()),
+                None => CallServiceResult::err(
+                    // TODO test-utils uses just json!{ "default" } value.
+                    42,
+                    json!("not enough arguments"),
+                ),
+            },
+            Tetraplet => CallServiceResult::ok(serde_json::to_value(&params.tetraplets).unwrap()),
+        }
+    }
+}
+#[cfg(test)]
+mod tests {
+    use super::*;
+
+    #[test]
+    fn test_parse_behavior_echo() {
+        let res = parse_behaviour("echo");
+        assert_eq!(
+            res,
+            Ok(("", Behavior::Echo)),
+            "{:?}",
+            BehaviorTagName::Echo.as_ref()
+        );
+    }
+
+    #[test]
+    fn test_parse_behavior_unit() {
+        let res = parse_behaviour("unit");
+        assert_eq!(res, Ok(("", Behavior::Unit)));
+    }
+
+    #[test]
+    fn test_parse_behavior_service() {
+        let res = parse_behaviour("service");
+        assert_eq!(res, Ok(("", Behavior::Service)));
+    }
+
+    #[test]
+    fn test_parse_behavior_function() {
+        let res = parse_behaviour("function");
+        assert_eq!(res, Ok(("", Behavior::Function)));
+    }
+
+    #[test]
+    fn test_parse_behavior_arg() {
+        let res = parse_behaviour("arg.42");
+        assert_eq!(res, Ok(("", Behavior::Arg(42))));
+    }
+
+    #[test]
+    fn test_parse_behavior_tetraplet() {
+        let res = parse_behaviour("tetraplet");
+        assert_eq!(res, Ok(("", Behavior::Tetraplet)));
+    }
+}
+
\ No newline at end of file diff --git a/src/air_test_framework/asserts/json.rs.html b/src/air_test_framework/asserts/json.rs.html new file mode 100644 index 00000000..3e2c4b5d --- /dev/null +++ b/src/air_test_framework/asserts/json.rs.html @@ -0,0 +1,467 @@ +json.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+/*
+ *
+ * Based on the JSON parser from nom examples:
+ *
+ * Copyright (c) 2014-2019 Geoffroy Couprie
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sublicense, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+ * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+ * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+use nom::{
+    branch::alt,
+    bytes::complete::{escaped, tag, take_while},
+    character::complete::{char, one_of, satisfy},
+    combinator::{cut, map, opt, value},
+    error::{context, ContextError, ParseError},
+    multi::separated_list0,
+    number::complete::double,
+    sequence::{delimited, preceded, separated_pair, terminated},
+    IResult,
+};
+use std::collections::HashMap;
+use std::str;
+
+#[derive(Debug, PartialEq)]
+pub enum JsonValue {
+    Null,
+    Str(String),
+    Boolean(bool),
+    Num(f64),
+    Array(Vec<JsonValue>),
+    Object(HashMap<String, JsonValue>),
+}
+
+/// parser combinators are constructed from the bottom up:
+/// first we write parsers for the smallest elements (here a space character),
+/// then we'll combine them in larger parsers
+fn sp<'a, E: ParseError<&'a str>>(i: &'a str) -> IResult<&'a str, &'a str, E> {
+    let chars = " \t\r\n";
+
+    // nom combinators like `take_while` return a function. That function is the
+    // parser,to which we can pass the input
+    take_while(move |c| chars.contains(c))(i)
+}
+
+/// A nom parser has the following signature:
+/// `Input -> IResult<Input, Output, Error>`, with `IResult` defined as:
+/// `type IResult<I, O, E = (I, ErrorKind)> = Result<(I, O), Err<E>>;`
+///
+/// most of the times you can ignore the error type and use the default (but this
+/// examples shows custom error types later on!)
+///
+/// Here we use `&str` as input type, but nom parsers can be generic over
+/// the input type, and work directly with `&[u8]` or any other type that
+/// implements the required traits.
+///
+/// Finally, we can see here that the input and output type are both `&str`
+/// with the same lifetime tag. This means that the produced value is a subslice
+/// of the input data. and there is no allocation needed. This is the main idea
+/// behind nom's performance.
+fn parse_str<'a, E: ParseError<&'a str>>(i: &'a str) -> IResult<&'a str, &'a str, E> {
+    escaped(
+        satisfy(|c| ('\u{20}'..='\u{10FFFF}').contains(&c) && (c != '\\') && (c != '"')),
+        '\\',
+        one_of("\"n\\"),
+    )(i)
+}
+
+/// `tag(string)` generates a parser that recognizes the argument string.
+///
+/// we can combine it with other functions, like `value` that takes another
+/// parser, and if that parser returns without an error, returns a given
+/// constant value.
+///
+/// `alt` is another combinator that tries multiple parsers one by one, until
+/// one of them succeeds
+fn boolean<'a, E: ParseError<&'a str>>(input: &'a str) -> IResult<&'a str, bool, E> {
+    // This is a parser that returns `true` if it sees the string "true", and
+    // an error otherwise
+    let parse_true = value(true, tag("true"));
+
+    // This is a parser that returns `false` if it sees the string "false", and
+    // an error otherwise
+    let parse_false = value(false, tag("false"));
+
+    // `alt` combines the two parsers. It returns the result of the first
+    // successful parser, or an error
+    alt((parse_true, parse_false))(input)
+}
+
+fn null<'a, E: ParseError<&'a str>>(input: &'a str) -> IResult<&'a str, (), E> {
+    value((), tag("null"))(input)
+}
+
+/// this parser combines the previous `parse_str` parser, that recognizes the
+/// interior of a string, with a parse to recognize the double quote character,
+/// before the string (using `preceded`) and after the string (using `terminated`).
+///
+/// `context` and `cut` are related to error management:
+/// - `cut` transforms an `Err::Error(e)` in `Err::Failure(e)`, signaling to
+/// combinators like  `alt` that they should not try other parsers. We were in the
+/// right branch (since we found the `"` character) but encountered an error when
+/// parsing the string
+/// - `context` lets you add a static string to provide more information in the
+/// error chain (to indicate which parser had an error)
+fn string<'a, E: ParseError<&'a str> + ContextError<&'a str>>(
+    i: &'a str,
+) -> IResult<&'a str, &'a str, E> {
+    context(
+        "string",
+        preceded(char('\"'), cut(terminated(parse_str, char('\"')))),
+    )(i)
+}
+
+/// some combinators, like `separated_list0` or `many0`, will call a parser repeatedly,
+/// accumulating results in a `Vec`, until it encounters an error.
+/// If you want more control on the parser application, check out the `iterator`
+/// combinator (cf `examples/iterator.rs`)
+fn array<'a, E: ParseError<&'a str> + ContextError<&'a str>>(
+    i: &'a str,
+) -> IResult<&'a str, Vec<JsonValue>, E> {
+    context(
+        "array",
+        preceded(
+            char('['),
+            cut(terminated(
+                separated_list0(preceded(sp, char(',')), json_value),
+                preceded(sp, char(']')),
+            )),
+        ),
+    )(i)
+}
+
+fn key_value<'a, E: ParseError<&'a str> + ContextError<&'a str>>(
+    i: &'a str,
+) -> IResult<&'a str, (&'a str, JsonValue), E> {
+    separated_pair(
+        preceded(sp, string),
+        cut(preceded(sp, char(':'))),
+        json_value,
+    )(i)
+}
+
+pub fn hash<'a, E: ParseError<&'a str> + ContextError<&'a str>>(
+    i: &'a str,
+) -> IResult<&'a str, HashMap<String, JsonValue>, E> {
+    context(
+        "map",
+        preceded(
+            char('{'),
+            cut(terminated(
+                map(
+                    separated_list0(preceded(sp, char(',')), key_value),
+                    |tuple_vec| {
+                        tuple_vec
+                            .into_iter()
+                            .map(|(k, v)| (String::from(k), v))
+                            .collect()
+                    },
+                ),
+                preceded(sp, char('}')),
+            )),
+        ),
+    )(i)
+}
+
+/// here, we apply the space parser before trying to parse a value
+pub fn json_value<'a, E: ParseError<&'a str> + ContextError<&'a str>>(
+    i: &'a str,
+) -> IResult<&'a str, JsonValue, E> {
+    preceded(
+        sp,
+        alt((
+            map(hash, JsonValue::Object),
+            map(array, JsonValue::Array),
+            map(string, |s| JsonValue::Str(String::from(s))),
+            map(double, JsonValue::Num),
+            map(boolean, JsonValue::Boolean),
+            map(null, |_| JsonValue::Null),
+        )),
+    )(i)
+}
+
+/// the root element of a JSON parser is either an object or an array
+#[allow(dead_code)]
+pub fn root<'a, E: ParseError<&'a str> + ContextError<&'a str>>(
+    i: &'a str,
+) -> IResult<&'a str, JsonValue, E> {
+    delimited(
+        sp,
+        alt((
+            map(hash, JsonValue::Object),
+            map(array, JsonValue::Array),
+            map(null, |_| JsonValue::Null),
+        )),
+        opt(sp),
+    )(i)
+}
+
\ No newline at end of file diff --git a/src/air_test_framework/asserts/mod.rs.html b/src/air_test_framework/asserts/mod.rs.html new file mode 100644 index 00000000..781798e5 --- /dev/null +++ b/src/air_test_framework/asserts/mod.rs.html @@ -0,0 +1,353 @@ +mod.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+mod behavior;
+mod json;
+pub(crate) mod parser;
+
+use crate::services::JValue;
+
+use air_test_utils::{CallRequestParams, CallServiceResult};
+use serde_json::json;
+use strum::{AsRefStr, EnumDiscriminants, EnumString};
+
+use std::{borrow::Cow, cell::Cell, collections::HashMap};
+
+use self::behavior::Behavior;
+
+/// Service definition in the testing framework comment DSL.
+#[derive(Debug, PartialEq, Eq, Clone, EnumDiscriminants)]
+#[strum_discriminants(derive(AsRefStr, EnumString))]
+#[strum_discriminants(name(ServiceTagName))]
+pub enum ServiceDefinition {
+    /// Simple service that returns same value
+    #[strum_discriminants(strum(serialize = "ok"))]
+    Ok(JValue),
+    /// Simple service that returns same call result (i.e. may return a error)
+    #[strum_discriminants(strum(serialize = "err"))]
+    Error(CallServiceResult),
+    /// Service that may return a new value on subsequent call.  Its keys are either
+    /// call number string starting from "0", or "default".
+    #[strum_discriminants(strum(serialize = "seq_ok"))]
+    SeqOk {
+        call_number_seq: Cell<usize>,
+        call_map: HashMap<String, JValue>,
+    },
+    #[strum_discriminants(strum(serialize = "seq_error"))]
+    SeqError {
+        call_number_seq: Cell<usize>,
+        call_map: HashMap<String, CallServiceResult>,
+    },
+    /// Some known service by name: "echo", "unit" (more to follow).
+    #[strum_discriminants(strum(serialize = "behaviour"))]
+    Behaviour(Behavior),
+    /// Same services as defined by the enum element above with dbg! applied to the arguments.
+    #[strum_discriminants(strum(serialize = "dbg_behaviour"))]
+    DbgBehaviour(Behavior),
+    /// Maps first argument to a value
+    #[strum_discriminants(strum(serialize = "map"))]
+    Map(HashMap<String, JValue>),
+}
+
+impl ServiceDefinition {
+    pub fn ok(value: JValue) -> Self {
+        Self::Ok(value)
+    }
+
+    pub fn error(value: CallServiceResult) -> Self {
+        Self::Error(value)
+    }
+
+    pub fn seq_ok(call_map: HashMap<String, JValue>) -> Self {
+        Self::SeqOk {
+            call_number_seq: 0.into(),
+            call_map,
+        }
+    }
+
+    pub fn seq_error(call_map: HashMap<String, CallServiceResult>) -> Self {
+        Self::SeqError {
+            call_number_seq: 0.into(),
+            call_map,
+        }
+    }
+
+    pub fn behaviour(name: Behavior) -> Self {
+        Self::Behaviour(name)
+    }
+
+    pub fn map(map: HashMap<String, JValue>) -> Self {
+        Self::Map(map)
+    }
+
+    pub async fn call(&self, params: CallRequestParams) -> CallServiceResult {
+        match self {
+            ServiceDefinition::Ok(ok) => CallServiceResult::ok(ok.clone()),
+            ServiceDefinition::Error(call_result) => call_result.clone(),
+            ServiceDefinition::SeqOk {
+                ref call_number_seq,
+                call_map,
+            } => call_seq_ok(call_number_seq, call_map),
+            ServiceDefinition::SeqError {
+                ref call_number_seq,
+                call_map,
+            } => call_seq_error(call_number_seq, call_map),
+            ServiceDefinition::Behaviour(name) => name.call(params).await,
+            ServiceDefinition::DbgBehaviour(name) => dbg!(name.call(dbg!(params)).await),
+            ServiceDefinition::Map(map) => call_map_service(map, params),
+        }
+    }
+}
+
+fn call_seq_ok(
+    call_number_seq: &Cell<usize>,
+    call_map: &HashMap<String, serde_json::Value>,
+) -> CallServiceResult {
+    let call_number = call_number_seq.get();
+    let call_num_str = call_number.to_string();
+    call_number_seq.set(call_number + 1);
+
+    let value = call_map
+        .get(&call_num_str)
+        .or_else(|| call_map.get("default"))
+        .unwrap_or_else(|| {
+            panic!(
+                r#"neither key {:?} nor "default" key not found in the {:?}"#,
+                call_num_str, call_map
+            )
+        })
+        .clone();
+    CallServiceResult::ok(value)
+}
+
+fn call_seq_error(
+    call_number_seq: &Cell<usize>,
+    call_map: &HashMap<String, CallServiceResult>,
+) -> CallServiceResult {
+    let call_number = call_number_seq.get();
+    let call_num_str = call_number.to_string();
+    call_number_seq.set(call_number + 1);
+
+    call_map
+        .get(&call_num_str)
+        .or_else(|| call_map.get("default"))
+        .unwrap_or_else(|| {
+            panic!(
+                r#"neither key {:?} nor "default" key not found in the {:?}"#,
+                call_num_str, call_map
+            )
+        })
+        .clone()
+}
+
+fn call_map_service(
+    map: &HashMap<String, serde_json::Value>,
+    args: CallRequestParams,
+) -> CallServiceResult {
+    let key = args
+        .arguments
+        .get(0)
+        .expect("At least one arugment expected");
+    // Strings are looked up by value, other objects -- by their string representation.
+    //
+    // For example, `"key"` is looked up as `"key"`, `5` is looked up as `"5"`, `["test"]` is looked up
+    // as `"[\"test\"]"`.
+    let key_repr = match key {
+        serde_json::Value::String(s) => Cow::Borrowed(s.as_str()),
+        val => Cow::Owned(val.to_string()),
+    };
+    CallServiceResult::ok(json!(map.get(key_repr.as_ref()).cloned()))
+}
+
\ No newline at end of file diff --git a/src/air_test_framework/asserts/parser.rs.html b/src/air_test_framework/asserts/parser.rs.html new file mode 100644 index 00000000..5979d79e --- /dev/null +++ b/src/air_test_framework/asserts/parser.rs.html @@ -0,0 +1,557 @@ +parser.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::{ServiceDefinition, ServiceTagName};
+use crate::transform::parser::delim_ws;
+
+use air_test_utils::CallServiceResult;
+use nom::{error::VerboseError, IResult};
+
+use std::{collections::HashMap, str::FromStr};
+
+pub(crate) type ParseError<'inp> = VerboseError<&'inp str>;
+
+impl FromStr for ServiceDefinition {
+    type Err = String;
+
+    fn from_str(s: &str) -> Result<Self, Self::Err> {
+        nom::combinator::all_consuming(parse_kw)(s)
+            .map(|(_, service_definition)| service_definition)
+            .map_err(|e| e.to_string())
+    }
+}
+
+// kw "=" val
+// example: "id=firstcall"
+pub fn parse_kw(inp: &str) -> IResult<&str, ServiceDefinition, ParseError> {
+    use super::behavior::parse_behaviour;
+    use nom::branch::alt;
+    use nom::bytes::complete::tag;
+    use nom::combinator::{cut, map, map_res, recognize};
+    use nom::error::context;
+    use nom::sequence::{pair, preceded};
+
+    let equal = || delim_ws(tag("="));
+    let json_value = || {
+        cut(context(
+            "result value has to be a valid JSON",
+            recognize(super::json::json_value),
+        ))
+    };
+    let json_map = || {
+        cut(context(
+            "result value has to be a valid JSON hash",
+            recognize(super::json::hash),
+        ))
+    };
+
+    delim_ws(alt((
+        map_res(
+            preceded(
+                pair(tag(ServiceTagName::Ok.as_ref()), equal()),
+                json_value(),
+            ),
+            |value| serde_json::from_str(value).map(ServiceDefinition::Ok),
+        ),
+        map_res(
+            preceded(
+                pair(tag(ServiceTagName::Error.as_ref()), equal()),
+                json_map(),
+            ),
+            |value| serde_json::from_str::<CallServiceResult>(value).map(ServiceDefinition::Error),
+        ),
+        map_res(
+            preceded(
+                pair(tag(ServiceTagName::SeqOk.as_ref()), equal()),
+                json_map(),
+            ),
+            |value| serde_json::from_str(value).map(ServiceDefinition::seq_ok),
+        ),
+        map_res(
+            preceded(
+                pair(tag(ServiceTagName::SeqError.as_ref()), equal()),
+                json_map(),
+            ),
+            |value| {
+                serde_json::from_str::<HashMap<String, CallServiceResult>>(value)
+                    .map(ServiceDefinition::seq_error)
+            },
+        ),
+        map(
+            preceded(
+                pair(tag(ServiceTagName::DbgBehaviour.as_ref()), equal()),
+                cut(parse_behaviour),
+            ),
+            ServiceDefinition::DbgBehaviour,
+        ),
+        map(
+            preceded(
+                pair(tag(ServiceTagName::Behaviour.as_ref()), equal()),
+                cut(parse_behaviour),
+            ),
+            ServiceDefinition::Behaviour,
+        ),
+        map_res(
+            preceded(pair(tag(ServiceTagName::Map.as_ref()), equal()), json_map()),
+            |value| serde_json::from_str(value).map(ServiceDefinition::Map),
+        ),
+    )))(inp)
+}
+
+#[cfg(test)]
+mod tests {
+    use crate::asserts::behavior::Behavior;
+
+    use super::*;
+    use pretty_assertions::assert_eq;
+    use serde_json::json;
+
+    #[test]
+    fn test_parse_empty() {
+        let res = ServiceDefinition::from_str("");
+        assert!(res.is_err());
+    }
+
+    #[test]
+    fn test_parse_garbage0() {
+        let res = ServiceDefinition::from_str("garbage");
+        assert!(res.is_err(), "{}", "{res:?}");
+    }
+
+    #[test]
+    fn test_result_service() {
+        use serde_json::json;
+
+        let res = ServiceDefinition::from_str(r#"ok={"this":["is","value"]}"#);
+        assert_eq!(
+            res,
+            Ok(ServiceDefinition::Ok(json!({"this": ["is", "value"]}))),
+        );
+    }
+
+    #[test]
+    fn test_result_service_malformed() {
+        let res = ServiceDefinition::from_str(r#"ok={"this":["is","value"]"#);
+        assert!(res.is_err());
+    }
+
+    #[test]
+    fn test_call_result() {
+        use serde_json::json;
+
+        let res = ServiceDefinition::from_str(r#"err={"ret_code": 0, "result": [1, 2, 3]}"#);
+        assert_eq!(
+            res,
+            Ok(ServiceDefinition::Error(CallServiceResult::ok(json!([
+                1, 2, 3
+            ])))),
+        );
+    }
+
+    #[test]
+    fn test_call_result_malformed() {
+        let res = ServiceDefinition::from_str(r#"err={"retcode": 0, "result": [1, 2, 3]}"#);
+        assert!(res.is_err());
+    }
+
+    #[test]
+    fn test_call_result_invalid() {
+        let res = ServiceDefinition::from_str(r#"err={"ret_code": 0, "result": 1, 2, 3]}"#);
+        assert!(res.is_err());
+    }
+
+    #[test]
+    fn test_seq_ok() {
+        use serde_json::json;
+
+        let res = ServiceDefinition::from_str(r#"seq_ok={"default": 42, "1": true, "3": []}"#);
+        assert_eq!(
+            res,
+            Ok(ServiceDefinition::seq_ok(maplit::hashmap! {
+                "default".to_owned() => json!(42),
+                "1".to_owned() => json!(true),
+                "3".to_owned() => json!([]),
+            })),
+        );
+    }
+
+    #[test]
+    fn test_seq_ok_malformed() {
+        let res = ServiceDefinition::from_str(r#"seq_ok={"default": 42, "1": true, "3": ]}"#);
+        assert!(res.is_err());
+    }
+
+    #[test]
+    fn test_seq_ok_invalid() {
+        // TODO perhaps, we should support both arrays and maps
+        let res = ServiceDefinition::from_str(r#"seq_ok=[42, 43]"#);
+        assert!(res.is_err());
+    }
+
+    #[test]
+    fn test_seq_error() {
+        use serde_json::json;
+
+        let res = ServiceDefinition::from_str(
+            r#"seq_error={"default": {"ret_code": 0, "result": 42}, "1": {"ret_code": 0, "result": true}, "3": {"ret_code": 1, "result": "error"}}"#,
+        );
+        assert_eq!(
+            res,
+            Ok(ServiceDefinition::seq_error(maplit::hashmap! {
+                "default".to_owned() => CallServiceResult::ok(json!(42)),
+                "1".to_owned() => CallServiceResult::ok(json!(true)),
+                "3".to_owned() => CallServiceResult::err(1, json!("error")),
+            })),
+        );
+    }
+
+    #[test]
+    fn test_seq_error_malformed() {
+        let res = ServiceDefinition::from_str(r#"seq_error={"default": 42, "1": true]}"#);
+        assert!(res.is_err());
+    }
+
+    #[test]
+    fn test_seq_error_invalid() {
+        // TODO perhaps, we should support both arrays and maps
+        let res = ServiceDefinition::from_str(r#"seq_error=[42, 43]"#);
+        assert!(res.is_err());
+    }
+
+    #[test]
+    fn test_behaviour() {
+        let res = ServiceDefinition::from_str(r#"behaviour=echo"#);
+        assert_eq!(res, Ok(ServiceDefinition::Behaviour(Behavior::Echo)),);
+    }
+
+    #[test]
+    fn test_dbg_behaviour() {
+        let res = ServiceDefinition::from_str(r#"dbg_behaviour=echo"#);
+        assert_eq!(res, Ok(ServiceDefinition::DbgBehaviour(Behavior::Echo)),);
+    }
+
+    #[test]
+    fn test_map() {
+        let res = ServiceDefinition::from_str(r#"map = {"42": [], "a": 2}"#);
+        assert_eq!(
+            res,
+            Ok(ServiceDefinition::Map(maplit::hashmap! {
+                "42".to_owned() => json!([]),
+                "a".to_owned() => json!(2)
+            }))
+        );
+    }
+
+    #[test]
+    fn test_composable() {
+        use nom::bytes::complete::tag;
+        use nom::multi::separated_list1;
+
+        let res = separated_list1(tag(";"), parse_kw)(r#"ok={"ret_code": 0};map={"default": 42}"#);
+        assert_eq!(
+            res,
+            Ok((
+                "",
+                vec![
+                    ServiceDefinition::Ok(json!({"ret_code":0,})),
+                    ServiceDefinition::Map(maplit::hashmap! {"default".to_owned()=>json!(42),})
+                ]
+            ))
+        )
+    }
+}
+
\ No newline at end of file diff --git a/src/air_test_framework/ephemeral/mod.rs.html b/src/air_test_framework/ephemeral/mod.rs.html new file mode 100644 index 00000000..745f9acd --- /dev/null +++ b/src/air_test_framework/ephemeral/mod.rs.html @@ -0,0 +1,689 @@ +mod.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
+334
+335
+336
+337
+338
+339
+340
+341
+342
+343
+344
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+pub mod neighborhood;
+
+use self::neighborhood::{PeerEnv, PeerSet};
+use crate::{
+    queue::PeerQueueCell,
+    services::{services_to_call_service_closure, MarineServiceHandle, NetworkServices},
+};
+
+use air_test_utils::{
+    key_utils::derive_dummy_keypair,
+    test_runner::{
+        create_avm_with_key, AirRunner, DefaultAirRunner, TestInitParameters, TestRunParameters,
+        TestRunner,
+    },
+    RawAVMOutcome,
+};
+use fluence_keypair::KeyPair;
+
+use std::{borrow::Borrow, cell::RefCell, collections::HashMap, hash::Hash, ops::Deref, rc::Rc};
+
+#[derive(Clone, Debug, PartialEq, Eq, Hash)]
+#[repr(transparent)]
+pub struct PeerId(Rc<str>);
+
+impl PeerId {
+    pub fn new<'any>(peer_id: impl Into<&'any str>) -> Self {
+        Self(peer_id.into().into())
+    }
+
+    pub fn from_keypair(keypair: &KeyPair) -> Self {
+        Self::new(keypair.public().to_peer_id().to_string().as_str())
+    }
+}
+impl From<String> for PeerId {
+    fn from(source: String) -> Self {
+        Self(source.as_str().into())
+    }
+}
+
+impl From<&str> for PeerId {
+    fn from(source: &str) -> Self {
+        Self(source.into())
+    }
+}
+
+impl From<&PeerId> for PeerId {
+    fn from(value: &PeerId) -> Self {
+        value.clone()
+    }
+}
+
+impl Borrow<str> for PeerId {
+    fn borrow(&self) -> &str {
+        &self.0
+    }
+}
+
+impl Deref for PeerId {
+    type Target = str;
+
+    fn deref(&self) -> &Self::Target {
+        &self.0
+    }
+}
+
+pub type Data = Vec<u8>;
+
+pub struct Peer<R> {
+    pub(crate) peer_id: PeerId,
+    runner: TestRunner<R>,
+}
+
+impl<R: AirRunner> Peer<R> {
+    pub async fn new(
+        keypair: impl Into<KeyPair>,
+        services: Rc<[MarineServiceHandle]>,
+        test_init_parameters: TestInitParameters,
+    ) -> Self {
+        let call_service = services_to_call_service_closure(services);
+
+        let runner = create_avm_with_key::<R>(keypair, call_service, test_init_parameters).await;
+        let peer_id = runner.runner.get_current_peer_id().into();
+
+        Self { peer_id, runner }
+    }
+
+    pub fn get_peer_id(&self) -> &PeerId {
+        &self.peer_id
+    }
+
+    pub(crate) async fn invoke(
+        &mut self,
+        air: impl Into<String>,
+        data: Data,
+        test_run_params: TestRunParameters,
+        queue_cell: &PeerQueueCell,
+    ) -> Result<RawAVMOutcome, String> {
+        let prev_data = queue_cell.take_prev_data();
+        let res = self
+            .runner
+            .call(air, prev_data, data, test_run_params)
+            .await;
+        if let Ok(outcome) = &res {
+            queue_cell.set_prev_data(outcome.data.clone());
+        }
+        res
+    }
+
+    pub fn get_keypair(&self) -> &KeyPair {
+        &self.runner.keypair
+    }
+}
+
+impl<R: AirRunner> std::fmt::Debug for Peer<R> {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        f.debug_struct("Peer")
+            .field("peer_id", &self.peer_id)
+            .field("services", &"...")
+            .finish()
+    }
+}
+
+pub struct Network<R = DefaultAirRunner> {
+    peers: RefCell<HashMap<PeerId, Rc<RefCell<PeerEnv<R>>>>>,
+
+    // Default peer services.
+    services: Rc<NetworkServices>,
+
+    // Resolves human-readable peer names to real peer IDs.
+    resolver: RefCell<HashMap<PeerId, PeerId>>,
+}
+
+// it is implemented only for the default runner for compatibility reasons
+// Rust fails to deduce type for `Network::empty()` without
+//   extencive test code changes
+impl Network<DefaultAirRunner> {
+    pub async fn empty() -> Rc<Self> {
+        Self::new(std::iter::empty::<PeerId>(), vec![], <_>::default()).await
+    }
+}
+
+impl<R: AirRunner> Network<R> {
+    pub async fn new(
+        named_peers: impl Iterator<Item = impl Into<PeerId>>,
+        common_services: Vec<MarineServiceHandle>,
+        test_init_params: TestInitParameters,
+    ) -> Rc<Self> {
+        let network = Rc::new(Self {
+            peers: Default::default(),
+            services: NetworkServices::new(common_services).into(),
+            resolver: Default::default(),
+        });
+        for peer_name in named_peers {
+            network.ensure_named_peer(peer_name, test_init_params).await;
+        }
+        network
+    }
+
+    pub async fn from_peers(nodes: Vec<Peer<R>>, test_init_params: TestInitParameters) -> Rc<Self> {
+        let network = Self::new(std::iter::empty::<PeerId>(), vec![], test_init_params).await;
+        let neighborhood: PeerSet = nodes.iter().map(|peer| peer.peer_id.clone()).collect();
+        for peer in nodes {
+            network.add_peer_env(peer, neighborhood.iter().cloned());
+        }
+        network
+    }
+
+    pub fn add_peer_env(
+        self: &Rc<Self>,
+        peer: Peer<R>,
+        neighborhood: impl IntoIterator<Item = impl Into<PeerId>>,
+    ) {
+        let peer_id = peer.peer_id.clone();
+        let mut peer_env = PeerEnv::new(peer, self);
+        peer_env.extend_neighborhood(neighborhood.into_iter());
+        self.insert_peer_env_entry(peer_id, peer_env);
+    }
+
+    pub async fn ensure_named_peer(
+        self: &Rc<Self>,
+        name: impl Into<PeerId>,
+        test_init_params: TestInitParameters,
+    ) -> PeerId {
+        use std::collections::hash_map::Entry;
+
+        let name = name.into();
+
+        match self.resolver.borrow_mut().entry(name.clone()) {
+            Entry::Occupied(entry) => entry.get().clone(),
+            Entry::Vacant(empty) => {
+                let (keypair, _) = derive_dummy_keypair(&name);
+                let peer = Peer::new(keypair, self.services.get_services(), test_init_params).await;
+                let peer_id = peer.get_peer_id().clone();
+                self.add_peer(peer);
+
+                empty.insert(peer_id.clone());
+
+                peer_id
+            }
+        }
+    }
+
+    /// Add a peer with default neighborhood.
+    pub fn add_peer(self: &Rc<Self>, peer: Peer<R>) {
+        let peer_id = peer.peer_id.clone();
+        let peer_env = PeerEnv::new(peer, self);
+        self.insert_peer_env_entry(peer_id, peer_env);
+    }
+
+    fn insert_peer_env_entry(&self, peer_id: PeerId, peer_env: PeerEnv<R>) {
+        use std::collections::hash_map::Entry;
+
+        let mut peers_ref = self.peers.borrow_mut();
+        let peer_env = Rc::new(peer_env.into());
+        // It will be simplified with entry_insert stabilization
+        // https://github.com/rust-lang/rust/issues/65225
+        match peers_ref.entry(peer_id) {
+            Entry::Occupied(ent) => {
+                let cell = ent.into_mut();
+                *cell = peer_env;
+                cell
+            }
+            Entry::Vacant(ent) => ent.insert(peer_env),
+        };
+    }
+
+    // TODO named peer
+    pub fn set_peer_failed<Id>(&mut self, name: &Id, failed: bool)
+    where
+        PeerId: Borrow<Id> + for<'a> From<&'a Id>,
+        Id: Hash + Eq + ?Sized,
+    {
+        let peer_id = self.resolve_peer(name);
+        let mut peers_ref = self.peers.borrow_mut();
+        peers_ref
+            .get_mut::<PeerId>(&peer_id)
+            .expect("unknown peer")
+            .as_ref()
+            .borrow_mut()
+            .set_failed(failed);
+    }
+
+    // TODO named peer
+    pub fn fail_peer_for<Id1, Id2>(&mut self, source_peer_name: &Id1, target_peer_name: &Id2)
+    where
+        PeerId: Borrow<Id1> + for<'a> From<&'a Id1>,
+        Id1: Hash + Eq + ?Sized,
+        PeerId: Borrow<Id2> + for<'a> From<&'a Id2>,
+        Id2: Hash + Eq + ?Sized,
+    {
+        let source_peer_id = self.resolve_peer(source_peer_name);
+        let target_peer_id = self.resolve_peer(target_peer_name);
+
+        let mut peers_ref = self.peers.borrow_mut();
+        peers_ref
+            .get_mut::<PeerId>(&source_peer_id)
+            .expect("unknown peer")
+            .as_ref()
+            .borrow_mut()
+            .get_neighborhood_mut()
+            .set_target_unreachable(&target_peer_id);
+    }
+
+    // TODO named peer
+    pub fn unfail_peer_for<Id1, Id2>(&mut self, source_peer_name: &Id1, target_peer_name: &Id2)
+    where
+        PeerId: Borrow<Id1> + for<'a> From<&'a Id1>,
+        Id1: Hash + Eq + ?Sized,
+        PeerId: Borrow<Id2> + for<'a> From<&'a Id2>,
+        Id2: Hash + Eq + ?Sized,
+    {
+        let source_peer_id = self.resolve_peer(source_peer_name);
+        let target_peer_id = self.resolve_peer(target_peer_name);
+        let mut peers_ref = self.peers.borrow_mut();
+        peers_ref
+            .get_mut(&source_peer_id)
+            .expect("unknown peer")
+            .as_ref()
+            .borrow_mut()
+            .get_neighborhood_mut()
+            .unset_target_unreachable(&target_peer_id);
+    }
+
+    // TODO there is some kind of unsymmetry between these methods and the fail/unfail:
+    // the latters panic on unknown peer; perhaps, it's OK
+    // TODO named peer
+    pub fn get_peer_env<Id>(&self, peer_id: &Id) -> Option<Rc<RefCell<PeerEnv<R>>>>
+    where
+        PeerId: Borrow<Id> + for<'a> From<&'a Id>,
+        Id: Hash + Eq + ?Sized,
+    {
+        let peers_ref = self.peers.borrow();
+        peers_ref.get(peer_id).cloned()
+    }
+
+    pub fn get_named_peer_env<Id>(&self, peer_name: &Id) -> Option<Rc<RefCell<PeerEnv<R>>>>
+    where
+        PeerId: Borrow<Id> + for<'a> From<&'a Id>,
+        Id: Hash + Eq + ?Sized,
+    {
+        let peer_id: PeerId = self.resolve_peer(peer_name);
+        self.get_peer_env::<PeerId>(&peer_id)
+    }
+
+    pub(crate) fn get_services(&self) -> Rc<NetworkServices> {
+        self.services.clone()
+    }
+
+    pub fn get_peers(&self) -> impl Iterator<Item = PeerId> {
+        let peers_ref = self.peers.borrow();
+        peers_ref.keys().cloned().collect::<Vec<_>>().into_iter()
+    }
+
+    // TODO it sounds cool, but actually, name and PeerId should be
+    // distinct and have distinct API for working with a peer by name: &str
+    // and by PeerId
+    pub fn resolve_peer<Id>(&self, name: &Id) -> PeerId
+    where
+        PeerId: Borrow<Id> + for<'a> From<&'a Id>,
+        Id: Hash + Eq + ?Sized,
+    {
+        let resolver = self.resolver.borrow();
+        resolver.get(name).cloned().unwrap_or_else(|| (name).into())
+    }
+}
+
\ No newline at end of file diff --git a/src/air_test_framework/ephemeral/neighborhood.rs.html b/src/air_test_framework/ephemeral/neighborhood.rs.html new file mode 100644 index 00000000..4b56820c --- /dev/null +++ b/src/air_test_framework/ephemeral/neighborhood.rs.html @@ -0,0 +1,1141 @@ +neighborhood.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
+334
+335
+336
+337
+338
+339
+340
+341
+342
+343
+344
+345
+346
+347
+348
+349
+350
+351
+352
+353
+354
+355
+356
+357
+358
+359
+360
+361
+362
+363
+364
+365
+366
+367
+368
+369
+370
+371
+372
+373
+374
+375
+376
+377
+378
+379
+380
+381
+382
+383
+384
+385
+386
+387
+388
+389
+390
+391
+392
+393
+394
+395
+396
+397
+398
+399
+400
+401
+402
+403
+404
+405
+406
+407
+408
+409
+410
+411
+412
+413
+414
+415
+416
+417
+418
+419
+420
+421
+422
+423
+424
+425
+426
+427
+428
+429
+430
+431
+432
+433
+434
+435
+436
+437
+438
+439
+440
+441
+442
+443
+444
+445
+446
+447
+448
+449
+450
+451
+452
+453
+454
+455
+456
+457
+458
+459
+460
+461
+462
+463
+464
+465
+466
+467
+468
+469
+470
+471
+472
+473
+474
+475
+476
+477
+478
+479
+480
+481
+482
+483
+484
+485
+486
+487
+488
+489
+490
+491
+492
+493
+494
+495
+496
+497
+498
+499
+500
+501
+502
+503
+504
+505
+506
+507
+508
+509
+510
+511
+512
+513
+514
+515
+516
+517
+518
+519
+520
+521
+522
+523
+524
+525
+526
+527
+528
+529
+530
+531
+532
+533
+534
+535
+536
+537
+538
+539
+540
+541
+542
+543
+544
+545
+546
+547
+548
+549
+550
+551
+552
+553
+554
+555
+556
+557
+558
+559
+560
+561
+562
+563
+564
+565
+566
+567
+568
+569
+570
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::{Network, Peer, PeerId};
+use crate::queue::ExecutionQueue;
+
+use air_test_utils::test_runner::{AirRunner, DefaultAirRunner, TestRunParameters};
+
+use std::{
+    borrow::Borrow,
+    collections::{HashMap, HashSet},
+    hash::Hash,
+    rc::{Rc, Weak},
+};
+
+const EXPECT_VALID_NETWORK: &str = "Using a peer of a destroyed network";
+
+pub(crate) type PeerSet = HashSet<PeerId>;
+
+#[derive(Debug, PartialEq, Eq, Copy, Clone)]
+pub enum AlterState {
+    Added,
+    Removed,
+}
+
+/// Neighbors of particular node, including set of nodes unreachable from this one (but they might be
+/// reachable from others).
+pub struct Neighborhood<R = DefaultAirRunner> {
+    // the value is true is link from this peer to neighbor is failng
+    network: Weak<Network<R>>,
+    unreachable: HashSet<PeerId>,
+    altered: HashMap<PeerId, AlterState>,
+}
+
+impl<R: AirRunner> Neighborhood<R> {
+    pub fn new(network: &Rc<Network<R>>) -> Self {
+        Self {
+            network: Rc::downgrade(network),
+            unreachable: <_>::default(),
+            altered: <_>::default(),
+        }
+    }
+
+    pub fn iter(&self) -> impl Iterator<Item = PeerId> {
+        self.into_iter()
+    }
+
+    pub fn alter(&mut self, other_peer_id: impl Into<PeerId>, state: AlterState) {
+        let other_peer_id = other_peer_id.into();
+
+        self.altered.insert(other_peer_id, state);
+    }
+
+    pub fn unalter<Id>(&mut self, other_peer_id: &Id)
+    where
+        PeerId: Borrow<Id>,
+        Id: Eq + Hash + ?Sized,
+    {
+        self.altered.remove(other_peer_id);
+    }
+
+    pub fn get_alter_state<Id>(&self, other_peer_id: &Id) -> Option<AlterState>
+    where
+        PeerId: Borrow<Id>,
+        Id: Eq + Hash + ?Sized,
+    {
+        self.altered.get(other_peer_id).copied()
+    }
+
+    pub fn set_target_unreachable(&mut self, target: impl Into<PeerId>) {
+        self.unreachable.insert(target.into());
+    }
+
+    pub fn unset_target_unreachable<Id>(&mut self, target: &Id)
+    where
+        PeerId: Borrow<Id>,
+        Id: Eq + Hash + ?Sized,
+    {
+        self.unreachable.remove(target);
+    }
+
+    pub fn is_reachable(&self, target: impl Into<PeerId>) -> bool {
+        let target = target.into();
+        let network = self.network.upgrade().expect(EXPECT_VALID_NETWORK);
+        if network.get_named_peer_env::<PeerId>(&target).is_some()
+            || self.altered.get(&target) == Some(&AlterState::Added)
+        {
+            !self.unreachable.contains(&target)
+        } else {
+            false
+        }
+    }
+}
+
+impl<R: AirRunner> std::iter::IntoIterator for &Neighborhood<R> {
+    type Item = PeerId;
+
+    type IntoIter = std::collections::hash_set::IntoIter<PeerId>;
+
+    fn into_iter(self) -> Self::IntoIter {
+        let network = self.network.upgrade().expect(EXPECT_VALID_NETWORK);
+        let mut peers: HashSet<_> = network
+            .get_peers()
+            .filter(|peer| self.altered.get(peer) != Some(&AlterState::Removed))
+            .collect();
+        for (peer, &state) in self.altered.iter() {
+            if state == AlterState::Added {
+                peers.insert(peer.clone());
+            }
+        }
+        peers.into_iter()
+    }
+}
+
+pub struct PeerEnv<R> {
+    pub(crate) peer: Peer<R>,
+    // failed for everyone
+    failed: bool,
+    neighborhood: Neighborhood<R>,
+}
+
+impl<R: AirRunner> PeerEnv<R> {
+    pub fn new(peer: Peer<R>, network: &Rc<Network<R>>) -> Self {
+        Self {
+            peer,
+            failed: false,
+            neighborhood: Neighborhood::new(network),
+        }
+    }
+
+    pub fn is_failed(&self) -> bool {
+        self.failed
+    }
+
+    pub fn set_failed(&mut self, failed: bool) {
+        self.failed = failed;
+    }
+
+    pub fn is_reachable(&self, target: impl Into<PeerId>) -> bool {
+        if self.is_failed() {
+            return false;
+        }
+
+        let target_peer_id = target.into();
+        if self.peer.peer_id == target_peer_id {
+            return true;
+        }
+
+        self.neighborhood.is_reachable(target_peer_id)
+    }
+
+    pub fn extend_neighborhood(&mut self, peers: impl Iterator<Item = impl Into<PeerId>>) {
+        let peer_id = &self.peer.peer_id;
+        for other_peer_id in peers.map(Into::into).filter(|other_id| other_id != peer_id) {
+            self.neighborhood.alter(other_peer_id, AlterState::Added);
+        }
+    }
+
+    pub fn remove_from_neighborhood(&mut self, peers: impl Iterator<Item = impl Into<PeerId>>) {
+        let peer_id = &self.peer.peer_id;
+        for other_peer_id in peers.map(Into::into).filter(|other_id| other_id != peer_id) {
+            self.neighborhood.alter(other_peer_id, AlterState::Removed);
+        }
+    }
+
+    pub fn get_neighborhood(&self) -> &Neighborhood<R> {
+        &self.neighborhood
+    }
+
+    pub fn get_neighborhood_mut(&mut self) -> &mut Neighborhood<R> {
+        &mut self.neighborhood
+    }
+
+    pub fn iter(&self) -> impl Iterator<Item = PeerId> {
+        self.neighborhood.iter()
+    }
+
+    pub(crate) async fn execute_once(
+        &mut self,
+        air: impl Into<String>,
+        network: &Network<R>,
+        queue: &ExecutionQueue,
+        test_parameters: &TestRunParameters,
+    ) -> Option<Result<air_test_utils::RawAVMOutcome, String>> {
+        let queue = queue.clone();
+        let queue_cell = queue.get_peer_queue_cell(self.peer.peer_id.clone());
+        let maybe_data = queue_cell.pop_data();
+
+        let maybe_data: futures::future::OptionFuture<_> = maybe_data
+            .map(|data| async {
+                let res = self
+                    .peer
+                    .invoke(air, data, test_parameters.clone(), &queue_cell)
+                    .await;
+
+                if let Ok(outcome) = &res {
+                    queue.distribute_to_peers(network, &outcome.next_peer_pks, &outcome.data)
+                }
+
+                res
+            })
+            .into();
+
+        maybe_data.await
+    }
+
+    pub fn get_peer(&self) -> &Peer<R> {
+        &self.peer
+    }
+}
+
+impl<'a, R: AirRunner> IntoIterator for &'a PeerEnv<R> {
+    type Item = <&'a Neighborhood<R> as IntoIterator>::Item;
+    type IntoIter = <&'a Neighborhood<R> as IntoIterator>::IntoIter;
+
+    fn into_iter(self) -> Self::IntoIter {
+        self.neighborhood.into_iter()
+    }
+}
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+
+    use air_test_utils::key_utils::derive_dummy_keypair;
+    use air_test_utils::prelude::*;
+
+    use std::{iter::FromIterator, rc::Rc};
+
+    #[tokio::test]
+    async fn test_empty_neighborhood() {
+        let peer_name = "someone";
+        let other_name = "other1";
+        let (peer_pk, peer_id) = derive_dummy_keypair(peer_name);
+        let (_other_pk1, other_id) = derive_dummy_keypair(other_name);
+        let peer_id = PeerId::from(peer_id);
+        let other_id = PeerId::from(other_id);
+        let network =
+            Network::<NativeAirRunner>::new(std::iter::empty::<PeerId>(), vec![], <_>::default())
+                .await;
+
+        let penv = PeerEnv::new(
+            Peer::new(peer_pk, Rc::from(vec![]), <_>::default()).await,
+            &network,
+        );
+        assert!(penv.is_reachable(&peer_id));
+        assert!(!penv.is_reachable(&other_id));
+    }
+
+    #[tokio::test]
+    async fn test_no_self_disconnect() {
+        let peer_name = "someone";
+        let other_name = "other1";
+        let (peer_pk, peer_id) = derive_dummy_keypair(peer_name);
+        let (_other_pk, other_id) = derive_dummy_keypair(other_name);
+        let peer_id = PeerId::from(peer_id);
+        let other_id = PeerId::from(other_id);
+        let network =
+            Network::<NativeAirRunner>::new(std::iter::empty::<PeerId>(), vec![], <_>::default())
+                .await;
+
+        let mut penv = PeerEnv::new(
+            Peer::new(peer_pk, Rc::from(vec![]), <_>::default()).await,
+            &network,
+        );
+        {
+            let nei = penv.get_neighborhood_mut();
+
+            nei.alter(peer_id.clone(), AlterState::Added);
+            nei.alter(peer_id.clone(), AlterState::Removed);
+        }
+        assert!(penv.is_reachable(&peer_id));
+        assert!(!penv.is_reachable(&other_id));
+
+        let nei = penv.get_neighborhood_mut();
+        nei.unalter(&peer_id);
+        assert!(penv.is_reachable(&peer_id));
+        assert!(!penv.is_reachable(&other_id));
+    }
+
+    #[tokio::test]
+    async fn test_set_neighborhood() {
+        let peer_name = "someone";
+        let other_name1 = "other1";
+        let other_name2 = "other2";
+        let (peer_pk, _peer_id) = derive_dummy_keypair(peer_name);
+        let (_other_pk1, other_id1) = derive_dummy_keypair(other_name1);
+        let (_other_pk2, other_id2) = derive_dummy_keypair(other_name2);
+        let other_id1 = PeerId::from(other_id1);
+        let other_id2 = PeerId::from(other_id2);
+        let network =
+            Network::<NativeAirRunner>::new(std::iter::empty::<PeerId>(), vec![], <_>::default())
+                .await;
+
+        let penv = PeerEnv::new(
+            Peer::new(peer_pk, Rc::from(vec![]), <_>::default()).await,
+            &network,
+        );
+        // iter is empty
+        assert!(penv.iter().next().is_none());
+
+        network.ensure_named_peer(other_name1, <_>::default()).await;
+        network.ensure_named_peer(other_name1, <_>::default()).await;
+        network.ensure_named_peer(other_name2, <_>::default()).await;
+        let expected_neighborhood = PeerSet::from([other_id1, other_id2]);
+        assert_eq!(penv.iter().collect::<PeerSet>(), expected_neighborhood);
+    }
+
+    #[tokio::test]
+    async fn test_insert() {
+        let peer_name = "someone";
+        let other_name1 = "other1";
+        let other_name2 = "other2";
+        let (peer_pk, _peer_id) = derive_dummy_keypair(peer_name);
+        let (_other_pk1, other_id1) = derive_dummy_keypair(other_name1);
+        let (_other_pk2, other_id2) = derive_dummy_keypair(other_name2);
+        let other_id1 = PeerId::from(other_id1);
+        let other_id2 = PeerId::from(other_id2);
+        let network =
+            Network::<NativeAirRunner>::new(std::iter::empty::<PeerId>(), vec![], <_>::default())
+                .await;
+
+        let penv = PeerEnv::new(
+            Peer::new(peer_pk, Rc::from(vec![]), <_>::default()).await,
+            &network,
+        );
+
+        // iter is empty
+        assert!(penv.iter().next().is_none());
+
+        network.ensure_named_peer(other_name1, <_>::default()).await;
+        network.ensure_named_peer(other_name2, <_>::default()).await;
+        let expected_neighborhood = PeerSet::from([other_id1, other_id2]);
+        assert_eq!(PeerSet::from_iter(penv.iter()), expected_neighborhood);
+    }
+
+    #[tokio::test]
+    async fn test_ensure() {
+        let peer_name = "someone";
+        let other_name1 = "other1";
+        let other_name2 = "other2";
+        let (peer_pk, _peer_id) = derive_dummy_keypair(peer_name);
+        let (_other_pk1, other_id1) = derive_dummy_keypair(other_name1);
+        let (_other_pk2, other_id2) = derive_dummy_keypair(other_name2);
+        let other_id1 = PeerId::from(other_id1);
+        let other_id2 = PeerId::from(other_id2);
+        let network =
+            Network::<NativeAirRunner>::new(std::iter::empty::<PeerId>(), vec![], <_>::default())
+                .await;
+
+        let mut penv = PeerEnv::new(
+            Peer::new(peer_pk, Rc::from(vec![]), <_>::default()).await,
+            &network,
+        );
+
+        // iter is empty
+        assert!(penv.iter().next().is_none());
+        let nei = penv.get_neighborhood_mut();
+        nei.alter(other_id1.clone(), AlterState::Added);
+        nei.alter(other_id2.clone(), AlterState::Added);
+
+        let expected_neighborhood = PeerSet::from([other_id1, other_id2]);
+        assert_eq!(PeerSet::from_iter(penv.iter()), expected_neighborhood);
+    }
+
+    #[tokio::test]
+    async fn test_insert_insert() {
+        let peer_name = "someone";
+        let other_name1 = "other1";
+        let (peer_pk, _peer_id) = derive_dummy_keypair(peer_name);
+        let (_other_pk1, other_id1) = derive_dummy_keypair(other_name1);
+        let other_id1 = PeerId::from(other_id1);
+        let network =
+            Network::<NativeAirRunner>::new(std::iter::empty::<PeerId>(), vec![], <_>::default())
+                .await;
+
+        let mut penv = PeerEnv::new(
+            Peer::new(peer_pk, Rc::from(vec![]), <_>::default()).await,
+            &network,
+        );
+
+        // iter is empty
+        assert!(penv.iter().next().is_none());
+
+        let nei = penv.get_neighborhood_mut();
+        nei.alter(other_id1.clone(), AlterState::Added);
+        nei.alter(other_id1.clone(), AlterState::Added);
+
+        let expected_neighborhood = vec![other_id1];
+        assert_eq!(penv.iter().collect::<Vec<_>>(), expected_neighborhood);
+    }
+
+    #[tokio::test]
+    async fn test_extend_neighborhood() {
+        let peer_name = "peer";
+        let (peer_pk, _peer_id) = derive_dummy_keypair(peer_name);
+
+        let network =
+            Network::<NativeAirRunner>::new(std::iter::empty::<PeerId>(), vec![], <_>::default())
+                .await;
+
+        let mut penv = PeerEnv::new(
+            Peer::new(peer_pk, Rc::from(vec![]), <_>::default()).await,
+            &network,
+        );
+        penv.get_neighborhood_mut()
+            .alter(PeerId::from("zero"), AlterState::Added);
+        penv.extend_neighborhood(IntoIterator::into_iter(["one", "two"]));
+
+        assert_eq!(
+            PeerSet::from_iter(penv.iter()),
+            PeerSet::from_iter(IntoIterator::into_iter(["zero", "one", "two"]).map(PeerId::from)),
+        );
+    }
+
+    #[tokio::test]
+    async fn test_remove_from_neiborhood() {
+        let network =
+            Network::<NativeAirRunner>::new(std::iter::empty::<PeerId>(), vec![], <_>::default())
+                .await;
+        let (peer_pk, _peer_id) = derive_dummy_keypair("someone");
+
+        let mut penv = PeerEnv::new(
+            Peer::new(peer_pk, Rc::from(vec![]), <_>::default()).await,
+            &network,
+        );
+        penv.get_neighborhood_mut()
+            .alter(PeerId::from("zero"), AlterState::Added);
+        penv.extend_neighborhood(IntoIterator::into_iter(["one", "two"]));
+        penv.remove_from_neighborhood(IntoIterator::into_iter(["zero", "two"]));
+
+        assert_eq!(
+            penv.iter().collect::<PeerSet>(),
+            maplit::hashset! {
+                PeerId::from("one"),
+            },
+        );
+    }
+    #[tokio::test]
+    async fn test_fail() {
+        let peer_name = "someone";
+        let other_name1 = "other1";
+        let (peer_pk, _peer_id) = derive_dummy_keypair(peer_name);
+        let (_other_pk, other_id) = derive_dummy_keypair(other_name1);
+        let other_id = PeerId::from(other_id);
+        let network =
+            Network::<NativeAirRunner>::new(std::iter::empty::<PeerId>(), vec![], <_>::default())
+                .await;
+        let mut penv = PeerEnv::new(
+            Peer::new(peer_pk, Rc::from(vec![]), <_>::default()).await,
+            &network,
+        );
+
+        let nei = penv.get_neighborhood_mut();
+        nei.alter(other_id.clone(), AlterState::Added);
+        nei.set_target_unreachable(other_id.clone());
+
+        let expected_neighborhood = PeerSet::from([other_id.clone()]);
+        assert_eq!(PeerSet::from_iter(penv.iter()), expected_neighborhood);
+        assert!(!penv.is_reachable(&other_id));
+    }
+
+    #[tokio::test]
+    async fn test_fail_remove() {
+        let peer_name = "someone";
+        let other_name1 = "other1";
+        let (peer_pk, _peer_id) = derive_dummy_keypair(peer_name);
+        let (_other_pk, other_id) = derive_dummy_keypair(other_name1);
+        let other_id = PeerId::from(other_id);
+        let network =
+            Network::<NativeAirRunner>::new(std::iter::empty::<PeerId>(), vec![], <_>::default())
+                .await;
+
+        let mut penv = PeerEnv::new(
+            Peer::new(peer_pk, Rc::from(vec![]), <_>::default()).await,
+            &network,
+        );
+
+        let nei = penv.get_neighborhood_mut();
+        nei.alter(other_id.clone(), AlterState::Added);
+        nei.set_target_unreachable(other_id.clone());
+        assert!(!penv.is_reachable(&other_id));
+
+        let nei = penv.get_neighborhood_mut();
+        nei.unalter(&other_id);
+        assert!(!penv.is_reachable(&other_id));
+
+        let nei = penv.get_neighborhood_mut();
+        nei.alter(other_id.clone(), AlterState::Added);
+        assert!(!penv.is_reachable(&other_id));
+    }
+
+    #[tokio::test]
+    async fn test_fail_unfail() {
+        let peer_name = "someone";
+        let other_name1 = "other1";
+        let (peer_pk, _peer_id) = derive_dummy_keypair(peer_name);
+        let (_other_pk, other_id) = derive_dummy_keypair(other_name1);
+        let other_id = PeerId::from(other_id);
+        let network =
+            Network::<NativeAirRunner>::new(std::iter::empty::<PeerId>(), vec![], <_>::default())
+                .await;
+        let mut penv = PeerEnv::new(
+            Peer::new(peer_pk, Rc::from(vec![]), <_>::default()).await,
+            &network,
+        );
+
+        let nei = penv.get_neighborhood_mut();
+        nei.alter(other_id.clone(), AlterState::Added);
+        nei.set_target_unreachable(other_id.clone());
+        assert!(!penv.is_reachable(&other_id));
+
+        let nei = penv.get_neighborhood_mut();
+        nei.unset_target_unreachable(&other_id);
+        assert!(penv.is_reachable(&other_id));
+    }
+
+    #[tokio::test]
+    async fn test_failed() {
+        let peer_name = "someone";
+        let other_name = "other1";
+        let remote_name = "remote";
+        let (peer_pk, peer_id) = derive_dummy_keypair(peer_name);
+        let (_other_pk, other_id) = derive_dummy_keypair(other_name);
+        let (_remote_pk, remote_id) = derive_dummy_keypair(remote_name);
+        let peer_id = PeerId::from(peer_id);
+        let other_id = PeerId::from(other_id);
+        let remote_id = PeerId::from(remote_id);
+        let network =
+            Network::<NativeAirRunner>::new(std::iter::empty::<PeerId>(), vec![], <_>::default())
+                .await;
+
+        let mut penv = PeerEnv::new(
+            Peer::new(peer_pk, Rc::from(vec![]), <_>::default()).await,
+            &network,
+        );
+        penv.get_neighborhood_mut()
+            .alter(other_id.clone(), AlterState::Added);
+
+        assert!(penv.is_reachable(&peer_id));
+        assert!(penv.is_reachable(&other_id));
+        assert!(!penv.is_reachable(&remote_id));
+
+        penv.set_failed(true);
+        assert!(!penv.is_reachable(&peer_id));
+        assert!(!penv.is_reachable(&other_id));
+        assert!(!penv.is_reachable(&remote_id));
+
+        penv.set_failed(false);
+        assert!(penv.is_reachable(&peer_id));
+        assert!(penv.is_reachable(&other_id));
+        assert!(!penv.is_reachable(&remote_id));
+    }
+}
+
\ No newline at end of file diff --git a/src/air_test_framework/execution/mod.rs.html b/src/air_test_framework/execution/mod.rs.html new file mode 100644 index 00000000..f341a2e4 --- /dev/null +++ b/src/air_test_framework/execution/mod.rs.html @@ -0,0 +1,2177 @@ +mod.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
+334
+335
+336
+337
+338
+339
+340
+341
+342
+343
+344
+345
+346
+347
+348
+349
+350
+351
+352
+353
+354
+355
+356
+357
+358
+359
+360
+361
+362
+363
+364
+365
+366
+367
+368
+369
+370
+371
+372
+373
+374
+375
+376
+377
+378
+379
+380
+381
+382
+383
+384
+385
+386
+387
+388
+389
+390
+391
+392
+393
+394
+395
+396
+397
+398
+399
+400
+401
+402
+403
+404
+405
+406
+407
+408
+409
+410
+411
+412
+413
+414
+415
+416
+417
+418
+419
+420
+421
+422
+423
+424
+425
+426
+427
+428
+429
+430
+431
+432
+433
+434
+435
+436
+437
+438
+439
+440
+441
+442
+443
+444
+445
+446
+447
+448
+449
+450
+451
+452
+453
+454
+455
+456
+457
+458
+459
+460
+461
+462
+463
+464
+465
+466
+467
+468
+469
+470
+471
+472
+473
+474
+475
+476
+477
+478
+479
+480
+481
+482
+483
+484
+485
+486
+487
+488
+489
+490
+491
+492
+493
+494
+495
+496
+497
+498
+499
+500
+501
+502
+503
+504
+505
+506
+507
+508
+509
+510
+511
+512
+513
+514
+515
+516
+517
+518
+519
+520
+521
+522
+523
+524
+525
+526
+527
+528
+529
+530
+531
+532
+533
+534
+535
+536
+537
+538
+539
+540
+541
+542
+543
+544
+545
+546
+547
+548
+549
+550
+551
+552
+553
+554
+555
+556
+557
+558
+559
+560
+561
+562
+563
+564
+565
+566
+567
+568
+569
+570
+571
+572
+573
+574
+575
+576
+577
+578
+579
+580
+581
+582
+583
+584
+585
+586
+587
+588
+589
+590
+591
+592
+593
+594
+595
+596
+597
+598
+599
+600
+601
+602
+603
+604
+605
+606
+607
+608
+609
+610
+611
+612
+613
+614
+615
+616
+617
+618
+619
+620
+621
+622
+623
+624
+625
+626
+627
+628
+629
+630
+631
+632
+633
+634
+635
+636
+637
+638
+639
+640
+641
+642
+643
+644
+645
+646
+647
+648
+649
+650
+651
+652
+653
+654
+655
+656
+657
+658
+659
+660
+661
+662
+663
+664
+665
+666
+667
+668
+669
+670
+671
+672
+673
+674
+675
+676
+677
+678
+679
+680
+681
+682
+683
+684
+685
+686
+687
+688
+689
+690
+691
+692
+693
+694
+695
+696
+697
+698
+699
+700
+701
+702
+703
+704
+705
+706
+707
+708
+709
+710
+711
+712
+713
+714
+715
+716
+717
+718
+719
+720
+721
+722
+723
+724
+725
+726
+727
+728
+729
+730
+731
+732
+733
+734
+735
+736
+737
+738
+739
+740
+741
+742
+743
+744
+745
+746
+747
+748
+749
+750
+751
+752
+753
+754
+755
+756
+757
+758
+759
+760
+761
+762
+763
+764
+765
+766
+767
+768
+769
+770
+771
+772
+773
+774
+775
+776
+777
+778
+779
+780
+781
+782
+783
+784
+785
+786
+787
+788
+789
+790
+791
+792
+793
+794
+795
+796
+797
+798
+799
+800
+801
+802
+803
+804
+805
+806
+807
+808
+809
+810
+811
+812
+813
+814
+815
+816
+817
+818
+819
+820
+821
+822
+823
+824
+825
+826
+827
+828
+829
+830
+831
+832
+833
+834
+835
+836
+837
+838
+839
+840
+841
+842
+843
+844
+845
+846
+847
+848
+849
+850
+851
+852
+853
+854
+855
+856
+857
+858
+859
+860
+861
+862
+863
+864
+865
+866
+867
+868
+869
+870
+871
+872
+873
+874
+875
+876
+877
+878
+879
+880
+881
+882
+883
+884
+885
+886
+887
+888
+889
+890
+891
+892
+893
+894
+895
+896
+897
+898
+899
+900
+901
+902
+903
+904
+905
+906
+907
+908
+909
+910
+911
+912
+913
+914
+915
+916
+917
+918
+919
+920
+921
+922
+923
+924
+925
+926
+927
+928
+929
+930
+931
+932
+933
+934
+935
+936
+937
+938
+939
+940
+941
+942
+943
+944
+945
+946
+947
+948
+949
+950
+951
+952
+953
+954
+955
+956
+957
+958
+959
+960
+961
+962
+963
+964
+965
+966
+967
+968
+969
+970
+971
+972
+973
+974
+975
+976
+977
+978
+979
+980
+981
+982
+983
+984
+985
+986
+987
+988
+989
+990
+991
+992
+993
+994
+995
+996
+997
+998
+999
+1000
+1001
+1002
+1003
+1004
+1005
+1006
+1007
+1008
+1009
+1010
+1011
+1012
+1013
+1014
+1015
+1016
+1017
+1018
+1019
+1020
+1021
+1022
+1023
+1024
+1025
+1026
+1027
+1028
+1029
+1030
+1031
+1032
+1033
+1034
+1035
+1036
+1037
+1038
+1039
+1040
+1041
+1042
+1043
+1044
+1045
+1046
+1047
+1048
+1049
+1050
+1051
+1052
+1053
+1054
+1055
+1056
+1057
+1058
+1059
+1060
+1061
+1062
+1063
+1064
+1065
+1066
+1067
+1068
+1069
+1070
+1071
+1072
+1073
+1074
+1075
+1076
+1077
+1078
+1079
+1080
+1081
+1082
+1083
+1084
+1085
+1086
+1087
+1088
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use crate::{
+    ephemeral::{Data, Network, PeerId},
+    queue::ExecutionQueue,
+    services::MarineServiceHandle,
+    transform::walker::TransformedAirScript,
+};
+
+use air_test_utils::{
+    test_runner::{AirRunner, DefaultAirRunner, TestInitParameters, TestRunParameters},
+    RawAVMOutcome,
+};
+
+use futures::future::OptionFuture;
+use futures::StreamExt;
+
+#[allow(unused)] // compiler gives warning, but it is used
+use futures::future::LocalBoxFuture;
+#[allow(unused)] // compiler gives warning, but it is used
+use futures::FutureExt;
+
+use std::{borrow::Borrow, hash::Hash, rc::Rc};
+
+/// A executor for an AIR script. Several executors may share same TransformedAirScript
+/// and its state.
+pub struct AirScriptExecutor<R = DefaultAirRunner> {
+    transformed_air_script: TransformedAirScript<R>,
+    test_parameters: TestRunParameters,
+    queue: ExecutionQueue,
+}
+
+// it is implemented only for the default runner for compatibility reasons
+// Rust fails to deduce type for `AirScriptExecutor::simple()` without
+//   extencive test code changes
+impl AirScriptExecutor<DefaultAirRunner> {
+    /// Simple constructor where everything is generated from the annotated_air_script.
+    pub async fn from_annotated(
+        test_parameters: TestRunParameters,
+        annotated_air_script: &str,
+    ) -> Result<Self, String> {
+        Self::new(
+            test_parameters,
+            vec![],
+            std::iter::empty(),
+            annotated_air_script,
+        )
+        .await
+    }
+}
+
+impl<R: AirRunner> AirScriptExecutor<R> {
+    pub async fn from_transformed_air_script(
+        mut test_parameters: TestRunParameters,
+        test_init_parameters: TestInitParameters,
+        transformed_air_script: TransformedAirScript<R>,
+    ) -> Result<Self, String> {
+        let network = transformed_air_script.get_network();
+        let init_peer_id = test_parameters.init_peer_id.clone();
+        let real_init_peer_id = network
+            .ensure_named_peer(init_peer_id.as_str(), test_init_parameters)
+            .await;
+        test_parameters.init_peer_id = real_init_peer_id.to_string();
+
+        let queue = ExecutionQueue::new();
+        // Seed execution
+        queue.distribute_to_peers(&network, &[real_init_peer_id], &<_>::default());
+
+        Ok(Self {
+            transformed_air_script,
+            test_parameters,
+            queue,
+        })
+    }
+
+    /// Create execution from the annotated air script.
+    ///
+    /// `extra_peers` allows you to define peers that are not mentioned in the annotated script
+    /// explicitly, but are used, e.g. if their names are returned from a call.
+    pub async fn new(
+        test_parameters: TestRunParameters,
+        common_services: Vec<MarineServiceHandle>,
+        extra_peers: impl IntoIterator<Item = PeerId>,
+        annotated_air_script: &str,
+    ) -> Result<Self, String> {
+        let network = Network::new(extra_peers.into_iter(), common_services, <_>::default()).await;
+        let transformed =
+            TransformedAirScript::new(annotated_air_script, network, <_>::default()).await?;
+
+        Self::from_transformed_air_script(test_parameters, <_>::default(), transformed).await
+    }
+
+    pub async fn from_network(
+        test_parameters: TestRunParameters,
+        test_init_parameters: TestInitParameters,
+        network: Rc<Network<R>>,
+        annotated_air_script: &str,
+    ) -> Result<Self, String> {
+        let transformed =
+            TransformedAirScript::new(annotated_air_script, network, test_init_parameters).await?;
+
+        Self::from_transformed_air_script(test_parameters, test_init_parameters, transformed).await
+    }
+
+    pub async fn new_with_init_parameters(
+        test_parameters: TestRunParameters,
+        test_init_parameters: TestInitParameters,
+        common_services: Vec<MarineServiceHandle>,
+        extra_peers: impl IntoIterator<Item = PeerId>,
+        annotated_air_script: &str,
+    ) -> Result<Self, String> {
+        let network = Network::new(
+            extra_peers.into_iter(),
+            common_services,
+            test_init_parameters,
+        )
+        .await;
+        let transformed =
+            TransformedAirScript::new(annotated_air_script, network, test_init_parameters).await?;
+
+        Self::from_transformed_air_script(test_parameters, test_init_parameters, transformed).await
+    }
+
+    /// Return Iterator for handling all the queued datas
+    /// for particular peer_id.
+    pub fn execution_iter<'s, Id>(
+        &'s self,
+        peer_id: &Id,
+    ) -> Option<impl futures::stream::Stream<Item = RawAVMOutcome> + 's>
+    where
+        PeerId: Borrow<Id> + for<'a> From<&'a Id>,
+        Id: Eq + Hash + ?Sized,
+    {
+        self.queue.execution_iter(
+            &self.transformed_air_script,
+            self.transformed_air_script.get_network(),
+            &self.test_parameters,
+            peer_id,
+        )
+    }
+
+    /// Process all queued datas, panicing on error.
+    pub async fn execute_all<Id>(&self, peer_id: &Id) -> Option<Vec<RawAVMOutcome>>
+    where
+        PeerId: Borrow<Id> + for<'a> From<&'a Id>,
+        Id: Eq + Hash + ?Sized,
+    {
+        let exec_iter: OptionFuture<_> = self.execution_iter(peer_id).map(|it| it.collect()).into();
+        exec_iter.await
+    }
+
+    /// Process one queued data, panicing if it is unavalable or on error.
+    pub async fn execute_one<Id>(&self, peer_id: &Id) -> Option<RawAVMOutcome>
+    where
+        PeerId: Borrow<Id> + for<'a> From<&'a Id>,
+        Id: Eq + Hash + ?Sized,
+    {
+        let mut it = self.execution_iter(peer_id)?;
+        it.next().await
+    }
+
+    /// Push data into peer's queue.
+    pub fn enqueue(&self, peer_id: impl Into<PeerId>, data: Data) {
+        let queue_cell = self.queue.get_peer_queue_cell(peer_id.into());
+        queue_cell.push_data(data);
+    }
+
+    pub fn get_prev_data(&self, peer_id: impl Into<PeerId>) -> Data {
+        let queue_cell = self.queue.get_peer_queue_cell(peer_id.into());
+        queue_cell.take_prev_data()
+    }
+
+    pub fn resolve_name(&self, name: &str) -> PeerId {
+        self.transformed_air_script.get_network().resolve_peer(name)
+    }
+
+    pub fn get_network(&self) -> Rc<Network<R>> {
+        self.transformed_air_script.get_network()
+    }
+
+    pub fn get_transformed_air_script(&self) -> &TransformedAirScript<R> {
+        &self.transformed_air_script
+    }
+}
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+    use crate::services::MarineService;
+
+    use air_test_utils::{key_utils::derive_dummy_keypair, prelude::*};
+    use pretty_assertions::assert_eq;
+
+    use std::cell::RefCell;
+
+    #[tokio::test]
+    async fn test_execution() {
+        let peer1_name = "peer1";
+        let peer2_name = "peer2";
+        let init_peer_name = "init_peer_id";
+
+        let exec = AirScriptExecutor::<NativeAirRunner>::new(
+            TestRunParameters::from_init_peer_id(init_peer_name),
+            vec![],
+            std::iter::empty(),
+            &format!(
+                r#"(seq
+(call "{peer1_name}" ("service" "func") [] arg) ; ok=42
+(call "{peer2_name}" ("service" "func") [arg]) ; ok=43
+)
+"#
+            ),
+        )
+        .await
+        .unwrap();
+
+        let peer1_id = exec.resolve_name(peer1_name).to_string();
+
+        let result_init: Vec<_> = exec.execution_iter(init_peer_name).unwrap().collect().await;
+
+        assert_eq!(result_init.len(), 1);
+        let outcome = &result_init[0];
+        assert_eq!(outcome.next_peer_pks, vec![peer1_id.clone()]);
+
+        assert!(exec
+            .execution_iter(peer2_name)
+            .unwrap()
+            .next()
+            .await
+            .is_none());
+        let results1: Vec<_> = exec.execution_iter(peer1_name).unwrap().collect().await;
+        assert_eq!(results1.len(), 1);
+        let outcome1 = &results1[0];
+        assert_eq!(outcome1.ret_code, 0);
+        assert!(exec
+            .execution_iter(peer1_name)
+            .unwrap()
+            .next()
+            .await
+            .is_none());
+
+        let outcome2 = exec.execute_one(peer2_name).await.unwrap();
+        assert_eq!(outcome2.ret_code, 0);
+    }
+
+    #[tokio::test]
+    async fn test_call_result_success() {
+        let exec = AirScriptExecutor::<NativeAirRunner>::new(
+            TestRunParameters::from_init_peer_id("init_peer_id"),
+            vec![],
+            std::iter::empty(),
+            r#"(seq
+(call "peer1" ("service" "func") [] arg) ; err = {"ret_code":0,"result":42}
+(call "peer2" ("service" "func") [arg]) ; ok = 43
+)
+"#,
+        )
+        .await
+        .unwrap();
+
+        let result_init: Vec<_> = exec.execution_iter("init_peer_id").unwrap().collect().await;
+
+        assert_eq!(result_init.len(), 1);
+        let outcome1 = &result_init[0];
+        assert_eq!(outcome1.ret_code, 0);
+        assert_eq!(outcome1.error_message, "");
+
+        assert!(exec.execution_iter("peer2").unwrap().next().await.is_none());
+        let results1: Vec<_> = exec.execution_iter("peer1").unwrap().collect().await;
+        assert_eq!(results1.len(), 1);
+        let outcome1 = &results1[0];
+        assert_eq!(outcome1.ret_code, 0, "{:?}", outcome1);
+        assert!(exec.execution_iter("peer1").unwrap().next().await.is_none());
+    }
+
+    #[tokio::test]
+    async fn test_call_result_error() {
+        let script = r#"
+        (seq
+            (call "peer1" ("service" "func") [] arg) ; err = {"ret_code":12,"result":"ERROR MESSAGE"}
+            (call "peer2" ("service" "func") [arg]) ; ok = 43
+        )
+        "#;
+        let exec = AirScriptExecutor::<NativeAirRunner>::new(
+            TestRunParameters::from_init_peer_id("init_peer_id"),
+            vec![],
+            std::iter::empty(),
+            script,
+        )
+        .await
+        .unwrap();
+
+        let result_init: Vec<_> = exec.execution_iter("init_peer_id").unwrap().collect().await;
+
+        assert_eq!(result_init.len(), 1);
+        let outcome1 = &result_init[0];
+        assert_eq!(outcome1.ret_code, 0);
+        assert_eq!(outcome1.error_message, "");
+
+        assert!(exec.execution_iter("peer2").unwrap().next().await.is_none());
+        let results1: Vec<_> = exec.execution_iter("peer1").unwrap().collect().await;
+        assert_eq!(results1.len(), 1);
+        let outcome1 = &results1[0];
+        assert_eq!(outcome1.ret_code, 10000, "{:?}", outcome1);
+        assert_eq!(
+            outcome1.error_message,
+            "Local service error, ret_code is 12, error message is '\"ERROR MESSAGE\"'",
+            "{:?}",
+            outcome1
+        );
+        assert!(exec.execution_iter("peer1").unwrap().next().await.is_none());
+
+        let results2: Vec<_> = exec.execution_iter("peer2").unwrap().collect().await;
+        assert_eq!(results2.len(), 0);
+    }
+
+    #[tokio::test]
+    async fn test_seq_ok() {
+        let init_peer_name = "init_peer_id";
+        let peer1_name = "peer1";
+        let peer2_name = "peer2";
+        let peer3_name = "peer3";
+        let (_peer2_pk, peer2_id) = derive_dummy_keypair(peer2_name);
+        let (_peer3_pk, peer3_id) = derive_dummy_keypair(peer3_name);
+
+        let exec = AirScriptExecutor::<NativeAirRunner>::new(
+            TestRunParameters::from_init_peer_id(init_peer_name),
+            vec![],
+            IntoIterator::into_iter([peer2_name, peer3_name]).map(Into::into),
+            &format!(r#"(seq
+  (seq
+    (call "{peer1_name}" ("service" "func") [] var)  ; ok = [{{"p":"{peer2_id}","v":2}},{{"p":"{peer3_id}","v":3}}]
+    (seq
+      (ap 1 k)
+      (fold var i
+        (seq
+          (call i.$.p ("service" "func") [i k] k)  ; seq_ok = {{"0":12,"default":42}}
+          (next i)))))
+  (call "init_peer_id" ("a" "b") []) ; ok = 0
+)"#),
+        )
+        .await
+        .unwrap();
+
+        let result_init: Vec<_> = exec.execution_iter(init_peer_name).unwrap().collect().await;
+
+        assert_eq!(result_init.len(), 1);
+        let outcome1 = &result_init[0];
+        assert_eq!(outcome1.ret_code, 0);
+        assert_eq!(outcome1.error_message, "");
+
+        assert!(exec
+            .execution_iter(peer2_name)
+            .unwrap()
+            .next()
+            .await
+            .is_none());
+        {
+            let results1 = exec.execute_all(peer1_name).await.unwrap();
+            assert_eq!(results1.len(), 1);
+            let outcome1 = &results1[0];
+            assert_eq!(outcome1.ret_code, 0, "{:?}", outcome1);
+            assert!(exec
+                .execution_iter(peer1_name)
+                .unwrap()
+                .next()
+                .await
+                .is_none());
+            assert_next_pks!(&outcome1.next_peer_pks, [peer2_id.as_str()]);
+        }
+
+        {
+            let results2: Vec<_> = exec.execute_all(peer2_name).await.unwrap();
+            assert_eq!(results2.len(), 1);
+            let outcome2 = &results2[0];
+            assert_eq!(outcome2.ret_code, 0, "{:?}", outcome2);
+            assert!(exec
+                .execution_iter(peer2_name)
+                .unwrap()
+                .next()
+                .await
+                .is_none());
+            assert_next_pks!(&outcome2.next_peer_pks, [peer3_id.as_str()]);
+
+            let trace = trace_from_result(outcome2);
+            assert_eq!(
+                trace,
+                ExecutionTrace::from(vec![
+                    scalar!(
+                        json!([{"p":peer2_id,"v":2},{"p":peer3_id,"v":3}]),
+                        peer_name = &peer1_name,
+                        service = "service..0",
+                        function = "func"
+                    ),
+                    scalar!(
+                        12,
+                        peer_name = &peer2_name,
+                        service = "service..1",
+                        function = "func",
+                        args = vec![json!({"p":peer2_id,"v":2}), json!(1)]
+                    ),
+                    request_sent_by(peer2_id.clone()),
+                ])
+            );
+        }
+
+        {
+            let results3: Vec<_> = exec.execute_all(peer3_name).await.unwrap();
+            assert_eq!(results3.len(), 1);
+            let outcome3 = &results3[0];
+            assert_eq!(outcome3.ret_code, 0, "{:?}", outcome3);
+            assert!(exec
+                .execution_iter(peer3_name)
+                .unwrap()
+                .next()
+                .await
+                .is_none());
+
+            let trace = trace_from_result(outcome3);
+            assert_eq!(
+                trace,
+                ExecutionTrace::from(vec![
+                    scalar!(
+                        json!([{"p":peer2_id,"v":2},{"p":peer3_id,"v":3}]),
+                        peer_name = &peer1_name,
+                        service = "service..0",
+                        function = "func"
+                    ),
+                    scalar!(
+                        12,
+                        peer_name = &peer2_name,
+                        service = "service..1",
+                        function = "func",
+                        args = vec![json!({"p":peer2_id,"v":2}), json!(1)]
+                    ),
+                    request_sent_by(peer2_id),
+                ])
+            );
+        }
+    }
+
+    #[tokio::test]
+    async fn test_map() {
+        let peer1_name = "peer1";
+        let peer2_name = "peer2";
+        let peer3_name = "peer3";
+        let (_peer2_pk, peer2_id) = derive_dummy_keypair(peer2_name);
+        let (_peer3_pk, peer3_id) = derive_dummy_keypair(peer3_name);
+
+        let exec = AirScriptExecutor::<NativeAirRunner>::new(
+            TestRunParameters::from_init_peer_id(peer1_name),
+            vec![],
+            IntoIterator::into_iter([peer2_name, peer3_name]).map(Into::into),
+            &format!(
+                r#"
+(seq
+  (call "{peer1_name}" ("" "") [] peers) ; ok = ["{peer2_id}", "{peer3_id}"]
+  (fold peers p
+    (seq
+      (call p ("" "") [p]) ; map = {{"{peer2_id}": 42, "{peer3_id}": 43}}
+      (next p)
+)))
+"#
+            ),
+        )
+        .await
+        .unwrap();
+
+        let result_init: Vec<_> = exec.execution_iter("peer1").unwrap().collect().await;
+
+        assert_eq!(result_init.len(), 1);
+        let outcome1 = &result_init[0];
+        assert_eq!(outcome1.ret_code, 0);
+        assert_eq!(outcome1.error_message, "");
+        assert_next_pks!(&outcome1.next_peer_pks, [peer2_id.as_str()]);
+
+        {
+            let results2 = exec.execute_all("peer2").await.unwrap();
+            assert_eq!(results2.len(), 1);
+            let outcome2 = &results2[0];
+            assert_eq!(outcome2.ret_code, 0, "{:?}", outcome2);
+            assert!(exec.execution_iter("peer2").unwrap().next().await.is_none());
+            assert_next_pks!(&outcome2.next_peer_pks, [peer3_id.as_str()]);
+        }
+
+        {
+            let results3 = exec.execute_all("peer3").await.unwrap();
+            assert_eq!(results3.len(), 1);
+            let outcome3 = &results3[0];
+            assert_eq!(outcome3.ret_code, 0, "{:?}", outcome3);
+            assert_next_pks!(&outcome3.next_peer_pks, []);
+
+            let trace = trace_from_result(outcome3);
+
+            assert_eq!(
+                &*trace,
+                vec![
+                    scalar!(
+                        json!([peer2_id, peer3_id]),
+                        peer_name = peer1_name,
+                        service = "..0"
+                    ),
+                    unused!(
+                        42,
+                        peer_name = &peer2_name,
+                        service = "..1",
+                        args = vec![peer2_id]
+                    ),
+                    unused!(
+                        43,
+                        peer_name = &peer3_name,
+                        service = "..1",
+                        args = vec![peer3_id]
+                    ),
+                ]
+            );
+        }
+    }
+
+    #[tokio::test]
+    #[should_panic]
+    async fn test_map_no_arg() {
+        let peer1_name = "peer1";
+
+        let exec = AirScriptExecutor::<NativeAirRunner>::new(
+            TestRunParameters::from_init_peer_id(peer1_name),
+            vec![],
+            std::iter::empty(),
+            &format!(
+                r#"
+(call "{peer1_name}" ("" "") [] p) ; map = {{"any": "key"}}
+"#
+            ),
+        )
+        .await
+        .unwrap();
+        let _result_init: Vec<_> = exec.execution_iter(peer1_name).unwrap().collect().await;
+    }
+
+    #[tokio::test]
+    async fn test_seq_error() {
+        let init_peer_name = "init_peer_id";
+        let peer1_name = "peer1";
+        let peer2_name = "peer2";
+        let peer3_name = "peer3";
+        let peer4_name = "peer4";
+        let (_peer2_pk, peer2_id) = derive_dummy_keypair(peer2_name);
+        let (_peer3_pk, peer3_id) = derive_dummy_keypair(peer3_name);
+        let (_peer4_pk, peer4_id) = derive_dummy_keypair(peer4_name);
+
+        let exec = AirScriptExecutor::<NativeAirRunner>::new(
+            TestRunParameters::from_init_peer_id(init_peer_name),
+            vec![],
+            IntoIterator::into_iter([peer2_name, peer3_name, peer4_name]).map(Into::into),
+            &format!(r#"(seq
+  (seq
+    (call "peer1" ("service" "func") [] var)  ; ok = [{{"p":"{peer2_id}","v":2}},{{"p":"{peer3_id}","v":3}}, {{"p":"{peer4_id}"}}]
+    (seq
+      (ap 1 k)
+      (fold var i
+        (seq
+          (call i.$.p ("service" "func") [i.$.v k] k)  ; seq_error = {{"0":{{"ret_code":0,"result":12}},"default":{{"ret_code":1,"result":42}}}}
+          (next i)))))
+  (call "init_peer_id" ("a" "b") []) ; ok = 0
+)"#),
+        )
+        .await
+        .unwrap();
+
+        let result_init: Vec<_> = exec.execution_iter(init_peer_name).unwrap().collect().await;
+
+        assert_eq!(result_init.len(), 1);
+        let outcome1 = &result_init[0];
+        assert_eq!(outcome1.ret_code, 0);
+        assert_eq!(outcome1.error_message, "");
+
+        assert!(exec
+            .execution_iter(peer2_name)
+            .unwrap()
+            .next()
+            .await
+            .is_none());
+        {
+            let results1 = exec.execute_all(peer1_name).await.unwrap();
+            assert_eq!(results1.len(), 1);
+            let outcome1 = &results1[0];
+            assert_eq!(outcome1.ret_code, 0, "{:?}", outcome1);
+            assert!(exec
+                .execution_iter(peer1_name)
+                .unwrap()
+                .next()
+                .await
+                .is_none());
+            assert_next_pks!(&outcome1.next_peer_pks, [peer2_id.as_str()]);
+        }
+
+        {
+            let results2: Vec<_> = exec.execute_all(peer2_name).await.unwrap();
+            assert_eq!(results2.len(), 1);
+            let outcome2 = &results2[0];
+            assert_eq!(outcome2.ret_code, 0, "{:?}", outcome2);
+            assert!(exec
+                .execution_iter(peer2_name)
+                .unwrap()
+                .next()
+                .await
+                .is_none());
+            assert_next_pks!(&outcome2.next_peer_pks, [peer3_id.as_str()]);
+
+            let trace = trace_from_result(outcome2);
+            assert_eq!(
+                trace,
+                ExecutionTrace::from(vec![
+                    scalar!(
+                        json!([{"p":peer2_id,"v":2},{"p":peer3_id,"v":3},{"p":peer4_id}]),
+                        peer_name = &peer1_name,
+                        service = "service..0",
+                        function = "func"
+                    ),
+                    scalar!(
+                        12,
+                        peer_name = &peer2_name,
+                        service = "service..1",
+                        function = "func",
+                        args = vec![2, 1]
+                    ),
+                    request_sent_by(peer2_id.clone()),
+                ])
+            );
+        }
+
+        {
+            let results3: Vec<_> = exec.execute_all("peer3").await.unwrap();
+            assert_eq!(results3.len(), 1);
+            // TODO why doesn't it fail?
+            let outcome3 = &results3[0];
+            assert_eq!(outcome3.ret_code, 0, "{:?}", outcome3);
+            assert!(exec.execution_iter("peer3").unwrap().next().await.is_none());
+
+            let trace = trace_from_result(outcome3);
+            assert_eq!(
+                trace,
+                ExecutionTrace::from(vec![
+                    scalar!(
+                        json!([{"p":peer2_id,"v":2},{"p":peer3_id,"v":3},{"p":peer4_id}]),
+                        peer_name = peer1_name,
+                        service = "service..0",
+                        function = "func"
+                    ),
+                    scalar!(
+                        12,
+                        peer_name = peer2_name,
+                        service = "service..1",
+                        function = "func",
+                        args = vec![2, 1]
+                    ),
+                    request_sent_by(peer2_id),
+                ])
+            );
+        }
+    }
+
+    #[tokio::test]
+    async fn test_echo() {
+        let init_peer_name = "init_peer_id";
+        let peer1_name = "peer1";
+        let peer2_name = "peer2";
+
+        let exec = AirScriptExecutor::<NativeAirRunner>::new(
+            TestRunParameters::from_init_peer_id(init_peer_name),
+            vec![],
+            std::iter::empty(),
+            &format!(
+                r#"(seq
+(call "{peer1_name}" ("service" "func") [1 22] arg) ; behaviour=echo
+(call "{peer2_name}" ("service" "func") [arg]) ; ok = 43
+)
+"#
+            ),
+        )
+        .await
+        .unwrap();
+
+        let result_init: Vec<_> = exec.execution_iter("init_peer_id").unwrap().collect().await;
+
+        assert_eq!(result_init.len(), 1);
+        let outcome0 = &result_init[0];
+        assert_eq!(outcome0.ret_code, 0);
+        assert_eq!(outcome0.error_message, "");
+
+        assert!(exec.execution_iter("peer2").unwrap().next().await.is_none());
+        let results1: Vec<_> = exec.execution_iter("peer1").unwrap().collect().await;
+        assert_eq!(results1.len(), 1);
+        let outcome1 = &results1[0];
+        assert_eq!(outcome1.ret_code, 0, "{:?}", outcome1);
+        assert!(exec.execution_iter("peer1").unwrap().next().await.is_none());
+
+        let peer1_id = exec.resolve_name(peer1_name).to_string();
+        assert_eq!(
+            trace_from_result(outcome1),
+            ExecutionTrace::from(vec![
+                scalar!(
+                    1,
+                    peer_name = &peer1_name,
+                    service = "service..0",
+                    function = "func",
+                    args = vec![1, 22]
+                ),
+                request_sent_by(&peer1_id),
+            ]),
+        )
+    }
+
+    #[tokio::test]
+    async fn test_transformed_distinct() {
+        let peer_name = "peer1";
+        let network =
+            Network::<NativeAirRunner>::new(std::iter::empty::<PeerId>(), vec![], <_>::default())
+                .await;
+
+        let transformed1 = TransformedAirScript::new(
+            &format!(r#"(call "{peer_name}" ("service" "function") []) ; ok = 42"#),
+            network.clone(),
+            <_>::default(),
+        )
+        .await
+        .unwrap();
+        let exectution1 = AirScriptExecutor::from_transformed_air_script(
+            TestRunParameters::from_init_peer_id(peer_name),
+            <_>::default(),
+            transformed1,
+        )
+        .await
+        .unwrap();
+
+        let transformed2 = TransformedAirScript::new(
+            &format!(r#"(call "{peer_name}" ("service" "function") []) ; ok = 24"#,),
+            network,
+            <_>::default(),
+        )
+        .await
+        .unwrap();
+        let exectution2 = AirScriptExecutor::from_transformed_air_script(
+            TestRunParameters::from_init_peer_id(peer_name),
+            <_>::default(),
+            transformed2,
+        )
+        .await
+        .unwrap();
+
+        let trace1 = exectution1.execute_one(peer_name).await.unwrap();
+        let trace2 = exectution2.execute_one(peer_name).await.unwrap();
+
+        assert_eq!(
+            trace_from_result(&trace1),
+            ExecutionTrace::from(vec![unused!(
+                42,
+                peer_name = peer_name,
+                service = "service..0",
+                function = "function"
+            )]),
+        );
+        assert_eq!(
+            trace_from_result(&trace2),
+            ExecutionTrace::from(vec![unused!(
+                24,
+                peer_name = peer_name,
+                service = "service..1",
+                function = "function"
+            )]),
+        );
+    }
+
+    #[tokio::test]
+    async fn test_transformed_shared() {
+        struct Service {
+            state: RefCell<std::vec::IntoIter<serde_json::Value>>,
+        }
+
+        impl MarineService for Service {
+            fn call<'this>(
+                &'this self,
+                _params: CallRequestParams,
+            ) -> LocalBoxFuture<'this, crate::services::FunctionOutcome> {
+                async {
+                    let mut cell = self.state.borrow_mut();
+                    crate::services::FunctionOutcome::from_value(cell.next().unwrap())
+                }
+                .boxed_local()
+            }
+        }
+        let service = Service {
+            state: vec![json!(42), json!(24)].into_iter().into(),
+        };
+        let network = Network::<NativeAirRunner>::new(
+            std::iter::empty::<PeerId>(),
+            vec![service.to_handle()],
+            <_>::default(),
+        )
+        .await;
+
+        let peer_name = "peer1";
+        let air_script = format!(r#"(call "{peer_name}" ("service" "function") [])"#);
+        let transformed1 = TransformedAirScript::new(&air_script, network.clone(), <_>::default())
+            .await
+            .unwrap();
+        let exectution1 = AirScriptExecutor::from_transformed_air_script(
+            TestRunParameters::from_init_peer_id(peer_name),
+            <_>::default(),
+            transformed1,
+        )
+        .await
+        .unwrap();
+
+        let transformed2 = TransformedAirScript::new(&air_script, network, <_>::default())
+            .await
+            .unwrap();
+        let exectution2 = AirScriptExecutor::from_transformed_air_script(
+            TestRunParameters::from_init_peer_id(peer_name),
+            <_>::default(),
+            transformed2,
+        )
+        .await
+        .unwrap();
+
+        let trace1 = exectution1.execute_one(peer_name).await.unwrap();
+        let trace2 = exectution2.execute_one(peer_name).await.unwrap();
+
+        assert_eq!(
+            trace_from_result(&trace1),
+            ExecutionTrace::from(vec![unused!(
+                42,
+                peer_name = peer_name,
+                service = "service",
+                function = "function"
+            ),]),
+        );
+        assert_eq!(
+            trace_from_result(&trace2),
+            ExecutionTrace::from(vec![unused!(
+                24,
+                peer_name = peer_name,
+                service = "service",
+                function = "function"
+            ),]),
+        );
+    }
+
+    #[tokio::test]
+    async fn test_invalid_air() {
+        let res = AirScriptExecutor::<NativeAirRunner>::new(
+            TestRunParameters::from_init_peer_id("init_peer_id"),
+            vec![],
+            std::iter::empty(),
+            r#"(seq
+(call "peer1" ("service" "func") [1 22] arg) ; behaviour=echo
+)
+"#,
+        )
+        .await;
+
+        match &res {
+            Ok(_) => {
+                assert!(res.is_err());
+            }
+            Err(err) => {
+                assert_eq!(
+                    err,
+                    "error: \n  ┌─ script.air:3:1\n  │\n3 │ )\n  │ ^ expected \"(\"\n\n"
+                );
+            }
+        }
+    }
+
+    async fn run_behaviour_service(peer_name: &str, air_script: &str) {
+        let exec = AirScriptExecutor::<NativeAirRunner>::new(
+            TestRunParameters::from_init_peer_id(peer_name),
+            vec![],
+            std::iter::empty(),
+            air_script,
+        )
+        .await
+        .unwrap();
+
+        let result_init: Vec<_> = exec.execution_iter(peer_name).unwrap().collect().await;
+
+        assert_eq!(result_init.len(), 1);
+        let outcome = &result_init[0];
+        assert_eq!(outcome.ret_code, 0);
+        assert_eq!(outcome.error_message, "");
+
+        assert_eq!(
+            trace_from_result(outcome),
+            ExecutionTrace::from(vec![scalar!(
+                "service",
+                peer_name = peer_name,
+                service = "service..0",
+                function = "func",
+                args = vec![1, 22]
+            ),]),
+        )
+    }
+
+    #[tokio::test]
+    async fn test_behaviour_service() {
+        let peer_name = "peer1";
+        let air_script =
+            &format!(r#"(call "{peer_name}" ("service" "func") [1 22] arg) ; behaviour=service"#);
+        run_behaviour_service(peer_name, air_script).await
+    }
+
+    #[tokio::test]
+    async fn test_dbg_behaviour_service() {
+        let peer_name = "peer1";
+        let air_script = &format!(
+            r#"(call "{peer_name}" ("service" "func") [1 22] arg) ; dbg_behaviour=service"#
+        );
+        run_behaviour_service(peer_name, air_script).await
+    }
+
+    async fn run_behaviour_function(peer_name: &str, air_script: &str) {
+        let exec = AirScriptExecutor::<NativeAirRunner>::new(
+            TestRunParameters::from_init_peer_id(peer_name),
+            vec![],
+            std::iter::empty(),
+            air_script,
+        )
+        .await
+        .unwrap();
+
+        let result_init: Vec<_> = exec.execution_iter(peer_name).unwrap().collect().await;
+
+        assert_eq!(result_init.len(), 1);
+        let outcome = &result_init[0];
+        assert_eq!(outcome.ret_code, 0);
+        assert_eq!(outcome.error_message, "");
+
+        assert_eq!(
+            trace_from_result(outcome),
+            ExecutionTrace::from(vec![scalar!(
+                "func",
+                peer_name = peer_name,
+                service = "service..0",
+                function = "func",
+                args = vec![1, 22]
+            ),]),
+        )
+    }
+
+    #[tokio::test]
+    async fn test_behaviour_function() {
+        let peer_name = "peer1";
+        let air_script =
+            &format!(r#"(call "{peer_name}" ("service" "func") [1 22] arg) ; behaviour=function"#);
+        run_behaviour_function(peer_name, air_script).await
+    }
+
+    #[tokio::test]
+    async fn test_dbg_behaviour_function() {
+        let peer_name = "peer1";
+        let air_script = &format!(
+            r#"(call "{peer_name}" ("service" "func") [1 22] arg) ; dbg_behaviour=function"#
+        );
+        run_behaviour_function(peer_name, air_script).await
+    }
+
+    async fn run_behaviour_arg(peer_name: &str, air_script: &str) {
+        let exec = AirScriptExecutor::<NativeAirRunner>::new(
+            TestRunParameters::from_init_peer_id(peer_name),
+            vec![],
+            std::iter::empty(),
+            air_script,
+        )
+        .await
+        .unwrap();
+
+        let result_init: Vec<_> = exec.execution_iter(peer_name).unwrap().collect().await;
+
+        assert_eq!(result_init.len(), 1);
+        let outcome = &result_init[0];
+        assert_eq!(outcome.ret_code, 0);
+        assert_eq!(outcome.error_message, "");
+
+        assert_eq!(
+            trace_from_result(outcome),
+            ExecutionTrace::from(vec![scalar!(
+                22,
+                peer_name = peer_name,
+                service = "service..0",
+                function = "func",
+                args = vec![1, 22]
+            ),]),
+        )
+    }
+
+    #[tokio::test]
+    async fn test_behaviour_arg() {
+        let peer_name = "peer1";
+        let air_script =
+            &format!(r#"(call "{peer_name}" ("service" "func") [1 22] arg) ; behaviour=arg.1"#);
+
+        run_behaviour_arg(peer_name, air_script).await
+    }
+
+    #[tokio::test]
+    async fn test_dbg_behaviour_arg() {
+        let peer_name = "peer1";
+        let air_script =
+            &format!(r#"(call "{peer_name}" ("service" "func") [1 22] arg) ; dbg_behaviour=arg.1"#);
+
+        run_behaviour_arg(peer_name, air_script).await
+    }
+
+    async fn run_behaviour_tetraplet(peer_name: &str, air_script: &str) {
+        let (_peer_pk, peer_id) = derive_dummy_keypair(peer_name);
+
+        let exec = AirScriptExecutor::<NativeAirRunner>::new(
+            TestRunParameters::from_init_peer_id(peer_name),
+            vec![],
+            std::iter::empty(),
+            air_script,
+        )
+        .await
+        .unwrap();
+
+        let result_init: Vec<_> = exec.execution_iter(peer_name).unwrap().collect().await;
+
+        assert_eq!(result_init.len(), 1);
+        let outcome = &result_init[0];
+        assert_eq!(outcome.ret_code, 0);
+        assert_eq!(outcome.error_message, "");
+
+        assert_eq!(
+            trace_from_result(outcome),
+            ExecutionTrace::from(vec![scalar!(
+                json!([[{
+                    "function_name": "",
+                    "lens": "",
+                    "peer_pk": &peer_id,
+                    "service_id": "",
+                }], [{
+                    "function_name": "",
+                    "lens": "",
+                    "peer_pk": &peer_id,
+                    "service_id": "",
+                }]]),
+                peer_name = peer_name,
+                service = "service..0",
+                function = "func",
+                args = vec![1, 22]
+            )]),
+        )
+    }
+
+    #[tokio::test]
+    async fn test_behaviour_tetraplet() {
+        let peer_name = "peer1";
+        let air_script =
+            &format!(r#"(call "{peer_name}" ("service" "func") [1 22] arg) ; behaviour=tetraplet"#);
+        run_behaviour_tetraplet(peer_name, air_script).await
+    }
+
+    #[tokio::test]
+    async fn test_dbg_behaviour_tetraplet() {
+        let peer_name = "peer1";
+        let air_script = &format!(
+            r#"(call "{peer_name}" ("service" "func") [1 22] arg) ; dbg_behaviour=tetraplet"#
+        );
+        run_behaviour_tetraplet(peer_name, air_script).await
+    }
+}
+
\ No newline at end of file diff --git a/src/air_test_framework/lib.rs.html b/src/air_test_framework/lib.rs.html new file mode 100644 index 00000000..22f8585e --- /dev/null +++ b/src/air_test_framework/lib.rs.html @@ -0,0 +1,59 @@ +lib.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+pub mod asserts;
+pub mod ephemeral;
+pub mod execution;
+mod queue;
+pub mod services;
+pub mod transform;
+
+pub use ephemeral::Network;
+pub use execution::AirScriptExecutor;
+pub use transform::walker::TransformedAirScript;
+
\ No newline at end of file diff --git a/src/air_test_framework/queue.rs.html b/src/air_test_framework/queue.rs.html new file mode 100644 index 00000000..2fd801b7 --- /dev/null +++ b/src/air_test_framework/queue.rs.html @@ -0,0 +1,269 @@ +queue.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use crate::ephemeral::{Data, Network, PeerId};
+
+use air_test_utils::{
+    test_runner::{AirRunner, TestRunParameters},
+    RawAVMOutcome,
+};
+
+use futures::stream::StreamExt;
+
+use std::pin::pin;
+use std::{
+    borrow::Borrow,
+    cell::RefCell,
+    collections::{HashMap, VecDeque},
+    future::Future,
+    hash::Hash,
+    ops::Deref,
+    rc::Rc,
+};
+
+#[derive(Debug, Default)]
+pub(crate) struct PeerQueueCell {
+    queue: RefCell<VecDeque<Data>>,
+    data: RefCell<Data>,
+}
+
+impl PeerQueueCell {
+    pub(crate) fn pop_data(&self) -> Option<Data> {
+        let mut cell_ref = self.queue.borrow_mut();
+        cell_ref.pop_front()
+    }
+
+    pub(crate) fn push_data(&self, data: Data) {
+        let mut cell_ref = self.queue.borrow_mut();
+        cell_ref.push_back(data);
+    }
+
+    pub(crate) fn take_prev_data(&self) -> Data {
+        let cell_ref = self.data.borrow_mut();
+        (*cell_ref).clone()
+    }
+
+    pub(crate) fn set_prev_data(&self, data: Data) {
+        let mut cell_ref = self.data.borrow_mut();
+        *cell_ref = data;
+    }
+}
+
+/// Per-particle message queue.
+#[derive(Debug, Clone, Default)]
+// TODO make it pub(crate) and see what is broken
+pub(crate) struct ExecutionQueue {
+    queues: Rc<RefCell<HashMap<PeerId, Rc<PeerQueueCell>>>>,
+}
+
+impl ExecutionQueue {
+    pub(crate) fn new() -> Self {
+        Default::default()
+    }
+
+    pub(crate) fn get_peer_queue_cell(&self, peer_id: PeerId) -> Rc<PeerQueueCell> {
+        let mut queues_ref = RefCell::borrow_mut(&self.queues);
+        queues_ref.entry(peer_id).or_default().clone()
+    }
+
+    /// Iterator for handling al the queued data.  It borrows peer env's `RefCell` only temporarily.
+    /// Following test-utils' call_vm macro, it panics on failed VM.
+    pub fn execution_iter<'ctx, Id, R: AirRunner + 'ctx>(
+        &'ctx self,
+        air: &'ctx str,
+        network: Rc<Network<R>>,
+        test_parameters: &'ctx TestRunParameters,
+        peer_id: &Id,
+    ) -> Option<impl futures::stream::Stream<Item = RawAVMOutcome> + 'ctx>
+    where
+        PeerId: Borrow<Id> + for<'a> From<&'a Id>,
+        Id: Eq + Hash + ?Sized,
+    {
+        let peer_env = network.get_named_peer_env(peer_id);
+
+        peer_env.map(|peer_env_cell| {
+            futures::stream::poll_fn(move |ctx| {
+                let mut peer_env = peer_env_cell.borrow_mut();
+                let x = pin!(peer_env.execute_once(air, &network, self, test_parameters)).poll(ctx);
+                x
+            })
+            .map(|r| r.unwrap_or_else(|err| panic!("VM call failed: {}", err)))
+        })
+    }
+
+    pub fn distribute_to_peers<Id, R: AirRunner>(
+        &self,
+        network: &Network<R>,
+        peers: &[Id],
+        data: &Data,
+    ) where
+        Id: Deref<Target = str>,
+    {
+        for peer_id in peers {
+            let peer_id: &str = peer_id;
+            match network.get_peer_env(peer_id) {
+                Some(peer_env_cell) => match peer_env_cell.try_borrow() {
+                    Ok(peer_env_ref) => {
+                        self.get_peer_queue_cell(peer_env_ref.peer.peer_id.clone())
+                            .push_data(data.clone());
+                    }
+                    Err(_) => {
+                        panic!("distributing data from peer to itself; probably, peer naming issue")
+                    }
+                },
+                None => panic!("Unknown peer {:?}", peer_id),
+            }
+        }
+    }
+}
+
\ No newline at end of file diff --git a/src/air_test_framework/services/mod.rs.html b/src/air_test_framework/services/mod.rs.html new file mode 100644 index 00000000..5527f98a --- /dev/null +++ b/src/air_test_framework/services/mod.rs.html @@ -0,0 +1,263 @@ +mod.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+pub(crate) mod results;
+
+use self::results::{MarineServiceWrapper, ResultStore};
+
+use futures::future::LocalBoxFuture;
+use futures::FutureExt;
+
+use air_test_utils::{CallRequestParams, CallServiceClosure, CallServiceResult};
+
+use std::{cell::RefCell, rc::Rc, time::Duration};
+
+pub type JValue = serde_json::Value;
+
+/// Somewhat modified type from fluence.  The Duration defines when the caller receives it, imitating
+/// real execution time.
+#[derive(Debug)]
+pub enum FunctionOutcome {
+    ServiceResult(CallServiceResult, Duration),
+    NotDefined,
+    Empty,
+}
+
+impl FunctionOutcome {
+    pub fn from_service_result(service_result: CallServiceResult) -> Self {
+        FunctionOutcome::ServiceResult(service_result, Duration::ZERO)
+    }
+
+    pub fn from_value(value: JValue) -> Self {
+        Self::from_service_result(CallServiceResult::ok(value))
+    }
+}
+
+/// A mocked Marine service.
+pub trait MarineService {
+    fn call<'this>(
+        &'this self,
+        params: CallRequestParams,
+    ) -> LocalBoxFuture<'this, FunctionOutcome>;
+
+    fn to_handle(self) -> MarineServiceHandle
+    where
+        Self: Sized + 'static,
+    {
+        MarineServiceHandle(Rc::new(RefCell::new(Box::new(self))))
+    }
+}
+
+#[derive(Clone)]
+pub struct MarineServiceHandle(Rc<RefCell<Box<dyn MarineService>>>);
+
+impl MarineService for MarineServiceHandle {
+    fn call<'this>(
+        &'this self,
+        params: CallRequestParams,
+    ) -> LocalBoxFuture<'this, FunctionOutcome> {
+        async {
+            let mut guard = self.0.borrow_mut();
+            MarineService::call(guard.as_mut(), params).await
+        }
+        .boxed_local()
+    }
+}
+
+pub(crate) fn services_to_call_service_closure(
+    services: Rc<[MarineServiceHandle]>,
+) -> CallServiceClosure<'static> {
+    Box::new(move |params: CallRequestParams| {
+        let services = services.clone();
+        async move {
+            for service_handler in services.as_ref() {
+                let outcome = service_handler.call(params.clone()).await;
+                match outcome {
+                    FunctionOutcome::ServiceResult(result, _) => return result,
+                    FunctionOutcome::NotDefined => continue,
+                    FunctionOutcome::Empty => {
+                        return CallServiceResult::ok(serde_json::Value::Null)
+                    }
+                }
+            }
+            panic!("No function found for params {:?}", params)
+        }
+        .boxed_local()
+    })
+}
+
+pub(crate) struct NetworkServices {
+    result_store: Rc<ResultStore>,
+    common_services: Rc<[MarineServiceHandle]>,
+}
+
+impl NetworkServices {
+    pub(crate) fn new(mut common_services: Vec<MarineServiceHandle>) -> Self {
+        let result_service = Rc::<ResultStore>::default();
+
+        // insert result service into all services:
+        let wrapper = MarineServiceWrapper::new(result_service.clone()).to_handle();
+        common_services.insert(0, wrapper);
+
+        Self {
+            result_store: result_service,
+            common_services: common_services.into(),
+        }
+    }
+
+    pub(crate) fn get_result_store(&self) -> Rc<ResultStore> {
+        self.result_store.clone()
+    }
+
+    pub(crate) fn get_services(&self) -> Rc<[MarineServiceHandle]> {
+        self.common_services.clone()
+    }
+}
+
\ No newline at end of file diff --git a/src/air_test_framework/services/results.rs.html b/src/air_test_framework/services/results.rs.html new file mode 100644 index 00000000..9463a2ed --- /dev/null +++ b/src/air_test_framework/services/results.rs.html @@ -0,0 +1,179 @@ +results.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::{FunctionOutcome, MarineService};
+use crate::asserts::ServiceDefinition;
+
+use futures::future::LocalBoxFuture;
+use futures::FutureExt;
+
+use air_test_utils::CallRequestParams;
+
+use std::{cell::RefCell, collections::HashMap, rc::Rc};
+
+#[derive(Clone, Debug, Default, PartialEq, Eq)]
+pub(crate) struct ResultStore {
+    pub(crate) results: RefCell<HashMap<usize, ServiceDefinition>>,
+}
+
+impl ResultStore {
+    pub(crate) fn insert(&self, service_definition: ServiceDefinition) -> Result<usize, String> {
+        let mut results = self.results.borrow_mut();
+        let id = results.len();
+        results.insert(id, service_definition);
+        Ok(id)
+    }
+}
+
+impl MarineService for ResultStore {
+    fn call<'this>(
+        &'this self,
+        mut params: CallRequestParams,
+    ) -> LocalBoxFuture<'this, FunctionOutcome> {
+        async {
+            let results = self.results.borrow();
+            let (real_service_id, suffix) = match params.service_id.rsplit_once("..") {
+                Some(split) => split,
+                None => return FunctionOutcome::NotDefined,
+            };
+
+            if let Ok(result_id) = suffix.parse::<usize>() {
+                let service_desc = results.get(&result_id).unwrap_or_else(|| {
+                    panic!("failed to parse service name {:?}", params.service_id)
+                });
+                // hide the artificial service_id
+                params.service_id = real_service_id.to_owned();
+                FunctionOutcome::from_service_result(service_desc.call(params).await)
+            } else {
+                // Pass malformed service names further in a chain
+                FunctionOutcome::NotDefined
+            }
+        }
+        .boxed_local()
+    }
+}
+
+pub(crate) struct MarineServiceWrapper<T> {
+    wrapped: Rc<T>,
+}
+
+impl<T> MarineServiceWrapper<T> {
+    pub(crate) fn new(wrapped: Rc<T>) -> Self {
+        Self { wrapped }
+    }
+}
+
+impl<T: MarineService> MarineService for MarineServiceWrapper<T> {
+    fn call<'this>(
+        &'this self,
+        params: CallRequestParams,
+    ) -> LocalBoxFuture<'this, FunctionOutcome> {
+        self.wrapped.call(params)
+    }
+}
+
\ No newline at end of file diff --git a/src/air_test_framework/transform/mod.rs.html b/src/air_test_framework/transform/mod.rs.html new file mode 100644 index 00000000..e1bae55b --- /dev/null +++ b/src/air_test_framework/transform/mod.rs.html @@ -0,0 +1,369 @@ +mod.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+pub(crate) mod parser;
+pub mod walker;
+
+use crate::asserts::ServiceDefinition;
+
+type Triplet = (Sexp, Sexp, Sexp);
+
+#[derive(Debug, PartialEq, Eq)]
+pub(crate) struct Call {
+    triplet: Triplet,
+    args: Vec<Sexp>,
+    var: Option<Box<Sexp>>,
+    service_desc: Option<ServiceDefinition>,
+}
+
+#[derive(Debug, PartialEq, Eq)]
+pub(crate) struct Canon {
+    peer: Sexp,
+    stream: Sexp,
+    target: Sexp,
+}
+
+#[derive(Debug, PartialEq, Eq)]
+pub(crate) enum Sexp {
+    Call(Box<Call>),
+    Canon(Box<Canon>),
+    List(Vec<Sexp>),
+    Symbol(String),
+    String(String),
+}
+
+impl Sexp {
+    pub(crate) fn list(list: Vec<Self>) -> Self {
+        Self::List(list)
+    }
+
+    pub(crate) fn symbol(name: impl ToString) -> Self {
+        Self::Symbol(name.to_string())
+    }
+
+    pub(crate) fn string(value: impl ToString) -> Self {
+        Self::String(value.to_string())
+    }
+
+    pub(crate) fn canon(peer: Sexp, stream: Sexp, target: Sexp) -> Self {
+        Self::Canon(Box::new(Canon {
+            peer,
+            stream,
+            target,
+        }))
+    }
+
+    pub(crate) fn inject(&mut self, service_definition: ServiceDefinition) -> Result<(), String> {
+        match self {
+            Sexp::Call(ref mut call) => {
+                call.service_desc = Some(service_definition);
+                Ok(())
+            }
+            Sexp::List(ref mut list) => match list.last_mut() {
+                Some(last) => last.inject(service_definition),
+                None => Err("cannot attach a service definition an empty list".to_owned()),
+            },
+            Sexp::Canon(_) => Err(format!(
+                "cannot attach a service definition to a canon {self:?}"
+            )),
+            Sexp::Symbol(s) => Err(format!(
+                "cannot attach a service definition to a symbol {s:?}"
+            )),
+            Sexp::String(ref s) => Err(format!(
+                r#"cannot attach a service definition to a string: "{s:?}""#
+            )),
+        }
+    }
+}
+
+impl std::fmt::Display for Sexp {
+    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
+        use itertools::Itertools;
+
+        match self {
+            Sexp::Call(call) => {
+                write!(
+                    f,
+                    "(call {peer} ({service} {func}) [{args}]{var})",
+                    peer = call.triplet.0,
+                    service = call.triplet.1,
+                    func = call.triplet.2,
+                    args = call.args.iter().format(" "),
+                    var = match &call.var {
+                        Some(var) => format!(" {var}"),
+                        None => "".to_owned(),
+                    }
+                )
+            }
+            Sexp::Canon(canon) => {
+                write!(
+                    f,
+                    "(canon {peer} {stream} {target})",
+                    peer = canon.peer,
+                    stream = canon.stream,
+                    target = canon.target,
+                )
+            }
+            Sexp::List(items) => write!(f, "({})", items.iter().format(" ")),
+            Sexp::Symbol(symbol) => write!(f, "{symbol}"),
+            Sexp::String(string) => write!(f, r#""{string}""#),
+        }
+    }
+}
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+
+    use std::str::FromStr;
+
+    #[test]
+    fn test_parse_fmt_call() {
+        let sexp_str = r#"(call "my_id" ("serv" "function") [other_peer_id "other_arg"])"#;
+        let sexp = Sexp::from_str(sexp_str).unwrap();
+        assert_eq!(format!("{sexp}"), sexp_str);
+    }
+
+    #[test]
+    fn test_parse_fmt_call_var() {
+        let sexp_str = r#"(call "my_id" ("serv" "function") [other_peer_id "other_arg"] var)"#;
+        let sexp = Sexp::from_str(sexp_str).unwrap();
+        assert_eq!(format!("{sexp}"), sexp_str);
+    }
+
+    #[test]
+    fn test_parse_canon() {
+        let sexp_str = r#"(canon "my_id" $stream #canon)"#;
+        let sexp = Sexp::from_str(sexp_str).unwrap();
+        assert_eq!(
+            sexp,
+            Sexp::canon(
+                Sexp::string("my_id"),
+                Sexp::symbol("$stream"),
+                Sexp::symbol("#canon"),
+            )
+        );
+    }
+
+    #[test]
+    fn test_parse_fmt_symbol() {
+        let sexp_str = "symbol";
+        let sexp = Sexp::from_str(sexp_str).unwrap();
+        assert_eq!(format!("{sexp}"), sexp_str);
+    }
+
+    #[test]
+    fn test_parse_fmt_string() {
+        let sexp_str = r#""my_id""#;
+        let sexp = Sexp::from_str(sexp_str).unwrap();
+        assert_eq!(format!("{sexp}"), sexp_str);
+    }
+
+    #[test]
+    fn test_parse_fmt_sexp() {
+        let sexp_str = r#"(par (ap x y) (fold x y (next)))"#;
+        let sexp = Sexp::from_str(sexp_str).unwrap();
+        assert_eq!(format!("{sexp}"), sexp_str);
+    }
+}
+
\ No newline at end of file diff --git a/src/air_test_framework/transform/parser.rs.html b/src/air_test_framework/transform/parser.rs.html new file mode 100644 index 00000000..0c6c766f --- /dev/null +++ b/src/air_test_framework/transform/parser.rs.html @@ -0,0 +1,2107 @@ +parser.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
+334
+335
+336
+337
+338
+339
+340
+341
+342
+343
+344
+345
+346
+347
+348
+349
+350
+351
+352
+353
+354
+355
+356
+357
+358
+359
+360
+361
+362
+363
+364
+365
+366
+367
+368
+369
+370
+371
+372
+373
+374
+375
+376
+377
+378
+379
+380
+381
+382
+383
+384
+385
+386
+387
+388
+389
+390
+391
+392
+393
+394
+395
+396
+397
+398
+399
+400
+401
+402
+403
+404
+405
+406
+407
+408
+409
+410
+411
+412
+413
+414
+415
+416
+417
+418
+419
+420
+421
+422
+423
+424
+425
+426
+427
+428
+429
+430
+431
+432
+433
+434
+435
+436
+437
+438
+439
+440
+441
+442
+443
+444
+445
+446
+447
+448
+449
+450
+451
+452
+453
+454
+455
+456
+457
+458
+459
+460
+461
+462
+463
+464
+465
+466
+467
+468
+469
+470
+471
+472
+473
+474
+475
+476
+477
+478
+479
+480
+481
+482
+483
+484
+485
+486
+487
+488
+489
+490
+491
+492
+493
+494
+495
+496
+497
+498
+499
+500
+501
+502
+503
+504
+505
+506
+507
+508
+509
+510
+511
+512
+513
+514
+515
+516
+517
+518
+519
+520
+521
+522
+523
+524
+525
+526
+527
+528
+529
+530
+531
+532
+533
+534
+535
+536
+537
+538
+539
+540
+541
+542
+543
+544
+545
+546
+547
+548
+549
+550
+551
+552
+553
+554
+555
+556
+557
+558
+559
+560
+561
+562
+563
+564
+565
+566
+567
+568
+569
+570
+571
+572
+573
+574
+575
+576
+577
+578
+579
+580
+581
+582
+583
+584
+585
+586
+587
+588
+589
+590
+591
+592
+593
+594
+595
+596
+597
+598
+599
+600
+601
+602
+603
+604
+605
+606
+607
+608
+609
+610
+611
+612
+613
+614
+615
+616
+617
+618
+619
+620
+621
+622
+623
+624
+625
+626
+627
+628
+629
+630
+631
+632
+633
+634
+635
+636
+637
+638
+639
+640
+641
+642
+643
+644
+645
+646
+647
+648
+649
+650
+651
+652
+653
+654
+655
+656
+657
+658
+659
+660
+661
+662
+663
+664
+665
+666
+667
+668
+669
+670
+671
+672
+673
+674
+675
+676
+677
+678
+679
+680
+681
+682
+683
+684
+685
+686
+687
+688
+689
+690
+691
+692
+693
+694
+695
+696
+697
+698
+699
+700
+701
+702
+703
+704
+705
+706
+707
+708
+709
+710
+711
+712
+713
+714
+715
+716
+717
+718
+719
+720
+721
+722
+723
+724
+725
+726
+727
+728
+729
+730
+731
+732
+733
+734
+735
+736
+737
+738
+739
+740
+741
+742
+743
+744
+745
+746
+747
+748
+749
+750
+751
+752
+753
+754
+755
+756
+757
+758
+759
+760
+761
+762
+763
+764
+765
+766
+767
+768
+769
+770
+771
+772
+773
+774
+775
+776
+777
+778
+779
+780
+781
+782
+783
+784
+785
+786
+787
+788
+789
+790
+791
+792
+793
+794
+795
+796
+797
+798
+799
+800
+801
+802
+803
+804
+805
+806
+807
+808
+809
+810
+811
+812
+813
+814
+815
+816
+817
+818
+819
+820
+821
+822
+823
+824
+825
+826
+827
+828
+829
+830
+831
+832
+833
+834
+835
+836
+837
+838
+839
+840
+841
+842
+843
+844
+845
+846
+847
+848
+849
+850
+851
+852
+853
+854
+855
+856
+857
+858
+859
+860
+861
+862
+863
+864
+865
+866
+867
+868
+869
+870
+871
+872
+873
+874
+875
+876
+877
+878
+879
+880
+881
+882
+883
+884
+885
+886
+887
+888
+889
+890
+891
+892
+893
+894
+895
+896
+897
+898
+899
+900
+901
+902
+903
+904
+905
+906
+907
+908
+909
+910
+911
+912
+913
+914
+915
+916
+917
+918
+919
+920
+921
+922
+923
+924
+925
+926
+927
+928
+929
+930
+931
+932
+933
+934
+935
+936
+937
+938
+939
+940
+941
+942
+943
+944
+945
+946
+947
+948
+949
+950
+951
+952
+953
+954
+955
+956
+957
+958
+959
+960
+961
+962
+963
+964
+965
+966
+967
+968
+969
+970
+971
+972
+973
+974
+975
+976
+977
+978
+979
+980
+981
+982
+983
+984
+985
+986
+987
+988
+989
+990
+991
+992
+993
+994
+995
+996
+997
+998
+999
+1000
+1001
+1002
+1003
+1004
+1005
+1006
+1007
+1008
+1009
+1010
+1011
+1012
+1013
+1014
+1015
+1016
+1017
+1018
+1019
+1020
+1021
+1022
+1023
+1024
+1025
+1026
+1027
+1028
+1029
+1030
+1031
+1032
+1033
+1034
+1035
+1036
+1037
+1038
+1039
+1040
+1041
+1042
+1043
+1044
+1045
+1046
+1047
+1048
+1049
+1050
+1051
+1052
+1053
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::{Call, Sexp, Triplet};
+use crate::asserts::ServiceDefinition;
+
+use nom::branch::alt;
+use nom::bytes::complete::{is_not, tag, take_until};
+use nom::character::complete::{alphanumeric1, multispace0, multispace1, one_of, space1};
+use nom::combinator::{cut, map, map_parser, map_res, opt, recognize, rest, value};
+use nom::error::{context, VerboseError, VerboseErrorKind};
+use nom::multi::{many0, many1, many1_count, separated_list0};
+use nom::sequence::{delimited, pair, preceded, separated_pair, terminated};
+use nom::{IResult, InputTakeAtPosition};
+use nom_locate::LocatedSpan;
+
+use std::str::FromStr;
+
+type Input<'inp> = LocatedSpan<&'inp str>;
+type ParseError<'inp> = VerboseError<Input<'inp>>;
+
+impl FromStr for Sexp {
+    type Err = String;
+
+    fn from_str(s: &str) -> Result<Self, Self::Err> {
+        use nom::combinator::all_consuming;
+
+        let span = nom_locate::LocatedSpan::new(s);
+        cut(all_consuming(delim_ws(parse_sexp)))(span)
+            .map(|(_, v)| v)
+            .map_err(parse_error_to_message)
+    }
+}
+
+pub(crate) fn parse_error_to_message(e: nom::Err<ParseError>) -> String {
+    let e = match e {
+        nom::Err::Failure(e) => e,
+        _ => panic!("shouldn't happen because of top-level cut"),
+    };
+    let contexts = e
+        .errors
+        .iter()
+        .rev()
+        .filter_map(|(span, kind)| {
+            if let VerboseErrorKind::Context(c) = kind {
+                Some(format!(
+                    "  {}:{}: {}",
+                    span.location_line(),
+                    span.get_utf8_column(),
+                    c
+                ))
+            } else {
+                None
+            }
+        })
+        .collect::<Vec<_>>();
+    if contexts.is_empty() {
+        e.to_string()
+    } else {
+        format!("Failed to parse the script:\n{}", contexts.join("\n"))
+    }
+}
+
+pub(crate) fn parse_sexp(inp: Input<'_>) -> IResult<Input<'_>, Sexp, ParseError<'_>> {
+    alt((
+        parse_sexp_call,
+        parse_sexp_canon,
+        parse_sexp_list,
+        parse_sexp_string,
+        parse_sexp_symbol,
+    ))(inp)
+}
+
+fn parse_sexp_list(inp: Input<'_>) -> IResult<Input<'_>, Sexp, ParseError<'_>> {
+    context(
+        "within generic list",
+        preceded(
+            terminated(tag("("), sexp_multispace0),
+            map_res(
+                cut(pair(
+                    map(separated_list0(sexp_multispace1, parse_sexp), Sexp::list),
+                    preceded(
+                        preceded(
+                            sexp_multispace0,
+                            context("closing parentheses not found", tag(")")),
+                        ),
+                        parse_annotation_comment,
+                    ),
+                )),
+                |(mut sexp, annotation)| {
+                    if let Some(service_definition) = annotation {
+                        sexp.inject(service_definition)?;
+                    }
+                    Ok::<_, String>(sexp)
+                },
+            ),
+        ),
+    )(inp)
+}
+
+fn parse_sexp_string(inp: Input<'_>) -> IResult<Input<'_>, Sexp, ParseError<'_>> {
+    // N.B. escape are rejected by AIR parser, but we simply treat backslash
+    // as any other character
+    map(
+        context(
+            "within string",
+            preceded(
+                tag("\""),
+                cut(terminated(
+                    alt((
+                        is_not("\""),
+                        //
+                        tag(""),
+                    )),
+                    context("closing quotes not found", tag("\"")),
+                )),
+            ),
+        ),
+        Sexp::string,
+    )(inp)
+}
+
+fn parse_sexp_symbol(inp: Input<'_>) -> IResult<Input<'_>, Sexp, ParseError<'_>> {
+    map(
+        recognize(pair(
+            many1_count(alt((
+                value((), alphanumeric1),
+                value((), one_of("_-.:$#%")),
+            ))),
+            opt(terminated(
+                delimited(tag("["), parse_sexp_symbol, tag("]")),
+                opt(tag("!")),
+            )),
+        )),
+        Sexp::symbol,
+    )(inp)
+}
+
+fn parse_sexp_canon(inp: Input<'_>) -> IResult<Input<'_>, Sexp, ParseError<'_>> {
+    preceded(
+        delim_ws(tag("(")),
+        preceded(
+            tag("canon "),
+            context("within canon instructon", cut(parse_canon_content)),
+        ),
+    )(inp)
+}
+
+fn parse_canon_content(inp: Input<'_>) -> IResult<Input<'_>, Sexp, ParseError<'_>> {
+    map(
+        terminated(
+            separated_pair(
+                separated_pair(
+                    context("canon peer", parse_sexp),
+                    sexp_multispace1,
+                    context("canon stream", parse_sexp_symbol),
+                ),
+                sexp_multispace1,
+                context("canon target", parse_sexp_symbol),
+            ),
+            pair(sexp_multispace0, tag(")")),
+        ),
+        |((peer, stream), target)| Sexp::canon(peer, stream, target),
+    )(inp)
+}
+
+fn parse_sexp_call(inp: Input<'_>) -> IResult<Input<'_>, Sexp, ParseError<'_>> {
+    preceded(
+        delim_ws(tag("(")),
+        preceded(
+            tag("call "),
+            context("within call list", cut(parse_sexp_call_content)),
+        ),
+        // call_content includes ")" and possible comment ^
+    )(inp)
+}
+
+fn parse_sexp_call_content(inp: Input<'_>) -> IResult<Input<'_>, Sexp, ParseError<'_>> {
+    map(
+        pair(
+            // triplet and arguments
+            pair(parse_sexp_call_triplet, parse_sexp_call_arguments),
+            // possible variable, closing ")", possible annotation
+            pair(
+                terminated(
+                    opt(preceded(sexp_multispace1, map(parse_sexp_symbol, Box::new))),
+                    preceded(sexp_multispace0, tag(")")),
+                ),
+                parse_annotation_comment,
+            ),
+        ),
+        |((triplet, args), (var, annotation))| {
+            Sexp::Call(
+                Call {
+                    triplet,
+                    args,
+                    var,
+                    service_desc: annotation,
+                }
+                .into(),
+            )
+        },
+    )(inp)
+}
+
+fn parse_annotation_comment(
+    inp: Input<'_>,
+) -> IResult<Input<'_>, Option<ServiceDefinition>, ParseError<'_>> {
+    use nom::combinator::success;
+
+    alt((
+        preceded(
+            pair(space1, tag("; ")),
+            map(cut(parse_singleline_annotation), Some),
+        ),
+        delimited(
+            pair(space1, tag("#|")),
+            map(
+                cut(map_parser(take_until("|#"), parse_multiline_annotation)),
+                Some,
+            ),
+            tag("|#"),
+        ),
+        success(None),
+    ))(inp)
+}
+
+fn parse_singleline_annotation(
+    inp: Input<'_>,
+) -> IResult<Input<'_>, ServiceDefinition, ParseError<'_>> {
+    context(
+        "single-line annotation",
+        map_res(
+            is_not("\r\n"),
+            |span: Input<'_>| -> Result<ServiceDefinition, ParseError<'_>> {
+                Ok(ServiceDefinition::from_str(&span).expect("invalid service definition"))
+            },
+        ),
+    )(inp)
+}
+
+fn parse_multiline_annotation(
+    inp: Input<'_>,
+) -> IResult<Input<'_>, ServiceDefinition, ParseError<'_>> {
+    context(
+        "multiline annotation",
+        map_res(
+            recognize(rest),
+            |span: Input<'_>| -> Result<ServiceDefinition, ParseError<'_>> {
+                Ok(ServiceDefinition::from_str(&span).expect("invalid service definition"))
+            },
+        ),
+    )(inp)
+}
+
+fn parse_sexp_call_triplet(inp: Input<'_>) -> IResult<Input<'_>, Triplet, ParseError<'_>> {
+    map(
+        separated_pair(
+            context("triplet peer_id", parse_sexp),
+            sexp_multispace0,
+            delimited(
+                delim_ws(tag("(")),
+                separated_pair(
+                    context(
+                        "triplet service name has to be a string literal",
+                        parse_sexp_string,
+                    ),
+                    sexp_multispace0,
+                    context("triplet function name", parse_sexp),
+                ),
+                delim_ws(tag(")")),
+            ),
+        ),
+        |(peer_id, (service, function))| (peer_id, service, function),
+    )(inp)
+}
+
+fn parse_sexp_call_arguments(inp: Input<'_>) -> IResult<Input<'_>, Vec<Sexp>, ParseError<'_>> {
+    delimited(tag("["), separated_list0(multispace1, parse_sexp), tag("]"))(inp)
+}
+
+pub(crate) fn delim_ws<I, O, E, F>(f: F) -> impl FnMut(I) -> IResult<I, O, E>
+where
+    F: nom::Parser<I, O, E>,
+    E: nom::error::ParseError<I>,
+    I: nom::InputTakeAtPosition
+        + nom::InputLength
+        + for<'a> nom::Compare<&'a str>
+        + nom::InputTake
+        + Clone,
+    <I as InputTakeAtPosition>::Item: nom::AsChar + Clone,
+    for<'a> &'a str: nom::FindToken<<I as InputTakeAtPosition>::Item>,
+{
+    delimited(sexp_multispace0, f, sexp_multispace0)
+}
+
+pub(crate) fn sexp_multispace0<I, E>(inp: I) -> IResult<I, (), E>
+where
+    E: nom::error::ParseError<I>,
+    I: InputTakeAtPosition
+        + nom::InputLength
+        + for<'a> nom::Compare<&'a str>
+        + nom::InputTake
+        + Clone,
+    <I as InputTakeAtPosition>::Item: nom::AsChar + Clone,
+    for<'a> &'a str: nom::FindToken<<I as InputTakeAtPosition>::Item>,
+{
+    map(
+        opt(many0(pair(
+            // white space
+            multispace1,
+            // possible ;;, ;;; comment
+            opt(pair(tag(";;"), is_not("\r\n"))),
+        ))),
+        |_| (),
+    )(inp)
+}
+
+pub(crate) fn sexp_multispace1(inp: Input<'_>) -> IResult<Input<'_>, (), ParseError<'_>> {
+    map(
+        // It's not the fastest implementation, but easiest to write.
+        // It passes initial whitespace two times.
+        many1(alt((
+            map(
+                pair(
+                    // white space
+                    multispace0,
+                    // ;;, ;;;, etc comment
+                    pair(tag(";;"), is_not("\r\n")),
+                ),
+                |_| (),
+            ),
+            map(multispace1, |_| ()),
+        ))),
+        |_| (),
+    )(inp)
+}
+
+#[cfg(test)]
+mod tests {
+    use super::super::Canon;
+    use super::*;
+    use crate::asserts::ServiceDefinition;
+
+    use pretty_assertions::assert_eq;
+    use serde_json::json;
+
+    #[tokio::test]
+    async fn test_multispace0_empty() {
+        let res = sexp_multispace0::<_, ()>("");
+        assert!(res.is_ok(), "{}", res.unwrap_err());
+    }
+
+    #[tokio::test]
+    async fn test_multispace0_spaces() {
+        let res = sexp_multispace0::<_, ()>("  ");
+        assert!(res.is_ok(), "{}", res.unwrap_err());
+    }
+
+    #[tokio::test]
+    async fn test_multispace0_comment() {
+        let res = sexp_multispace0::<_, ()>(";; this is comment");
+        assert!(res.is_ok(), "{}", res.unwrap_err());
+    }
+
+    #[tokio::test]
+    async fn test_multispace0_comment_with_space() {
+        let res = sexp_multispace0::<_, ()>(" ;; ");
+        assert!(res.is_ok(), "{}", res.unwrap_err());
+    }
+
+    #[tokio::test]
+    async fn test_multispace0_multiline() {
+        let res = sexp_multispace0::<_, ()>(" ;; \n ;;;; \n ");
+        assert!(res.is_ok(), "{}", res.unwrap_err());
+    }
+
+    #[tokio::test]
+    async fn test_multispace1_empty() {
+        let res = sexp_multispace1("".into());
+        assert!(res.is_err());
+    }
+
+    #[tokio::test]
+    async fn test_multispace1_space() {
+        let res = sexp_multispace1(" ".into());
+        assert!(res.is_ok(), "{}", res.unwrap_err());
+    }
+
+    #[tokio::test]
+    async fn test_multispace1_comment() {
+        let res = sexp_multispace1(" ;; ".into());
+        assert!(res.is_ok(), "{}", res.unwrap_err());
+    }
+
+    #[tokio::test]
+    async fn test_multispace1_multiline() {
+        let res = sexp_multispace1(" ;; \n ;;;; \n ".into());
+        assert!(res.is_ok(), "{}", res.unwrap_err());
+    }
+
+    #[tokio::test]
+    async fn test_symbol() {
+        let res = Sexp::from_str("symbol");
+        assert_eq!(res, Ok(Sexp::symbol("symbol")));
+    }
+
+    #[tokio::test]
+    async fn test_symbol_lambda() {
+        let res = Sexp::from_str("sym_bol.$.blabla");
+        assert_eq!(res, Ok(Sexp::symbol("sym_bol.$.blabla")));
+    }
+
+    #[tokio::test]
+    async fn test_symbol_lambda_exclamation() {
+        let res = Sexp::from_str("pid-num.$.[0]!");
+        assert_eq!(res, Ok(Sexp::symbol("pid-num.$.[0]!")));
+    }
+
+    #[tokio::test]
+    async fn test_symbol_stream() {
+        let res = Sexp::from_str("$stream");
+        assert_eq!(res, Ok(Sexp::symbol("$stream")));
+    }
+
+    #[tokio::test]
+    async fn test_symbol_canon() {
+        let res = Sexp::from_str("#canon");
+        assert_eq!(res, Ok(Sexp::symbol("#canon")));
+    }
+
+    #[tokio::test]
+    async fn test_symbol_lambda2() {
+        let res = Sexp::from_str(r#"$result.$[0]"#);
+        assert_eq!(res, Ok(Sexp::symbol(r#"$result.$[0]"#)));
+    }
+
+    #[tokio::test]
+    async fn test_string_empty() {
+        let res = Sexp::from_str(r#""""#);
+        assert_eq!(res, Ok(Sexp::string("")));
+    }
+
+    #[tokio::test]
+    async fn test_string() {
+        let res = Sexp::from_str(r#""str ing""#);
+        assert_eq!(res, Ok(Sexp::string("str ing")));
+    }
+
+    #[tokio::test]
+    async fn test_empty_list() {
+        let res = Sexp::from_str("()");
+        assert_eq!(res, Ok(Sexp::List(vec![])));
+    }
+
+    #[tokio::test]
+    async fn test_small_list() {
+        let res = Sexp::from_str("(null)");
+        assert_eq!(res, Ok(Sexp::list(vec![Sexp::symbol("null")])));
+    }
+
+    #[tokio::test]
+    async fn test_call_no_args() {
+        let res = Sexp::from_str(r#"(call peer_id ("serv" "func") [])"#);
+        assert_eq!(
+            res,
+            Ok(Sexp::Call(
+                Call {
+                    triplet: (
+                        Sexp::symbol("peer_id"),
+                        Sexp::string("serv"),
+                        Sexp::string("func"),
+                    ),
+                    args: vec![],
+                    var: None,
+                    service_desc: None,
+                }
+                .into()
+            ))
+        );
+    }
+
+    #[tokio::test]
+    async fn test_call_after_call() {
+        let res = Sexp::from_str(
+            r#"(seq
+    (call peer_id ("serv" "func") [])
+    (call peer_id ("serv" "func") [])
+)"#,
+        );
+        assert_eq!(
+            res,
+            Ok(Sexp::list(vec![
+                Sexp::symbol("seq"),
+                Sexp::Call(
+                    Call {
+                        triplet: (
+                            Sexp::symbol("peer_id"),
+                            Sexp::string("serv"),
+                            Sexp::string("func"),
+                        ),
+                        args: vec![],
+                        var: None,
+                        service_desc: None,
+                    }
+                    .into()
+                ),
+                Sexp::Call(
+                    Call {
+                        triplet: (
+                            Sexp::symbol("peer_id"),
+                            Sexp::string("serv"),
+                            Sexp::string("func"),
+                        ),
+                        args: vec![],
+                        var: None,
+                        service_desc: None,
+                    }
+                    .into()
+                ),
+            ]))
+        );
+    }
+
+    #[tokio::test]
+    async fn test_call_annotation_newline() {
+        let res = Sexp::from_str(
+            r#"(seq (call peer_id ("serv" "func") [])
+; result=42
+)"#,
+        );
+        assert_eq!(
+            res,
+            Err("Failed to parse the script:\n  1:1: within generic list\n  2:1: closing parentheses not found".to_owned())
+        );
+    }
+
+    #[tokio::test]
+    async fn test_call_args1() {
+        let res = Sexp::from_str(r#"(call peer_id ("serv" "func") [a])"#);
+        assert_eq!(
+            res,
+            Ok(Sexp::Call(
+                Call {
+                    triplet: (
+                        Sexp::symbol("peer_id"),
+                        Sexp::string("serv"),
+                        Sexp::string("func"),
+                    ),
+                    args: vec![Sexp::symbol("a")],
+                    var: None,
+                    service_desc: None,
+                }
+                .into()
+            ))
+        );
+    }
+
+    #[tokio::test]
+    async fn test_call_args2() {
+        let res = Sexp::from_str(r#"(call peer_id ("serv" "func") [a b])"#);
+        assert_eq!(
+            res,
+            Ok(Sexp::Call(
+                Call {
+                    triplet: (
+                        Sexp::symbol("peer_id"),
+                        Sexp::string("serv"),
+                        Sexp::string("func"),
+                    ),
+                    args: vec![Sexp::symbol("a"), Sexp::symbol("b")],
+                    var: None,
+                    service_desc: None,
+                }
+                .into()
+            ))
+        );
+    }
+
+    #[tokio::test]
+    async fn test_call_var() {
+        let res = Sexp::from_str(r#"(call peer_id ("serv" "func") [a b] var)"#);
+        assert_eq!(
+            res,
+            Ok(Sexp::Call(
+                Call {
+                    triplet: (
+                        Sexp::Symbol("peer_id".to_owned()),
+                        Sexp::String("serv".to_owned()),
+                        Sexp::String("func".to_owned()),
+                    ),
+                    args: vec![Sexp::Symbol("a".to_owned()), Sexp::Symbol("b".to_owned())],
+                    var: Some(Box::new(Sexp::Symbol("var".to_owned()))),
+                    service_desc: None,
+                }
+                .into()
+            ))
+        );
+    }
+
+    #[tokio::test]
+    async fn test_call_with_annotation() {
+        let res = Sexp::from_str(r#"(call peer_id ("serv" "func") [a b] var) ; ok=42 "#);
+        let expected_annotation = ServiceDefinition::Ok(json!(42));
+        assert_eq!(
+            res,
+            Ok(Sexp::Call(
+                Call {
+                    triplet: (
+                        Sexp::symbol("peer_id"),
+                        Sexp::string("serv"),
+                        Sexp::string("func"),
+                    ),
+                    args: vec![Sexp::symbol("a"), Sexp::symbol("b")],
+                    var: Some(Box::new(Sexp::symbol("var"))),
+                    service_desc: Some(expected_annotation),
+                }
+                .into()
+            ))
+        );
+    }
+
+    #[tokio::test]
+    async fn test_call_with_annotation2() {
+        let res = Sexp::from_str(
+            r#"(par
+  (call peerid ("serv" "func") [a b] var) ; ok=42
+  (call peerid2 ("serv" "func") []))"#,
+        );
+        assert!(res.is_ok(), "{}", "{res:?}");
+    }
+
+    #[tokio::test]
+    async fn test_generic_sexp() {
+        let res = Sexp::from_str(" (fold i n ( par (null) (match y \"asdf\" (fail ))) )");
+        assert_eq!(
+            res,
+            Ok(Sexp::list(vec![
+                Sexp::symbol("fold"),
+                Sexp::symbol("i"),
+                Sexp::symbol("n"),
+                Sexp::list(vec![
+                    Sexp::symbol("par"),
+                    Sexp::list(vec![Sexp::symbol("null")]),
+                    Sexp::list(vec![
+                        Sexp::symbol("match"),
+                        Sexp::symbol("y"),
+                        Sexp::string("asdf"),
+                        Sexp::list(vec![Sexp::symbol("fail"),])
+                    ])
+                ])
+            ]))
+        );
+    }
+
+    #[tokio::test]
+    async fn test_trailing_error() {
+        let res = Sexp::from_str("(null))");
+        assert!(res.is_err(), "{}", "{res:?}");
+    }
+
+    #[tokio::test]
+    async fn test_incomplete_string() {
+        let err = Sexp::from_str(
+            r#"(seq
+   "string"#,
+        )
+        .unwrap_err();
+        assert_eq!(
+            err,
+            "Failed to parse the script:
+  1:1: within generic list
+  2:4: within string
+  2:11: closing quotes not found"
+        );
+    }
+
+    #[tokio::test]
+    async fn test_incomplete_list() {
+        let err = Sexp::from_str(
+            r#"(seq
+   "string"
+"#,
+        )
+        .unwrap_err();
+        assert_eq!(
+            err,
+            "Failed to parse the script:
+  1:1: within generic list
+  3:1: closing parentheses not found"
+        );
+    }
+
+    #[tokio::test]
+    async fn test_parse_fmt_call() {
+        let sexp_str = r#"(call "my_id" ("serv" "function") [other_peer_id "other_arg"])"#;
+        let sexp = Sexp::from_str(sexp_str).unwrap();
+        assert_eq!(format!("{sexp}"), sexp_str);
+    }
+
+    #[tokio::test]
+    async fn test_parse_fmt_call_var() {
+        let sexp_str = r#"(call "my_id" ("serv" "function") [other_peer_id "other_arg"] var)"#;
+        let sexp = Sexp::from_str(sexp_str).unwrap();
+        assert_eq!(format!("{sexp}"), sexp_str);
+    }
+
+    #[tokio::test]
+    async fn test_parse_fmt_symbol() {
+        let sexp_str = "symbol";
+        let sexp = Sexp::from_str(sexp_str).unwrap();
+        assert_eq!(format!("{sexp}"), sexp_str);
+    }
+
+    #[tokio::test]
+    async fn test_parse_fmt_string() {
+        let sexp_str = r#""my_id""#;
+        let sexp = Sexp::from_str(sexp_str).unwrap();
+        assert_eq!(format!("{sexp}"), sexp_str);
+    }
+
+    #[tokio::test]
+    async fn test_parse_fmt_sexp() {
+        let sexp_str = r#"(par (ap x y) (fold x y (next)))"#;
+        let sexp = Sexp::from_str(sexp_str).unwrap();
+        assert_eq!(format!("{sexp}"), sexp_str);
+    }
+
+    #[tokio::test]
+    async fn test_canon_syntax() {
+        let sexp_str = r#"(seq (canon peer_id $stream #canon) (fold #canon i (next)))"#;
+        let res = Sexp::from_str(sexp_str);
+        assert!(res.is_ok(), "{}", "{res:?}");
+    }
+
+    #[tokio::test]
+    async fn test_comments() {
+        let sexp_str = r#" ;; One comment
+( ;;; Second comment
+  ;; The third one
+  (par ;;;; Comment comment comment
+    ;;;; Comment comment comment
+    (null)  ;;;;; Comment
+    (fail  ;; Fails
+        1    ;; Retcode
+        "test"  ;; Message
+        ;; Nothing more
+    )
+  )   ;;;;; Comment
+  ;;;;; Comment
+ )  ;;;;; Comment
+;;; Comment
+"#;
+        let res = Sexp::from_str(sexp_str);
+        assert_eq!(
+            res,
+            Ok(Sexp::list(vec![Sexp::list(vec![
+                Sexp::symbol("par"),
+                Sexp::list(vec![Sexp::symbol("null"),]),
+                Sexp::list(vec![
+                    Sexp::symbol("fail"),
+                    Sexp::symbol("1"),
+                    Sexp::string("test"),
+                ]),
+            ])]))
+        );
+    }
+
+    #[tokio::test]
+    async fn test_annotation_multiline() {
+        let multiline_annotation = r#" #|
+        map = {
+          "0": null
+        } |#"#;
+        let res = parse_annotation_comment(multiline_annotation.into());
+        assert!(res.is_ok(), "{}", "{res:?}");
+    }
+
+    #[tokio::test]
+    async fn test_annotation_multiline_with_call() {
+        let sexp_str = r#"(call "peer_id" ("serv" "func") [a b] var) #|
+        map = {
+           "0": null
+        }
+        |#"#;
+        let expected_annotation = ServiceDefinition::Map(maplit::hashmap! {
+            "0".to_owned() => json!(None::<()>),
+        });
+
+        let res = Sexp::from_str(sexp_str);
+        assert_eq!(
+            res,
+            Ok(Sexp::Call(
+                Call {
+                    triplet: (
+                        Sexp::string("peer_id"),
+                        Sexp::string("serv"),
+                        Sexp::string("func"),
+                    ),
+                    args: vec![Sexp::symbol("a"), Sexp::symbol("b")],
+                    var: Some(Box::new(Sexp::symbol("var"))),
+                    service_desc: Some(expected_annotation),
+                }
+                .into()
+            ))
+        );
+    }
+
+    #[tokio::test]
+    async fn test_annotation_multiline_with_many_calls() {
+        let sexp_str = r#"(seq
+            (call "peer_id" ("serv" "func") [a b] var) #|
+                   map = {
+                     "0": null
+                   }
+                |#
+            (call "peer_id" ("serv" "func") [a b] var)
+        )"#;
+        let expected_annotation = ServiceDefinition::Map(maplit::hashmap! {
+            "0".to_owned() => json!(None::<()>),
+        });
+
+        let res = Sexp::from_str(sexp_str);
+        assert_eq!(
+            res,
+            Ok(Sexp::List(vec![
+                Sexp::symbol("seq"),
+                Sexp::Call(
+                    Call {
+                        triplet: (
+                            Sexp::string("peer_id"),
+                            Sexp::string("serv"),
+                            Sexp::string("func"),
+                        ),
+                        args: vec![Sexp::symbol("a"), Sexp::symbol("b")],
+                        var: Some(Box::new(Sexp::symbol("var"))),
+                        service_desc: Some(expected_annotation),
+                    }
+                    .into()
+                ),
+                Sexp::Call(
+                    Call {
+                        triplet: (
+                            Sexp::string("peer_id"),
+                            Sexp::string("serv"),
+                            Sexp::string("func"),
+                        ),
+                        args: vec![Sexp::symbol("a"), Sexp::symbol("b")],
+                        var: Some(Box::new(Sexp::symbol("var"))),
+                        service_desc: None,
+                    }
+                    .into()
+                ),
+            ])),
+        );
+    }
+
+    #[tokio::test]
+    async fn test_call_with_annotation_last_form() {
+        let res = Sexp::from_str(
+            r#"(par
+  (call peerid ("serv" "func") [a b] var)
+  (call peerid2 ("serv" "func") [])) ; ok=42
+"#,
+        );
+        assert_eq!(
+            res,
+            Ok(Sexp::List(vec![
+                Sexp::symbol("par"),
+                Sexp::Call(
+                    Call {
+                        triplet: (
+                            Sexp::symbol("peerid"),
+                            Sexp::string("serv"),
+                            Sexp::string("func"),
+                        ),
+                        args: vec![Sexp::symbol("a"), Sexp::symbol("b")],
+                        var: Some(Box::new(Sexp::symbol("var"))),
+                        service_desc: None,
+                    }
+                    .into()
+                ),
+                Sexp::Call(
+                    Call {
+                        triplet: (
+                            Sexp::symbol("peerid2"),
+                            Sexp::string("serv"),
+                            Sexp::string("func"),
+                        ),
+                        args: vec![],
+                        var: None,
+                        service_desc: Some(ServiceDefinition::Ok(json!(42))),
+                    }
+                    .into()
+                ),
+            ]))
+        );
+    }
+    #[tokio::test]
+    async fn test_call_with_annotation_last_form_multiline() {
+        let res = Sexp::from_str(
+            r#"(par
+  (call peerid ("serv" "func") [a b] var)
+  (call peerid2 ("serv" "func") [])) #|
+    ok=42
+  |#
+"#,
+        );
+        assert_eq!(
+            res,
+            Ok(Sexp::List(vec![
+                Sexp::symbol("par"),
+                Sexp::Call(
+                    Call {
+                        triplet: (
+                            Sexp::symbol("peerid"),
+                            Sexp::string("serv"),
+                            Sexp::string("func"),
+                        )
+                            .into(),
+                        args: vec![Sexp::symbol("a"), Sexp::symbol("b")],
+                        var: Some(Box::new(Sexp::symbol("var"))),
+                        service_desc: None,
+                    }
+                    .into()
+                ),
+                Sexp::Call(
+                    Call {
+                        triplet: (
+                            Sexp::symbol("peerid2"),
+                            Sexp::string("serv"),
+                            Sexp::string("func"),
+                        ),
+                        args: vec![],
+                        var: None,
+                        service_desc: Some(ServiceDefinition::Ok(json!(42))),
+                    }
+                    .into()
+                ),
+            ]))
+        );
+    }
+
+    #[tokio::test]
+    async fn test_canon_var_peer() {
+        let res = Sexp::from_str(r#"(canon peer $stream #canon)"#);
+
+        assert_eq!(
+            res,
+            Ok(Sexp::Canon(
+                Canon {
+                    peer: Sexp::symbol("peer"),
+                    stream: Sexp::symbol("$stream"),
+                    target: Sexp::symbol("#canon"),
+                }
+                .into()
+            ))
+        )
+    }
+
+    #[tokio::test]
+    async fn test_canon_string_peer() {
+        let res = Sexp::from_str(r#"(canon "peer" $stream #canon)"#);
+
+        assert_eq!(
+            res,
+            Ok(Sexp::Canon(
+                Canon {
+                    peer: Sexp::string("peer"),
+                    stream: Sexp::symbol("$stream"),
+                    target: Sexp::symbol("#canon"),
+                }
+                .into()
+            ))
+        )
+    }
+
+    #[tokio::test]
+    async fn test_canon_error_no_peer() {
+        let res = Sexp::from_str(r#"(canon )"#);
+        assert_eq!(
+            res,
+            Err(
+                "Failed to parse the script:\n  1:8: within canon instructon\n  1:8: canon peer"
+                    .to_owned()
+            )
+        );
+    }
+
+    #[tokio::test]
+    async fn test_canon_error_no_stream() {
+        let res = Sexp::from_str(r#"(canon peer )"#);
+        assert_eq!(
+            res,
+            Err(
+                "Failed to parse the script:\n  1:8: within canon instructon\n  1:13: canon stream"
+                    .to_owned()
+            )
+        );
+    }
+
+    #[tokio::test]
+    async fn test_canon_error_no_target() {
+        let res = Sexp::from_str(r#"(canon peer $stream )"#);
+        assert_eq!(
+            res,
+            Err(
+                "Failed to parse the script:\n  1:8: within canon instructon\n  1:21: canon target"
+                    .to_owned()
+            )
+        );
+    }
+
+    #[tokio::test]
+    async fn test_canon_error_wrong_stream() {
+        let res = Sexp::from_str(r#"(canon peer "$stream" #canon)"#);
+        assert_eq!(
+            res,
+            Err(
+                "Failed to parse the script:\n  1:8: within canon instructon\n  1:13: canon stream"
+                    .to_owned()
+            )
+        );
+    }
+
+    #[tokio::test]
+    async fn test_canon_error_wrong_target() {
+        let res = Sexp::from_str(r##"(canon peer $stream "#canon" )"##);
+        assert_eq!(
+            res,
+            Err(
+                "Failed to parse the script:\n  1:8: within canon instructon\n  1:21: canon target"
+                    .to_owned()
+            )
+        );
+    }
+}
+
\ No newline at end of file diff --git a/src/air_test_framework/transform/walker.rs.html b/src/air_test_framework/transform/walker.rs.html new file mode 100644 index 00000000..5afb66e7 --- /dev/null +++ b/src/air_test_framework/transform/walker.rs.html @@ -0,0 +1,749 @@ +walker.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
+334
+335
+336
+337
+338
+339
+340
+341
+342
+343
+344
+345
+346
+347
+348
+349
+350
+351
+352
+353
+354
+355
+356
+357
+358
+359
+360
+361
+362
+363
+364
+365
+366
+367
+368
+369
+370
+371
+372
+373
+374
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::{Call, Canon, Sexp};
+use crate::ephemeral::Network;
+
+use air_test_utils::key_utils::at;
+use air_test_utils::test_runner::AirRunner;
+use air_test_utils::test_runner::DefaultAirRunner;
+use air_test_utils::test_runner::TestInitParameters;
+
+use std::{borrow::Cow, fmt::Write, ops::Deref, rc::Rc, str::FromStr};
+
+/// Transformed script represents transformed script's services' state within the network.
+/// Executions that use the same transformed script share same generated services' state.
+/// This struct is cheap to clone, and cloned copies share same internal state.
+#[derive(Clone)]
+pub struct TransformedAirScript<R = DefaultAirRunner> {
+    network: Rc<Network<R>>,
+    tranformed: Rc<str>,
+}
+
+impl<R: AirRunner> TransformedAirScript<R> {
+    // TODO peer transformation mode
+    pub async fn new(
+        annotated_air_script: &str,
+        network: Rc<Network<R>>,
+        test_init_parameters: TestInitParameters,
+    ) -> Result<Self, String> {
+        let at_transformed_air_script = at_transform(annotated_air_script);
+
+        // validate the AIR script with the standard parser first
+        air_parser::parse(&at_transformed_air_script)?;
+
+        Self::new_unvalidated(&at_transformed_air_script, network, test_init_parameters).await
+    }
+
+    pub(crate) async fn new_unvalidated(
+        at_transformed_air_script: &str,
+        network: Rc<Network<R>>,
+        test_init_parameters: TestInitParameters,
+    ) -> Result<Self, String> {
+        let transformer = Transformer { network: &network };
+        let mut sexp = Sexp::from_str(at_transformed_air_script)?;
+        transformer.transform(&mut sexp, test_init_parameters).await;
+
+        Ok(Self {
+            network,
+            tranformed: Rc::from(sexp.to_string().as_str()),
+        })
+    }
+
+    pub fn get_network(&self) -> Rc<Network<R>> {
+        self.network.clone()
+    }
+}
+
+impl<R> Deref for TransformedAirScript<R> {
+    type Target = str;
+
+    fn deref(&self) -> &Self::Target {
+        &self.tranformed
+    }
+}
+
+struct Transformer<'net, R> {
+    network: &'net Rc<Network<R>>,
+}
+
+impl<R: AirRunner> Transformer<'_, R> {
+    #[async_recursion::async_recursion(?Send)]
+    pub(crate) async fn transform(
+        &self,
+        sexp: &mut Sexp,
+        test_init_parameters: TestInitParameters,
+    ) {
+        match sexp {
+            Sexp::Call(call) => self.handle_call(call, test_init_parameters).await,
+            Sexp::Canon(canon) => self.handle_canon(canon, test_init_parameters).await,
+            Sexp::List(children) => {
+                for child in children.iter_mut().skip(1) {
+                    self.transform(child, test_init_parameters).await;
+                }
+            }
+            Sexp::Symbol(_) | Sexp::String(_) => {}
+        }
+    }
+
+    async fn handle_call(&self, call: &mut Call, test_init_parameters: TestInitParameters) {
+        // collect peers...
+        if let Sexp::String(ref mut peer_name) = &mut call.triplet.0 {
+            *peer_name = self
+                .network
+                .ensure_named_peer(peer_name.as_str(), test_init_parameters)
+                .await
+                .to_string();
+        }
+
+        let result_store = self.network.get_services().get_result_store();
+
+        if let Some(service) = &call.service_desc {
+            // install a value
+            let call_id = result_store.insert(service.clone()).unwrap();
+
+            match &mut call.triplet.1 {
+                Sexp::String(ref mut value) => {
+                    write!(value, "..{call_id}").unwrap();
+                }
+                _ => panic!("Incorrect script: non-string service string not supported"),
+            }
+        }
+    }
+
+    async fn handle_canon(&self, canon: &mut Canon, test_init_parameters: TestInitParameters) {
+        if let Sexp::String(ref mut peer_name) = &mut canon.peer {
+            *peer_name = self
+                .network
+                .ensure_named_peer(peer_name.as_str(), test_init_parameters)
+                .await
+                .to_string();
+        }
+    }
+}
+
+/// Replace substrings for the form @"peer_name" by a derived peer ID.
+///
+/// It works like a pre-processor.
+fn at_transform(air_script: &str) -> Cow<'_, str> {
+    let transformer = regex::Regex::new(r#"@"([-a-z0-9_]+)""#).unwrap();
+    transformer.replace_all(air_script, |c: &regex::Captures| {
+        // no escaping needed for peer ID
+        format!(r#""{}""#, at(&c[1]))
+    })
+}
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+    use crate::{
+        asserts::ServiceDefinition, ephemeral::PeerId, services::results::ResultStore,
+        AirScriptExecutor,
+    };
+
+    use air_test_utils::key_utils::at;
+    use air_test_utils::prelude::*;
+
+    use std::{
+        collections::{HashMap, HashSet},
+        iter::FromIterator,
+    };
+
+    impl ResultStore {
+        pub fn into_inner(self) -> HashMap<usize, ServiceDefinition> {
+            self.results.into_inner()
+        }
+    }
+
+    #[tokio::test]
+    async fn test_translate_null() {
+        let network =
+            Network::<NativeAirRunner>::new(std::iter::empty::<PeerId>(), vec![], <_>::default())
+                .await;
+        let transformed = TransformedAirScript::new("(null)", network, <_>::default())
+            .await
+            .unwrap();
+        assert_eq!(&*transformed, "(null)");
+    }
+
+    #[tokio::test]
+    async fn test_translate_call_no_result() {
+        let network =
+            Network::<NativeAirRunner>::new(std::iter::empty::<PeerId>(), vec![], <_>::default())
+                .await;
+        let script = r#"(call peer_id ("service_id" func) [])"#;
+        let transformed = TransformedAirScript::new_unvalidated(script, network, <_>::default())
+            .await
+            .unwrap();
+        assert_eq!(&*transformed, script);
+    }
+
+    #[tokio::test]
+    #[should_panic]
+    async fn test_translate_call_no_string() {
+        let network =
+            Network::<NativeAirRunner>::new(std::iter::empty::<PeerId>(), vec![], <_>::default())
+                .await;
+        let script = r#"(call "peer_id" (service_id func) [])"#;
+        let transformed = TransformedAirScript::new(script, network, <_>::default()).await;
+        assert_eq!(transformed.as_deref(), Ok(script));
+    }
+
+    #[tokio::test]
+    async fn test_translate_call_result() {
+        let network =
+            Network::<NativeAirRunner>::new(std::iter::empty::<PeerId>(), vec![], <_>::default())
+                .await;
+        let script = r#"(call "peer_id" ("service_id" func) []) ; ok = 42"#;
+        let transformer =
+            TransformedAirScript::new_unvalidated(script, network.clone(), <_>::default())
+                .await
+                .unwrap();
+
+        let peer_id = at("peer_id");
+
+        assert_eq!(
+            &*transformer,
+            &format!(r#"(call "{peer_id}" ("service_id..0" func) [])"#)
+        );
+
+        assert_eq!(
+            Rc::deref(&network.get_services().get_result_store())
+                .clone()
+                .into_inner(),
+            maplit::hashmap! {
+                0usize => ServiceDefinition::Ok(serde_json::json!(42)),
+            }
+        );
+
+        assert_eq!(
+            network.get_peers().collect::<Vec<_>>(),
+            vec![PeerId::from(peer_id)],
+        );
+    }
+
+    #[tokio::test]
+    async fn test_translate_multiple_calls() {
+        let script = r#"(seq
+   (call peer_id ("service_id" func) [a 11]) ; ok={"test":"me"}
+   (seq
+      (call peer_id ("service_id" func) [b])
+      (call peer_id ("service_id" func) [1]) ; ok=true
+))"#;
+
+        let network =
+            Network::<NativeAirRunner>::new(std::iter::empty::<PeerId>(), vec![], <_>::default())
+                .await;
+        let transformed =
+            TransformedAirScript::new_unvalidated(script, network.clone(), <_>::default())
+                .await
+                .unwrap();
+        assert_eq!(
+            &*transformed,
+            concat!(
+                "(seq ",
+                r#"(call peer_id ("service_id..0" func) [a 11])"#,
+                " (seq ",
+                r#"(call peer_id ("service_id" func) [b])"#,
+                " ",
+                r#"(call peer_id ("service_id..1" func) [1])"#,
+                "))",
+            )
+        );
+
+        assert_eq!(
+            (*network.get_services().get_result_store())
+                .clone()
+                .into_inner(),
+            maplit::hashmap! {
+                0usize => ServiceDefinition::Ok(serde_json::json!({"test":"me"})),
+                1 => ServiceDefinition::Ok(serde_json::json!(true)),
+            }
+        );
+
+        assert!(network.get_peers().collect::<Vec<_>>().is_empty());
+    }
+
+    #[tokio::test]
+    async fn test_peers() {
+        // this script is not correct AIR, but our parser handles it
+        let script = r#"(seq
+   (call "peer_id1" ("service_id" func) [a 11]) ; ok={"test":"me"}
+   (seq
+      (call "peer_id2" ("service_id" func) [b])
+      (call "peer_id1" ("service_id" func) [1]) ; ok=true
+      (call peer_id3 ("service_id" func) [b])
+      (canon "peer_id4" $stream #canon)
+))"#;
+
+        let network =
+            Network::<NativeAirRunner>::new(std::iter::empty::<PeerId>(), vec![], <_>::default())
+                .await;
+        let t = TransformedAirScript::new_unvalidated(script, network.clone(), <_>::default())
+            .await
+            .unwrap();
+
+        let peer_id1 = at("peer_id1");
+        let peer_id2 = at("peer_id2");
+        let peer_id4 = at("peer_id4");
+
+        assert_eq!(
+            network.get_peers().collect::<HashSet<_>>(),
+            HashSet::from_iter(vec![
+                PeerId::from(peer_id1.as_str()),
+                PeerId::from(peer_id2.as_str()),
+                PeerId::from(peer_id4.as_str()),
+            ]),
+        );
+
+        let expected = format!(
+            concat!(
+                "(seq",
+                r#" (call "{peer_id1}" ("service_id..0" func) [a 11])"#,
+                " (seq",
+                r#" (call "{peer_id2}" ("service_id" func) [b])"#,
+                r#" (call "{peer_id1}" ("service_id..1" func) [1])"#,
+                r#" (call peer_id3 ("service_id" func) [b])"#,
+                r#" (canon "{peer_id4}" $stream #canon)))"#
+            ),
+            peer_id1 = peer_id1,
+            peer_id2 = peer_id2,
+            peer_id4 = peer_id4
+        );
+        assert_eq!(*t, expected);
+    }
+
+    #[tokio::test]
+    async fn test_at_transform() {
+        let script = r#"(call "peer_id1" ("service_id" "func") [1 @"peer_id3"] x) ; ok={"test":@"peer_id2"}"#;
+
+        let network =
+            Network::<NativeAirRunner>::new(std::iter::empty::<PeerId>(), vec![], <_>::default())
+                .await;
+        let t = TransformedAirScript::new(script, network.clone(), <_>::default())
+            .await
+            .unwrap();
+
+        let peer_id1 = at("peer_id1");
+        let peer_id2 = at("peer_id2");
+        let peer_id3 = at("peer_id3");
+
+        let expected = format!(
+            r#"(call "{peer_id1}" ("service_id..0" "func") [1 "{peer_id3}"] x)"#,
+            peer_id1 = peer_id1,
+            peer_id3 = peer_id3,
+        );
+        assert_eq!(*t, expected);
+
+        let peer_name1 = "peer_id1";
+        let exec = AirScriptExecutor::from_transformed_air_script(
+            TestRunParameters::from_init_peer_id(peer_name1),
+            <_>::default(),
+            t,
+        )
+        .await
+        .unwrap();
+        let res = exec.execute_one(peer_name1).await.unwrap();
+        assert_eq!(
+            trace_from_result(&res),
+            ExecutionTrace::from(vec![scalar!(
+                json!({ "test": peer_id2 }),
+                peer_name = peer_name1,
+                service = "service_id..0",
+                function = "func",
+                args = vec![json!(1), json!(peer_id3)]
+            )])
+        );
+    }
+}
+
\ No newline at end of file diff --git a/src/air_test_utils/call_services.rs.html b/src/air_test_utils/call_services.rs.html new file mode 100644 index 00000000..122902cd --- /dev/null +++ b/src/air_test_utils/call_services.rs.html @@ -0,0 +1,323 @@ +call_services.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::*;
+
+use serde_json::json;
+
+use futures::FutureExt;
+
+use std::cell::RefCell;
+use std::collections::HashMap;
+use std::rc::Rc;
+
+pub fn unit_call_service() -> CallServiceClosure<'static> {
+    Box::new(|_| {
+        async { CallServiceResult::ok(json!("result from unit_call_service")) }.boxed_local()
+    })
+}
+
+pub fn echo_call_service() -> CallServiceClosure<'static> {
+    Box::new(|mut params| {
+        async move { CallServiceResult::ok(params.arguments.remove(0)) }.boxed_local()
+    })
+}
+
+pub fn set_variable_call_service(json: serde_json::Value) -> CallServiceClosure<'static> {
+    Box::new(move |_| {
+        {
+            let json = json.clone();
+            async move { CallServiceResult::ok(json) }
+        }
+        .boxed_local()
+    })
+}
+
+/// Manages which source will be used to choose a variable.
+pub enum VariableOptionSource {
+    // i-th argument
+    Argument(usize),
+    FunctionName,
+    ServiceName,
+}
+
+pub fn set_variables_call_service(
+    variables_mapping: HashMap<String, serde_json::Value>,
+    variable_source: VariableOptionSource,
+) -> CallServiceClosure<'static> {
+    use VariableOptionSource::*;
+
+    let variable_source = Rc::new(variable_source);
+    let variables_mapping = Rc::new(variables_mapping);
+
+    Box::new(move |params| {
+        let variable_source = variable_source.clone();
+        let variables_mapping = variables_mapping.clone();
+        async move {
+            let var_name = match variable_source.as_ref() {
+                Argument(id) => match params.arguments.get(*id) {
+                    Some(serde_json::Value::String(name)) => name.to_string(),
+                    _ => "default".to_string(),
+                },
+                FunctionName => params.function_name,
+                ServiceName => params.service_id,
+            };
+
+            variables_mapping.get(&var_name).map_or_else(
+                || CallServiceResult::ok(json!("default result from set_variables_call_service")),
+                |var| CallServiceResult::ok(var.clone()),
+            )
+        }
+        .boxed_local()
+    })
+}
+
+pub fn return_string_call_service(ret_str: impl Into<String>) -> CallServiceClosure<'static> {
+    let ret_str = Rc::new(ret_str.into());
+
+    Box::new(move |_| {
+        let ret_str = ret_str.clone();
+        async move { CallServiceResult::ok(json!(ret_str.to_string())) }.boxed_local()
+    })
+}
+
+pub fn fallible_call_service(
+    fallible_service_id: impl Into<String>,
+) -> CallServiceClosure<'static> {
+    let fallible_service_id = Rc::new(fallible_service_id.into());
+
+    Box::new(move |params| {
+        let fallible_service_id = fallible_service_id.clone();
+        async move {
+            // return a error for service with such id
+            if params.service_id == fallible_service_id.as_str() {
+                CallServiceResult::err(1, json!("failed result from fallible_call_service"))
+            } else {
+                // return success for services with other service id
+                CallServiceResult::ok(json!("success result from fallible_call_service"))
+            }
+        }
+        .boxed_local()
+    })
+}
+
+pub fn fallible_call_service_by_arg(
+    arg: impl Into<serde_json::Value>,
+) -> CallServiceClosure<'static> {
+    let arg = Rc::new(arg.into());
+
+    Box::new(move |params| {
+        let arg = arg.clone();
+        async move {
+            // return a error for service with specific arg
+            if params.arguments.get(0) == Some(arg.as_ref()) {
+                CallServiceResult::err(1, json!("failed result from fallible_call_service_by_arg"))
+            } else {
+                // return success for services with other arg
+                CallServiceResult::ok(json!("success result from fallible_call_service_by_arg"))
+            }
+        }
+        .boxed_local()
+    })
+}
+
+pub type ArgTetraplets = Vec<Vec<SecurityTetraplet>>;
+
+pub fn tetraplet_host_function(
+    closure: CallServiceClosure<'static>,
+) -> (CallServiceClosure<'static>, Rc<RefCell<ArgTetraplets>>) {
+    let arg_tetraplets = Rc::new(RefCell::new(ArgTetraplets::new()));
+    let closure = Rc::new(closure);
+
+    let arg_tetraplets_inner = arg_tetraplets.clone();
+
+    let host_function: CallServiceClosure<'_> = Box::new(move |params| {
+        let arg_tetraplets_inner = arg_tetraplets_inner.clone();
+        let closure = closure.clone();
+        async move {
+            *arg_tetraplets_inner.borrow_mut() = params.tetraplets.clone();
+            closure(params).await
+        }
+        .boxed_local()
+    });
+
+    (host_function, arg_tetraplets)
+}
+
\ No newline at end of file diff --git a/src/air_test_utils/executed_state.rs.html b/src/air_test_utils/executed_state.rs.html new file mode 100644 index 00000000..194a1326 --- /dev/null +++ b/src/air_test_utils/executed_state.rs.html @@ -0,0 +1,889 @@ +executed_state.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
+334
+335
+336
+337
+338
+339
+340
+341
+342
+343
+344
+345
+346
+347
+348
+349
+350
+351
+352
+353
+354
+355
+356
+357
+358
+359
+360
+361
+362
+363
+364
+365
+366
+367
+368
+369
+370
+371
+372
+373
+374
+375
+376
+377
+378
+379
+380
+381
+382
+383
+384
+385
+386
+387
+388
+389
+390
+391
+392
+393
+394
+395
+396
+397
+398
+399
+400
+401
+402
+403
+404
+405
+406
+407
+408
+409
+410
+411
+412
+413
+414
+415
+416
+417
+418
+419
+420
+421
+422
+423
+424
+425
+426
+427
+428
+429
+430
+431
+432
+433
+434
+435
+436
+437
+438
+439
+440
+441
+442
+443
+444
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::ApResult;
+use super::CallResult;
+use super::CanonResult;
+use super::CanonResultCidAggregate;
+use super::ExecutedState;
+use super::JValue;
+use super::ParResult;
+use super::Sender;
+use super::TracePos;
+use super::ValueRef;
+use crate::key_utils::at;
+use crate::FoldLore;
+use crate::FoldResult;
+use crate::FoldSubTraceLore;
+use crate::SubTraceDesc;
+
+use air::ExecutionCidState;
+use air_interpreter_cid::value_to_json_cid;
+use air_interpreter_cid::CID;
+use air_interpreter_data::CanonCidAggregate;
+use air_interpreter_data::GenerationIdx;
+use air_interpreter_data::Provenance;
+use air_interpreter_data::RawValue;
+use air_interpreter_data::ServiceResultCidAggregate;
+use avm_server::SecurityTetraplet;
+use serde::Deserialize;
+use serde::Serialize;
+
+use std::rc::Rc;
+
+pub fn simple_value_aggregate_cid(
+    result: impl Into<JValue>,
+    cid_state: &mut ExecutionCidState,
+) -> CID<ServiceResultCidAggregate> {
+    let value = result.into();
+    let vm_value = RawValue::from_value(value);
+
+    let value_cid = cid_state.value_tracker.track_raw_value(vm_value);
+    let tetraplet = SecurityTetraplet::default();
+    let tetraplet_cid = cid_state.tetraplet_tracker.track_value(tetraplet).unwrap();
+    let service_result_agg = ServiceResultCidAggregate {
+        value_cid,
+        argument_hash: "".into(),
+        tetraplet_cid,
+    };
+    cid_state
+        .service_result_agg_tracker
+        .track_value(service_result_agg)
+        .unwrap()
+}
+
+pub fn value_aggregate_cid(
+    result: impl Into<JValue>,
+    tetraplet: SecurityTetraplet,
+    args: Vec<JValue>,
+    cid_state: &mut ExecutionCidState,
+) -> CID<ServiceResultCidAggregate> {
+    let value = result.into();
+    let vm_value = RawValue::from_value(value);
+    let value_cid = cid_state.value_tracker.track_raw_value(vm_value);
+    let tetraplet_cid = cid_state.tetraplet_tracker.track_value(tetraplet).unwrap();
+
+    let arguments = JValue::array(args);
+    let argument_hash = value_to_json_cid(&arguments).unwrap().get_inner();
+
+    let service_result_agg = ServiceResultCidAggregate {
+        value_cid,
+        argument_hash,
+        tetraplet_cid,
+    };
+
+    cid_state
+        .service_result_agg_tracker
+        .track_value(service_result_agg)
+        .unwrap()
+}
+
+pub fn request_sent_by(sender: impl Into<String>) -> ExecutedState {
+    ExecutedState::Call(CallResult::RequestSentBy(Sender::PeerId(Rc::new(
+        sender.into(),
+    ))))
+}
+
+pub fn par(left: u32, right: u32) -> ExecutedState {
+    let par_result = ParResult {
+        left_size: left as _,
+        right_size: right as _,
+    };
+
+    ExecutedState::Par(par_result)
+}
+
+pub fn fold(lore: FoldLore) -> ExecutedState {
+    let result = FoldResult { lore };
+    ExecutedState::Fold(result)
+}
+
+pub fn subtrace_lore(
+    value_pos: impl Into<TracePos>,
+    before: SubTraceDesc,
+    after: SubTraceDesc,
+) -> FoldSubTraceLore {
+    FoldSubTraceLore {
+        value_pos: value_pos.into(),
+        subtraces_desc: vec![before, after],
+    }
+}
+
+pub fn subtrace_desc(begin_pos: impl Into<TracePos>, subtrace_len: u32) -> SubTraceDesc {
+    SubTraceDesc {
+        begin_pos: begin_pos.into(),
+        subtrace_len,
+    }
+}
+
+pub fn ap(generation: impl Into<GenerationIdx>) -> ExecutedState {
+    let ap_result = ApResult::new(generation.into());
+    ExecutedState::Ap(ap_result)
+}
+
+#[derive(Debug, Serialize, Deserialize)]
+pub struct ValueAggregateAlike {
+    pub result: JValue,
+    pub tetraplet: Rc<SecurityTetraplet>,
+    // TODO convert data and remove Provenance
+    pub provenance: Option<Provenance>,
+}
+
+#[derive(Debug, Serialize, Deserialize)]
+pub struct CanonResultAlike {
+    pub tetraplet: Rc<SecurityTetraplet>,
+    pub values: Vec<ValueAggregateAlike>,
+}
+
+/// This function takes a JSON DSL-like struct for compatibility and test writer
+/// convenience.
+pub fn canon(canonicalized_element: serde_json::Value) -> ExecutedState {
+    let mut cid_state = ExecutionCidState::new();
+
+    canon_tracked(canonicalized_element, &mut cid_state)
+}
+
+pub fn canon_tracked(
+    canonicalized_element: serde_json::Value,
+    cid_state: &mut ExecutionCidState,
+) -> ExecutedState {
+    let canon_input = serde_json::from_value::<CanonResultAlike>(canonicalized_element)
+        .expect("Malformed canon input");
+    let tetraplet_cid = cid_state
+        .tetraplet_tracker
+        .track_value(canon_input.tetraplet.clone())
+        .unwrap_or_else(|e| {
+            panic!(
+                "{:?}: failed to compute CID of {:?}",
+                e, canon_input.tetraplet
+            )
+        });
+    let value_cids = canon_input
+        .values
+        .iter()
+        .map(|value| {
+            let vm_value = RawValue::from_value(value.result.clone());
+
+            let value_cid = cid_state.value_tracker.track_raw_value(vm_value);
+            let tetraplet_cid = cid_state
+                .tetraplet_tracker
+                .track_value(value.tetraplet.clone())?;
+            cid_state
+                .canon_element_tracker
+                .track_value(CanonCidAggregate {
+                    value: value_cid,
+                    tetraplet: tetraplet_cid,
+                    provenance: value.provenance.clone().unwrap_or_else(Provenance::literal),
+                })
+        })
+        .collect::<Result<Vec<_>, _>>()
+        .unwrap_or_else(|e| panic!("{:?}: failed to compute CID of {:?}", e, canon_input.values));
+
+    let canon_result = CanonResultCidAggregate::new(tetraplet_cid, value_cids);
+    let canon_result_cid = cid_state
+        .canon_result_tracker
+        .track_value(canon_result.clone())
+        .unwrap_or_else(|e| panic!("{:?}: failed to compute CID of {:?}", e, canon_result));
+    ExecutedState::Canon(CanonResult::executed(canon_result_cid))
+}
+
+pub fn canon_request(peer_id: impl Into<String>) -> ExecutedState {
+    ExecutedState::Canon(CanonResult::request_sent_by(peer_id.into().into()))
+}
+
+#[macro_export]
+macro_rules! _trace_value_body {
+    ($value:expr) => {
+        $crate::executed_state::ExecutedCallBuilder::new($value)
+    };
+
+    ($value:expr, $func1:ident = $v1:expr $(, $func:ident = $v:expr)*) => {
+        $crate::executed_state::ExecutedCallBuilder::new($value) .$func1($v1) $(. $func($v))*
+    };
+}
+
+#[macro_export]
+macro_rules! scalar {
+    ($value:expr) => {
+        _trace_value_body!($value).scalar()
+    };
+
+    ($value:expr, $func1:ident = $v1:expr $(, $func:ident = $v:expr)*) => {
+        _trace_value_body!($value, $func1 = $v1 $(, $func = $v)*).scalar()
+    };
+}
+
+#[macro_export]
+macro_rules! scalar_tracked {
+    ($value:expr, $state:expr) => {
+        _trace_value_body!($value).scalar_tracked(&mut $state)
+    };
+
+    ($value:expr, $state:expr, $func1:ident = $v1:expr $(, $func:ident = $v:expr)*) => {
+        _trace_value_body!($value, $func1 = $v1 $(, $func = $v)*).scalar_tracked(&mut $state)
+    };
+}
+
+#[macro_export]
+macro_rules! failed {
+    ($ret_code:expr, $error_message:expr) => {{
+        let failed_value = $crate::executed_state::_failure_to_value($ret_code, $error_message);
+        _trace_value_body!(failed_value).failed()
+    }};
+    ($ret_code:expr, $error_message:expr, $func1:ident = $v1:expr $(, $func:ident = $v:expr)*) => {{
+        let failed_value = $crate::executed_state::_failure_to_value($ret_code, $error_message);
+        _trace_value_body!(failed_value, $func1 = $v1 $(, $func = $v)*).failed()
+    }}
+}
+
+#[macro_export]
+macro_rules! stream {
+    ($value:expr, $generation:expr) => {
+        _trace_value_body!($value).stream($generation)
+    };
+
+    ($value:expr, $generation:expr, $func1:ident = $v1:expr $(, $func:ident = $v:expr)*) => {
+        _trace_value_body!($value, $func1 = $v1 $(, $func = $v)*).stream($generation)
+    };
+}
+
+#[macro_export]
+macro_rules! stream_tracked {
+    ($value:expr, $generation:expr, $state:expr) => {
+        _trace_value_body!($value).stream_tracked($generation, &mut $state)
+    };
+
+    ($value:expr, $generation:expr, $state:expr, $func1:ident = $v1:expr $(, $func:ident = $v:expr)*) => {
+        _trace_value_body!($value, $func1 = $v1 $(, $func = $v)*).stream_tracked($generation, &mut $state)
+    };
+}
+
+/// Please note that `unused_tracked` does not exist as unused is never tracked.
+#[macro_export]
+macro_rules! unused {
+    ($value:expr) => {
+        _trace_value_body!($value).unused()
+    };
+
+    ($value:expr, $func1:ident = $v1:expr $(, $func:ident = $v:expr)*) => {
+        _trace_value_body!($value, $func1 = $v1 $(, $func = $v)*).unused()
+    };
+}
+
+pub fn _failure_to_value(ret_code: i32, error_message: &str) -> JValue {
+    let message_serialized = serde_json::to_string(error_message).unwrap();
+    crate::CallServiceFailed::new(ret_code, message_serialized.into()).to_value()
+}
+
+pub struct ExecutedCallBuilder {
+    result: JValue,
+    tetraplet: SecurityTetraplet,
+    args: Vec<JValue>,
+}
+
+impl ExecutedCallBuilder {
+    pub fn new(result: impl Into<JValue>) -> Self {
+        Self {
+            result: result.into(),
+            tetraplet: Default::default(),
+            args: Default::default(),
+        }
+    }
+
+    pub fn peer(mut self, peer_pk: impl Into<String>) -> Self {
+        self.tetraplet.peer_pk = peer_pk.into();
+        self
+    }
+
+    pub fn peer_name(mut self, peer_name: impl AsRef<str>) -> Self {
+        self.tetraplet.peer_pk = at(peer_name.as_ref());
+        self
+    }
+
+    pub fn service(mut self, service_id: impl Into<String>) -> Self {
+        self.tetraplet.service_id = service_id.into();
+        self
+    }
+
+    pub fn function(mut self, function_name: impl Into<String>) -> Self {
+        self.tetraplet.function_name = function_name.into();
+        self
+    }
+
+    pub fn lens(mut self, lens: impl Into<String>) -> Self {
+        self.tetraplet.lens = lens.into();
+        self
+    }
+
+    pub fn args(mut self, args: impl IntoIterator<Item = impl Into<JValue>>) -> Self {
+        self.args = args.into_iter().map(Into::into).collect();
+        self
+    }
+
+    pub fn scalar(self) -> ExecutedState {
+        let mut cid_state = ExecutionCidState::new();
+        self.scalar_tracked(&mut cid_state)
+    }
+
+    pub fn unused(self) -> ExecutedState {
+        let value_cid = value_to_json_cid(&self.result).unwrap();
+        let value = ValueRef::Unused(value_cid);
+        ExecutedState::Call(CallResult::Executed(value))
+    }
+
+    pub fn scalar_tracked(self, cid_state: &mut ExecutionCidState) -> ExecutedState {
+        let service_result_agg_cid =
+            value_aggregate_cid(self.result, self.tetraplet, self.args, cid_state);
+        let value = ValueRef::Scalar(service_result_agg_cid);
+        ExecutedState::Call(CallResult::Executed(value))
+    }
+
+    pub fn failed(self) -> ExecutedState {
+        let mut cid_state = ExecutionCidState::new();
+        self.failed_tracked(&mut cid_state)
+    }
+
+    pub fn failed_tracked(self, cid_state: &mut ExecutionCidState) -> ExecutedState {
+        let service_result_agg_cid =
+            value_aggregate_cid(self.result, self.tetraplet, self.args, cid_state);
+        ExecutedState::Call(CallResult::Failed(service_result_agg_cid))
+    }
+
+    pub fn stream(self, generation: u32) -> ExecutedState {
+        let mut cid_state = ExecutionCidState::new();
+        self.stream_tracked(generation, &mut cid_state)
+    }
+
+    pub fn stream_tracked(
+        self,
+        generation: u32,
+        cid_state: &mut ExecutionCidState,
+    ) -> ExecutedState {
+        let service_result_agg_cid =
+            value_aggregate_cid(self.result, self.tetraplet, self.args, cid_state);
+        let value = ValueRef::Stream {
+            cid: service_result_agg_cid,
+            // TODO: refactor it
+            generation: (generation as usize).into(),
+        };
+        ExecutedState::Call(CallResult::Executed(value))
+    }
+}
+
+pub fn extract_service_result_cid(
+    stream_exec_state: &ExecutedState,
+) -> CID<ServiceResultCidAggregate> {
+    match stream_exec_state {
+        ExecutedState::Call(CallResult::Executed(ValueRef::Stream { cid, .. })) => cid.clone(),
+        ExecutedState::Call(CallResult::Executed(ValueRef::Scalar(cid))) => cid.clone(),
+        _ => panic!("the function is intended for call results values only"),
+    }
+}
+
+pub fn extract_canon_result_cid(canon_state: &ExecutedState) -> CID<CanonResultCidAggregate> {
+    match canon_state {
+        ExecutedState::Canon(CanonResult::Executed(cid)) => cid.clone(),
+        _ => panic!("the function is intended for executed canon only"),
+    }
+}
+
+#[cfg(test)]
+mod tests {
+    use air::ExecutionCidState;
+    use serde_json::json;
+
+    #[test]
+    fn test_scalar() {
+        assert_eq!(scalar!(42), scalar!(42));
+        assert_eq!(scalar!("test"), scalar!("test"));
+        assert_ne!(scalar!(42), scalar!(42, peer = "test"));
+        assert_ne!(
+            scalar!(42, peer = "test"),
+            scalar!(42, peer = "test", args = vec![json!(1)]),
+        );
+    }
+
+    #[test]
+    fn test_scalar_tracked() {
+        let mut store = ExecutionCidState::new();
+        assert_eq!(scalar_tracked!(42, store), scalar_tracked!(42, store));
+        assert_eq!(scalar!(42), scalar_tracked!(42, store));
+        assert_eq!(
+            scalar_tracked!("test", store),
+            scalar_tracked!("test", store)
+        );
+        assert_ne!(
+            scalar_tracked!(42, store),
+            scalar_tracked!(42, store, peer = "test")
+        );
+        assert_ne!(
+            scalar_tracked!(42, store, peer = "test"),
+            scalar_tracked!(42, store, peer = "test", args = vec![json!(1)]),
+        );
+        assert_eq!(
+            scalar!(42, peer = "test", args = vec![json!(1)]),
+            scalar_tracked!(42, store, peer = "test", args = vec![json!(1)]),
+        );
+    }
+}
+
\ No newline at end of file diff --git a/src/air_test_utils/key_utils.rs.html b/src/air_test_utils/key_utils.rs.html new file mode 100644 index 00000000..03c216e3 --- /dev/null +++ b/src/air_test_utils/key_utils.rs.html @@ -0,0 +1,97 @@ +key_utils.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use air_interpreter_signatures::KeyPair;
+use rand_chacha::rand_core::SeedableRng;
+
+///  Derive fake keypair for testing proposes.
+///
+///  This function should be used in production, but it is yet.
+///  It returns a keypair determinisitically derived from seed, and a corresponding peer ID
+///  that might be useful in tests.
+// Should be moved to test lib when keypair interface PR is merged.
+pub fn derive_dummy_keypair(seed: &str) -> (KeyPair, String) {
+    use sha2::{Digest as _, Sha256};
+
+    let mut rng = {
+        let mut hasher = Sha256::new();
+        hasher.update(seed);
+        rand_chacha::ChaCha8Rng::from_seed(hasher.finalize().into())
+    };
+
+    let keypair_ed25519 = ed25519_dalek::SigningKey::generate(&mut rng);
+    let keypair = fluence_keypair::KeyPair::Ed25519(keypair_ed25519.into());
+    let keypair = KeyPair::try_from(keypair).expect("cannot happen");
+
+    let peer_id = keypair.public().to_peer_id().unwrap().to_string();
+    (keypair, peer_id)
+}
+
+pub fn at(peer_name: &str) -> String {
+    derive_dummy_keypair(peer_name).1
+}
+
\ No newline at end of file diff --git a/src/air_test_utils/lib.rs.html b/src/air_test_utils/lib.rs.html new file mode 100644 index 00000000..d729cfe4 --- /dev/null +++ b/src/air_test_utils/lib.rs.html @@ -0,0 +1,513 @@ +lib.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#![forbid(unsafe_code)]
+#![warn(rust_2018_idioms)]
+#![deny(
+    dead_code,
+    nonstandard_style,
+    unused_imports,
+    unused_mut,
+    unused_variables,
+    unused_unsafe,
+    unreachable_patterns
+)]
+
+pub mod call_services;
+pub mod executed_state;
+pub mod key_utils;
+pub mod test_runner;
+
+pub mod native_test_runner;
+pub mod wasm_test_runner;
+
+pub use air::interpreter_data::*;
+
+use air::ExecutionCidState;
+pub use avm_interface::raw_outcome::*;
+pub use avm_server::*;
+
+use futures::future::LocalBoxFuture;
+
+pub mod prelude {
+    pub use super::*;
+    pub use call_services::*;
+    pub use executed_state::*;
+    pub use test_runner::*;
+
+    pub use air_interpreter_value::JValue;
+    pub use serde_json::json;
+}
+
+pub type CallServiceClosure<'x> =
+    Box<dyn Fn(CallRequestParams) -> LocalBoxFuture<'x, CallServiceResult> + 'static>;
+
+use air_interpreter_value::JValue;
+
+#[macro_export]
+macro_rules! checked_call_vm {
+    ($vm:expr, $test_run_parameters:expr, $script:expr, $prev_data:expr, $data:expr) => {{
+        match $vm
+            .call($script, $prev_data, $data, $test_run_parameters)
+            .await
+        {
+            Ok(v) if v.ret_code != 0 => {
+                panic!("VM returns a error: {} {}", v.ret_code, v.error_message)
+            }
+            Ok(v) => v,
+            Err(err) => panic!("VM call failed: {}", err),
+        }
+    }};
+}
+
+#[macro_export]
+macro_rules! call_vm {
+    ($vm:expr, $test_run_parameters:expr, $script:expr, $prev_data:expr, $data:expr) => {
+        match $vm
+            .call($script, $prev_data, $data, $test_run_parameters)
+            .await
+        {
+            Ok(v) => v,
+            Err(err) => panic!("VM call failed: {}", err),
+        }
+    };
+}
+
+pub fn trace_from_result(result: &RawAVMOutcome) -> ExecutionTrace {
+    let data = data_from_result(result);
+    data.trace
+}
+
+pub fn data_from_result(result: &RawAVMOutcome) -> InterpreterData {
+    let env = InterpreterDataEnvelope::try_from_slice(&result.data)
+        .expect("default serializer shouldn't fail");
+    InterpreterData::try_from_slice(&env.inner_data).expect("default serializer shouldn't fail")
+}
+
+pub fn env_from_result(result: &RawAVMOutcome) -> InterpreterDataEnvelope<'_> {
+    InterpreterDataEnvelope::try_from_slice(&result.data)
+        .expect("default serializer shouldn't fail")
+}
+
+pub fn raw_data_from_trace(
+    trace: impl Into<ExecutionTrace>,
+    cid_state: ExecutionCidState,
+) -> Vec<u8> {
+    let data = InterpreterDataEnvelope::from_execution_result(
+        trace.into(),
+        cid_state.into(),
+        <_>::default(),
+        0,
+        semver::Version::new(1, 1, 1),
+    );
+    data.serialize().expect("default serializer shouldn't fail")
+}
+
+pub fn raw_data_from_trace_with_canon(
+    trace: impl Into<ExecutionTrace>,
+    cid_state: ExecutionCidState,
+) -> Vec<u8> {
+    let data = InterpreterDataEnvelope::from_execution_result(
+        trace.into(),
+        CidInfo {
+            value_store: cid_state.value_tracker.into(),
+            tetraplet_store: cid_state.tetraplet_tracker.into(),
+            canon_element_store: cid_state.canon_element_tracker.into(),
+            canon_result_store: cid_state.canon_result_tracker.into(),
+            service_result_store: cid_state.service_result_agg_tracker.into(),
+        },
+        <_>::default(),
+        0,
+        semver::Version::new(1, 1, 1),
+    );
+    data.serialize().expect("default serializer shouldn't fail")
+}
+
+#[macro_export]
+macro_rules! assert_next_pks {
+    ($expected:expr, $actual:expr) => {
+        let expected: std::collections::HashSet<_> =
+            $expected.into_iter().map(|s| s.as_str()).collect();
+        let actual: std::collections::HashSet<_> = $actual.iter().map(|s| *s).collect();
+
+        assert_eq!(expected, actual)
+    };
+}
+
+pub fn print_trace(result: &RawAVMOutcome, trace_name: &str) {
+    let data = data_from_result(result);
+    let trace = &data.trace;
+
+    println!("trace {} (states_count: {}): [", trace_name, trace.len());
+    for (id, state) in trace.iter().enumerate() {
+        print!("  {id}: {state}");
+        match state {
+            ExecutedState::Call(call_result) => print_call_value(&data, call_result),
+            ExecutedState::Canon(canon_result) => print_canon_values(&data, canon_result),
+            ExecutedState::Par(_) | ExecutedState::Fold(_) | ExecutedState::Ap(_) => {}
+        }
+        println!();
+    }
+    println!("]");
+}
+
+fn print_call_value(data: &InterpreterData, call_result: &CallResult) {
+    let service_result_cid = match call_result {
+        CallResult::Executed(ValueRef::Unused(_)) | CallResult::RequestSentBy(_) => return,
+        CallResult::Executed(ValueRef::Scalar(cid)) => cid,
+        CallResult::Executed(ValueRef::Stream { cid, .. }) => cid,
+        CallResult::Failed(cid) => cid,
+    };
+
+    let service_result = data
+        .cid_info
+        .service_result_store
+        .get(service_result_cid)
+        .unwrap_or_else(|| panic!("service result CID not found: {:?}", service_result_cid));
+    let value = data
+        .cid_info
+        .value_store
+        .get(&service_result.value_cid)
+        .unwrap_or_else(|| panic!("value CID not found: {:?}", service_result.value_cid));
+    print!(" => {:#?}", value);
+}
+
+fn print_canon_values(data: &InterpreterData, canon_result: &CanonResult) {
+    let canon_result_cid = match canon_result {
+        CanonResult::RequestSentBy(_) => return,
+        CanonResult::Executed(cid) => cid,
+    };
+    let canon_agg = data
+        .cid_info
+        .canon_result_store
+        .get(canon_result_cid)
+        .unwrap_or_else(|| panic!("canon result CID not found: {:?}", canon_result_cid));
+    let canon_vals: Vec<_> = canon_agg
+        .values
+        .iter()
+        .map(|elt_cid| {
+            let elt = data
+                .cid_info
+                .canon_element_store
+                .get(elt_cid)
+                .unwrap_or_else(|| panic!("canon element CID not found: {:?}", elt_cid));
+            data.cid_info
+                .value_store
+                .get(&elt.value)
+                .unwrap_or_else(|| panic!("value CID not found: {:?}", elt.value));
+        })
+        .collect();
+    print!(" => {:?}", canon_vals)
+}
+
+#[macro_export]
+macro_rules! rc {
+    ($expr:expr) => {
+        ::std::rc::Rc::new($expr)
+    };
+}
+
+use air::ToErrorCode;
+use air_interpreter_interface::INTERPRETER_SUCCESS;
+
+pub fn is_interpreter_succeded(result: &RawAVMOutcome) -> bool {
+    result.ret_code == INTERPRETER_SUCCESS
+}
+
+pub fn check_error(result: &RawAVMOutcome, error: impl ToErrorCode + ToString) -> bool {
+    result.ret_code == error.to_error_code() && result.error_message == error.to_string()
+}
+
+#[macro_export]
+macro_rules! assert_error_eq {
+    ($result:expr, $error:expr $(,)?) => {{
+        let result: &::air_test_utils::RawAVMOutcome = $result;
+        let error = $error;
+        ::std::assert_eq!(
+            (result.ret_code, &result.error_message),
+            (::air::ToErrorCode::to_error_code(&error), &::std::string::ToString::to_string(&error))
+        );
+    }};
+    ($result:expr, $error:expr, $($arg:tt)+) => {{
+        let result: &::air_test_utils::RawAVMOutcome = $result;
+        let error = $error;
+        ::std::assert_eq!(
+            (result.ret_code, &result.error_message),
+            (::air::ToErrorCode::to_error_code(&error), &::std::string::ToString::to_string(&error)),
+            $($arg)+
+        );
+    }};
+}
+
\ No newline at end of file diff --git a/src/air_test_utils/native_test_runner.rs.html b/src/air_test_utils/native_test_runner.rs.html new file mode 100644 index 00000000..67ce52d5 --- /dev/null +++ b/src/air_test_utils/native_test_runner.rs.html @@ -0,0 +1,239 @@ +native_test_runner.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use crate::prelude::TestInitParameters;
+use crate::test_runner::AirRunner;
+use air_interpreter_interface::CallResultsRepr;
+use air_interpreter_interface::RunParameters;
+use air_interpreter_sede::ToSerialized;
+use avm_server::avm_runner::*;
+use avm_server::into_raw_result;
+use avm_server::AquaVMRuntimeLimits;
+use fluence_keypair::KeyPair;
+use futures::future::LocalBoxFuture;
+use futures::FutureExt;
+
+pub struct NativeAirRunner {
+    current_peer_id: String,
+    test_init_parameters: TestInitParameters,
+}
+
+impl NativeAirRunner {
+    fn new(current_peer_id: impl Into<String>, test_init_parameters: TestInitParameters) -> Self {
+        Self {
+            current_peer_id: current_peer_id.into(),
+            test_init_parameters,
+        }
+    }
+}
+impl AirRunner for NativeAirRunner {
+    fn new(
+        current_peer_id: impl Into<String>,
+        test_init_parameters: TestInitParameters,
+    ) -> LocalBoxFuture<'static, Self> {
+        let current_peer_id = current_peer_id.into();
+        async move { Self::new(current_peer_id, test_init_parameters) }.boxed_local()
+    }
+
+    fn call<'this>(
+        &'this mut self,
+        air: impl Into<String>,
+        prev_data: impl Into<Vec<u8>>,
+        data: impl Into<Vec<u8>>,
+        init_peer_id: impl Into<String>,
+        timestamp: u64,
+        ttl: u32,
+        override_current_peer_id: Option<String>,
+        call_results: avm_server::CallResults,
+        keypair: &KeyPair,
+        particle_id: String,
+    ) -> LocalBoxFuture<'this, Result<RawAVMOutcome, Box<dyn std::error::Error + 'this>>> {
+        let air = air.into();
+        let prev_data = prev_data.into();
+        let data = data.into();
+        let init_peer_id = init_peer_id.into();
+        let keypair = keypair.clone();
+        async move {
+            // some inner parts transformations
+            let raw_call_results = into_raw_result(call_results);
+            let raw_call_results = CallResultsRepr.serialize(&raw_call_results).unwrap();
+
+            let current_peer_id =
+                override_current_peer_id.unwrap_or_else(|| self.current_peer_id.clone());
+
+            let key_format = keypair.key_format().into();
+            let secret_key_bytes = keypair.secret().unwrap();
+
+            let AquaVMRuntimeLimits {
+                air_size_limit,
+                particle_size_limit,
+                call_result_size_limit,
+                hard_limit_enabled,
+            } = self.test_init_parameters.into();
+
+            let outcome = air::execute_air(
+                air.into(),
+                prev_data.into(),
+                data.into(),
+                RunParameters {
+                    init_peer_id: init_peer_id.into(),
+                    current_peer_id,
+                    timestamp,
+                    ttl,
+                    key_format,
+                    secret_key_bytes,
+                    particle_id,
+                    air_size_limit,
+                    particle_size_limit,
+                    call_result_size_limit,
+                    hard_limit_enabled,
+                },
+                raw_call_results,
+            );
+            let outcome = RawAVMOutcome::from_interpreter_outcome(outcome)?;
+
+            Ok(outcome)
+        }
+        .boxed_local()
+    }
+
+    fn get_current_peer_id(&self) -> &str {
+        &self.current_peer_id
+    }
+}
+
\ No newline at end of file diff --git a/src/air_test_utils/test_runner.rs.html b/src/air_test_utils/test_runner.rs.html new file mode 100644 index 00000000..fac6b7c9 --- /dev/null +++ b/src/air_test_utils/test_runner.rs.html @@ -0,0 +1,809 @@ +test_runner.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
+334
+335
+336
+337
+338
+339
+340
+341
+342
+343
+344
+345
+346
+347
+348
+349
+350
+351
+352
+353
+354
+355
+356
+357
+358
+359
+360
+361
+362
+363
+364
+365
+366
+367
+368
+369
+370
+371
+372
+373
+374
+375
+376
+377
+378
+379
+380
+381
+382
+383
+384
+385
+386
+387
+388
+389
+390
+391
+392
+393
+394
+395
+396
+397
+398
+399
+400
+401
+402
+403
+404
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use crate::key_utils::derive_dummy_keypair;
+#[cfg(feature = "test_with_native_code")]
+pub use crate::native_test_runner::NativeAirRunner as DefaultAirRunner;
+#[cfg(not(feature = "test_with_native_code"))]
+pub use crate::wasm_test_runner::WasmAirRunner as DefaultAirRunner;
+
+pub use crate::native_test_runner::NativeAirRunner;
+pub use crate::wasm_test_runner::ReleaseWasmAirRunner;
+pub use crate::wasm_test_runner::WasmAirRunner;
+
+use super::CallServiceClosure;
+
+use avm_server::avm_runner::*;
+use avm_server::AVMRuntimeLimits;
+use avm_server::AquaVMRuntimeLimits;
+use fluence_keypair::KeyPair;
+use futures::future::LocalBoxFuture;
+use futures::StreamExt;
+
+use std::collections::HashMap;
+use std::collections::HashSet;
+
+pub trait AirRunner {
+    fn new(
+        current_call_id: impl Into<String>,
+        test_init_parameters: TestInitParameters,
+    ) -> LocalBoxFuture<'static, Self>;
+
+    #[allow(clippy::too_many_arguments)]
+    fn call<'this>(
+        &'this mut self,
+        air: impl Into<String>,
+        prev_data: impl Into<Vec<u8>>,
+        data: impl Into<Vec<u8>>,
+        init_peer_id: impl Into<String>,
+        timestamp: u64,
+        ttl: u32,
+        override_current_peer_id: Option<String>,
+        call_results: avm_server::CallResults,
+        key_pair: &KeyPair,
+        particle_id: String,
+    ) -> LocalBoxFuture<'this, Result<RawAVMOutcome, Box<dyn std::error::Error + 'this>>>;
+
+    fn get_current_peer_id(&self) -> &str;
+}
+
+pub struct TestRunner<R = DefaultAirRunner> {
+    pub runner: R,
+    call_service: CallServiceClosure<'static>,
+    pub keypair: KeyPair,
+}
+
+#[derive(Debug, Default, Clone)]
+pub struct TestRunParameters {
+    pub init_peer_id: String,
+    pub timestamp: u64,
+    pub ttl: u32,
+    pub override_current_peer_id: Option<String>,
+    pub particle_id: String,
+}
+
+/// This struct is used to set limits for the test runner creating AVMRunner.
+#[derive(Debug, Default, Clone, Copy)]
+pub struct TestInitParameters {
+    pub air_size_limit: Option<u64>,
+    pub particle_size_limit: Option<u64>,
+    pub call_result_size_limit: Option<u64>,
+    pub hard_limit_enabled: bool,
+}
+
+impl<R: AirRunner> TestRunner<R> {
+    pub async fn call(
+        &mut self,
+        air: impl Into<String>,
+        prev_data: impl Into<Vec<u8>>,
+        data: impl Into<Vec<u8>>,
+        test_run_params: TestRunParameters,
+    ) -> Result<RawAVMOutcome, String> {
+        let air = air.into();
+        let mut prev_data = prev_data.into();
+        let mut data = data.into();
+
+        let TestRunParameters {
+            init_peer_id,
+            timestamp,
+            ttl,
+            override_current_peer_id,
+            particle_id,
+        } = test_run_params;
+
+        let mut call_results = HashMap::new();
+        let mut next_peer_pks = HashSet::new();
+
+        loop {
+            let mut outcome: RawAVMOutcome = self
+                .runner
+                .call(
+                    air.clone(),
+                    prev_data,
+                    data,
+                    init_peer_id.clone(),
+                    timestamp,
+                    ttl,
+                    override_current_peer_id.clone(),
+                    call_results,
+                    &self.keypair,
+                    particle_id.clone(),
+                )
+                .await
+                .map_err(|e| e.to_string())?;
+
+            next_peer_pks.extend(outcome.next_peer_pks);
+
+            if outcome.call_requests.is_empty() {
+                outcome.next_peer_pks = next_peer_pks.into_iter().collect::<Vec<_>>();
+                return Ok(outcome);
+            }
+
+            call_results = futures::stream::iter(outcome.call_requests.into_iter())
+                .then(|(id, call_parameters)| {
+                    let service_result = (self.call_service)(call_parameters);
+                    async move { (id, service_result.await) }
+                })
+                .collect::<HashMap<_, _>>()
+                .await;
+
+            prev_data = outcome.data;
+            data = vec![];
+        }
+    }
+
+    #[allow(clippy::too_many_arguments)]
+    pub async fn call_single<'this>(
+        &'this mut self,
+        air: impl Into<String>,
+        prev_data: impl Into<Vec<u8>>,
+        data: impl Into<Vec<u8>>,
+        init_peer_id: impl Into<String>,
+        timestamp: u64,
+        ttl: u32,
+        override_current_peer_id: Option<String>,
+        call_results: avm_server::CallResults,
+        particle_id: impl Into<String>,
+    ) -> Result<RawAVMOutcome, Box<dyn std::error::Error + 'this>> {
+        self.runner
+            .call(
+                air,
+                prev_data,
+                data,
+                init_peer_id,
+                timestamp,
+                ttl,
+                override_current_peer_id,
+                call_results,
+                &self.keypair,
+                particle_id.into(),
+            )
+            .await
+    }
+}
+
+pub async fn create_avm(
+    call_service: CallServiceClosure<'static>,
+    current_peer_id: impl Into<String>,
+) -> TestRunner {
+    create_custom_avm(call_service, current_peer_id).await
+}
+
+pub async fn create_custom_avm<R: AirRunner>(
+    call_service: CallServiceClosure<'static>,
+    current_peer_id: impl Into<String>,
+) -> TestRunner<R> {
+    let current_peer_id = current_peer_id.into();
+    let (keypair, _) = derive_dummy_keypair(&current_peer_id);
+    let runner = R::new(current_peer_id, <_>::default()).await;
+
+    TestRunner {
+        runner,
+        call_service,
+        keypair: keypair.into_inner(),
+    }
+}
+
+pub async fn create_avm_with_key<R: AirRunner>(
+    keypair: impl Into<KeyPair>,
+    call_service: CallServiceClosure<'static>,
+    test_init_parameters: TestInitParameters,
+) -> TestRunner<R> {
+    let keypair = keypair.into();
+    let current_peer_id = keypair.public().to_peer_id().to_string();
+    let runner = R::new(current_peer_id, test_init_parameters).await;
+
+    TestRunner {
+        runner,
+        call_service,
+        keypair,
+    }
+}
+
+impl TestRunParameters {
+    pub fn new(
+        init_peer_id: impl Into<String>,
+        timestamp: u64,
+        ttl: u32,
+        particle_id: impl Into<String>,
+    ) -> Self {
+        Self {
+            init_peer_id: init_peer_id.into(),
+            timestamp,
+            ttl,
+            override_current_peer_id: None,
+            particle_id: particle_id.into(),
+        }
+    }
+
+    pub fn from_init_peer_id(init_peer_id: impl Into<String>) -> Self {
+        Self {
+            init_peer_id: init_peer_id.into(),
+            ..<_>::default()
+        }
+    }
+
+    pub fn from_timestamp(timestamp: u64) -> Self {
+        Self {
+            timestamp,
+            ..<_>::default()
+        }
+    }
+
+    pub fn from_ttl(ttl: u32) -> Self {
+        Self {
+            ttl,
+            ..<_>::default()
+        }
+    }
+
+    pub fn with_particle_id(mut self, particle_id: impl Into<String>) -> Self {
+        self.particle_id = particle_id.into();
+        self
+    }
+}
+
+impl TestInitParameters {
+    pub fn new(
+        air_size_limit: u64,
+        particle_size_limit: u64,
+        call_result_size_limit: u64,
+        hard_limit_enabled: bool,
+    ) -> Self {
+        Self {
+            air_size_limit: Some(air_size_limit),
+            particle_size_limit: Some(particle_size_limit),
+            call_result_size_limit: Some(call_result_size_limit),
+            hard_limit_enabled,
+        }
+    }
+
+    pub fn no_limits() -> Self {
+        Self {
+            air_size_limit: Some(u64::MAX),
+            particle_size_limit: Some(u64::MAX),
+            call_result_size_limit: Some(u64::MAX),
+            hard_limit_enabled: false,
+        }
+    }
+}
+
+impl From<TestInitParameters> for AVMRuntimeLimits {
+    fn from(value: TestInitParameters) -> Self {
+        AVMRuntimeLimits::new(
+            value.air_size_limit,
+            value.particle_size_limit,
+            value.call_result_size_limit,
+            value.hard_limit_enabled,
+        )
+    }
+}
+
+impl From<TestInitParameters> for AquaVMRuntimeLimits {
+    fn from(value: TestInitParameters) -> Self {
+        use air_interpreter_interface::MAX_AIR_SIZE;
+        use air_interpreter_interface::MAX_CALL_RESULT_SIZE;
+        use air_interpreter_interface::MAX_PARTICLE_SIZE;
+        let air_size_limit = value.air_size_limit.unwrap_or(MAX_AIR_SIZE);
+        let particle_size_limit: u64 = value.particle_size_limit.unwrap_or(MAX_PARTICLE_SIZE);
+        let call_result_size_limit = value.call_result_size_limit.unwrap_or(MAX_CALL_RESULT_SIZE);
+
+        AquaVMRuntimeLimits::new(
+            air_size_limit,
+            particle_size_limit,
+            call_result_size_limit,
+            value.hard_limit_enabled,
+        )
+    }
+}
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+    use crate::call_services::{set_variables_call_service, VariableOptionSource};
+
+    use avm_interface::CallRequestParams;
+    use serde_json::json;
+
+    #[tokio::test]
+    async fn test_override_current_peer_id() {
+        let spell_id = "spell_id";
+        let host_peer_id = "host_peer_id";
+        let script = format!(r#"(call "{spell_id}" ("service" "func") [])"#);
+
+        let variables = maplit::hashmap! {
+            "func".to_owned() => json!("success"),
+        };
+
+        let key_format = fluence_keypair::KeyFormat::Ed25519;
+        let keypair = KeyPair::generate(key_format);
+        let keypair2 = KeyPair::generate(key_format);
+
+        let mut client = create_custom_avm::<NativeAirRunner>(
+            set_variables_call_service(variables, VariableOptionSource::FunctionName),
+            host_peer_id,
+        )
+        .await;
+
+        let current_result_1 = client
+            .runner
+            .call(
+                &script,
+                "",
+                "",
+                spell_id,
+                0,
+                0,
+                None,
+                HashMap::new(),
+                &keypair,
+                "".to_owned(),
+            )
+            .await
+            .expect("call should be success");
+
+        assert_eq!(
+            current_result_1.ret_code, 0,
+            "{:?}",
+            current_result_1.error_message
+        );
+
+        let expected_current_call_requests = HashMap::new();
+        let expected_current_next_peers_pks = vec![spell_id.to_owned()];
+
+        assert_eq!(
+            current_result_1.call_requests,
+            expected_current_call_requests
+        );
+        assert_eq!(
+            current_result_1.next_peer_pks,
+            expected_current_next_peers_pks
+        );
+
+        let spell_result_1 = client
+            .runner
+            .call(
+                script,
+                "",
+                "",
+                spell_id,
+                0,
+                0,
+                Some(spell_id.to_owned()),
+                HashMap::new(),
+                &keypair2,
+                "".to_owned(),
+            )
+            .await
+            .expect("call should be success");
+
+        let expected_spell_call_requests = maplit::hashmap! {
+            1 => CallRequestParams::new("service", "func", vec![], vec![]),
+        };
+        let expected_spell_next_peers_pks = Vec::<String>::new();
+
+        assert_eq!(spell_result_1.call_requests, expected_spell_call_requests);
+        assert_eq!(spell_result_1.next_peer_pks, expected_spell_next_peers_pks);
+    }
+}
+
\ No newline at end of file diff --git a/src/air_test_utils/wasm_test_runner.rs.html b/src/air_test_utils/wasm_test_runner.rs.html new file mode 100644 index 00000000..a66756fb --- /dev/null +++ b/src/air_test_utils/wasm_test_runner.rs.html @@ -0,0 +1,453 @@ +wasm_test_runner.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use crate::prelude::TestInitParameters;
+use crate::test_runner::AirRunner;
+
+use avm_server::avm_runner::*;
+
+use fluence_keypair::KeyPair;
+use futures::future::LocalBoxFuture;
+use futures::FutureExt;
+use marine_wasmtime_backend::WasmtimeConfig;
+use marine_wasmtime_backend::WasmtimeWasmBackend;
+use object_pool::Reusable;
+use once_cell::sync::OnceCell;
+
+use std::path::PathBuf;
+
+// 100 Mb
+const AVM_MAX_HEAP_SIZE: u64 = 100 * 1024 * 1024;
+const AIR_WASM_PATH: &str = "../target/wasm32-wasi/debug/air_interpreter_server.wasm";
+const RELEASE_AIR_WASM_PATH: &str = "../target/wasm32-wasi/release/air_interpreter_server.wasm";
+
+pub struct WasmAirRunner {
+    current_peer_id: String,
+    runner: Reusable<'static, AVMRunner<WasmtimeWasmBackend>>,
+}
+
+fn create_wasm_backend() -> WasmtimeWasmBackend {
+    let mut config = WasmtimeConfig::default();
+    config
+        .debug_info(true)
+        .epoch_interruption(false)
+        .wasm_backtrace(true);
+
+    WasmtimeWasmBackend::new(config).unwrap()
+}
+
+async fn make_pooled_avm_runner(
+    test_init_parameters: TestInitParameters,
+) -> AVMRunner<WasmtimeWasmBackend> {
+    let logging_mask = i32::MAX;
+    let wasm_backend = create_wasm_backend();
+    AVMRunner::new(
+        PathBuf::from(AIR_WASM_PATH),
+        Some(AVM_MAX_HEAP_SIZE),
+        test_init_parameters.into(),
+        logging_mask,
+        wasm_backend,
+    )
+    .await
+    .expect("vm should be created")
+}
+
+impl AirRunner for WasmAirRunner {
+    fn new(
+        current_peer_id: impl Into<String>,
+        test_init_parameters: TestInitParameters,
+    ) -> LocalBoxFuture<'static, Self> {
+        let current_peer_id = current_peer_id.into();
+        async move {
+            static POOL_CELL: OnceCell<object_pool::Pool<AVMRunner<WasmtimeWasmBackend>>> =
+                OnceCell::new();
+            let pool = POOL_CELL.get_or_init(|| {
+                object_pool::Pool::new(
+                    // we create an empty pool and let it fill on demand
+                    0,
+                    || unreachable!(),
+                )
+            });
+
+            let runner = match pool.try_pull() {
+                Some(runner) => runner,
+                None => Reusable::new(pool, make_pooled_avm_runner(test_init_parameters).await),
+            };
+
+            Self {
+                current_peer_id: current_peer_id.into(),
+                runner,
+            }
+        }
+        .boxed_local()
+    }
+
+    fn call<'this>(
+        &'this mut self,
+        air: impl Into<String>,
+        prev_data: impl Into<Vec<u8>>,
+        data: impl Into<Vec<u8>>,
+        init_peer_id: impl Into<String>,
+        timestamp: u64,
+        ttl: u32,
+        override_current_peer_id: Option<String>,
+        call_results: avm_server::CallResults,
+        keypair: &KeyPair,
+        particle_id: String,
+    ) -> LocalBoxFuture<'this, Result<RawAVMOutcome, Box<dyn std::error::Error + 'this>>> {
+        let air = air.into();
+        let prev_data = prev_data.into();
+        let data = data.into();
+        let init_peer_id = init_peer_id.into();
+        let keypair = keypair.clone();
+        async move {
+            let current_peer_id =
+                override_current_peer_id.unwrap_or_else(|| self.current_peer_id.clone());
+
+            Ok(self
+                .runner
+                .call(
+                    air,
+                    prev_data,
+                    data,
+                    init_peer_id,
+                    timestamp,
+                    ttl,
+                    current_peer_id,
+                    call_results,
+                    &keypair,
+                    particle_id,
+                )
+                .await?)
+        }
+        .boxed_local()
+    }
+
+    fn get_current_peer_id(&self) -> &str {
+        &self.current_peer_id
+    }
+}
+
+/// WASM runner that runs release build form benchmarking.
+pub struct ReleaseWasmAirRunner {
+    current_peer_id: String,
+    // these instances are not cached, as benches create relatively small number of instances
+    runner: AVMRunner<WasmtimeWasmBackend>,
+}
+
+impl AirRunner for ReleaseWasmAirRunner {
+    fn new(
+        current_peer_id: impl Into<String>,
+        test_init_parameters: TestInitParameters,
+    ) -> LocalBoxFuture<'static, Self> {
+        let current_peer_id = current_peer_id.into();
+        async move {
+            let logging_mask = i32::MAX;
+
+            let wasm_backend = create_wasm_backend();
+            let runner = AVMRunner::new(
+                PathBuf::from(RELEASE_AIR_WASM_PATH),
+                Some(AVM_MAX_HEAP_SIZE),
+                test_init_parameters.into(),
+                logging_mask,
+                wasm_backend,
+            )
+            .await
+            .expect("vm should be created");
+
+            Self {
+                current_peer_id: current_peer_id.into(),
+                runner,
+            }
+        }
+        .boxed_local()
+    }
+
+    fn call<'this>(
+        &'this mut self,
+        air: impl Into<String>,
+        prev_data: impl Into<Vec<u8>>,
+        data: impl Into<Vec<u8>>,
+        init_peer_id: impl Into<String>,
+        timestamp: u64,
+        ttl: u32,
+        override_current_peer_id: Option<String>,
+        call_results: avm_server::CallResults,
+        keypair: &KeyPair,
+        particle_id: String,
+    ) -> LocalBoxFuture<'this, Result<RawAVMOutcome, Box<dyn std::error::Error + 'this>>> {
+        let air = air.into();
+        let prev_data = prev_data.into();
+        let data = data.into();
+        let init_peer_id = init_peer_id.into();
+        let keypair = keypair.clone();
+        async move {
+            let current_peer_id =
+                override_current_peer_id.unwrap_or_else(|| self.current_peer_id.clone());
+
+            Ok(self
+                .runner
+                .call(
+                    air,
+                    prev_data,
+                    data,
+                    init_peer_id,
+                    timestamp,
+                    ttl,
+                    current_peer_id,
+                    call_results,
+                    &keypair,
+                    particle_id,
+                )
+                .await?)
+        }
+        .boxed_local()
+    }
+
+    fn get_current_peer_id(&self) -> &str {
+        &self.current_peer_id
+    }
+}
+
\ No newline at end of file diff --git a/src/air_trace_handler/data_keeper/errors.rs.html b/src/air_trace_handler/data_keeper/errors.rs.html new file mode 100644 index 00000000..0c9094e5 --- /dev/null +++ b/src/air_trace_handler/data_keeper/errors.rs.html @@ -0,0 +1,121 @@ +errors.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::ExecutedState;
+use crate::TracePos;
+use air_interpreter_data::TraceLen;
+use thiserror::Error as ThisError;
+
+/// Errors arose out while accessing various interpreter data.
+#[derive(ThisError, Debug, PartialEq, Eq)]
+pub enum KeeperError {
+    /// Errors occurred when trace_len - trace_position < requested_subtrace_len.
+    #[error(
+        "executed trace has {trace_len} elements and current position is {trace_position}, \
+        but tried to set {requested_subtrace_len} subtrace_len"
+    )]
+    SetSubtraceLenFailed {
+        requested_subtrace_len: TraceLen,
+        trace_position: TracePos,
+        trace_len: TraceLen,
+    },
+
+    /// Errors occurred when
+    ///     requested_subtrace_len != 0 && requested_pos + requested_subtrace_len > trace_len.
+    #[error(
+        "executed trace has {trace_len} elements, \
+        but tried to set {requested_subtrace_len} subtrace_len and {requested_pos} position"
+    )]
+    SetSubtraceLenAndPosFailed {
+        requested_pos: TracePos,
+        requested_subtrace_len: TraceLen,
+        trace_len: TraceLen,
+    },
+
+    /// Errors occurred when Fold FSM tries to obtain stream generation by value_pos from a trace,
+    /// but this value_pos is bigger than the trace length.
+    #[error("requested an element at position '{position}', but executed trace contains only '{trace_len}' elements")]
+    NoElementAtPosition { position: TracePos, trace_len: TraceLen },
+
+    /// Errors occurred when Fold FSM tries to obtain stream generation by value_pos from a trace,
+    /// but such state doesn't belong to values in streams (it doesn't contain a generation).
+    #[error("expected a state of CallResult(Value::Stream) or Ap types but '{state}' obtained")]
+    NoStreamState { state: ExecutedState },
+}
+
\ No newline at end of file diff --git a/src/air_trace_handler/data_keeper/keeper.rs.html b/src/air_trace_handler/data_keeper/keeper.rs.html new file mode 100644 index 00000000..acdeb774 --- /dev/null +++ b/src/air_trace_handler/data_keeper/keeper.rs.html @@ -0,0 +1,149 @@ +keeper.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::ExecutionTrace;
+use super::MergeCtx;
+use super::TraceSlider;
+use crate::TracePos;
+
+use bimap::BiHashMap;
+
+/// Keeps all necessary data for merging.
+#[derive(Debug, Default, PartialEq)]
+pub(crate) struct DataKeeper {
+    pub(crate) prev_ctx: MergeCtx,
+    pub(crate) current_ctx: MergeCtx,
+    pub(crate) new_to_prev_pos: BiHashMap<TracePos, TracePos>,
+    pub(crate) new_to_current_pos: BiHashMap<TracePos, TracePos>,
+    pub(crate) result_trace: ExecutionTrace,
+}
+
+impl DataKeeper {
+    pub(crate) fn from_trace(prev_trace: ExecutionTrace, current_trace: ExecutionTrace) -> Self {
+        let prev_ctx = MergeCtx::from_trace(prev_trace);
+        let current_ctx = MergeCtx::from_trace(current_trace);
+
+        Self {
+            prev_ctx,
+            current_ctx,
+            new_to_prev_pos: <_>::default(),
+            new_to_current_pos: <_>::default(),
+            result_trace: <_>::default(),
+        }
+    }
+
+    pub(crate) fn result_states_count(&self) -> usize {
+        self.result_trace.len()
+    }
+
+    pub(crate) fn result_trace_next_pos(&self) -> TracePos {
+        self.result_trace.trace_states_count().into()
+    }
+
+    pub(crate) fn prev_slider(&self) -> &TraceSlider {
+        &self.prev_ctx.slider
+    }
+
+    pub(crate) fn prev_slider_mut(&mut self) -> &mut TraceSlider {
+        &mut self.prev_ctx.slider
+    }
+
+    pub(crate) fn current_slider(&self) -> &TraceSlider {
+        &self.current_ctx.slider
+    }
+
+    pub(crate) fn current_slider_mut(&mut self) -> &mut TraceSlider {
+        &mut self.current_ctx.slider
+    }
+}
+
\ No newline at end of file diff --git a/src/air_trace_handler/data_keeper/merge_ctx.rs.html b/src/air_trace_handler/data_keeper/merge_ctx.rs.html new file mode 100644 index 00000000..68234171 --- /dev/null +++ b/src/air_trace_handler/data_keeper/merge_ctx.rs.html @@ -0,0 +1,123 @@ +merge_ctx.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use air_interpreter_data::GenerationIdx;
+
+use super::ExecutionTrace;
+use super::KeeperError;
+use super::KeeperResult;
+use super::TraceSlider;
+use crate::TracePos;
+
+/// Contains all necessary information about data.
+#[derive(Debug, Default, PartialEq, Eq)]
+pub struct MergeCtx {
+    pub slider: TraceSlider,
+}
+
+impl MergeCtx {
+    pub(crate) fn from_trace(trace: ExecutionTrace) -> Self {
+        let slider = TraceSlider::new(trace);
+
+        Self { slider }
+    }
+
+    pub(crate) fn try_get_generation(&self, position: TracePos) -> KeeperResult<GenerationIdx> {
+        use air_interpreter_data::*;
+
+        let state = self
+            .slider
+            .state_at_position(position)
+            .ok_or_else(|| KeeperError::NoElementAtPosition {
+                position,
+                trace_len: self.slider.trace_len(),
+            })?;
+
+        match state {
+            ExecutedState::Call(CallResult::Executed(ValueRef::Stream { generation, .. })) => Ok(*generation),
+            // such Aps are always preceded by Fold where corresponding stream could be used
+            // so it's been already checked that res_generation is well-formed
+            // and accessing 0th element is safe here
+            ExecutedState::Ap(ap_result) => Ok(ap_result.res_generations[0]),
+            state => Err(KeeperError::NoStreamState { state: state.clone() }),
+        }
+    }
+}
+
\ No newline at end of file diff --git a/src/air_trace_handler/data_keeper/mod.rs.html b/src/air_trace_handler/data_keeper/mod.rs.html new file mode 100644 index 00000000..d3a1e0a6 --- /dev/null +++ b/src/air_trace_handler/data_keeper/mod.rs.html @@ -0,0 +1,69 @@ +mod.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+mod errors;
+mod keeper;
+mod merge_ctx;
+mod trace_slider;
+
+pub use errors::KeeperError;
+pub use merge_ctx::MergeCtx;
+pub use trace_slider::TraceSlider;
+
+pub(crate) use keeper::DataKeeper;
+
+type KeeperResult<T> = std::result::Result<T, KeeperError>;
+
+use super::ExecutedState;
+use super::ExecutionTrace;
+
\ No newline at end of file diff --git a/src/air_trace_handler/data_keeper/trace_slider.rs.html b/src/air_trace_handler/data_keeper/trace_slider.rs.html new file mode 100644 index 00000000..a37cc05b --- /dev/null +++ b/src/air_trace_handler/data_keeper/trace_slider.rs.html @@ -0,0 +1,249 @@ +trace_slider.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use air_interpreter_data::TraceLen;
+
+use super::ExecutedState;
+use super::ExecutionTrace;
+use super::KeeperError::*;
+use super::KeeperResult;
+use crate::TracePos;
+
+type SeenElements = u32;
+
+/// This slider is intended to slide on a subtrace inside provided trace. This subtrace
+/// is identified by position and len.
+// TODO: check for overflow
+#[derive(Debug, Default, Clone, PartialEq, Eq)]
+pub struct TraceSlider {
+    /// Trace that slider slide on.
+    trace: ExecutionTrace,
+
+    /// Position of current subtrace inside trace.
+    position: TracePos,
+
+    /// Length of a current subtrace.
+    subtrace_len: TraceLen,
+
+    /// Count of seen elements since the last position update.
+    seen_elements: SeenElements,
+}
+
+impl TraceSlider {
+    pub(crate) fn new(trace: impl Into<ExecutionTrace>) -> Self {
+        let trace = trace.into();
+        let subtrace_len = trace.trace_states_count();
+
+        Self {
+            trace,
+            subtrace_len,
+            ..<_>::default()
+        }
+    }
+
+    /// Returns the next state if current interval length hasn't been reached
+    /// and None otherwise.
+    #[allow(clippy::suspicious_operation_groupings)]
+    pub(crate) fn next_state(&mut self) -> Option<ExecutedState> {
+        if self.seen_elements >= self.subtrace_len || self.position >= self.trace.trace_states_count().into() {
+            return None;
+        }
+
+        let result = self.trace[self.position].clone();
+        self.position += 1;
+        self.seen_elements += 1;
+        Some(result)
+    }
+
+    pub(crate) fn set_position_and_len(&mut self, position: TracePos, subtrace_len: TraceLen) -> KeeperResult<()> {
+        // it's possible to set empty subtrace_len and inconsistent position
+        if subtrace_len != 0 && position + subtrace_len > self.trace.trace_states_count().into() {
+            return Err(SetSubtraceLenAndPosFailed {
+                requested_pos: position,
+                requested_subtrace_len: subtrace_len,
+                trace_len: self.trace.trace_states_count(),
+            });
+        }
+
+        self.position = position;
+        self.subtrace_len = subtrace_len;
+        self.seen_elements = 0;
+
+        Ok(())
+    }
+
+    pub(crate) fn set_subtrace_len(&mut self, subtrace_len: TraceLen) -> KeeperResult<()> {
+        let trace_remainder: TraceLen = (TracePos::from(self.trace_len()) - self.position).into();
+        if trace_remainder < subtrace_len {
+            return Err(SetSubtraceLenFailed {
+                requested_subtrace_len: subtrace_len,
+                trace_position: self.position,
+                trace_len: self.trace.trace_states_count(),
+            });
+        }
+
+        self.seen_elements = 0;
+        self.subtrace_len = subtrace_len;
+
+        Ok(())
+    }
+
+    pub(crate) fn position(&self) -> TracePos {
+        self.position
+    }
+
+    pub(crate) fn subtrace_len(&self) -> TraceLen {
+        debug_assert!(self.subtrace_len >= self.seen_elements);
+        self.subtrace_len - self.seen_elements
+    }
+
+    pub(crate) fn state_at_position(&self, position: TracePos) -> Option<&ExecutedState> {
+        // it would be nice to have the `impl SliceIndex for TracePos`, but it is unstable
+        self.trace.get(position)
+    }
+
+    pub(super) fn trace_len(&self) -> TraceLen {
+        self.trace.trace_states_count()
+    }
+}
+
\ No newline at end of file diff --git a/src/air_trace_handler/errors.rs.html b/src/air_trace_handler/errors.rs.html new file mode 100644 index 00000000..808d80ca --- /dev/null +++ b/src/air_trace_handler/errors.rs.html @@ -0,0 +1,143 @@ +errors.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::data_keeper::KeeperError;
+use super::merger::MergeError;
+use super::state_automata::StateFSMError;
+
+use air_interpreter_data::ExecutedState;
+use air_interpreter_data::TracePos;
+use thiserror::Error as ThisError;
+
+use std::num::TryFromIntError;
+
+/// Errors arose out of merging previous data with a new.
+#[derive(ThisError, Debug)]
+#[allow(clippy::enum_variant_names)]
+pub enum TraceHandlerError {
+    #[error(transparent)]
+    KeeperError(#[from] KeeperError),
+
+    #[error(transparent)]
+    MergeError(#[from] MergeError),
+
+    #[error(transparent)]
+    StateFSMError(#[from] StateFSMError),
+}
+
+#[derive(ThisError, Debug)]
+#[allow(clippy::enum_variant_names)]
+pub enum GenerationCompactificationError {
+    #[error("trying to change generation of an invalid trace position {0}")]
+    TracePosPointsToNowhere(TracePos),
+
+    #[error(
+        "trying to change generation of a state {state} on {position} position, the state doesn't contain generation"
+    )]
+    TracePosPointsToInvalidState { position: TracePos, state: ExecutedState },
+}
+
+impl GenerationCompactificationError {
+    pub fn points_to_nowhere(position: TracePos) -> Self {
+        GenerationCompactificationError::TracePosPointsToNowhere(position)
+    }
+
+    pub fn points_to_invalid_state(position: TracePos, state: ExecutedState) -> Self {
+        GenerationCompactificationError::TracePosPointsToInvalidState { position, state }
+    }
+}
+
+#[derive(ThisError, Debug)]
+#[allow(clippy::enum_variant_names)]
+pub enum IntConversionError {
+    #[error("trying to cast integer types, there is an error {0:?}")]
+    TryIntoTracePosError(TryFromIntError),
+}
+
\ No newline at end of file diff --git a/src/air_trace_handler/handler.rs.html b/src/air_trace_handler/handler.rs.html new file mode 100644 index 00000000..4d9a505e --- /dev/null +++ b/src/air_trace_handler/handler.rs.html @@ -0,0 +1,403 @@ +handler.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::*;
+use merger::*;
+
+use std::convert::TryInto;
+
+#[derive(Debug, Default)]
+pub struct TraceHandler {
+    data_keeper: DataKeeper,
+    fsm_keeper: FSMKeeper,
+}
+
+impl TraceHandler {
+    pub fn from_trace(prev_trace: ExecutionTrace, current_trace: ExecutionTrace) -> Self {
+        let data_keeper = DataKeeper::from_trace(prev_trace, current_trace);
+
+        Self {
+            data_keeper,
+            fsm_keeper: <_>::default(),
+        }
+    }
+
+    /// Returns size of elements inside result trace and intended to provide
+    /// a position of next inserted elements.
+    pub fn trace_pos(&self) -> Result<TracePos, IntConversionError> {
+        self.data_keeper
+            .result_trace
+            .len()
+            .try_into()
+            .map_err(IntConversionError::TryIntoTracePosError)
+    }
+
+    pub fn into_result_trace(self) -> ExecutionTrace {
+        self.data_keeper.result_trace
+    }
+
+    pub fn as_result_trace(&self) -> &ExecutionTrace {
+        &self.data_keeper.result_trace
+    }
+
+    pub fn subgraph_sizes(&self) -> (TraceLen, TraceLen) {
+        let prev_len = self.data_keeper.prev_slider().subtrace_len();
+        let current_len = self.data_keeper.current_slider().subtrace_len();
+
+        (prev_len, current_len)
+    }
+
+    pub fn update_generation(
+        &mut self,
+        trace_pos: TracePos,
+        generation: GenerationIdx,
+    ) -> Result<(), GenerationCompactificationError> {
+        let state = self
+            .data_keeper
+            .result_trace
+            .get_mut(trace_pos)
+            .ok_or_else(|| GenerationCompactificationError::points_to_nowhere(trace_pos))?;
+
+        match state {
+            ExecutedState::Ap(ap_result) => ap_result.res_generations = vec![generation],
+            ExecutedState::Call(CallResult::Executed(ValueRef::Stream {
+                generation: call_generation,
+                ..
+            })) => *call_generation = generation,
+            state => {
+                return Err(GenerationCompactificationError::points_to_invalid_state(
+                    trace_pos,
+                    state.clone(),
+                ))
+            }
+        }
+
+        Ok(())
+    }
+}
+
+impl TraceHandler {
+    /// Should be called at the beginning of a call execution.
+    pub fn meet_call_start(&mut self) -> TraceHandlerResult<MergerCallResult> {
+        try_merge_next_state_as_call(&mut self.data_keeper).map_err(Into::into)
+    }
+
+    /// Should be called when a call instruction was executed successfully. It adds the supplied
+    /// state to the result trace.
+    pub fn meet_call_end(&mut self, call_result: CallResult) {
+        log::trace!(
+            target: air_log_targets::EXECUTED_STATE_CHANGING,
+            "  adding new call executed state {:?}",
+            call_result
+        );
+        self.data_keeper.result_trace.push(ExecutedState::Call(call_result));
+    }
+}
+
+impl TraceHandler {
+    pub fn meet_ap_start(&mut self) -> TraceHandlerResult<MergerApResult> {
+        try_merge_next_state_as_ap(&mut self.data_keeper).map_err(Into::into)
+    }
+
+    pub fn meet_ap_end(&mut self, ap_result: ApResult) {
+        self.data_keeper.result_trace.push(ExecutedState::Ap(ap_result));
+    }
+}
+
+impl TraceHandler {
+    pub fn meet_canon_start(&mut self) -> TraceHandlerResult<MergerCanonResult> {
+        try_merge_next_state_as_canon(&mut self.data_keeper).map_err(Into::into)
+    }
+
+    pub fn meet_canon_end(&mut self, canon_result: CanonResult) {
+        self.data_keeper.result_trace.push(ExecutedState::Canon(canon_result));
+    }
+}
+
+impl TraceHandler {
+    pub fn meet_par_start(&mut self) -> TraceHandlerResult<()> {
+        let ingredients = merger::try_merge_next_state_as_par(&mut self.data_keeper)?;
+        let par_fsm = ParFSM::from_left_started(ingredients, &mut self.data_keeper)?;
+        self.fsm_keeper.push_par(par_fsm);
+
+        Ok(())
+    }
+
+    pub fn meet_par_subgraph_end(&mut self, subgraph_type: SubgraphType) -> TraceHandlerResult<()> {
+        match subgraph_type {
+            SubgraphType::Left => {
+                let par_fsm = self.fsm_keeper.last_par()?;
+                par_fsm.left_completed(&mut self.data_keeper);
+            }
+            SubgraphType::Right => {
+                let par_fsm = self.fsm_keeper.pop_par()?;
+                par_fsm.right_completed(&mut self.data_keeper);
+            }
+        }
+
+        Ok(())
+    }
+}
+
+impl TraceHandler {
+    pub fn meet_fold_start(&mut self, fold_id: u32) -> TraceHandlerResult<()> {
+        let ingredients = try_merge_next_state_as_fold(&mut self.data_keeper)?;
+        let fold_fsm = FoldFSM::from_fold_start(ingredients, &mut self.data_keeper)?;
+        self.fsm_keeper.add_fold(fold_id, fold_fsm);
+
+        Ok(())
+    }
+
+    pub fn meet_iteration_start(&mut self, fold_id: u32, value_pos: TracePos) -> TraceHandlerResult<()> {
+        let fold_fsm = self.fsm_keeper.fold_mut(fold_id)?;
+        fold_fsm.meet_iteration_start(value_pos, &mut self.data_keeper)?;
+
+        Ok(())
+    }
+
+    pub fn meet_iteration_end(&mut self, fold_id: u32) -> TraceHandlerResult<()> {
+        let fold_fsm = self.fsm_keeper.fold_mut(fold_id)?;
+        fold_fsm.meet_iteration_end(&self.data_keeper);
+
+        Ok(())
+    }
+
+    pub fn meet_back_iterator(&mut self, fold_id: u32) -> TraceHandlerResult<()> {
+        let fold_fsm = self.fsm_keeper.fold_mut(fold_id)?;
+        fold_fsm.meet_back_iterator(&mut self.data_keeper)?;
+
+        Ok(())
+    }
+
+    pub fn meet_generation_end(&mut self, fold_id: u32) -> TraceHandlerResult<()> {
+        let fold_fsm = self.fsm_keeper.fold_mut(fold_id)?;
+        fold_fsm.meet_generation_end(&self.data_keeper);
+
+        Ok(())
+    }
+
+    pub fn meet_fold_end(&mut self, fold_id: u32) -> TraceHandlerResult<()> {
+        let fold_fsm = self.fsm_keeper.extract_fold(fold_id)?;
+        fold_fsm.meet_fold_end(&mut self.data_keeper);
+
+        Ok(())
+    }
+}
+
\ No newline at end of file diff --git a/src/air_trace_handler/lib.rs.html b/src/air_trace_handler/lib.rs.html new file mode 100644 index 00000000..6625ccb7 --- /dev/null +++ b/src/air_trace_handler/lib.rs.html @@ -0,0 +1,117 @@ +lib.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#![forbid(unsafe_code)]
+#![warn(rust_2018_idioms)]
+#![deny(
+    dead_code,
+    nonstandard_style,
+    unused_imports,
+    unused_mut,
+    unused_variables,
+    unused_unsafe,
+    unreachable_patterns
+)]
+
+mod data_keeper;
+mod errors;
+mod handler;
+pub mod merger;
+mod state_automata;
+
+pub use data_keeper::KeeperError;
+pub use errors::GenerationCompactificationError;
+pub use errors::IntConversionError;
+pub use errors::TraceHandlerError;
+pub use handler::TraceHandler;
+pub use merger::DataType;
+pub use merger::MergeError;
+pub use state_automata::StateFSMError;
+pub use state_automata::SubgraphType;
+
+pub type TraceHandlerResult<T> = std::result::Result<T, TraceHandlerError>;
+
+use air_interpreter_data::*;
+use data_keeper::DataKeeper;
+use data_keeper::MergeCtx;
+use merger::MergerFoldResult;
+use merger::ResolvedFold;
+use merger::ResolvedSubTraceDescs;
+use state_automata::FSMKeeper;
+use state_automata::FoldFSM;
+use state_automata::ParFSM;
+
\ No newline at end of file diff --git a/src/air_trace_handler/merger/ap_merger.rs.html b/src/air_trace_handler/merger/ap_merger.rs.html new file mode 100644 index 00000000..35c63860 --- /dev/null +++ b/src/air_trace_handler/merger/ap_merger.rs.html @@ -0,0 +1,191 @@ +ap_merger.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::*;
+
+const EXPECTED_STATE_NAME: &str = "ap";
+
+#[derive(Debug, Clone)]
+pub enum MergerApResult {
+    /// There is no corresponding state in a trace for this call.
+    NotMet,
+
+    /// There was a state in at least one of the contexts. If there were two states in
+    /// both contexts, they were successfully merged.
+    Met(MetApResult),
+}
+
+#[derive(Debug, Clone)]
+pub struct MetApResult {
+    pub generation: GenerationIdx,
+    pub value_source: ValueSource,
+}
+
+pub(crate) fn try_merge_next_state_as_ap(data_keeper: &mut DataKeeper) -> MergeResult<MergerApResult> {
+    use ExecutedState::Ap;
+    use PreparationScheme::*;
+
+    let prev_state = data_keeper.prev_slider_mut().next_state();
+    let current_state = data_keeper.current_slider_mut().next_state();
+
+    match (prev_state, current_state) {
+        (Some(Ap(prev_ap)), Some(Ap(_))) => prepare_merge_result(prev_ap, Both, data_keeper),
+        (Some(Ap(prev_ap)), None) => prepare_merge_result(prev_ap, Previous, data_keeper),
+        // check that current state is Ap, but it's impossible to use it, because prev_data
+        // could not have streams with such generations
+        (None, Some(Ap(current_ap))) => prepare_merge_result(current_ap, Current, data_keeper),
+        (None, None) => Ok(MergerApResult::NotMet),
+        (prev_state, current_state) => Err(MergeError::incompatible_states(
+            prev_state,
+            current_state,
+            EXPECTED_STATE_NAME,
+        )),
+    }
+}
+
+macro_rules! to_maybe_generation {
+    ($ap_result:ident, $generations:expr, $error_ty:ident) => {
+        match $generations.len() {
+            1 => $generations[0],
+            _ => {
+                let ap_error = super::ApResultError::$error_ty($ap_result);
+                return Err(super::MergeError::IncorrectApResult(ap_error));
+            }
+        }
+    };
+}
+
+fn prepare_merge_result(
+    ap_result: ApResult,
+    scheme: PreparationScheme,
+    data_keeper: &mut DataKeeper,
+) -> MergeResult<MergerApResult> {
+    prepare_positions_mapping(scheme, data_keeper);
+
+    let generation = to_maybe_generation!(ap_result, &ap_result.res_generations, InvalidDstGenerations);
+    let met_result = MetApResult::new(generation, scheme.into());
+    let ap_result = MergerApResult::Met(met_result);
+
+    Ok(ap_result)
+}
+
+impl MetApResult {
+    pub(crate) fn new(generation: GenerationIdx, value_source: ValueSource) -> Self {
+        Self {
+            generation,
+            value_source,
+        }
+    }
+}
+
\ No newline at end of file diff --git a/src/air_trace_handler/merger/call_merger.rs.html b/src/air_trace_handler/merger/call_merger.rs.html new file mode 100644 index 00000000..75688062 --- /dev/null +++ b/src/air_trace_handler/merger/call_merger.rs.html @@ -0,0 +1,241 @@ +call_merger.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+mod utils;
+
+use super::*;
+use crate::TracePos;
+use utils::*;
+
+const EXPECTED_STATE_NAME: &str = "call";
+
+#[derive(Debug, Clone)]
+pub enum MergerCallResult {
+    /// There is no corresponding state in a trace for this call.
+    NotMet,
+
+    /// There was a state in at least one of the contexts. If there were two states in
+    /// both contexts, they were successfully merged.
+    Met(MetCallResult),
+}
+
+#[derive(Debug, Clone)]
+pub struct MetCallResult {
+    pub result: CallResult,
+    pub trace_pos: TracePos,
+    pub source: ValueSource,
+}
+
+pub(crate) fn try_merge_next_state_as_call(data_keeper: &mut DataKeeper) -> MergeResult<MergerCallResult> {
+    use ExecutedState::Call;
+    use PreparationScheme::*;
+
+    let prev_state = data_keeper.prev_slider_mut().next_state();
+    let current_state = data_keeper.current_slider_mut().next_state();
+
+    match (prev_state, current_state) {
+        (Some(Call(prev_call)), Some(Call(current_call))) => {
+            let (merged_call, scheme) = merge_call_results(prev_call, current_call)?;
+            Ok(prepare_call_result(merged_call, scheme, data_keeper))
+        }
+        (None, Some(Call(current_call))) => Ok(prepare_call_result(current_call, Current, data_keeper)),
+        (Some(Call(prev_call)), None) => Ok(prepare_call_result(prev_call, Previous, data_keeper)),
+        (None, None) => Ok(MergerCallResult::NotMet),
+        (prev_state, current_state) => Err(MergeError::incompatible_states(
+            prev_state,
+            current_state,
+            EXPECTED_STATE_NAME,
+        )),
+    }
+}
+
+fn merge_call_results(prev_call: CallResult, current_call: CallResult) -> MergeResult<(CallResult, PreparationScheme)> {
+    use CallResult::*;
+    use PreparationScheme::*;
+
+    let (merged_state, scheme) = match (prev_call, current_call) {
+        (prev @ Failed(..), current @ Failed(..)) => {
+            check_equal(&prev, &current)?;
+            (prev, Previous)
+        }
+        (RequestSentBy(_), current @ Failed(..)) => (current, Current),
+        (prev @ Failed(..), RequestSentBy(_)) => (prev, Previous),
+        // senders shouldn't be checked for equality, for more info please look at
+        // github.com/fluencelabs/aquavm/issues/137
+        (previous @ RequestSentBy(_), RequestSentBy(_)) => (previous, Previous),
+        (RequestSentBy(_), current @ Executed(_)) => (current, Current),
+        (previous @ Executed(..), RequestSentBy(_)) => (previous, Previous),
+        (Executed(prev_value), Executed(current_value)) => (merge_executed(prev_value, current_value)?, Both),
+        (prev_call, current_call) => return Err(CallResultError::incompatible_calls(prev_call, current_call)),
+    };
+
+    Ok((merged_state, scheme))
+}
+
+pub(super) fn prepare_call_result(
+    call_result: CallResult,
+    scheme: PreparationScheme,
+    data_keeper: &mut DataKeeper,
+) -> MergerCallResult {
+    let trace_pos = data_keeper.result_trace_next_pos();
+    prepare_positions_mapping(scheme, data_keeper);
+
+    let met_result = MetCallResult::new(call_result, trace_pos, scheme.into());
+    MergerCallResult::Met(met_result)
+}
+
+impl From<PreparationScheme> for ValueSource {
+    fn from(scheme: PreparationScheme) -> Self {
+        match scheme {
+            PreparationScheme::Previous | PreparationScheme::Both => ValueSource::PreviousData,
+            PreparationScheme::Current => ValueSource::CurrentData,
+        }
+    }
+}
+
+impl MetCallResult {
+    pub fn new(result: CallResult, trace_pos: TracePos, source: ValueSource) -> Self {
+        Self {
+            result,
+            trace_pos,
+            source,
+        }
+    }
+}
+
\ No newline at end of file diff --git a/src/air_trace_handler/merger/call_merger/utils.rs.html b/src/air_trace_handler/merger/call_merger/utils.rs.html new file mode 100644 index 00000000..a2bf63b0 --- /dev/null +++ b/src/air_trace_handler/merger/call_merger/utils.rs.html @@ -0,0 +1,159 @@ +utils.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::*;
+
+use air_interpreter_cid::CID;
+
+pub(super) fn merge_executed(prev_value: ValueRef, current_value: ValueRef) -> MergeResult<CallResult> {
+    match (&prev_value, &current_value) {
+        (ValueRef::Scalar(_), ValueRef::Scalar(_)) => {
+            are_scalars_equal(&prev_value, &current_value)?;
+            Ok(CallResult::Executed(prev_value))
+        }
+        (ValueRef::Stream { cid: pr, .. }, ValueRef::Stream { cid: cr, .. }) => {
+            are_streams_equal(pr, cr, &prev_value, &current_value)?;
+            Ok(CallResult::Executed(prev_value))
+        }
+        (ValueRef::Unused(_), ValueRef::Unused(_)) => {
+            are_scalars_equal(&prev_value, &current_value)?;
+            Ok(CallResult::Executed(prev_value))
+        }
+        _ => Err(CallResultError::not_equal_values(prev_value, current_value)),
+    }
+}
+
+fn are_scalars_equal(prev_value: &ValueRef, current_value: &ValueRef) -> MergeResult<()> {
+    if prev_value == current_value {
+        return Ok(());
+    }
+
+    Err(CallResultError::not_equal_values(
+        prev_value.clone(),
+        current_value.clone(),
+    ))
+}
+
+fn are_streams_equal(
+    prev_result_value: &CID<ServiceResultCidAggregate>,
+    current_result_value: &CID<ServiceResultCidAggregate>,
+    prev_value: &ValueRef,
+    current_value: &ValueRef,
+) -> MergeResult<()> {
+    // values from streams could have different generations and it's ok
+    if prev_result_value == current_result_value {
+        return Ok(());
+    }
+
+    Err(CallResultError::not_equal_values(
+        prev_value.clone(),
+        current_value.clone(),
+    ))
+}
+
+pub(super) fn check_equal(prev_call: &CallResult, current_call: &CallResult) -> MergeResult<()> {
+    if prev_call != current_call {
+        Err(CallResultError::incompatible_calls(
+            prev_call.clone(),
+            current_call.clone(),
+        ))
+    } else {
+        Ok(())
+    }
+}
+
\ No newline at end of file diff --git a/src/air_trace_handler/merger/canon_merger.rs.html b/src/air_trace_handler/merger/canon_merger.rs.html new file mode 100644 index 00000000..cfefd384 --- /dev/null +++ b/src/air_trace_handler/merger/canon_merger.rs.html @@ -0,0 +1,171 @@ +canon_merger.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::*;
+use crate::merger::errors::CanonResultError;
+
+const EXPECTED_STATE_NAME: &str = "canon";
+
+#[derive(Debug, Clone)]
+pub enum MergerCanonResult {
+    /// There is no corresponding state in a trace for this call.
+    Empty,
+
+    /// There was a state in at least one of the contexts. If there were two states in
+    /// both contexts, they were successfully merged.
+    CanonResult(CanonResult),
+}
+
+pub(crate) fn try_merge_next_state_as_canon(data_keeper: &mut DataKeeper) -> MergeResult<MergerCanonResult> {
+    use ExecutedState::Canon;
+
+    let prev_state = data_keeper.prev_slider_mut().next_state();
+    let current_state = data_keeper.current_slider_mut().next_state();
+
+    match (prev_state, current_state) {
+        (Some(Canon(prev_canon)), Some(Canon(current_canon))) => prepare_both_canon_result(prev_canon, current_canon),
+        (Some(Canon(prev_canon)), None) => prepare_single_canon_result(prev_canon),
+        (None, Some(Canon(current_canon))) => prepare_single_canon_result(current_canon),
+        (None, None) => Ok(MergerCanonResult::Empty),
+        (prev_state, current_state) => Err(MergeError::incompatible_states(
+            prev_state,
+            current_state,
+            EXPECTED_STATE_NAME,
+        )),
+    }
+}
+
+fn prepare_both_canon_result(
+    prev_canon_result: CanonResult,
+    current_canon_result: CanonResult,
+) -> MergeResult<MergerCanonResult> {
+    let canon_result =
+        merge_canon_results(prev_canon_result, current_canon_result).map_err(MergeError::IncorrectCanonResult)?;
+    prepare_single_canon_result(canon_result)
+}
+
+fn prepare_single_canon_result(canon_result: CanonResult) -> MergeResult<MergerCanonResult> {
+    let merger_result = MergerCanonResult::CanonResult(canon_result);
+    Ok(merger_result)
+}
+
+fn merge_canon_results(
+    prev_canon_result: CanonResult,
+    current_canon_result: CanonResult,
+) -> Result<CanonResult, CanonResultError> {
+    use CanonResult::*;
+
+    match (&prev_canon_result, &current_canon_result) {
+        (Executed(prev), Executed(cur)) if prev != cur => Err(CanonResultError::incompatible_state(
+            prev_canon_result,
+            current_canon_result,
+        )),
+        (RequestSentBy(_), Executed(_)) => Ok(current_canon_result),
+
+        (RequestSentBy(_), RequestSentBy(_)) | (Executed(_), RequestSentBy(_)) | (Executed(_), Executed(_)) => {
+            Ok(prev_canon_result)
+        }
+    }
+}
+
\ No newline at end of file diff --git a/src/air_trace_handler/merger/errors.rs.html b/src/air_trace_handler/merger/errors.rs.html new file mode 100644 index 00000000..86989bbf --- /dev/null +++ b/src/air_trace_handler/merger/errors.rs.html @@ -0,0 +1,345 @@ +errors.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::ApResult;
+use super::CallResult;
+use super::ExecutedState;
+use super::FoldResult;
+use super::KeeperError;
+use super::ValueRef;
+
+use air_interpreter_data::CanonResult;
+use air_interpreter_data::TracePos;
+use thiserror::Error as ThisError;
+
+/// Errors arose out of merging previous data with a new.
+#[derive(ThisError, Debug)]
+pub enum MergeError {
+    /// Errors occurred when previous and current executed states are incompatible.
+    #[error("previous and current data have incompatible states: '{0:?}' '{1:?}'")]
+    IncompatibleExecutedStates(ExecutedState, ExecutedState),
+
+    /// Merger was expected to see other state that was obtained from one of traces
+    /// (the other state was absent).
+    #[error("state from {1} `{0:?}` is incompatible with expected {2}")]
+    DifferentExecutedStateExpected(ExecutedState, DataType, &'static str),
+
+    #[error(transparent)]
+    KeeperError(#[from] KeeperError),
+
+    #[error(transparent)]
+    IncorrectApResult(#[from] ApResultError),
+
+    #[error(transparent)]
+    IncorrectCallResult(#[from] CallResultError),
+
+    #[error(transparent)]
+    IncorrectCanonResult(#[from] CanonResultError),
+
+    #[error(transparent)]
+    IncorrectFoldResult(#[from] FoldResultError),
+}
+
+#[derive(ThisError, Debug)]
+pub enum ApResultError {
+    /// Error occurred when Ap results contains not 1 generation in destination.
+    #[error("{0:?} ap result contains inappropriate generation count in destination")]
+    InvalidDstGenerations(ApResult),
+}
+
+#[derive(ThisError, Debug)]
+pub enum CallResultError {
+    #[error("values in call results are not equal: {prev_value:?} != {current_value:?}")]
+    ValuesNotEqual {
+        prev_value: ValueRef,
+        current_value: ValueRef,
+    },
+
+    /// Errors occurred when previous and current call results are incompatible.
+    #[error("previous and current call results are incompatible: '{prev_call:?}' '{current_call:?}'")]
+    IncompatibleCallResults {
+        prev_call: CallResult,
+        current_call: CallResult,
+    },
+}
+
+#[derive(ThisError, Debug)]
+pub enum CanonResultError {
+    #[error("canon results {prev_canon_result:?} {current_canon_result:?} points to incompatible execution states")]
+    IncompatibleState {
+        prev_canon_result: CanonResult,
+        current_canon_result: CanonResult,
+    },
+}
+
+#[derive(ThisError, Debug)]
+pub enum FoldResultError {
+    #[error("the first {count} subtrace descriptors lens of fold {fold_result:?} overflows")]
+    SubtraceLenOverflow { fold_result: FoldResult, count: usize },
+
+    /// There are several lores with the same value_pos.
+    #[error("{0:?} contains several subtraces with the same value_pos {1}")]
+    SeveralRecordsWithSamePos(FoldResult, TracePos),
+
+    /// Errors occurred when one of the fold subtrace lore doesn't contain 2 descriptors.
+    #[error("fold contains {0} sublore descriptors, but 2 is expected")]
+    FoldIncorrectSubtracesCount(usize),
+}
+
+impl MergeError {
+    // shouldn't be called with both Nones
+    pub(crate) fn incompatible_states(
+        prev_state: Option<ExecutedState>,
+        current_state: Option<ExecutedState>,
+        expected_state: &'static str,
+    ) -> Self {
+        match (prev_state, current_state) {
+            (Some(prev_state), Some(current_state)) => {
+                MergeError::IncompatibleExecutedStates(prev_state, current_state)
+            }
+            (None, Some(current_state)) => {
+                MergeError::DifferentExecutedStateExpected(current_state, DataType::Current, expected_state)
+            }
+            (Some(prev_state), None) => {
+                MergeError::DifferentExecutedStateExpected(prev_state, DataType::Previous, expected_state)
+            }
+            (None, None) => unreachable!("shouldn't be called with both None"),
+        }
+    }
+}
+
+// these impl methods allow construction of MergeError and are used to make code more clean
+impl CallResultError {
+    pub(crate) fn not_equal_values(prev_value: ValueRef, current_value: ValueRef) -> MergeError {
+        let call_result_error = CallResultError::ValuesNotEqual {
+            prev_value,
+            current_value,
+        };
+
+        MergeError::IncorrectCallResult(call_result_error)
+    }
+
+    pub(crate) fn incompatible_calls(prev_call: CallResult, current_call: CallResult) -> MergeError {
+        let call_result_error = CallResultError::IncompatibleCallResults {
+            prev_call,
+            current_call,
+        };
+
+        MergeError::IncorrectCallResult(call_result_error)
+    }
+}
+
+impl CanonResultError {
+    pub(crate) fn incompatible_state(prev_canon_result: CanonResult, current_canon_result: CanonResult) -> Self {
+        Self::IncompatibleState {
+            prev_canon_result,
+            current_canon_result,
+        }
+    }
+}
+
+#[derive(Clone, Copy, Debug)]
+pub enum DataType {
+    Previous,
+    Current,
+}
+
+use std::fmt;
+
+impl fmt::Display for DataType {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        match self {
+            DataType::Previous => write!(f, "previous"),
+            DataType::Current => write!(f, "current"),
+        }
+    }
+}
+
\ No newline at end of file diff --git a/src/air_trace_handler/merger/fold_merger.rs.html b/src/air_trace_handler/merger/fold_merger.rs.html new file mode 100644 index 00000000..6e2db55b --- /dev/null +++ b/src/air_trace_handler/merger/fold_merger.rs.html @@ -0,0 +1,181 @@ +fold_merger.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+mod fold_lore_resolver;
+
+use super::*;
+pub use fold_lore_resolver::*;
+
+#[derive(Debug, Default, Clone)]
+pub struct MergerFoldResult {
+    pub prev_fold_lore: ResolvedFold,
+    pub current_fold_lore: ResolvedFold,
+}
+
+pub(crate) fn try_merge_next_state_as_fold(data_keeper: &mut DataKeeper) -> MergeResult<MergerFoldResult> {
+    use ExecutedState::Fold;
+
+    let prev_state = data_keeper.prev_slider_mut().next_state();
+    let current_state = data_keeper.current_slider_mut().next_state();
+
+    let fold_result = match (prev_state, current_state) {
+        (Some(Fold(prev_fold)), Some(Fold(current_fold))) => {
+            MergerFoldResult::from_fold_results(&prev_fold, &current_fold, data_keeper)
+        }
+        (None, Some(Fold(current_fold))) => {
+            MergerFoldResult::from_fold_result(&current_fold, MergeCtxType::Current, data_keeper)
+        }
+        (Some(Fold(prev_fold)), None) => {
+            MergerFoldResult::from_fold_result(&prev_fold, MergeCtxType::Previous, data_keeper)
+        }
+        (None, None) => return Ok(MergerFoldResult::default()),
+        (prev_state, current_state) => return Err(MergeError::incompatible_states(prev_state, current_state, "fold")),
+    }?;
+
+    Ok(fold_result)
+}
+
+impl MergerFoldResult {
+    fn from_fold_result(fold: &FoldResult, ctx_type: MergeCtxType, data_keeper: &DataKeeper) -> MergeResult<Self> {
+        let (prev_fold_lore, current_fold_lore) = match ctx_type {
+            MergeCtxType::Previous => {
+                let fold_lore = resolve_fold_lore(fold, &data_keeper.prev_ctx)?;
+                (fold_lore, <_>::default())
+            }
+            MergeCtxType::Current => {
+                let fold_lore = resolve_fold_lore(fold, &data_keeper.current_ctx)?;
+                (<_>::default(), fold_lore)
+            }
+        };
+
+        let merge_result = Self {
+            prev_fold_lore,
+            current_fold_lore,
+        };
+
+        Ok(merge_result)
+    }
+
+    fn from_fold_results(
+        prev_fold: &FoldResult,
+        current_fold: &FoldResult,
+        data_keeper: &DataKeeper,
+    ) -> MergeResult<Self> {
+        let prev_fold_lore = resolve_fold_lore(prev_fold, &data_keeper.prev_ctx)?;
+        let current_fold_lore = resolve_fold_lore(current_fold, &data_keeper.current_ctx)?;
+
+        let merge_result = Self {
+            prev_fold_lore,
+            current_fold_lore,
+        };
+
+        Ok(merge_result)
+    }
+}
+
\ No newline at end of file diff --git a/src/air_trace_handler/merger/fold_merger/fold_lore_resolver.rs.html b/src/air_trace_handler/merger/fold_merger/fold_lore_resolver.rs.html new file mode 100644 index 00000000..2214ad00 --- /dev/null +++ b/src/air_trace_handler/merger/fold_merger/fold_lore_resolver.rs.html @@ -0,0 +1,627 @@ +fold_lore_resolver.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::*;
+use crate::data_keeper::MergeCtx;
+
+use air_interpreter_data::FoldSubTraceLore;
+use air_interpreter_data::SubTraceDesc;
+use air_interpreter_data::TracePos;
+
+use std::collections::HashMap;
+
+pub type FoldStatesCount = u32;
+
+#[derive(Debug, Default, Clone, PartialEq, Eq)]
+pub struct ResolvedFold {
+    pub lore: HashMap<TracePos, ResolvedSubTraceDescs>,
+    pub fold_states_count: FoldStatesCount,
+}
+
+#[derive(Debug, Clone, PartialEq, Eq)]
+pub struct ResolvedSubTraceDescs {
+    pub before_subtrace: SubTraceDesc,
+    pub after_subtrace: SubTraceDesc,
+}
+
+pub(super) fn resolve_fold_lore(fold: &FoldResult, merge_ctx: &MergeCtx) -> MergeResult<ResolvedFold> {
+    let (fold_states_count, lens) = compute_lens_convolution(fold, merge_ctx)?;
+
+    let lore = fold.lore.iter().zip(lens).try_fold::<_, _, MergeResult<_>>(
+        HashMap::with_capacity(fold.lore.len()),
+        |mut resolved_lore, (lore, lens)| {
+            let before_subtrace = SubTraceDesc::new(lore.subtraces_desc[0].begin_pos, lens.before_len as _);
+            let after_subtrace = SubTraceDesc::new(lore.subtraces_desc[1].begin_pos, lens.after_len as _);
+            let resolved_descs = ResolvedSubTraceDescs::new(before_subtrace, after_subtrace);
+
+            match resolved_lore.insert(lore.value_pos, resolved_descs) {
+                Some(_) => {
+                    Err(FoldResultError::SeveralRecordsWithSamePos(fold.clone(), lore.value_pos)).map_err(Into::into)
+                }
+                None => Ok(resolved_lore),
+            }
+        },
+    )?;
+
+    let resolved_fold_lore = ResolvedFold::new(lore, fold_states_count);
+    Ok(resolved_fold_lore)
+}
+
+/// This function does conversion subtrace_lens of a fold result, it's better to explain it on
+/// examples.
+///
+/// Imagine a fold on stream with 3 elements that have the same generation, in this case the
+/// conversion will look like this:
+/// [1, 1] [2, 2] [3, 3] => [12, 1] [11, 3] [9, 6]
+///   g0     g0     g0
+/// here a number before comma represents count of elements before next, and after the comma - after
+///
+/// For fold with 5 elements of two generations:
+/// [1, 1] [2, 2] [3, 3] [4, 4] [5, 5] [1, 1] => [12, 1] [11, 3] [9, 6] [18, 4] [14, 9] [2, 1]
+///   g0     g0     g0     g1     g1     g2
+///
+/// It could be seen that this function does a convolution of lens with respect to generations.
+/// This is needed to handle (fold (par (next ... cases, because of subtrace_len of a Fold state
+/// describes only states inside this iteration without states that next brings, however a Par
+/// lens describe the whole subgraph, where "next" states are included.
+
+// TODO: in future it's possible to change a format of a Fold state to one behaves like Par,
+// because this function adds some overhead
+fn compute_lens_convolution(fold: &FoldResult, merge_ctx: &MergeCtx) -> MergeResult<(FoldStatesCount, Vec<LoresLen>)> {
+    let subtraces_count = fold.lore.len();
+    let mut lens = Vec::with_capacity(subtraces_count);
+    let mut fold_states_count: FoldStatesCount = 0;
+    let mut last_seen_generation = GenerationIdx::from(0);
+    let mut last_seen_generation_pos = 0;
+    let mut cum_after_len = 0;
+
+    for subtrace_id in 0..subtraces_count {
+        let subtrace_lore = &fold.lore[subtrace_id];
+        check_subtrace_lore(subtrace_lore)?;
+
+        let current_generation = merge_ctx.try_get_generation(subtrace_lore.value_pos)?;
+        // TODO: check sequence for monotone
+        if last_seen_generation != current_generation {
+            if subtrace_id > 0 {
+                // do a back traversal for before lens
+                compute_before_lens(&mut lens, last_seen_generation_pos, subtrace_id - 1);
+            }
+            last_seen_generation = current_generation;
+            last_seen_generation_pos = subtrace_id;
+            cum_after_len = 0;
+        }
+
+        let before_len = subtrace_lore.subtraces_desc[0].subtrace_len;
+        let after_len = subtrace_lore.subtraces_desc[1].subtrace_len;
+        // this checks for overflow both cum_before_len and cum_after_len
+        fold_states_count = fold_states_count
+            .checked_add(before_len)
+            .and_then(|v| v.checked_add(after_len))
+            .ok_or_else(|| FoldResultError::SubtraceLenOverflow {
+                fold_result: fold.clone(),
+                count: subtrace_id,
+            })?;
+
+        cum_after_len += after_len;
+
+        // temporary set not cumulative before len
+        let new_lens = LoresLen::new(before_len, cum_after_len);
+        lens.push(new_lens);
+    }
+
+    if subtraces_count > 0 {
+        compute_before_lens(&mut lens, last_seen_generation_pos, subtraces_count - 1);
+    }
+
+    Ok((fold_states_count, lens))
+}
+
+fn compute_before_lens(lore_lens: &mut [LoresLen], begin_pos: usize, end_pos: usize) {
+    let mut cum_before_len = 0;
+    let after_len = lore_lens[end_pos].after_len;
+
+    for subtrace_id in (begin_pos..=end_pos).rev() {
+        let before_len = &mut lore_lens[subtrace_id].before_len;
+
+        cum_before_len += *before_len;
+        *before_len = cum_before_len + after_len;
+    }
+}
+
+fn check_subtrace_lore(subtrace_lore: &FoldSubTraceLore) -> MergeResult<()> {
+    // this limitation is due to current constraint on count of next inside one fold,
+    // for more info please see comments in the interpreter-data crate
+    const SUBTRACE_DESC_COUNT: usize = 2;
+
+    if subtrace_lore.subtraces_desc.len() != SUBTRACE_DESC_COUNT {
+        return Err(FoldResultError::FoldIncorrectSubtracesCount(
+            subtrace_lore.subtraces_desc.len(),
+        ))
+        .map_err(Into::into);
+    }
+
+    Ok(())
+}
+
+impl ResolvedFold {
+    pub fn new(lore: HashMap<TracePos, ResolvedSubTraceDescs>, fold_states_count: FoldStatesCount) -> Self {
+        Self {
+            lore,
+            fold_states_count,
+        }
+    }
+}
+
+impl ResolvedSubTraceDescs {
+    pub fn new(before_subtrace: SubTraceDesc, after_subtrace: SubTraceDesc) -> Self {
+        Self {
+            before_subtrace,
+            after_subtrace,
+        }
+    }
+}
+
+#[derive(Clone, Copy, Debug, PartialEq, Eq)]
+struct LoresLen {
+    before_len: u32,
+    after_len: u32,
+}
+
+impl LoresLen {
+    fn new(before_len: u32, after_len: u32) -> Self {
+        Self { before_len, after_len }
+    }
+}
+
+#[cfg(test)]
+mod tests {
+    use super::compute_lens_convolution;
+    use crate::data_keeper::TraceSlider;
+    use crate::merger::fold_merger::fold_lore_resolver::LoresLen;
+    use crate::MergeCtx;
+    use air_interpreter_data::ApResult;
+    use air_interpreter_data::ExecutedState;
+    use air_interpreter_data::FoldResult;
+    use air_interpreter_data::FoldSubTraceLore;
+    use air_interpreter_data::SubTraceDesc;
+    use air_interpreter_data::TracePos;
+
+    fn subtrace_desc(begin_pos: impl Into<TracePos>, subtrace_len: u32) -> SubTraceDesc {
+        SubTraceDesc {
+            begin_pos: begin_pos.into(),
+            subtrace_len,
+        }
+    }
+
+    #[test]
+    fn empty_fold_result() {
+        let lore = vec![];
+
+        let fold_result = FoldResult { lore };
+
+        let slider = TraceSlider::new(vec![]);
+        let ctx = MergeCtx { slider };
+
+        let (all_states, convoluted_lens) =
+            compute_lens_convolution(&fold_result, &ctx).expect("convolution should be successful");
+        assert_eq!(all_states, 0);
+        assert_eq!(convoluted_lens, vec![]);
+    }
+
+    #[test]
+    fn convolution_test_1() {
+        // [1, 1] [2, 2] [3, 3] => [12, 1] [11, 3] [9, 6]
+        //   g0     g0     g0
+        let lore = vec![
+            FoldSubTraceLore {
+                value_pos: 0.into(),
+                subtraces_desc: vec![subtrace_desc(0, 1), subtrace_desc(0, 1)],
+            },
+            FoldSubTraceLore {
+                value_pos: 0.into(),
+                subtraces_desc: vec![subtrace_desc(0, 2), subtrace_desc(0, 2)],
+            },
+            FoldSubTraceLore {
+                value_pos: 0.into(),
+                subtraces_desc: vec![subtrace_desc(0, 3), subtrace_desc(0, 3)],
+            },
+        ];
+
+        let fold_result = FoldResult { lore };
+
+        let slider = TraceSlider::new(vec![ExecutedState::Ap(ApResult::new(0.into()))]);
+        let ctx = MergeCtx { slider };
+
+        let (all_states, convoluted_lens) =
+            compute_lens_convolution(&fold_result, &ctx).expect("convolution should be successful");
+        assert_eq!(all_states, 12);
+
+        let expected_lens = vec![LoresLen::new(12, 1), LoresLen::new(11, 3), LoresLen::new(9, 6)];
+        assert_eq!(convoluted_lens, expected_lens);
+    }
+
+    #[test]
+    fn convolution_test_2() {
+        // [1, 1] [2, 2] [3, 3] [4, 4] [5, 5] [1, 1] => [12, 1] [11, 3] [9, 6] [18, 4] [14, 9] [2, 1]
+        //   g0     g0     g0     g1     g1     g2
+        let lore = vec![
+            FoldSubTraceLore {
+                value_pos: 0.into(),
+                subtraces_desc: vec![subtrace_desc(0, 1), subtrace_desc(0, 1)],
+            },
+            FoldSubTraceLore {
+                value_pos: 0.into(),
+                subtraces_desc: vec![subtrace_desc(0, 2), subtrace_desc(0, 2)],
+            },
+            FoldSubTraceLore {
+                value_pos: 0.into(),
+                subtraces_desc: vec![subtrace_desc(0, 3), subtrace_desc(0, 3)],
+            },
+            FoldSubTraceLore {
+                value_pos: 1.into(),
+                subtraces_desc: vec![subtrace_desc(0, 4), subtrace_desc(0, 4)],
+            },
+            FoldSubTraceLore {
+                value_pos: 1.into(),
+                subtraces_desc: vec![subtrace_desc(0, 5), subtrace_desc(0, 5)],
+            },
+            FoldSubTraceLore {
+                value_pos: 2.into(),
+                subtraces_desc: vec![subtrace_desc(0, 1), subtrace_desc(0, 1)],
+            },
+        ];
+
+        let fold_result = FoldResult { lore };
+
+        let slider = TraceSlider::new(vec![
+            ExecutedState::Ap(ApResult::new(0.into())),
+            ExecutedState::Ap(ApResult::new(1.into())),
+            ExecutedState::Ap(ApResult::new(2.into())),
+        ]);
+        let ctx = MergeCtx { slider };
+
+        let (all_states, convoluted_lens) =
+            compute_lens_convolution(&fold_result, &ctx).expect("convolution should be successful");
+        assert_eq!(all_states, 32);
+
+        let expected_lens = vec![
+            LoresLen::new(12, 1),
+            LoresLen::new(11, 3),
+            LoresLen::new(9, 6),
+            LoresLen::new(18, 4),
+            LoresLen::new(14, 9),
+            LoresLen::new(2, 1),
+        ];
+        assert_eq!(convoluted_lens, expected_lens);
+    }
+}
+
\ No newline at end of file diff --git a/src/air_trace_handler/merger/mod.rs.html b/src/air_trace_handler/merger/mod.rs.html new file mode 100644 index 00000000..0fe8d64e --- /dev/null +++ b/src/air_trace_handler/merger/mod.rs.html @@ -0,0 +1,167 @@ +mod.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+mod ap_merger;
+mod call_merger;
+mod canon_merger;
+mod errors;
+mod fold_merger;
+mod par_merger;
+mod position_mapping;
+
+pub use ap_merger::MergerApResult;
+pub use ap_merger::MetApResult;
+pub use call_merger::MergerCallResult;
+pub use call_merger::MetCallResult;
+pub use canon_merger::MergerCanonResult;
+pub use fold_merger::MergerFoldResult;
+pub use par_merger::MergerParResult;
+pub use position_mapping::PreparationScheme;
+
+pub use errors::ApResultError;
+pub use errors::CallResultError;
+pub use errors::CanonResultError;
+pub use errors::DataType;
+pub use errors::FoldResultError;
+pub use errors::MergeError;
+
+pub use fold_merger::ResolvedFold;
+pub use fold_merger::ResolvedSubTraceDescs;
+
+pub(super) use ap_merger::try_merge_next_state_as_ap;
+pub(super) use call_merger::try_merge_next_state_as_call;
+pub(super) use canon_merger::try_merge_next_state_as_canon;
+pub(crate) use fold_merger::try_merge_next_state_as_fold;
+pub(crate) use par_merger::try_merge_next_state_as_par;
+
+use position_mapping::prepare_positions_mapping;
+
+type MergeResult<T> = std::result::Result<T, MergeError>;
+
+use super::data_keeper::KeeperError;
+use super::DataKeeper;
+
+use air_interpreter_data::*;
+
+#[derive(Debug, Copy, Clone)]
+pub enum MergeCtxType {
+    Current,
+    Previous,
+}
+
+#[derive(Debug, Clone, Copy)]
+pub enum ValueSource {
+    PreviousData,
+    CurrentData,
+}
+
+use std::fmt;
+
+impl fmt::Display for MergeCtxType {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        match self {
+            MergeCtxType::Previous => write!(f, "previous"),
+            MergeCtxType::Current => write!(f, "current"),
+        }
+    }
+}
+
\ No newline at end of file diff --git a/src/air_trace_handler/merger/par_merger.rs.html b/src/air_trace_handler/merger/par_merger.rs.html new file mode 100644 index 00000000..ba8c5c1b --- /dev/null +++ b/src/air_trace_handler/merger/par_merger.rs.html @@ -0,0 +1,131 @@ +par_merger.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::*;
+use ExecutedState::Par;
+
+#[derive(Default, Debug, Copy, Clone)]
+pub struct MergerParResult {
+    pub prev_par: Option<ParResult>,
+    pub current_par: Option<ParResult>,
+}
+
+pub(crate) fn try_merge_next_state_as_par(data_keeper: &mut DataKeeper) -> MergeResult<MergerParResult> {
+    let prev_state = data_keeper.prev_slider_mut().next_state();
+    let current_state = data_keeper.current_slider_mut().next_state();
+
+    let result = match (prev_state, current_state) {
+        (Some(Par(prev_par)), Some(Par(current_par))) => MergerParResult::from_pars(prev_par, current_par),
+        (None, Some(Par(current_par))) => MergerParResult::from_current_par(current_par),
+        (Some(Par(prev_par)), None) => MergerParResult::from_prev_par(prev_par),
+        (None, None) => MergerParResult::default(),
+        (prev_state, current_state) => return Err(MergeError::incompatible_states(prev_state, current_state, "par")),
+    };
+
+    Ok(result)
+}
+
+impl MergerParResult {
+    fn from_pars(prev_par: ParResult, current_par: ParResult) -> Self {
+        Self {
+            prev_par: Some(prev_par),
+            current_par: Some(current_par),
+        }
+    }
+
+    fn from_prev_par(prev_par: ParResult) -> Self {
+        Self {
+            prev_par: Some(prev_par),
+            current_par: None,
+        }
+    }
+
+    fn from_current_par(current_par: ParResult) -> Self {
+        Self {
+            prev_par: None,
+            current_par: Some(current_par),
+        }
+    }
+}
+
\ No newline at end of file diff --git a/src/air_trace_handler/merger/position_mapping.rs.html b/src/air_trace_handler/merger/position_mapping.rs.html new file mode 100644 index 00000000..90380bb4 --- /dev/null +++ b/src/air_trace_handler/merger/position_mapping.rs.html @@ -0,0 +1,105 @@ +position_mapping.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::DataKeeper;
+
+#[derive(Debug, Copy, Clone)]
+pub enum PreparationScheme {
+    Previous,
+    Current,
+    Both,
+}
+
+/// Prepares new_to_old_pos mapping in data keeper to keep track of value sources.
+pub(super) fn prepare_positions_mapping(scheme: PreparationScheme, data_keeper: &mut DataKeeper) {
+    use PreparationScheme::*;
+
+    let new_pos = data_keeper.result_trace_next_pos();
+
+    // it's safe to sub 1 from positions here iff scheme was set correctly
+    match scheme {
+        Previous => {
+            let prev_pos = data_keeper.prev_slider().position() - 1;
+            data_keeper.new_to_prev_pos.insert(new_pos, prev_pos);
+        }
+        Current => {
+            let current_pos = data_keeper.current_slider().position() - 1;
+            data_keeper.new_to_current_pos.insert(new_pos, current_pos);
+        }
+        Both => {
+            let prev_pos = data_keeper.prev_slider().position() - 1;
+            let current_pos = data_keeper.current_slider().position() - 1;
+            data_keeper.new_to_prev_pos.insert(new_pos, prev_pos);
+            data_keeper.new_to_current_pos.insert(new_pos, current_pos);
+        }
+    };
+}
+
\ No newline at end of file diff --git a/src/air_trace_handler/state_automata/errors.rs.html b/src/air_trace_handler/state_automata/errors.rs.html new file mode 100644 index 00000000..0f0e4749 --- /dev/null +++ b/src/air_trace_handler/state_automata/errors.rs.html @@ -0,0 +1,129 @@ +errors.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::KeeperError;
+use super::ParResult;
+use crate::merger::MergeCtxType;
+use crate::ResolvedFold;
+use crate::TracePos;
+
+use air_interpreter_data::TraceLen;
+use thiserror::Error as ThisError;
+
+/// Errors arose out of merging previous data with a new.
+#[derive(ThisError, Debug)]
+pub enum StateFSMError {
+    /// Error occurred while trying to access or pop elements from an empty par queue.
+    #[error("par queue is empty, while par FSM is requested")]
+    ParQueueIsEmpty,
+
+    /// Errors occurred while trying to access or pop elements from queue,
+    /// which contains element of different type.
+    #[error("fold FSM for fold id {0} wasn't found")]
+    FoldFSMNotFound(u32),
+
+    /// Errors occurred when ParResult.0 + ParResult.1 overflows.
+    #[error("overflow is occurred while calculating the entire len occupied by executed states corresponded to current par: '{0:?}'")]
+    ParLenOverflow(ParResult),
+
+    /// Errors occurred when slider.position() + ParResult.0 + ParResult.1 overflows.
+    #[error("overflow is occurred while calculating the new position of a {2} slider for resolved par {0:?} and current position {1}'")]
+    ParPosOverflow(ParResult, TracePos, MergeCtxType),
+
+    /// Errors occurred when ParResult.0 + ParResult.1 value is bigger than current subgraph size.
+    #[error("underflow is occurred while calculating the new position of a {2} slider for resolved par {0:?} and current subtrace len {1}'")]
+    ParLenUnderflow(ParResult, TraceLen, MergeCtxType),
+
+    /// Errors occurred when {0}.fold_states_count + {1} overflows.
+    #[error("overflow is occurred while calculating the new position of a {2} slider for resolved fold {0:?} and current position {1}'")]
+    FoldPosOverflow(ResolvedFold, TracePos, MergeCtxType),
+
+    /// Errors occurred when {1} - 1{0}.fold_states_count underflows.
+    #[error("underflow is occurred while calculating the new position of a {2} slider for resolved fold {0:?} and current subtrace len {1}'")]
+    FoldLenUnderflow(ResolvedFold, TracePos, MergeCtxType),
+
+    /// Errors bubbled from DataKeeper.
+    #[error(transparent)]
+    KeeperError(#[from] KeeperError),
+}
+
\ No newline at end of file diff --git a/src/air_trace_handler/state_automata/fold_fsm.rs.html b/src/air_trace_handler/state_automata/fold_fsm.rs.html new file mode 100644 index 00000000..69af1bf6 --- /dev/null +++ b/src/air_trace_handler/state_automata/fold_fsm.rs.html @@ -0,0 +1,311 @@ +fold_fsm.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+mod lore_applier;
+mod lore_ctor;
+mod lore_ctor_queue;
+mod state_handler;
+
+use crate::TracePos;
+
+use super::*;
+use lore_applier::*;
+use lore_ctor::*;
+use lore_ctor_queue::*;
+use state_handler::CtxStateHandler;
+
+use air_interpreter_data::FoldLore;
+
+/// This FSM manages fold and keeps internally queue of lore ctors.
+/// State transitioning functions must work in the following way:
+///     meet_fold_start.1 ->
+///         meet_generation_start.N ->
+///             meet_next.M ->
+///             meet_prev.M ->
+///         meet_generation_end.N ->
+///     meet_fold_end.1
+/// where .T means that this function should be called exactly T times.
+#[derive(Debug, Default, Clone)]
+pub(crate) struct FoldFSM {
+    prev_fold: ResolvedFold,
+    current_fold: ResolvedFold,
+    state_inserter: StateInserter,
+    ctor_queue: SubTraceLoreCtorQueue,
+    result_lore: FoldLore,
+    state_handler: CtxStateHandler,
+}
+
+impl FoldFSM {
+    pub(crate) fn from_fold_start(fold_result: MergerFoldResult, data_keeper: &mut DataKeeper) -> FSMResult<Self> {
+        let state_inserter = StateInserter::from_keeper(data_keeper);
+        let state_handler =
+            CtxStateHandler::prepare(&fold_result.prev_fold_lore, &fold_result.current_fold_lore, data_keeper)?;
+
+        let fold_fsm = Self {
+            prev_fold: fold_result.prev_fold_lore,
+            current_fold: fold_result.current_fold_lore,
+            state_inserter,
+            state_handler,
+            ..<_>::default()
+        };
+
+        Ok(fold_fsm)
+    }
+
+    pub(crate) fn meet_iteration_start(&mut self, value_pos: TracePos, data_keeper: &mut DataKeeper) -> FSMResult<()> {
+        let prev_pos = data_keeper.new_to_prev_pos.get_by_left(&value_pos);
+        let current_pos = data_keeper.new_to_current_pos.get_by_left(&value_pos);
+
+        let prev_lore = prev_pos.and_then(|pos| self.prev_fold.lore.remove(pos));
+        let current_lore = current_pos.and_then(|pos| self.current_fold.lore.remove(pos));
+
+        self.prepare(prev_lore, current_lore, value_pos, data_keeper)
+    }
+
+    fn prepare(
+        &mut self,
+        prev_lore: Option<ResolvedSubTraceDescs>,
+        current_lore: Option<ResolvedSubTraceDescs>,
+        value_pos: TracePos,
+        data_keeper: &mut DataKeeper,
+    ) -> FSMResult<()> {
+        apply_fold_lore_before(data_keeper, &prev_lore, &current_lore)?;
+
+        let ctor = SubTraceLoreCtor::from_before_start(value_pos, data_keeper);
+        self.ctor_queue.add_element(ctor, prev_lore, current_lore);
+
+        Ok(())
+    }
+
+    pub(crate) fn meet_iteration_end(&mut self, data_keeper: &DataKeeper) {
+        self.ctor_queue.current().ctor.before_end(data_keeper);
+    }
+
+    pub(crate) fn meet_back_iterator(&mut self, data_keeper: &mut DataKeeper) -> FSMResult<()> {
+        let back_traversal_started = self.ctor_queue.back_traversal_started();
+
+        let LoreCtorDesc {
+            ctor,
+            prev_lore,
+            current_lore,
+        } = self.ctor_queue.current();
+
+        if !back_traversal_started {
+            ctor.maybe_before_end(data_keeper);
+            ctor.after_start(data_keeper);
+            apply_fold_lore_after(data_keeper, prev_lore, current_lore)?;
+            self.ctor_queue.start_back_traverse();
+        } else {
+            ctor.after_end(data_keeper);
+            self.ctor_queue.traverse_back();
+
+            let LoreCtorDesc {
+                ctor,
+                prev_lore,
+                current_lore,
+            } = self.ctor_queue.current();
+
+            ctor.after_start(data_keeper);
+            apply_fold_lore_after(data_keeper, prev_lore, current_lore)?;
+        }
+
+        Ok(())
+    }
+
+    pub(crate) fn meet_generation_end(&mut self, data_keeper: &DataKeeper) {
+        self.ctor_queue.finish(data_keeper);
+        self.ctor_queue.end_back_traverse();
+
+        let fold_lore = self.ctor_queue.transform_to_lore();
+        self.result_lore.extend(fold_lore);
+    }
+
+    pub(crate) fn meet_fold_end(self, data_keeper: &mut DataKeeper) {
+        // TODO: check for prev and current lore emptiness
+        let fold_result = FoldResult { lore: self.result_lore };
+        let state = ExecutedState::Fold(fold_result);
+        self.state_inserter.insert(data_keeper, state);
+        self.state_handler.set_final_states(data_keeper);
+    }
+}
+
+#[derive(Clone, Copy)]
+enum ByNextPosition {
+    /// Represents executed states before next.
+    Before,
+
+    /// Represents executed states after next.
+    After,
+}
+
\ No newline at end of file diff --git a/src/air_trace_handler/state_automata/fold_fsm/lore_applier.rs.html b/src/air_trace_handler/state_automata/fold_fsm/lore_applier.rs.html new file mode 100644 index 00000000..b10d7134 --- /dev/null +++ b/src/air_trace_handler/state_automata/fold_fsm/lore_applier.rs.html @@ -0,0 +1,155 @@ +lore_applier.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::*;
+use ByNextPosition::*;
+use MergeCtxType::*;
+
+/// Adjusts sliders accordingly to a before fold lore state.
+pub(super) fn apply_fold_lore_before(
+    data_keeper: &mut DataKeeper,
+    prev_fold_lore: &Option<ResolvedSubTraceDescs>,
+    current_fold_lore: &Option<ResolvedSubTraceDescs>,
+) -> FSMResult<()> {
+    apply_fold_lore(data_keeper, prev_fold_lore, Previous, Before)?;
+    apply_fold_lore(data_keeper, current_fold_lore, Current, Before)
+}
+
+/// Adjusts sliders accordingly to an after fold lore state.
+pub(super) fn apply_fold_lore_after(
+    data_keeper: &mut DataKeeper,
+    prev_fold_lore: &Option<ResolvedSubTraceDescs>,
+    current_fold_lore: &Option<ResolvedSubTraceDescs>,
+) -> FSMResult<()> {
+    apply_fold_lore(data_keeper, prev_fold_lore, Previous, After)?;
+    apply_fold_lore(data_keeper, current_fold_lore, Current, After)
+}
+
+fn apply_fold_lore(
+    data_keeper: &mut DataKeeper,
+    fold_lore: &Option<ResolvedSubTraceDescs>,
+    ctx_type: MergeCtxType,
+    next_position: ByNextPosition,
+) -> FSMResult<()> {
+    let slider = match ctx_type {
+        Previous => data_keeper.prev_slider_mut(),
+        Current => data_keeper.current_slider_mut(),
+    };
+
+    match fold_lore {
+        Some(fold_lore) => match next_position {
+            Before => {
+                slider.set_position_and_len(
+                    fold_lore.before_subtrace.begin_pos as _,
+                    fold_lore.before_subtrace.subtrace_len as _,
+                )?;
+            }
+            After => {
+                slider.set_position_and_len(
+                    fold_lore.after_subtrace.begin_pos as _,
+                    fold_lore.after_subtrace.subtrace_len as _,
+                )?;
+            }
+        },
+        None => {
+            // substrace is empty
+            slider.set_subtrace_len(0)?;
+        }
+    }
+
+    Ok(())
+}
+
\ No newline at end of file diff --git a/src/air_trace_handler/state_automata/fold_fsm/lore_ctor.rs.html b/src/air_trace_handler/state_automata/fold_fsm/lore_ctor.rs.html new file mode 100644 index 00000000..f040433f --- /dev/null +++ b/src/air_trace_handler/state_automata/fold_fsm/lore_ctor.rs.html @@ -0,0 +1,299 @@ +lore_ctor.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::*;
+use air_interpreter_data::SubTraceDesc;
+
+/// This struct is a form of FSM and is intended to construct a fold subtrace lore element.
+#[derive(Debug, Default, PartialEq, Eq, Clone, Copy)]
+pub(super) struct SubTraceLoreCtor {
+    value_pos: TracePos,
+    before_tracker: PositionsTracker,
+    after_tracker: PositionsTracker,
+    state: CtorState,
+}
+
+#[derive(Debug, Default, PartialEq, Eq, Clone, Copy)]
+struct PositionsTracker {
+    start_pos: TracePos,
+    end_pos: TracePos,
+}
+
+#[derive(Debug, PartialEq, Eq, Clone, Copy)]
+pub enum CtorState {
+    BeforeStarted,
+    BeforeCompleted,
+    AfterStarted,
+    AfterCompleted,
+}
+
+impl SubTraceLoreCtor {
+    pub(super) fn from_before_start(value_pos: TracePos, data_keeper: &DataKeeper) -> Self {
+        let before_tracker = PositionsTracker {
+            start_pos: data_keeper.result_trace_next_pos(),
+            end_pos: 0.into(),
+        };
+
+        Self {
+            value_pos,
+            before_tracker,
+            ..<_>::default()
+        }
+    }
+
+    pub(super) fn before_end(&mut self, data_keeper: &DataKeeper) {
+        self.before_tracker.end_pos = data_keeper.result_trace_next_pos();
+        self.state.next();
+    }
+
+    pub(super) fn maybe_before_end(&mut self, data_keeper: &DataKeeper) {
+        if self.state != CtorState::BeforeStarted {
+            return;
+        }
+
+        self.before_tracker.end_pos = data_keeper.result_trace_next_pos();
+        self.state.next();
+    }
+
+    pub(super) fn after_start(&mut self, data_keeper: &DataKeeper) {
+        self.after_tracker.start_pos = data_keeper.result_trace_next_pos();
+        self.state.next();
+    }
+
+    pub(super) fn after_end(&mut self, data_keeper: &DataKeeper) {
+        self.after_tracker.end_pos = data_keeper.result_trace_next_pos();
+        self.state.next();
+    }
+
+    pub(super) fn into_subtrace_lore(self) -> FoldSubTraceLore {
+        let before = SubTraceDesc {
+            begin_pos: self.before_tracker.start_pos,
+            subtrace_len: self.before_tracker.len() as _,
+        };
+
+        let after = SubTraceDesc {
+            begin_pos: self.after_tracker.start_pos,
+            subtrace_len: self.after_tracker.len() as _,
+        };
+
+        FoldSubTraceLore {
+            value_pos: self.value_pos,
+            subtraces_desc: vec![before, after],
+        }
+    }
+
+    // this function should be called in a situation of early exit from fold,
+    // for more details see the comment above SubTraceLoreCtorQueue::finish().
+    pub(super) fn finish(&mut self, data_keeper: &DataKeeper) {
+        use CtorState::*;
+
+        match self.state {
+            BeforeStarted => {
+                self.before_end(data_keeper);
+                self.after_start(data_keeper);
+                self.after_end(data_keeper);
+            }
+            BeforeCompleted => {
+                self.after_start(data_keeper);
+                self.after_end(data_keeper);
+            }
+            AfterStarted => {
+                self.after_end(data_keeper);
+            }
+            AfterCompleted => {}
+        }
+    }
+}
+
+impl PositionsTracker {
+    fn len(&self) -> usize {
+        (self.end_pos - self.start_pos).into()
+    }
+}
+
+impl Default for CtorState {
+    fn default() -> Self {
+        Self::BeforeStarted
+    }
+}
+
+impl CtorState {
+    fn next(&mut self) {
+        use CtorState::*;
+
+        let next_state = match self {
+            BeforeStarted => BeforeCompleted,
+            BeforeCompleted => AfterStarted,
+            AfterStarted => AfterCompleted,
+            AfterCompleted => AfterCompleted,
+        };
+
+        *self = next_state;
+    }
+}
+
\ No newline at end of file diff --git a/src/air_trace_handler/state_automata/fold_fsm/lore_ctor_queue.rs.html b/src/air_trace_handler/state_automata/fold_fsm/lore_ctor_queue.rs.html new file mode 100644 index 00000000..12cdb5a1 --- /dev/null +++ b/src/air_trace_handler/state_automata/fold_fsm/lore_ctor_queue.rs.html @@ -0,0 +1,213 @@ +lore_ctor_queue.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::DataKeeper;
+use super::FoldLore;
+use super::ResolvedSubTraceDescs;
+use super::SubTraceLoreCtor;
+
+/// This queue emulates behaviour of fold states traversal:
+///  - at first states are traversal forward until the end of states
+///  - then states are traversal backward the same times
+#[derive(Debug, Default, Clone)]
+pub(super) struct SubTraceLoreCtorQueue {
+    queue: Vec<LoreCtorDesc>,
+    back_traversal_pos: usize,
+    back_traversal_started: bool,
+}
+
+impl SubTraceLoreCtorQueue {
+    pub(super) fn current(&mut self) -> &mut LoreCtorDesc {
+        &mut self.queue[self.back_traversal_pos - 1]
+    }
+
+    pub(super) fn add_element(
+        &mut self,
+        ctor: SubTraceLoreCtor,
+        prev_lore: Option<ResolvedSubTraceDescs>,
+        current_lore: Option<ResolvedSubTraceDescs>,
+    ) {
+        let new_element = LoreCtorDesc {
+            ctor,
+            prev_lore,
+            current_lore,
+        };
+        self.queue.push(new_element);
+        self.back_traversal_pos += 1;
+    }
+
+    pub(super) fn traverse_back(&mut self) {
+        self.back_traversal_pos -= 1;
+    }
+
+    pub(super) fn start_back_traverse(&mut self) {
+        self.back_traversal_started = true;
+    }
+
+    pub(super) fn end_back_traverse(&mut self) {
+        self.back_traversal_started = false;
+    }
+
+    pub(super) fn back_traversal_started(&self) -> bool {
+        self.back_traversal_started
+    }
+
+    pub(super) fn transform_to_lore(&mut self) -> FoldLore {
+        self.queue
+            .drain(..)
+            .map(|l| l.ctor.into_subtrace_lore())
+            .collect::<Vec<_>>()
+    }
+
+    // this function should be called in a case of early exit from fold, f.e.
+    // in last error bubbling or join behaviour in the following situations:
+    //    (fold iterable iterator
+    //      (seq
+    //        (call .. [joined_variable])
+    //        (next iterator)
+    //      )
+    //    )
+    //
+    // In such example next wouldn't be called and correspondingly all pushed to
+    // ctor queue states wouldn't be properly finished. This function serves such
+    // situations, having called from generation_end.
+    pub(super) fn finish(&mut self, data_keeper: &DataKeeper) {
+        // TODO: optimize it
+        for ctor in self.queue.iter_mut() {
+            ctor.ctor.finish(data_keeper);
+        }
+
+        // set this to zero to correspond that all states were "observed" with back traversal
+        self.back_traversal_pos = 0;
+    }
+}
+
+#[derive(Debug, Clone)]
+pub(super) struct LoreCtorDesc {
+    pub(super) ctor: SubTraceLoreCtor,
+    pub(super) prev_lore: Option<ResolvedSubTraceDescs>,
+    pub(super) current_lore: Option<ResolvedSubTraceDescs>,
+}
+
\ No newline at end of file diff --git a/src/air_trace_handler/state_automata/fold_fsm/state_handler.rs.html b/src/air_trace_handler/state_automata/fold_fsm/state_handler.rs.html new file mode 100644 index 00000000..14533088 --- /dev/null +++ b/src/air_trace_handler/state_automata/fold_fsm/state_handler.rs.html @@ -0,0 +1,143 @@ +state_handler.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::*;
+use crate::merger::MergeCtxType;
+use crate::ResolvedFold;
+
+use num_traits::ops::checked::CheckedAdd;
+
+/// This state updater manage to do the same thing as CtxStateHandler in ParFSM,
+/// for details please see its detailed comment.
+#[derive(Debug, Default, Clone)]
+pub(super) struct CtxStateHandler {
+    state_pair: CtxStatesPair,
+}
+
+impl CtxStateHandler {
+    pub(super) fn prepare(
+        prev_fold: &ResolvedFold,
+        current_fold: &ResolvedFold,
+        data_keeper: &DataKeeper,
+    ) -> FSMResult<Self> {
+        let prev_state = compute_new_state(prev_fold, data_keeper, MergeCtxType::Previous)?;
+        let current_state = compute_new_state(current_fold, data_keeper, MergeCtxType::Current)?;
+        let state_pair = CtxStatesPair::new(prev_state, current_state);
+
+        let updater = Self { state_pair };
+        Ok(updater)
+    }
+
+    pub(super) fn set_final_states(self, data_keeper: &mut DataKeeper) {
+        update_ctx_states(self.state_pair, data_keeper)
+    }
+}
+
+fn compute_new_state(fold: &ResolvedFold, data_keeper: &DataKeeper, ctx_type: MergeCtxType) -> FSMResult<CtxState> {
+    let ctx = match ctx_type {
+        MergeCtxType::Previous => &data_keeper.prev_ctx,
+        MergeCtxType::Current => &data_keeper.current_ctx,
+    };
+
+    let current_position = ctx.slider.position();
+    let pos = current_position
+        .checked_add(&fold.fold_states_count.into())
+        .ok_or_else(|| StateFSMError::FoldPosOverflow(fold.clone(), current_position, ctx_type))?;
+
+    let current_len = ctx.slider.subtrace_len();
+    let subtrace_len = current_len
+        .checked_sub(fold.fold_states_count)
+        // TODO judging by the error message, one should pass current_len instead.
+        .ok_or_else(|| StateFSMError::FoldLenUnderflow(fold.clone(), current_position, ctx_type))?;
+
+    let state = CtxState::new(pos, subtrace_len);
+    Ok(state)
+}
+
\ No newline at end of file diff --git a/src/air_trace_handler/state_automata/fsm_queue.rs.html b/src/air_trace_handler/state_automata/fsm_queue.rs.html new file mode 100644 index 00000000..bbfc6639 --- /dev/null +++ b/src/air_trace_handler/state_automata/fsm_queue.rs.html @@ -0,0 +1,123 @@ +fsm_queue.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::FSMResult;
+use super::FoldFSM;
+use super::ParFSM;
+use super::StateFSMError;
+
+use std::collections::HashMap;
+
+#[derive(Debug, Default)]
+pub(crate) struct FSMKeeper {
+    par_stack: Vec<ParFSM>,
+    fold_map: HashMap<u32, FoldFSM>,
+}
+
+impl FSMKeeper {
+    pub(crate) fn push_par(&mut self, par_fsm: ParFSM) {
+        self.par_stack.push(par_fsm);
+    }
+
+    pub(crate) fn add_fold(&mut self, fold_id: u32, fold_fsm: FoldFSM) {
+        self.fold_map.insert(fold_id, fold_fsm);
+    }
+
+    pub(crate) fn last_par(&mut self) -> FSMResult<&mut ParFSM> {
+        self.par_stack.last_mut().ok_or(StateFSMError::ParQueueIsEmpty)
+    }
+
+    pub(crate) fn pop_par(&mut self) -> FSMResult<ParFSM> {
+        self.par_stack.pop().ok_or(StateFSMError::ParQueueIsEmpty)
+    }
+
+    pub(crate) fn fold_mut(&mut self, fold_id: u32) -> FSMResult<&mut FoldFSM> {
+        self.fold_map
+            .get_mut(&fold_id)
+            .ok_or(StateFSMError::FoldFSMNotFound(fold_id))
+    }
+
+    pub(crate) fn extract_fold(&mut self, fold_id: u32) -> FSMResult<FoldFSM> {
+        self.fold_map
+            .remove(&fold_id)
+            .ok_or(StateFSMError::FoldFSMNotFound(fold_id))
+    }
+}
+
\ No newline at end of file diff --git a/src/air_trace_handler/state_automata/mod.rs.html b/src/air_trace_handler/state_automata/mod.rs.html new file mode 100644 index 00000000..4e866739 --- /dev/null +++ b/src/air_trace_handler/state_automata/mod.rs.html @@ -0,0 +1,99 @@ +mod.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+mod errors;
+mod fold_fsm;
+mod fsm_queue;
+mod par_fsm;
+mod state_inserter;
+mod utils;
+
+pub use errors::StateFSMError;
+pub use par_fsm::SubgraphType;
+
+pub(crate) type FSMResult<T> = std::result::Result<T, StateFSMError>;
+
+pub(super) use fold_fsm::FoldFSM;
+pub(super) use fsm_queue::FSMKeeper;
+pub(super) use par_fsm::ParFSM;
+
+use super::data_keeper::KeeperError;
+use super::merger::MergeCtxType;
+use super::merger::MergerParResult;
+use super::DataKeeper;
+use super::ExecutedState;
+use super::FoldResult;
+use super::FoldSubTraceLore;
+use super::MergeCtx;
+use super::MergerFoldResult;
+use super::ParResult;
+use super::ResolvedFold;
+use super::ResolvedSubTraceDescs;
+use state_inserter::StateInserter;
+use utils::*;
+
\ No newline at end of file diff --git a/src/air_trace_handler/state_automata/par_fsm.rs.html b/src/air_trace_handler/state_automata/par_fsm.rs.html new file mode 100644 index 00000000..cd26f489 --- /dev/null +++ b/src/air_trace_handler/state_automata/par_fsm.rs.html @@ -0,0 +1,215 @@ +par_fsm.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+mod par_builder;
+mod state_handler;
+
+use super::*;
+use par_builder::ParBuilder;
+use state_handler::CtxStateHandler;
+
+/// Manages a par state, its state transitioning functions must be called in the following way:
+///   from_left_started
+///     -> left_completed
+///     -> right_completed
+#[derive(Debug, Default, Clone)]
+pub(crate) struct ParFSM {
+    prev_par: ParResult,
+    current_par: ParResult,
+    state_inserter: StateInserter,
+    state_handler: CtxStateHandler,
+    par_builder: ParBuilder,
+}
+
+#[derive(Debug, Clone, Copy, Eq, PartialEq)]
+pub enum SubgraphType {
+    Left,
+    Right,
+}
+
+impl ParFSM {
+    pub(crate) fn from_left_started(ingredients: MergerParResult, data_keeper: &mut DataKeeper) -> FSMResult<Self> {
+        // default is a par with empty left and right subgraphs
+        let prev_par = ingredients.prev_par.unwrap_or_default();
+        let current_par = ingredients.current_par.unwrap_or_default();
+
+        let state_inserter = StateInserter::from_keeper(data_keeper);
+        let state_handler = CtxStateHandler::prepare(prev_par, current_par, data_keeper)?;
+        let par_builder = ParBuilder::from_keeper(data_keeper, &state_inserter);
+
+        let par_fsm = Self {
+            prev_par,
+            current_par,
+            state_inserter,
+            state_handler,
+            par_builder,
+        };
+
+        par_fsm.prepare_sliders(data_keeper, SubgraphType::Left)?;
+
+        Ok(par_fsm)
+    }
+
+    pub(crate) fn left_completed(&mut self, data_keeper: &mut DataKeeper) {
+        self.par_builder.track(data_keeper, SubgraphType::Left);
+        self.state_handler.handle_subgraph_end(data_keeper, SubgraphType::Left);
+
+        // all invariants were checked in the ctor
+        let _ = self.prepare_sliders(data_keeper, SubgraphType::Right);
+    }
+
+    pub(crate) fn right_completed(mut self, data_keeper: &mut DataKeeper) {
+        self.par_builder.track(data_keeper, SubgraphType::Right);
+        let state = self.par_builder.build();
+        self.state_inserter.insert(data_keeper, state);
+
+        self.state_handler.handle_subgraph_end(data_keeper, SubgraphType::Right);
+    }
+
+    fn prepare_sliders(&self, data_keeper: &mut DataKeeper, subgraph_type: SubgraphType) -> FSMResult<()> {
+        let (prev_len, current_len) = match subgraph_type {
+            SubgraphType::Left => (self.prev_par.left_size, self.current_par.left_size),
+            SubgraphType::Right => (self.prev_par.right_size, self.current_par.right_size),
+        };
+
+        data_keeper.prev_slider_mut().set_subtrace_len(prev_len as _)?;
+        data_keeper.current_slider_mut().set_subtrace_len(current_len as _)?;
+
+        Ok(())
+    }
+}
+
+use std::fmt;
+
+impl fmt::Display for SubgraphType {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        match self {
+            SubgraphType::Left => write!(f, "left"),
+            SubgraphType::Right => write!(f, "right"),
+        }
+    }
+}
+
\ No newline at end of file diff --git a/src/air_trace_handler/state_automata/par_fsm/par_builder.rs.html b/src/air_trace_handler/state_automata/par_fsm/par_builder.rs.html new file mode 100644 index 00000000..d6ff3bc5 --- /dev/null +++ b/src/air_trace_handler/state_automata/par_fsm/par_builder.rs.html @@ -0,0 +1,119 @@ +par_builder.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::*;
+
+/// Tracks lens of data_keeper.result_trace to build resulted Par state at the end.
+#[derive(Debug, Default, Clone)]
+pub(super) struct ParBuilder {
+    saved_states_count: usize,
+    left_subgraph_size: usize,
+    right_subgraph_size: usize,
+}
+
+impl ParBuilder {
+    // StateInserter here needs to guaranteed that ParBuilder creates after it,
+    // it must be so to right track a left subgraph size
+    pub(super) fn from_keeper(data_keeper: &DataKeeper, _: &StateInserter) -> Self {
+        let saved_states_count = data_keeper.result_states_count();
+
+        Self {
+            saved_states_count,
+            left_subgraph_size: 0,
+            right_subgraph_size: 0,
+        }
+    }
+
+    pub(super) fn track(&mut self, data_keeper: &DataKeeper, subgraph_type: SubgraphType) {
+        let prev_states_count = self.saved_states_count;
+        let states_count = data_keeper.result_states_count();
+        let resulted_states_count = states_count - prev_states_count;
+
+        match subgraph_type {
+            SubgraphType::Left => self.left_subgraph_size = resulted_states_count,
+            SubgraphType::Right => self.right_subgraph_size = resulted_states_count,
+        }
+        self.saved_states_count = data_keeper.result_trace.len();
+    }
+
+    pub(super) fn build(self) -> ExecutedState {
+        // TODO: check that usize could be converted into u32
+        ExecutedState::par(self.left_subgraph_size, self.right_subgraph_size)
+    }
+}
+
\ No newline at end of file diff --git a/src/air_trace_handler/state_automata/par_fsm/state_handler.rs.html b/src/air_trace_handler/state_automata/par_fsm/state_handler.rs.html new file mode 100644 index 00000000..de5913cb --- /dev/null +++ b/src/air_trace_handler/state_automata/par_fsm/state_handler.rs.html @@ -0,0 +1,173 @@ +state_handler.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+mod new_states_calculation;
+
+use super::*;
+use new_states_calculation::compute_new_states;
+
+/// At the end of a Par execution it's needed to update subtrace_len and positions of both sliders.
+///
+/// To see why it's really needed, imagine the following trace:
+/// [par 12, 3]
+///     [par 3, 5]                                                       <- left subgraph of [par 9, 3]
+///         [call rs 1] [call rs 2] [call rs 3]                          <- left subgraph of [par 3, 5]
+///         [call rs 4] [call rs 5] [call rs 6] [call rs 7] [call rs 8]  <- right subgraph of [par 3, 5]
+///     [par 1, 1]                                                       <- right subgraph of [par 9, 3]
+///         [call e 9]                                                   <- left subgraph of [par 1, 1]
+///         [call e 10]                                                  <- right subgraph of [par 1, 1]
+///
+/// where
+///     call rs N - request sent state of Nth call
+///     call e N - executed state of Nth call
+///
+/// and the following script:
+/// (par
+///     (xor
+///         (par
+///             (call 1-3)
+///             (call 4-8)
+///         )
+///         (null)  <- here could be any non-fallible set of instructions
+///     )
+///     (par
+///         (call 9)
+///         (call 10)
+///     )
+/// )
+///
+/// Suppose that call 5 (corresponds to [call rs 5]) will fail (f.e. call_service returns a service
+/// error). Since it's wrapped with xor, then right subgraph of xor (null) will be executed.
+/// After that next par will be executed. This par has corresponding state [par 1, 1] in a trace,
+/// and to allow slider to pop it it's needed to set updated position in a proper way, because
+/// otherwise [call rs 6] will be returned.
+///
+/// This struct manages to save the updated lens and pos and update slider states to prevent
+/// such situations.
+#[derive(Debug, Default, Clone, Copy)]
+pub(super) struct CtxStateHandler {
+    left_pair: CtxStatesPair,
+    right_pair: CtxStatesPair,
+}
+
+impl CtxStateHandler {
+    /// Prepare new states that sliders will have after finishing executing of each subgraph.
+    pub(super) fn prepare(prev_par: ParResult, current_par: ParResult, data_keeper: &DataKeeper) -> FSMResult<Self> {
+        let left_pair = compute_new_states(data_keeper, prev_par, current_par, SubgraphType::Left)?;
+        let right_pair = compute_new_states(data_keeper, prev_par, current_par, SubgraphType::Right)?;
+
+        let handler = Self { left_pair, right_pair };
+
+        Ok(handler)
+    }
+
+    pub(super) fn handle_subgraph_end(self, data_keeper: &mut DataKeeper, subgraph_type: SubgraphType) {
+        match subgraph_type {
+            SubgraphType::Left => update_ctx_states(self.left_pair, data_keeper),
+            SubgraphType::Right => update_ctx_states(self.right_pair, data_keeper),
+        }
+    }
+}
+
\ No newline at end of file diff --git a/src/air_trace_handler/state_automata/par_fsm/state_handler/new_states_calculation.rs.html b/src/air_trace_handler/state_automata/par_fsm/state_handler/new_states_calculation.rs.html new file mode 100644 index 00000000..1409e099 --- /dev/null +++ b/src/air_trace_handler/state_automata/par_fsm/state_handler/new_states_calculation.rs.html @@ -0,0 +1,121 @@ +new_states_calculation.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::*;
+use crate::data_keeper::TraceSlider;
+
+use num_traits::CheckedAdd;
+
+pub(super) fn compute_new_states(
+    data_keeper: &DataKeeper,
+    prev_par: ParResult,
+    current_par: ParResult,
+    subgraph_type: SubgraphType,
+) -> FSMResult<CtxStatesPair> {
+    let prev_state = compute_new_state(prev_par, subgraph_type, data_keeper.prev_slider())?;
+    let current_state = compute_new_state(current_par, subgraph_type, data_keeper.current_slider())?;
+
+    let pair = CtxStatesPair::new(prev_state, current_state);
+    Ok(pair)
+}
+
+fn compute_new_state(par_result: ParResult, subgraph_type: SubgraphType, slider: &TraceSlider) -> FSMResult<CtxState> {
+    let par_subgraph_len = match subgraph_type {
+        SubgraphType::Left => par_result.left_size,
+        SubgraphType::Right => par_result.size().ok_or(StateFSMError::ParLenOverflow(par_result))?,
+    };
+
+    let new_position = slider
+        .position()
+        .checked_add(&air_interpreter_data::TracePos::from(par_subgraph_len))
+        .ok_or_else(|| StateFSMError::ParPosOverflow(par_result, slider.position(), MergeCtxType::Previous))?;
+
+    assert!(std::mem::size_of_val(&par_subgraph_len) <= std::mem::size_of::<usize>());
+    let new_subtrace_len = match subgraph_type {
+        SubgraphType::Left => par_subgraph_len,
+        SubgraphType::Right => slider
+            .subtrace_len()
+            .checked_sub(par_subgraph_len)
+            .ok_or_else(|| StateFSMError::ParLenUnderflow(par_result, slider.subtrace_len(), MergeCtxType::Current))?,
+    };
+
+    let new_state = CtxState::new(new_position, new_subtrace_len);
+    Ok(new_state)
+}
+
\ No newline at end of file diff --git a/src/air_trace_handler/state_automata/state_inserter.rs.html b/src/air_trace_handler/state_automata/state_inserter.rs.html new file mode 100644 index 00000000..8b0ab7e0 --- /dev/null +++ b/src/air_trace_handler/state_automata/state_inserter.rs.html @@ -0,0 +1,89 @@ +state_inserter.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::DataKeeper;
+use super::ExecutedState;
+use air_interpreter_data::TracePos;
+
+/// This one is intended to optimize insertion in data to avoid insertion in a middle of it.
+/// This is achieved by inserting a temporary state, track insert position and insert there
+/// the final state.
+#[derive(Debug, Default, Clone)]
+pub(super) struct StateInserter {
+    position: TracePos,
+}
+
+impl StateInserter {
+    pub(super) fn from_keeper(data_keeper: &mut DataKeeper) -> Self {
+        let position = data_keeper.result_trace_next_pos();
+        // this par is a temporary state
+        data_keeper.result_trace.push(ExecutedState::par(0, 0));
+
+        Self { position }
+    }
+
+    pub(super) fn insert(self, data_keeper: &mut DataKeeper, state: ExecutedState) {
+        data_keeper.result_trace[self.position] = state;
+    }
+}
+
\ No newline at end of file diff --git a/src/air_trace_handler/state_automata/utils.rs.html b/src/air_trace_handler/state_automata/utils.rs.html new file mode 100644 index 00000000..702a0faf --- /dev/null +++ b/src/air_trace_handler/state_automata/utils.rs.html @@ -0,0 +1,135 @@ +utils.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use air_interpreter_data::TraceLen;
+
+use super::DataKeeper;
+use super::FSMResult;
+use super::MergeCtx;
+use crate::TracePos;
+
+#[derive(Debug, Default, Clone, Copy)]
+pub(super) struct CtxState {
+    pub(super) pos: TracePos,
+    pub(super) subtrace_len: TraceLen,
+}
+
+#[derive(Debug, Default, Clone, Copy)]
+pub(super) struct CtxStatesPair {
+    pub(super) prev_state: CtxState,
+    pub(super) current_state: CtxState,
+}
+
+impl CtxState {
+    pub(super) fn new(pos: TracePos, subtrace_len: TraceLen) -> Self {
+        Self { pos, subtrace_len }
+    }
+
+    pub(super) fn update_ctx_state(self, ctx: &mut MergeCtx) -> FSMResult<()> {
+        ctx.slider
+            .set_position_and_len(self.pos, self.subtrace_len)
+            .map_err(Into::into)
+    }
+}
+
+impl CtxStatesPair {
+    pub(super) fn new(prev_state: CtxState, current_state: CtxState) -> Self {
+        Self {
+            prev_state,
+            current_state,
+        }
+    }
+}
+
+pub(super) fn update_ctx_states(state_pair: CtxStatesPair, data_keeper: &mut DataKeeper) {
+    // these calls shouldn't produce a error, because sizes become less and
+    // they have been already checked in a state updater ctor. It's important
+    // to make it in a such way, because this function could be called from
+    // error_exit that shouldn't fail.
+    let _ = state_pair.prev_state.update_ctx_state(&mut data_keeper.prev_ctx);
+    let _ = state_pair.current_state.update_ctx_state(&mut data_keeper.current_ctx);
+}
+
\ No newline at end of file diff --git a/src/air_utils/lib.rs.html b/src/air_utils/lib.rs.html new file mode 100644 index 00000000..4b0a1561 --- /dev/null +++ b/src/air_utils/lib.rs.html @@ -0,0 +1,141 @@ +lib.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#[macro_export]
+macro_rules! measure {
+    (target: $target:expr, $expr:expr, $span:literal) => ({
+        let span = tracing::span!(target=$target, $span);
+        let _enter = span.enter();
+        $expr
+    });
+    ($expr:expr, $level:expr, $span:literal, $($fields:tt)*) => ({
+        let span = tracing::span!($level, $span, $($fields)*);
+        let _enter = span.enter();
+        $expr
+    });
+    ($expr:expr, $level:expr, $span:literal) => ({
+        let span = tracing::span!($level, $span);
+        let _enter = span.enter();
+        $expr
+    });
+    ($expr:expr, $span:literal) => ({
+        let span = tracing::span!($span);
+        let _enter = span.enter();
+        $expr
+    });
+}
+
+#[macro_export]
+macro_rules! auto_checked_add {
+    [$type:ty] => {
+        impl ::num_traits::CheckedAdd for $type {
+            fn checked_add(&self, other: &Self) -> Option<Self> {
+                self.0.checked_add(other.0).map(Self)
+            }
+        }
+    };
+}
+
+#[macro_export]
+macro_rules! farewell_if_fail {
+    ($cmd:expr, $raw_prev_data:expr, $soft_limits_triggering:expr) => {
+        match $cmd {
+            Ok(result) => result,
+            // return the prev data in case of errors
+            Err(error) => {
+                return Err(farewell::from_uncatchable_error(
+                    $raw_prev_data,
+                    error,
+                    $soft_limits_triggering,
+                ))
+            }
+        };
+    };
+}
+
\ No newline at end of file diff --git a/src/avm_data_store/lib.rs.html b/src/avm_data_store/lib.rs.html new file mode 100644 index 00000000..6a0c1e6b --- /dev/null +++ b/src/avm_data_store/lib.rs.html @@ -0,0 +1,437 @@ +lib.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#![forbid(unsafe_code)]
+#![warn(rust_2018_idioms)]
+#![deny(
+    dead_code,
+    nonstandard_style,
+    unused_imports,
+    unused_mut,
+    unused_variables,
+    unused_unsafe,
+    unreachable_patterns
+)]
+
+use avm_interface::raw_outcome::RawAVMOutcome;
+
+use serde::Deserialize;
+use serde::Serialize;
+use std::borrow::Cow;
+use std::time::Duration;
+
+/// This trait is used for
+///   - persisting prev_data between successive calls of an interpreter
+///   - logging previous, current, and new data in case of spikes
+pub trait DataStore {
+    type Error;
+
+    fn initialize(&mut self) -> Result<(), Self::Error>;
+
+    fn store_data(
+        &mut self,
+        data: &[u8],
+        particle_id: &str,
+        current_peer_id: &str,
+    ) -> Result<(), Self::Error>;
+
+    fn read_data(
+        &mut self,
+        particle_id: &str,
+        current_peer_id: &str,
+    ) -> Result<Vec<u8>, Self::Error>;
+
+    /// Cleanup data that become obsolete.
+    fn cleanup_data(&mut self, particle_id: &str, current_peer_id: &str)
+        -> Result<(), Self::Error>;
+
+    /// Returns true if an anomaly happened and it's necessary to save execution data
+    /// for debugging purposes.
+    ///  execution_time - time taken by the interpreter to execute provided script
+    ///  memory_delta - count of bytes on which an interpreter heap has been extended
+    ///                 during execution of a particle
+    ///  outcome - a result of AquaVM invocation
+    fn detect_anomaly(
+        &self,
+        execution_time: Duration,
+        memory_delta: usize,
+        outcome: &RawAVMOutcome,
+    ) -> bool;
+
+    fn collect_anomaly_data(
+        &mut self,
+        particle_id: &str,
+        current_peer_id: &str,
+        anomaly_data: AnomalyData<'_>,
+    ) -> Result<(), Self::Error>;
+}
+
+#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
+pub struct AnomalyData<'data> {
+    #[serde(borrow)]
+    pub air_script: Cow<'data, str>,
+    #[serde(borrow, with = "serde_bytes")]
+    pub particle: Cow<'data, [u8]>, // it's byte because of the restriction on trait objects methods
+    #[serde(borrow, with = "serde_bytes")]
+    pub prev_data: Cow<'data, [u8]>,
+    #[serde(borrow, with = "serde_bytes")]
+    pub current_data: Cow<'data, [u8]>,
+    #[serde(borrow, with = "serde_bytes")]
+    pub call_results: Cow<'data, [u8]>,
+    #[serde(borrow, with = "serde_bytes")]
+    pub avm_outcome: Cow<'data, [u8]>,
+    pub execution_time: Duration,
+    pub memory_delta: usize,
+}
+
+impl<'data> AnomalyData<'data> {
+    #[allow(clippy::too_many_arguments)]
+    pub fn new(
+        air_script: &'data str,
+        particle: &'data [u8],
+        prev_data: &'data [u8],
+        current_data: &'data [u8],
+        call_results: &'data [u8],
+        avm_outcome: &'data [u8],
+        execution_time: Duration,
+        memory_delta: usize,
+    ) -> Self {
+        Self {
+            air_script: air_script.into(),
+            particle: particle.into(),
+            prev_data: prev_data.into(),
+            current_data: current_data.into(),
+            call_results: call_results.into(),
+            avm_outcome: avm_outcome.into(),
+            execution_time,
+            memory_delta,
+        }
+    }
+}
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+
+    fn anomaly_json(
+        air_script: &str,
+        particle: &[u8],
+        prev_data: &[u8],
+        current_data: &[u8],
+        call_results: &[u8],
+        avm_outcome: &[u8],
+    ) -> String {
+        format!(
+            concat!(
+                r#"{{"air_script":{air_script},"#,
+                r#""particle":{particle},"#,
+                r#""prev_data":{prev_data},"#,
+                r#""current_data":{current_data},"#,
+                r#""call_results":{call_results},"#,
+                r#""avm_outcome":{avm_outcome},"#,
+                r#""execution_time":{{"secs":42,"nanos":0}},"#,
+                r#""memory_delta":123"#,
+                r#"}}"#
+            ),
+            air_script = serde_json::to_string(air_script).unwrap(),
+            particle = serde_json::to_string(particle).unwrap(),
+            prev_data = serde_json::to_string(prev_data).unwrap(),
+            current_data = serde_json::to_string(current_data).unwrap(),
+            call_results = serde_json::to_string(call_results).unwrap(),
+            avm_outcome = serde_json::to_string(avm_outcome).unwrap(),
+        )
+    }
+    #[test]
+    fn anomaly_data_se() {
+        let anomaly = AnomalyData::new(
+            "(null)",
+            br#"{"data":"value"}"#,  // not real data
+            br#"{"trace":[]}"#,      // not real data
+            br#"{"trace":[1,2,3]}"#, // not real data
+            b"{}",                   // not real data
+            b"{}",
+            Duration::from_secs(42),
+            123,
+        );
+
+        let json_data = serde_json::to_string(&anomaly).expect("JSON serialize anomaly data");
+        let expected = anomaly_json(
+            &anomaly.air_script,
+            &anomaly.particle,
+            &anomaly.prev_data,
+            &anomaly.current_data,
+            &anomaly.call_results,
+            &anomaly.avm_outcome,
+        );
+        assert_eq!(json_data, expected);
+    }
+
+    #[test]
+    fn anomaly_data_de() {
+        let particle = br#"{"particle":"data"}"#;
+        let current_data = br#"{"data":"current"}"#;
+        let prev_data = br#"{"data":"prev"}"#;
+        let avm_outcome = br#"{"avm":[1,2,3]}"#;
+        let call_results = br#"{"call_results": "excellent result"}"#;
+        let json_data = anomaly_json(
+            "(null)",
+            &particle[..],
+            &prev_data[..],
+            &current_data[..],
+            &call_results[..],
+            &avm_outcome[..],
+        );
+
+        let anomaly: AnomalyData<'_> =
+            serde_json::from_str(&json_data).expect("deserialize JSON anomaly data");
+
+        assert_eq!(
+            anomaly,
+            AnomalyData::new(
+                "(null)",
+                &particle[..],
+                &prev_data[..],
+                &current_data[..],
+                &call_results[..],
+                &avm_outcome[..],
+                Duration::from_secs(42),
+                123,
+            )
+        )
+    }
+}
+
\ No newline at end of file diff --git a/src/avm_interface/call_request_parameters.rs.html b/src/avm_interface/call_request_parameters.rs.html new file mode 100644 index 00000000..c5764bf6 --- /dev/null +++ b/src/avm_interface/call_request_parameters.rs.html @@ -0,0 +1,245 @@ +call_request_parameters.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::JValue;
+use crate::CallSeDeErrors;
+
+use air_interpreter_interface::SerializedCallRequests;
+use polyplets::SecurityTetraplet;
+use serde::Deserialize;
+use serde::Serialize;
+
+use std::collections::HashMap;
+
+pub type CallRequests = HashMap<u32, CallRequestParams>;
+
+/// Contains arguments of a call instruction and all other necessary information
+/// required for calling a service.
+#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
+pub struct CallRequestParams {
+    /// Id of a service that should be called.
+    pub service_id: String,
+
+    /// Name of a function from service identified by service_id that should be called.
+    pub function_name: String,
+
+    /// Arguments that should be passed to the function.
+    pub arguments: Vec<JValue>,
+
+    /// Tetraplets that should be passed to the service.
+    pub tetraplets: Vec<Vec<SecurityTetraplet>>,
+}
+
+impl CallRequestParams {
+    pub fn new(
+        service_id: impl Into<String>,
+        function_name: impl Into<String>,
+        arguments: Vec<JValue>,
+        tetraplets: Vec<Vec<SecurityTetraplet>>,
+    ) -> Self {
+        Self {
+            service_id: service_id.into(),
+            function_name: function_name.into(),
+            arguments,
+            tetraplets,
+        }
+    }
+
+    pub(crate) fn from_raw(
+        call_params: air_interpreter_interface::CallRequestParams,
+    ) -> Result<Self, CallSeDeErrors> {
+        use air_interpreter_interface::CallArgumentsRepr;
+        use air_interpreter_interface::TetrapletsRepr;
+        use air_interpreter_sede::FromSerialized;
+
+        // TODO that's different JValue!
+        let arguments: Vec<JValue> = CallArgumentsRepr
+            .deserialize(&call_params.arguments)
+            .map_err(|de_error| CallSeDeErrors::CallParamsArgsDeFailed {
+                call_params: call_params.clone(),
+                de_error,
+            })?;
+
+        let tetraplets: Vec<Vec<SecurityTetraplet>> = TetrapletsRepr
+            .deserialize(&call_params.tetraplets)
+            .map_err(|de_error| CallSeDeErrors::CallParamsTetrapletsDeFailed {
+                call_params: call_params.clone(),
+                de_error,
+            })?;
+
+        let call_params = Self {
+            service_id: call_params.service_id,
+            function_name: call_params.function_name,
+            arguments,
+            tetraplets,
+        };
+
+        Ok(call_params)
+    }
+}
+
+pub(crate) fn from_raw_call_requests(
+    raw_call_params: SerializedCallRequests,
+) -> Result<CallRequests, CallSeDeErrors> {
+    use air_interpreter_interface::CallRequestsRepr;
+    use air_interpreter_sede::FromSerialized;
+
+    let call_requests: air_interpreter_interface::CallRequests =
+        match CallRequestsRepr.deserialize(&raw_call_params) {
+            Ok(requests) => requests,
+            Err(error) => {
+                return Err(CallSeDeErrors::CallRequestsDeError {
+                    raw_call_request: raw_call_params,
+                    error,
+                })
+                .map_err(Into::into)
+            }
+        };
+
+    call_requests
+        .into_iter()
+        .map(|(call_id, call_params)| -> Result<_, _> {
+            let call_params = CallRequestParams::from_raw(call_params)?;
+            Ok((call_id, call_params))
+        })
+        .collect::<Result<_, _>>()
+}
+
\ No newline at end of file diff --git a/src/avm_interface/call_service_result.rs.html b/src/avm_interface/call_service_result.rs.html new file mode 100644 index 00000000..39b85763 --- /dev/null +++ b/src/avm_interface/call_service_result.rs.html @@ -0,0 +1,159 @@ +call_service_result.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::JValue;
+
+use serde::Deserialize;
+use serde::Serialize;
+use std::collections::HashMap;
+
+pub type CallResults = HashMap<u32, CallServiceResult>;
+pub const CALL_SERVICE_SUCCESS: i32 = 0;
+
+/// Represents an executed host function result.
+#[derive(Debug, Default, Clone, Serialize, Deserialize, PartialEq, Eq)]
+pub struct CallServiceResult {
+    /// A error code service or builtin returned, where CALL_SERVICE_SUCCESS represents success.
+    pub ret_code: i32,
+
+    /// Resulted JValue returned by a service string.
+    pub result: JValue,
+}
+
+impl CallServiceResult {
+    pub fn ok(result: JValue) -> Self {
+        Self {
+            ret_code: CALL_SERVICE_SUCCESS,
+            result,
+        }
+    }
+
+    pub fn err(err_code: i32, result: JValue) -> Self {
+        Self {
+            ret_code: err_code,
+            result,
+        }
+    }
+
+    pub fn into_raw(self) -> air_interpreter_interface::CallServiceResult {
+        let CallServiceResult { ret_code, result } = self;
+
+        air_interpreter_interface::CallServiceResult {
+            ret_code,
+            // TODO serializer
+            result: result.to_string(),
+        }
+    }
+}
+
+#[tracing::instrument(level = "debug", skip(call_results))]
+pub fn into_raw_result(call_results: CallResults) -> air_interpreter_interface::CallResults {
+    call_results
+        .into_iter()
+        .map(|(call_id, call_result)| (call_id.to_string(), call_result.into_raw()))
+        .collect::<_>()
+}
+
+use std::fmt;
+
+impl fmt::Display for CallServiceResult {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        write!(f, "ret_code: {}, result: '{}'", self.ret_code, self.result)
+    }
+}
+
\ No newline at end of file diff --git a/src/avm_interface/lib.rs.html b/src/avm_interface/lib.rs.html new file mode 100644 index 00000000..5449e8ad --- /dev/null +++ b/src/avm_interface/lib.rs.html @@ -0,0 +1,175 @@ +lib.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#![forbid(unsafe_code)]
+#![warn(rust_2018_idioms)]
+#![deny(
+    dead_code,
+    nonstandard_style,
+    unused_imports,
+    unused_mut,
+    unused_variables,
+    unused_unsafe,
+    unreachable_patterns
+)]
+
+mod call_request_parameters;
+mod call_service_result;
+mod outcome;
+mod particle_parameters;
+pub mod raw_outcome;
+
+use air_interpreter_interface::CallArgumentsDeserializeError;
+use air_interpreter_interface::CallRequestsDeserializeError;
+use air_interpreter_interface::CallResultsSerializeError;
+use air_interpreter_interface::SerializedCallRequests;
+use air_interpreter_interface::TetrapletDeserializeError;
+use thiserror::Error as ThisError;
+
+#[derive(Debug, ThisError)]
+#[allow(clippy::enum_variant_names)]
+pub enum CallSeDeErrors {
+    /// Errors encountered while trying to serialize call results.
+    #[error("error occurred while call results `{call_results:?}` deserialization: {se_error}")]
+    CallResultsSeFailed {
+        call_results: air_interpreter_interface::CallResults,
+        se_error: CallResultsSerializeError,
+    },
+
+    /// This error is encountered when deserialization pof call requests failed for some reason.
+    #[error("'{raw_call_request:?}' can't been serialized with error '{error}'")]
+    CallRequestsDeError {
+        raw_call_request: SerializedCallRequests,
+        error: CallRequestsDeserializeError,
+    },
+
+    /// Errors encountered while trying to deserialize arguments from call parameters returned
+    /// by the interpreter. In the corresponding struct such arguments are Vec<JValue> serialized
+    /// to a string.
+    #[error("error occurred while deserialization of arguments from call params `{call_params:?}`: {de_error}")]
+    CallParamsArgsDeFailed {
+        call_params: air_interpreter_interface::CallRequestParams,
+        de_error: CallArgumentsDeserializeError,
+    },
+
+    /// Errors encountered while trying to deserialize tetraplets from call parameters returned
+    /// by the interpreter. In the corresponding struct such tetraplets are
+    /// Vec<Vec<SecurityTetraplet>> serialized to a string.
+    #[error("error occurred while deserialization of tetraplets from call params `{call_params:?}`: {de_error}")]
+    CallParamsTetrapletsDeFailed {
+        call_params: air_interpreter_interface::CallRequestParams,
+        de_error: TetrapletDeserializeError,
+    },
+}
+
+type JValue = serde_json::Value;
+
+pub use air_interpreter_interface::SoftLimitsTriggering;
+pub use call_request_parameters::*;
+pub use call_service_result::*;
+pub use outcome::*;
+pub use particle_parameters::*;
+
\ No newline at end of file diff --git a/src/avm_interface/outcome.rs.html b/src/avm_interface/outcome.rs.html new file mode 100644 index 00000000..70d0be71 --- /dev/null +++ b/src/avm_interface/outcome.rs.html @@ -0,0 +1,241 @@ +outcome.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::CallRequests;
+use crate::raw_outcome::RawAVMOutcome;
+
+use air_interpreter_interface::SoftLimitsTriggering;
+use serde::Deserialize;
+use serde::Serialize;
+
+use std::time::Duration;
+
+#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
+pub struct AVMOutcome {
+    /// Contains script data that should be preserved in an executor of this interpreter
+    /// regardless of ret_code value.
+    pub data: Vec<u8>,
+
+    /// Collected parameters of all met call instructions that could be executed on a current peer.
+    pub call_requests: CallRequests,
+
+    /// Public keys of peers that should receive data.
+    pub next_peer_pks: Vec<String>,
+
+    /// Memory in bytes AVM linear heap was extended during execution by.
+    pub memory_delta: usize,
+
+    /// Time of a particle execution
+    /// (it counts only execution time without operations with DataStore and so on)
+    pub execution_time: Duration,
+
+    /// To store and convey soft limits triggering flags.
+    pub soft_limits_triggering: SoftLimitsTriggering,
+}
+
+#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
+pub struct ErrorAVMOutcome {
+    pub error_code: i64,
+    pub error_message: String,
+    pub outcome: AVMOutcome,
+}
+
+impl AVMOutcome {
+    fn new(
+        data: Vec<u8>,
+        call_requests: CallRequests,
+        next_peer_pks: Vec<String>,
+        memory_delta: usize,
+        execution_time: Duration,
+        soft_limits_triggering: SoftLimitsTriggering,
+    ) -> Self {
+        Self {
+            data,
+            call_requests,
+            next_peer_pks,
+            memory_delta,
+            execution_time,
+            soft_limits_triggering,
+        }
+    }
+
+    #[allow(clippy::result_large_err)]
+    pub fn from_raw_outcome(
+        raw_outcome: RawAVMOutcome,
+        memory_delta: usize,
+        execution_time: Duration,
+    ) -> Result<Self, ErrorAVMOutcome> {
+        use air_interpreter_interface::INTERPRETER_SUCCESS;
+
+        let RawAVMOutcome {
+            ret_code,
+            error_message,
+            data,
+            call_requests,
+            next_peer_pks,
+            soft_limits_triggering,
+        } = raw_outcome;
+
+        let avm_outcome = AVMOutcome::new(
+            data,
+            call_requests,
+            next_peer_pks,
+            memory_delta,
+            execution_time,
+            soft_limits_triggering,
+        );
+
+        if ret_code == INTERPRETER_SUCCESS {
+            Ok(avm_outcome)
+        } else {
+            Err(ErrorAVMOutcome::new(ret_code, error_message, avm_outcome))
+        }
+    }
+}
+
+impl ErrorAVMOutcome {
+    fn new(error_code: i64, error_message: String, outcome: AVMOutcome) -> Self {
+        Self {
+            error_code,
+            error_message,
+            outcome,
+        }
+    }
+}
+
\ No newline at end of file diff --git a/src/avm_interface/particle_parameters.rs.html b/src/avm_interface/particle_parameters.rs.html new file mode 100644 index 00000000..5d86d2f1 --- /dev/null +++ b/src/avm_interface/particle_parameters.rs.html @@ -0,0 +1,101 @@ +particle_parameters.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use serde::Deserialize;
+use serde::Serialize;
+use std::borrow::Cow;
+
+/// Represents parameters obtained from a particle.
+#[derive(Debug, Clone, Serialize, Deserialize)]
+pub struct ParticleParameters<'ctx> {
+    pub init_peer_id: Cow<'ctx, str>,
+    pub particle_id: Cow<'ctx, str>,
+    pub timestamp: u64,
+    pub ttl: u32,
+    pub current_peer_id: Cow<'ctx, str>,
+}
+
+impl<'ctx> ParticleParameters<'ctx> {
+    pub fn new(
+        init_peer_id: Cow<'ctx, str>,
+        particle_id: Cow<'ctx, str>,
+        timestamp: u64,
+        ttl: u32,
+        current_peer_id: Cow<'ctx, str>,
+    ) -> Self {
+        Self {
+            init_peer_id,
+            particle_id,
+            timestamp,
+            ttl,
+            current_peer_id,
+        }
+    }
+}
+
\ No newline at end of file diff --git a/src/avm_interface/raw_outcome.rs.html b/src/avm_interface/raw_outcome.rs.html new file mode 100644 index 00000000..79c25283 --- /dev/null +++ b/src/avm_interface/raw_outcome.rs.html @@ -0,0 +1,145 @@ +raw_outcome.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use crate::CallSeDeErrors;
+
+use super::CallRequests;
+
+use air_interpreter_interface::InterpreterOutcome;
+
+use air_interpreter_interface::SoftLimitsTriggering;
+use serde::Deserialize;
+use serde::Serialize;
+
+/// This struct is very similar to AVMOutcome, but keeps error_code and error_msg for test purposes.
+#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
+pub struct RawAVMOutcome {
+    pub ret_code: i64,
+    pub error_message: String,
+    pub data: Vec<u8>,
+    pub call_requests: CallRequests,
+    pub next_peer_pks: Vec<String>,
+    pub soft_limits_triggering: SoftLimitsTriggering,
+}
+
+impl RawAVMOutcome {
+    pub fn from_interpreter_outcome(outcome: InterpreterOutcome) -> Result<Self, CallSeDeErrors> {
+        let InterpreterOutcome {
+            ret_code,
+            error_message,
+            data,
+            call_requests,
+            next_peer_pks,
+            air_size_limit_exceeded,
+            particle_size_limit_exceeded,
+            call_result_size_limit_exceeded,
+        } = outcome;
+
+        let call_requests = crate::from_raw_call_requests(call_requests.into())?;
+        let soft_limits_triggering = SoftLimitsTriggering::new(
+            air_size_limit_exceeded,
+            particle_size_limit_exceeded,
+            call_result_size_limit_exceeded,
+        );
+
+        let raw_avm_outcome = Self {
+            ret_code,
+            error_message,
+            data,
+            call_requests,
+            next_peer_pks,
+            soft_limits_triggering,
+        };
+
+        Ok(raw_avm_outcome)
+    }
+}
+
\ No newline at end of file diff --git a/src/avm_server/avm.rs.html b/src/avm_server/avm.rs.html new file mode 100644 index 00000000..96d6363a --- /dev/null +++ b/src/avm_server/avm.rs.html @@ -0,0 +1,419 @@ +avm.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::avm_runner::AVMRunner;
+use super::AVMDataStore;
+use super::AVMError;
+use super::AVMMemoryStats;
+use crate::config::AVMConfig;
+use crate::AVMResult;
+
+use avm_data_store::AnomalyData;
+use avm_interface::raw_outcome::RawAVMOutcome;
+use avm_interface::AVMOutcome;
+use avm_interface::CallResults;
+use avm_interface::ParticleParameters;
+use fluence_keypair::KeyPair;
+
+use marine_wasm_backend_traits::WasmBackend;
+
+use std::ops::Deref;
+use std::ops::DerefMut;
+use std::time::Duration;
+use std::time::Instant;
+
+/// A newtype needed to mark it as `unsafe impl Send`
+struct SendSafeRunner<WB: WasmBackend>(AVMRunner<WB>);
+
+/// Mark runtime as Send, so libp2p on the node (use-site) is happy
+unsafe impl<WB: WasmBackend> Send for SendSafeRunner<WB> {}
+
+impl<WB: WasmBackend> Deref for SendSafeRunner<WB> {
+    type Target = AVMRunner<WB>;
+
+    fn deref(&self) -> &Self::Target {
+        &self.0
+    }
+}
+impl<WB: WasmBackend> DerefMut for SendSafeRunner<WB> {
+    fn deref_mut(&mut self) -> &mut Self::Target {
+        &mut self.0
+    }
+}
+
+pub struct AVM<E, WB: WasmBackend> {
+    runner: SendSafeRunner<WB>,
+    data_store: AVMDataStore<E>,
+}
+
+impl<E, WB: WasmBackend> AVM<E, WB> {
+    /// Create AVM with provided config.
+    #[allow(clippy::result_large_err)]
+    pub async fn new(config: AVMConfig<E>, wasm_backend: WB) -> AVMResult<Self, E> {
+        let AVMConfig {
+            air_wasm_path,
+            max_heap_size,
+            logging_mask,
+            mut data_store,
+        } = config;
+
+        data_store.initialize()?;
+
+        let runner = AVMRunner::new(
+            air_wasm_path,
+            max_heap_size,
+            <_>::default(),
+            logging_mask,
+            wasm_backend,
+        )
+        .await
+        .map_err(AVMError::RunnerError)?;
+        let runner = SendSafeRunner(runner);
+        let avm = Self { runner, data_store };
+
+        Ok(avm)
+    }
+
+    #[allow(clippy::result_large_err)]
+    pub async fn call(
+        &mut self,
+        air: impl Into<String>,
+        data: impl Into<Vec<u8>>,
+        particle_parameters: ParticleParameters<'_>,
+        call_results: CallResults,
+        keypair: &KeyPair,
+    ) -> AVMResult<AVMOutcome, E> {
+        let air = air.into();
+        let prev_data = self.data_store.read_data(
+            &particle_parameters.particle_id,
+            &particle_parameters.current_peer_id,
+        )?;
+        let current_data = data.into();
+
+        let execution_start_time = Instant::now();
+        let memory_size_before = self.memory_stats().memory_size;
+        let outcome = self
+            .runner
+            .call(
+                air.clone(),
+                prev_data,
+                current_data.clone(),
+                particle_parameters.init_peer_id.clone().into_owned(),
+                particle_parameters.timestamp,
+                particle_parameters.ttl,
+                particle_parameters.current_peer_id.clone(),
+                call_results.clone(),
+                keypair,
+                particle_parameters.particle_id.to_string(),
+            )
+            .await
+            .map_err(AVMError::RunnerError)?;
+
+        let execution_time = execution_start_time.elapsed();
+        let memory_delta = self.memory_stats().memory_size - memory_size_before;
+        if self
+            .data_store
+            .detect_anomaly(execution_time, memory_delta, &outcome)
+        {
+            self.save_anomaly_data(
+                &air,
+                &current_data,
+                &call_results,
+                &particle_parameters,
+                &outcome,
+                execution_time,
+                memory_delta,
+            )?;
+        }
+
+        // persist resulted data
+        self.data_store.store_data(
+            &outcome.data,
+            &particle_parameters.particle_id,
+            &particle_parameters.current_peer_id,
+        )?;
+        let outcome = AVMOutcome::from_raw_outcome(outcome, memory_delta, execution_time)
+            .map_err(AVMError::InterpreterFailed)?;
+
+        Ok(outcome)
+    }
+
+    /// Cleanup data that become obsolete.
+    #[allow(clippy::result_large_err)]
+    pub fn cleanup_data(&mut self, particle_id: &str, current_peer_id: &str) -> AVMResult<(), E> {
+        self.data_store.cleanup_data(particle_id, current_peer_id)?;
+        Ok(())
+    }
+
+    /// Return memory stat of an interpreter heap.
+    pub fn memory_stats(&self) -> AVMMemoryStats {
+        self.runner.memory_stats()
+    }
+
+    #[allow(clippy::result_large_err, clippy::too_many_arguments)]
+    fn save_anomaly_data(
+        &mut self,
+        air_script: &str,
+        current_data: &[u8],
+        call_result: &CallResults,
+        particle_parameters: &ParticleParameters<'_>,
+        avm_outcome: &RawAVMOutcome,
+        execution_time: Duration,
+        memory_delta: usize,
+    ) -> AVMResult<(), E> {
+        let prev_data = self.data_store.read_data(
+            &particle_parameters.particle_id,
+            &particle_parameters.current_peer_id,
+        )?;
+        let call_results = serde_json::to_vec(call_result).map_err(AVMError::AnomalyDataSeError)?;
+        let ser_particle =
+            serde_json::to_vec(particle_parameters).map_err(AVMError::AnomalyDataSeError)?;
+        let ser_avm_outcome =
+            serde_json::to_vec(avm_outcome).map_err(AVMError::AnomalyDataSeError)?;
+
+        let anomaly_data = AnomalyData::new(
+            air_script,
+            &ser_particle,
+            &prev_data,
+            current_data,
+            &call_results,
+            &ser_avm_outcome,
+            execution_time,
+            memory_delta,
+        );
+
+        self.data_store
+            .collect_anomaly_data(
+                &particle_parameters.particle_id,
+                &particle_parameters.current_peer_id,
+                anomaly_data,
+            )
+            .map_err(Into::into)
+    }
+}
+
\ No newline at end of file diff --git a/src/avm_server/config.rs.html b/src/avm_server/config.rs.html new file mode 100644 index 00000000..9aa86595 --- /dev/null +++ b/src/avm_server/config.rs.html @@ -0,0 +1,71 @@ +config.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use super::AVMDataStore;
+use std::path::PathBuf;
+
+/// Describes behaviour of the AVM.
+pub struct AVMConfig<E> {
+    /// Path to a AIR interpreter Wasm file.
+    pub air_wasm_path: PathBuf,
+
+    /// Maximum heap size in bytes available for the interpreter.
+    pub max_heap_size: Option<u64>,
+
+    /// Mask used to filter logs, for details see `log_utf8_string` in fluence-faas.
+    pub logging_mask: i32,
+
+    pub data_store: AVMDataStore<E>,
+}
+
\ No newline at end of file diff --git a/src/avm_server/errors.rs.html b/src/avm_server/errors.rs.html new file mode 100644 index 00000000..650950aa --- /dev/null +++ b/src/avm_server/errors.rs.html @@ -0,0 +1,173 @@ +errors.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+pub use avm_interface::CallSeDeErrors;
+use avm_interface::ErrorAVMOutcome;
+use marine::IValue;
+use marine::MarineError;
+
+use serde_json::Error as SerdeError;
+use thiserror::Error as ThisError;
+
+use std::io::Error as IOError;
+use std::path::PathBuf;
+
+#[derive(Debug, ThisError)]
+pub enum AVMError<E> {
+    /// This error contains interpreter outcome in case when execution failed on the interpreter
+    /// side. A host should match on this error type explicitly to save provided data.
+    #[error("interpreter failed with: {0:?}")]
+    InterpreterFailed(ErrorAVMOutcome),
+
+    /// This errors are encountered from an AVM runner.
+    #[error(transparent)]
+    RunnerError(RunnerError),
+
+    /// This errors are encountered from a data store object.
+    #[error(transparent)]
+    DataStoreError(#[from] E),
+
+    /// This errors are encountered from serialization of data tracked during an anomaly.
+    #[error(transparent)]
+    AnomalyDataSeError(SerdeError),
+}
+
+#[derive(Debug, ThisError)]
+pub enum RunnerError {
+    /// This errors are encountered from FaaS.
+    #[error(transparent)]
+    MarineError(#[from] MarineError),
+
+    /// Specified path to AIR interpreter .wasm file was invalid
+    #[error("path to AIR interpreter .wasm ({invalid_path:?}) is invalid: {reason}; IO Error: {io_error:?}")]
+    InvalidAIRPath {
+        invalid_path: PathBuf,
+        io_error: Option<IOError>,
+        reason: &'static str,
+    },
+
+    /// AIR interpreter result deserialization errors.
+    #[error("{0}")]
+    InterpreterResultDeError(String),
+
+    /// Marine call returns Vec<IValue> to support multi-value in a future,
+    /// but actually now it could return empty vec or a vec with one value.
+    /// This error is encountered when it returns vec with not a one value.
+    #[error("result `{0:?}` returned from Marine should contain only one element")]
+    IncorrectInterpreterResult(Vec<IValue>),
+
+    /// This errors are encountered from an call results/params se/de.
+    #[error(transparent)]
+    CallSeDeErrors(#[from] CallSeDeErrors),
+
+    /// Invalid secret key.
+    #[error(transparent)]
+    KeyError(eyre::Error),
+
+    /// Errors from auxiliary calls.
+    #[error("{0}")]
+    Aux(String),
+}
+
\ No newline at end of file diff --git a/src/avm_server/lib.rs.html b/src/avm_server/lib.rs.html new file mode 100644 index 00000000..b48279c6 --- /dev/null +++ b/src/avm_server/lib.rs.html @@ -0,0 +1,135 @@ +lib.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+#![warn(rust_2018_idioms)]
+#![deny(
+    dead_code,
+    nonstandard_style,
+    unused_imports,
+    unused_mut,
+    unused_variables,
+    unused_unsafe,
+    unreachable_patterns
+)]
+
+mod avm;
+mod config;
+mod errors;
+mod runner;
+
+pub use avm::AVM;
+pub use config::AVMConfig;
+pub use errors::AVMError;
+pub use runner::AVMMemoryStats;
+pub use runner::AVMRuntimeLimits;
+pub use runner::AquaVMRuntimeLimits;
+
+pub use avm_interface::*;
+
+pub mod avm_runner {
+    pub use crate::runner::AVMRunner;
+    pub use avm_interface::raw_outcome::RawAVMOutcome;
+}
+
+// Re-exports
+pub use marine::ne_vec;
+pub use marine::HostExportedFunc;
+pub use marine::HostImportDescriptor;
+pub use marine::HostImportError;
+pub use marine::IType;
+pub use marine::IValue;
+
+pub use polyplets::SecurityTetraplet;
+
+pub use avm_data_store::AnomalyData;
+pub use avm_data_store::DataStore;
+
+pub type AVMDataStore<E> = Box<dyn DataStore<Error = E> + Send + Sync + 'static>;
+
+pub type AVMResult<T, E> = std::result::Result<T, AVMError<E>>;
+
+pub use errors::RunnerError;
+pub type RunnerResult<T> = std::result::Result<T, RunnerError>;
+
\ No newline at end of file diff --git a/src/avm_server/runner.rs.html b/src/avm_server/runner.rs.html new file mode 100644 index 00000000..1387aa96 --- /dev/null +++ b/src/avm_server/runner.rs.html @@ -0,0 +1,847 @@ +runner.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
+334
+335
+336
+337
+338
+339
+340
+341
+342
+343
+344
+345
+346
+347
+348
+349
+350
+351
+352
+353
+354
+355
+356
+357
+358
+359
+360
+361
+362
+363
+364
+365
+366
+367
+368
+369
+370
+371
+372
+373
+374
+375
+376
+377
+378
+379
+380
+381
+382
+383
+384
+385
+386
+387
+388
+389
+390
+391
+392
+393
+394
+395
+396
+397
+398
+399
+400
+401
+402
+403
+404
+405
+406
+407
+408
+409
+410
+411
+412
+413
+414
+415
+416
+417
+418
+419
+420
+421
+422
+423
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use crate::RunnerError;
+use crate::RunnerResult;
+
+use air_interpreter_interface::try_as_string;
+use air_interpreter_interface::CallResultsRepr;
+use air_interpreter_interface::InterpreterOutcome;
+use air_interpreter_sede::ToSerialized;
+use air_utils::measure;
+use avm_interface::raw_outcome::RawAVMOutcome;
+use avm_interface::CallResults;
+use fluence_keypair::KeyPair;
+use marine::generic::Marine;
+use marine::generic::MarineConfig;
+use marine::generic::ModuleDescriptor;
+use marine::IValue;
+use marine_wasm_backend_traits::WasmBackend;
+
+use std::path::PathBuf;
+
+#[derive(Clone, Copy, Debug)]
+pub struct AquaVMRuntimeLimits {
+    pub air_size_limit: u64, // WIP remove pub?
+    /// The particle data size limit.
+    pub particle_size_limit: u64,
+    /// This is the limit for the size of service call result.
+    pub call_result_size_limit: u64,
+    /// This knob controls hard RAM limits behavior for AVMRunner.
+    pub hard_limit_enabled: bool,
+}
+
+#[derive(Default)]
+pub struct AVMRuntimeLimits {
+    // The AIR script size limit.
+    pub air_size_limit: Option<u64>,
+    /// The particle data size limit.
+    pub particle_size_limit: Option<u64>,
+    /// This is the limit for the size of service call result.
+    pub call_result_size_limit: Option<u64>,
+    /// This knob controls hard RAM limits behavior for AVMRunner.
+    pub hard_limit_enabled: bool,
+}
+
+pub struct AVMRunner<WB: WasmBackend> {
+    marine: Marine<WB>,
+    /// file name of the AIR interpreter .wasm
+    wasm_filename: String,
+    /// The memory limit provided by constructor
+    total_memory_limit: Option<u64>,
+    /// This struct contains runtime RAM allowance.
+    aquavm_runtime_limits: AquaVMRuntimeLimits,
+}
+
+/// Return statistic of AVM server Wasm module heap footprint.
+pub struct AVMMemoryStats {
+    /// Size of currently used linear memory in bytes.
+    /// Please note that linear memory contains not only heap, but globals, shadow stack and so on.
+    pub memory_size: usize,
+    /// Possibly set max memory size for AVM server.
+    pub total_memory_limit: Option<u64>,
+    /// Number of allocations rejected due to memory limit.
+    /// May be not recorded by some backends in Marine.
+    pub allocation_rejects: Option<u32>,
+}
+
+impl<WB: WasmBackend> AVMRunner<WB> {
+    /// Create AVM with the provided config.
+    pub async fn new(
+        air_wasm_path: PathBuf,
+        total_memory_limit: Option<u64>,
+        avm_runtime_limits: AVMRuntimeLimits,
+        logging_mask: i32,
+        wasm_backend: WB,
+    ) -> RunnerResult<Self> {
+        let (wasm_dir, wasm_filename) = split_dirname(air_wasm_path)?;
+
+        let marine_config =
+            make_marine_config(wasm_dir, &wasm_filename, total_memory_limit, logging_mask);
+        let marine = Marine::with_raw_config(wasm_backend, marine_config).await?;
+        let aquavm_runtime_limits = avm_runtime_limits.into();
+
+        let avm = Self {
+            marine,
+            wasm_filename,
+            total_memory_limit,
+            aquavm_runtime_limits,
+        };
+
+        Ok(avm)
+    }
+
+    #[allow(clippy::too_many_arguments)]
+    #[tracing::instrument(skip_all)]
+    pub async fn call(
+        &mut self,
+        air: impl Into<String>,
+        prev_data: impl Into<Vec<u8>>,
+        data: impl Into<Vec<u8>>,
+        init_peer_id: impl Into<String>,
+        timestamp: u64,
+        ttl: u32,
+        current_peer_id: impl Into<String>,
+        call_results: CallResults,
+        keypair: &KeyPair,
+        particle_id: String,
+    ) -> RunnerResult<RawAVMOutcome> {
+        let key_format = keypair.key_format();
+        // we use secret() for compatibility with JS client that doesn't have keypair type,
+        // it can serialize a secret key only
+        let secret_key_bytes: Vec<u8> = keypair.secret().map_err(RunnerError::KeyError)?;
+
+        let args = prepare_args(
+            air,
+            prev_data,
+            data,
+            current_peer_id.into(),
+            init_peer_id.into(),
+            timestamp,
+            ttl,
+            self.aquavm_runtime_limits,
+            call_results,
+            key_format.into(),
+            secret_key_bytes,
+            particle_id,
+        );
+
+        let result = measure!(
+            self.marine
+                .call_with_ivalues_async(&self.wasm_filename, "invoke", &args, <_>::default())
+                .await?,
+            tracing::Level::INFO,
+            "marine.call_with_ivalues",
+            method = "invoke",
+        );
+
+        let result = try_as_one_value_vec(result)?;
+        let outcome = InterpreterOutcome::from_ivalue(result)
+            .map_err(RunnerError::InterpreterResultDeError)?;
+        let outcome = RawAVMOutcome::from_interpreter_outcome(outcome)?;
+
+        Ok(outcome)
+    }
+
+    #[allow(clippy::too_many_arguments)]
+    #[tracing::instrument(skip_all)]
+    pub async fn call_tracing(
+        &mut self,
+        air: impl Into<String>,
+        prev_data: impl Into<Vec<u8>>,
+        data: impl Into<Vec<u8>>,
+        init_peer_id: impl Into<String>,
+        timestamp: u64,
+        ttl: u32,
+        current_peer_id: impl Into<String>,
+        call_results: CallResults,
+        tracing_params: String,
+        tracing_output_mode: u8,
+        key_format: u8,
+        secret_key_bytes: Vec<u8>,
+        particle_id: String,
+    ) -> RunnerResult<RawAVMOutcome> {
+        let mut args = prepare_args(
+            air,
+            prev_data,
+            data,
+            current_peer_id.into(),
+            init_peer_id.into(),
+            timestamp,
+            ttl,
+            self.aquavm_runtime_limits,
+            call_results,
+            key_format,
+            secret_key_bytes,
+            particle_id,
+        );
+        args.push(IValue::String(tracing_params));
+        args.push(IValue::U8(tracing_output_mode));
+
+        let result = measure!(
+            self.marine
+                .call_with_ivalues_async(
+                    &self.wasm_filename,
+                    "invoke_tracing",
+                    &args,
+                    <_>::default(),
+                )
+                .await?,
+            tracing::Level::INFO,
+            "marine.call_with_ivalues",
+            method = "invoke_tracing",
+        );
+
+        let result = try_as_one_value_vec(result)?;
+        let outcome = InterpreterOutcome::from_ivalue(result)
+            .map_err(RunnerError::InterpreterResultDeError)?;
+        let outcome = RawAVMOutcome::from_interpreter_outcome(outcome)?;
+
+        Ok(outcome)
+    }
+
+    pub async fn to_human_readable_data<'this>(
+        &'this mut self,
+        data: Vec<u8>,
+    ) -> RunnerResult<String> {
+        let args = vec![IValue::ByteArray(data)];
+
+        let result = self
+            .marine
+            .call_with_ivalues_async(
+                &self.wasm_filename,
+                "to_human_readable_data",
+                &args,
+                <_>::default(),
+            )
+            .await?;
+        let result = try_as_one_value_vec(result)?;
+        let outcome = try_as_string(result, "result").map_err(RunnerError::Aux)?;
+        Ok(outcome)
+    }
+
+    pub fn memory_stats(&self) -> AVMMemoryStats {
+        let stats = self.marine.module_memory_stats();
+
+        // only the interpreters must be loaded in Marine
+        debug_assert!(stats.modules.len() == 1);
+
+        AVMMemoryStats {
+            memory_size: stats.modules[0].memory_size,
+            total_memory_limit: self.total_memory_limit,
+            allocation_rejects: stats.allocation_stats.map(|stats| stats.allocation_rejects),
+        }
+    }
+}
+
+#[allow(clippy::too_many_arguments)]
+#[tracing::instrument(skip(air, prev_data, data, call_results, secret_key_bytes))]
+fn prepare_args(
+    air: impl Into<String>,
+    prev_data: impl Into<Vec<u8>>,
+    data: impl Into<Vec<u8>>,
+    current_peer_id: String,
+    init_peer_id: String,
+    timestamp: u64,
+    ttl: u32,
+    aquavm_runtime_limits: AquaVMRuntimeLimits,
+    call_results: CallResults,
+    key_format: u8,
+    secret_key_bytes: Vec<u8>,
+    particle_id: String,
+) -> Vec<IValue> {
+    let AquaVMRuntimeLimits {
+        air_size_limit,
+        particle_size_limit,
+        call_result_size_limit,
+        hard_limit_enabled,
+    } = aquavm_runtime_limits;
+
+    let run_parameters = air_interpreter_interface::RunParameters::new(
+        init_peer_id,
+        current_peer_id,
+        timestamp,
+        ttl,
+        key_format,
+        secret_key_bytes,
+        particle_id,
+        air_size_limit,
+        particle_size_limit,
+        call_result_size_limit,
+        hard_limit_enabled,
+    )
+    .into_ivalue();
+
+    let call_results = avm_interface::into_raw_result(call_results);
+    let call_results = measure!(
+        CallResultsRepr
+            .serialize(&call_results)
+            .expect("the default serializer shouldn't fail"),
+        tracing::Level::INFO,
+        "CallResultsRepr.serialize"
+    );
+
+    vec![
+        IValue::String(air.into()),
+        IValue::ByteArray(prev_data.into()),
+        IValue::ByteArray(data.into()),
+        run_parameters,
+        IValue::ByteArray(call_results.to_vec()),
+    ]
+}
+
+/// Splits given path into its directory and file name
+///
+/// # Example
+/// For path `/path/to/air_interpreter_server.wasm` result will be `Ok(PathBuf(/path/to), "air_interpreter_server.wasm")`
+fn split_dirname(path: PathBuf) -> RunnerResult<(PathBuf, String)> {
+    use RunnerError::InvalidAIRPath;
+
+    let metadata = path.metadata().map_err(|err| InvalidAIRPath {
+        invalid_path: path.clone(),
+        reason: "failed to get file's metadata (doesn't exist or invalid permissions)",
+        io_error: Some(err),
+    })?;
+
+    if !metadata.is_file() {
+        return Err(InvalidAIRPath {
+            invalid_path: path,
+            reason: "is not a file",
+            io_error: None,
+        });
+    }
+
+    let file_name = path
+        .file_name()
+        .expect("checked to be a file, file name must be defined");
+    let file_name = file_name.to_string_lossy().into_owned();
+
+    let mut path = path;
+    // drop file name from path
+    path.pop();
+
+    Ok((path, file_name))
+}
+
+fn make_marine_config<WB: WasmBackend>(
+    air_wasm_dir: PathBuf,
+    air_wasm_file: &str,
+    total_memory_limit: Option<u64>,
+    logging_mask: i32,
+) -> MarineConfig<WB> {
+    let air_module_config = marine::generic::MarineModuleConfig::<WB> {
+        logger_enabled: true,
+        host_imports: <_>::default(),
+        wasi: None,
+        logging_mask,
+    };
+
+    MarineConfig {
+        modules_dir: Some(air_wasm_dir),
+        total_memory_limit,
+        modules_config: vec![ModuleDescriptor {
+            load_from: None,
+            file_name: String::from(air_wasm_file),
+            import_name: String::from(air_wasm_file),
+            config: air_module_config,
+        }],
+        default_modules_config: None,
+    }
+}
+
+fn try_as_one_value_vec(mut ivalues: Vec<IValue>) -> RunnerResult<IValue> {
+    use RunnerError::IncorrectInterpreterResult;
+
+    if ivalues.len() != 1 {
+        return Err(IncorrectInterpreterResult(ivalues));
+    }
+
+    Ok(ivalues.remove(0))
+}
+
+impl AquaVMRuntimeLimits {
+    pub fn new(
+        air_size_limit: u64,
+        particle_size_limit: u64,
+        call_result_size_limit: u64,
+        hard_limit_enabled: bool,
+    ) -> Self {
+        Self {
+            air_size_limit,
+            particle_size_limit,
+            call_result_size_limit,
+            hard_limit_enabled,
+        }
+    }
+}
+
+impl AVMRuntimeLimits {
+    pub fn new(
+        air_size_limit: Option<u64>,
+        particle_size_limit: Option<u64>,
+        call_result_size_limit: Option<u64>,
+        hard_limit_enabled: bool,
+    ) -> Self {
+        Self {
+            air_size_limit,
+            particle_size_limit,
+            call_result_size_limit,
+            hard_limit_enabled,
+        }
+    }
+}
+
+impl From<AVMRuntimeLimits> for AquaVMRuntimeLimits {
+    fn from(value: AVMRuntimeLimits) -> Self {
+        use air_interpreter_interface::MAX_AIR_SIZE;
+        use air_interpreter_interface::MAX_CALL_RESULT_SIZE;
+        use air_interpreter_interface::MAX_PARTICLE_SIZE;
+
+        AquaVMRuntimeLimits::new(
+            value.air_size_limit.unwrap_or(MAX_AIR_SIZE),
+            value.particle_size_limit.unwrap_or(MAX_PARTICLE_SIZE),
+            value.call_result_size_limit.unwrap_or(MAX_CALL_RESULT_SIZE),
+            value.hard_limit_enabled,
+        )
+    }
+}
+
\ No newline at end of file diff --git a/src/polyplets/lib.rs.html b/src/polyplets/lib.rs.html new file mode 100644 index 00000000..d2db7902 --- /dev/null +++ b/src/polyplets/lib.rs.html @@ -0,0 +1,71 @@ +lib.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#![forbid(unsafe_code)]
+#![warn(rust_2018_idioms)]
+#![deny(
+    dead_code,
+    nonstandard_style,
+    unused_imports,
+    unused_mut,
+    unused_variables,
+    unused_unsafe,
+    unreachable_patterns
+)]
+
+mod triplet;
+
+pub use marine_call_parameters::SecurityTetraplet;
+pub use triplet::ResolvedTriplet;
+
\ No newline at end of file diff --git a/src/polyplets/triplet.rs.html b/src/polyplets/triplet.rs.html new file mode 100644 index 00000000..1ddfa191 --- /dev/null +++ b/src/polyplets/triplet.rs.html @@ -0,0 +1,91 @@ +triplet.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+
/*
+ * AquaVM Workflow Engine
+ *
+ * Copyright (C) 2024 Fluence DAO
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use marine_call_parameters::SecurityTetraplet;
+
+use serde::Deserialize;
+use serde::Serialize;
+
+/// ResolvedTriplet represents peer network location with all
+/// variables, literals and etc resolved into final string.
+/// This structure contains a subset of values that
+/// SecurityTetraplet consists of.
+#[derive(Debug, Default, Clone, Eq, PartialEq, Hash, Serialize, Deserialize)]
+pub struct ResolvedTriplet {
+    pub peer_pk: String,
+    pub service_id: String,
+    pub function_name: String,
+}
+
+impl From<ResolvedTriplet> for SecurityTetraplet {
+    fn from(triplet: ResolvedTriplet) -> Self {
+        Self {
+            peer_pk: triplet.peer_pk,
+            service_id: triplet.service_id,
+            function_name: triplet.function_name,
+            lens: String::new(),
+        }
+    }
+}
+
\ No newline at end of file diff --git a/static.files/COPYRIGHT-23e9bde6c69aea69.txt b/static.files/COPYRIGHT-23e9bde6c69aea69.txt new file mode 100644 index 00000000..1447df79 --- /dev/null +++ b/static.files/COPYRIGHT-23e9bde6c69aea69.txt @@ -0,0 +1,50 @@ +# REUSE-IgnoreStart + +These documentation pages include resources by third parties. This copyright +file applies only to those resources. The following third party resources are +included, and carry their own copyright notices and license terms: + +* Fira Sans (FiraSans-Regular.woff2, FiraSans-Medium.woff2): + + Copyright (c) 2014, Mozilla Foundation https://mozilla.org/ + with Reserved Font Name Fira Sans. + + Copyright (c) 2014, Telefonica S.A. + + Licensed under the SIL Open Font License, Version 1.1. + See FiraSans-LICENSE.txt. + +* rustdoc.css, main.js, and playpen.js: + + Copyright 2015 The Rust Developers. + Licensed under the Apache License, Version 2.0 (see LICENSE-APACHE.txt) or + the MIT license (LICENSE-MIT.txt) at your option. + +* normalize.css: + + Copyright (c) Nicolas Gallagher and Jonathan Neal. + Licensed under the MIT license (see LICENSE-MIT.txt). + +* Source Code Pro (SourceCodePro-Regular.ttf.woff2, + SourceCodePro-Semibold.ttf.woff2, SourceCodePro-It.ttf.woff2): + + Copyright 2010, 2012 Adobe Systems Incorporated (http://www.adobe.com/), + with Reserved Font Name 'Source'. All Rights Reserved. Source is a trademark + of Adobe Systems Incorporated in the United States and/or other countries. + + Licensed under the SIL Open Font License, Version 1.1. + See SourceCodePro-LICENSE.txt. + +* Source Serif 4 (SourceSerif4-Regular.ttf.woff2, SourceSerif4-Bold.ttf.woff2, + SourceSerif4-It.ttf.woff2): + + Copyright 2014-2021 Adobe (http://www.adobe.com/), with Reserved Font Name + 'Source'. All Rights Reserved. Source is a trademark of Adobe in the United + States and/or other countries. + + Licensed under the SIL Open Font License, Version 1.1. + See SourceSerif4-LICENSE.md. + +This copyright file is intended to be distributed with rustdoc output. + +# REUSE-IgnoreEnd diff --git a/static.files/FiraSans-LICENSE-db4b642586e02d97.txt b/static.files/FiraSans-LICENSE-db4b642586e02d97.txt new file mode 100644 index 00000000..d7e9c149 --- /dev/null +++ b/static.files/FiraSans-LICENSE-db4b642586e02d97.txt @@ -0,0 +1,98 @@ +// REUSE-IgnoreStart + +Digitized data copyright (c) 2012-2015, The Mozilla Foundation and Telefonica S.A. +with Reserved Font Name < Fira >, + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. + +// REUSE-IgnoreEnd diff --git a/static.files/FiraSans-Medium-8f9a781e4970d388.woff2 b/static.files/FiraSans-Medium-8f9a781e4970d388.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..7a1e5fc548ef28137a32150b6aa50a568cd53d02 GIT binary patch literal 132780 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�|o|A<_G9#bJ&K$mXTSM@kZfZ^-ZYS)6EG~kHJ{! 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

TIWHPC<_9>em(Cvlhuf-BD zsPEhJ-}=#6GvaP`FXpqmk=4SJ zsRU|eChbW1@k8-QvCBSHQB&xxZ17flwT0g5dJn=p!sU%3kewa61M$V%iQ)fE|{v5SXzw(e=|ytoJ7)vuZ*x_*U1etUVt1c81F&3w7>^XwVjfrMY9 zV%DLLXtUsp3GttY6mCz9PmjYB2#eJc(x?erLLivJ8{n%F;#VilzZ@Tbd46^~tF&ju zf9s&XYo(IGrA<8phEf30b9!R_9!d&%qFbPShz1Ru(uNBvUc3 ziAlY%tiAEujXy-vKO`U$BJ2xux52VRIGRXY?vy8^Q^MPJ-oJb}1IEoGhukg%6mD^s zl#SFn&!nXa;AjCVd&yfh%UCra^x+655;9rw1=~4%+v{LAE%xTjAZL8Ma9!5ryvr8E z75EiJ4r{TET0kiEt12R>f)qzWnJwZj3mLg3z@N-+=_SI*ouLJHPuh=tS506%q*N<0s z-k)9$D4w%S&oqdr0=AGQQoK=EPa|lS5?QLv4*Eq43BB6FrrRyn+xBcGF8eE)JnfRlmPaa#yAd`i3;oT(0k?*1r@j}_a^+^iR1TBHB&!}l~3RU%Cv zJP_Ca0=Z?n4`B$e3giBY+yDyu+az<#qc*I8!A_J`9}~AlCa#+>&-KFA`Fy^}P{@`y zUTj>tiENI8)R830XS`#JNN&`{l3Y{nP)Xb(~L^3ymJ6EG*U`h!Ex# zpuYNRc=PVXy9YDyfiHHiSUKmc_grg2wy#*SY}d*yRn{ZNc7*7ybeH<(94rWNl~%61 zHRn{gOA6*3Y)p*CE=5$yQ*ik;EhV%2{^O3))KLn|WR66Cd%9o#LO!5C2wzY4%0H8L z%8$u=!9xCec{lE-QQ5)^ijzL`VB2wSY^VF*=$Q@?#0{n>!v241Y`5`C#g5Xv9uNuz zr;*p9t48w0U%qb5bb?0bR}j&~oPULkKO4QOSeuZ|#@~q94!@zeINrXI@{*dxRjs#G zf2bnD@0>s849rn59cnxm>^xuf;mb_1!xvKYm+wPx zg{xAU%LOth-kFK%>Ag#j_wn;{3R%hzM-fXxzWU(%Yfh=$!$%y>|0W2LhIB?piF>!VzsS$%v@ooG{^$q`t(En=k>=OmtFL(JI3$~Jk0 zDw_F}9ZH3&Yhlpy>d;7uE4Z?K_R^)P4>%rC`NHZUo%%PqT*ze8xO56N2)Yk5QVesS zsiG^eBKpsV7nMfdFT*FTlllSuChI1Bh6F;PK*z>oMgE`L5Rj@Cg%s&9M9~k_hr4xy zevyjnh8^Uq4v5$QLb1QbIxA(!SeqxK(9xyQdD^If=TjS>O)aRZ6+RU_#Y{%!MVCdR zwnbr&?2YO_*w5cu!Q1p~YN)DKpq6NA;+P-8g?2)D0m#^qKI5tfCW>j@1M}^{+cC6l zBTfhj+5yGQo@)n>R)QC1IAc#RABG;7qD^BDRJ_|Aw>xi(F8wAO$wSXK`7E_{B_3~e zi8Cq*m=P8G^4CoH1j$X-GE4wP1eZ={@yYxm?WtSwg*$!cZ_brgwDy-5M%`6}R2z!q z@(^Ri+y-U7-kU1qtT|I-%UNYd!IOPihTa_cOiI#@4Xbk2Ny5I7Y+Y(zsvb~V%$DdK z(dBt^B-SJY;8uqN8gV?42L}4$RY7r8YZZ^;EzMP{M_^m{_L}QxB=7gyx@uRX1|uaa zxE#h8sr>h!&rd&|!V>0ng(*!;O|2-e#1*j2X#Wqg7DtlvCq`)T+vwY}=z-}#TGm$j z*7$+cfh{a@@#JQ**21M0siEIsx7e%vbI6C6ZYJv~1DRHpl0btqFwM%_P!f{Ao5&(T zscx#kGJ}4lL%CFL4Fhqd1H-(^LSE(j^$3lxP^&9+X&O@AJ>vCYLOW27&0;WDM-c zq8%t{Agfm(L@cYFl`BAGl@_5~(wXz@s0s!lpE+iocQ$`#r6LtO(3k$-_jdxDq*PKy zspo2Y5pCnmlT*&jtT?c@UA#4*GmnlP-Z`JNC%95qpu%avPF6bJmWnD>MRRH~v+qxG zSp|Dn@;&v~6ijcAF3;f)Q=T~{F{Vfa+)M|*SW77mc%X4Bhf>r&Pe!UHS%k@j8ABOk zd--j)w)KgVjsLX$Gqx$wZ|lIkkF0Oezm5ND-zY?P{>DTxUf>NUpg4*&aEDZS-K~hywp-SI^$87+%P7p}7}waRZ(GMcP6^j>NR0#8U*U zRoLqtzzGavU2fP1LgRHlnzP6Ep&T^MUyqoJc`QyIK%tCyV4OBJTySPQ zL)%kKsMLLVQ;v^d`m2rs!ew}i_Wv{E1x##i0fU)Pa#l0M?qTde#nEJZolll0pArW0 z=P8XA4;cF$kf6lHw0s4pOoP)eB;WTV#=t~X_1}X8Nyc;2y23?p!wgHfTgZudJH9a4P9zCV1!sWH%B7S(~Lyg zObVYz*LJDOZp|xCFqbq*gecnD;qAgfsYN1m6Kiguka&!Cl~AaP^+grj`4qf&)A-w4 zi~_MQ#+3=)kFLTxTJ$>iN0@3TAwR?cI99N~-P9Ul2r|CsA}Y*h z$3{RubhaRNK$@oc-<`S6<#X`uZ>~<;nl=`AL3uSu)n zGWjuJH{fifBE%m16w%lo^A(4hJd0Q8tMTT;NT3wJSM7N*YfVMYqIEg`N7LU>VD3!c zS=1b2G4~>=bMO9rf!O`AfwY;uYxV{9ZS~zqGrAk_gJ9F*1twINUPzVw_fIPzyy_#I ztP|#T8waf8F2%cuR>1#Zij?c3kOBfC$Lcw1@E`T&SaR`&b8{D_TOW9-Yd4Q*(@{!= zL3uxLF?S9OcnS6bBhKE?qp^W~yY~h5BQCYacI;oczg{wSfN{0?3U1Dy)Ar~6wQjv) zqhAiJv#ic(wY60P&W#Ni0E_5^JnWf$YaX0*#eX}ET#rr@mqPB?78{5?ePr@@#4$W$ zNxl0!Q=hHbo_iI<&=?69mv7jqZ@0Kle>m_V5F0pk;8YE<+{(WV$WUhPCnTy^hrd8o zDwwY3!O0#Y(_bS}6iZlC>4gj+g)0meT+v+(R&XU$9v$4hthd*{w6#D^rzsCYpp_Am zU+BIF5fgcYjGnV(smctb@D$*3KCR2FrTWVyvVvBBM3weC8>76Z2b8pQc*)nWcITl| zBEjN1Qd0eh&0U_c6`vXD_{N;;)wdXHS^sY1`gFMu@Kjgyidv`YN`-Fe@XkJo8{(?% zfmK8u6Nh8k%s|{$_Yiesr|oOT!-j_p>(`w_cva07`dND27UNml*kOEFGvzDf zgZc-EWoY4j<#=H5?(*&7f-Ur&^ujH&Bf7C|Y?Id$_vN0>8g0!FfgdDV$@c}(1$lP( z-0#ruz!2Sr6M=l`MVRZ(YOcsG)SA@1=iZO*!nzzbf^R$OJj%Oh@EEial6}*w<|=7S z#ofe&lqQfx%QUV-vWIJK>6?mUNUx#J(^R}X-#1*NU_Vy*Grf;1Y_cDTzZn>> zH~S790*3H{Lvl>_o+q>k_s258IRN!OB5bdC;<} zRqEM?#Dv@*DP{krDd#E$JFig}a!AVBKql&rJV+^^5sh;2+%ya>d|qjr-)B=NtII0k zoU=)iw{1g;aQ|H6?Xg9cb%gpZGPC1v;Mj>lWU|OxoX->FIfBx0kZ-8%k9vl_rP;lW zS2cW1(mERV<3HMnXT{S}E~)%9yW#}{5c&4!MgMAhkEU-r)y2T!+_}Y{LmyJV^;}(N zJ+}(s`zS6w&TGPw1TU2zB7T;BD0~8;k|voW|2gngOk!Q#qogI`Xhg~&n1FrMccZqy7kk4kzOxg36ui^&jD0(ERj$D&a_S2n7!@X?F0Acl~#0G z98B+^)6*PU)qk&N>#PG&%k}P>VOHXUKJ!IkA})gpxj+Sjd>bhDw*g9(m3Kx0ueM+X zSZST1=wUUsvSFg9B|}2cl5hlhu>SThURtoRss?coc0ECadl8W%mgcZ!IVgER70{#E zM$BA1KIm7y;!1hS_^YOAOhAa?z1Y45s*>4Xe34bCD}H(8A56Q9U6#57qkC!%Awb}x zAS3JkHR`J{+puitA$;Hue)XY#GgGP|@lBHKrpP|g_>&>y%oVkWjeVq5J{uSpIs)yBTPVMF@TT#ZudbDCVZ=s}~ zZpQdezE{!d*#b9vczWbunix~Fu^UTI(9xYTQtXjx@sDS>b8s7F%~A)qx)w({o%#dL zUc>cQwA(B$zpMNLxg6m6rd(JQ<+9Z<4ztL6ZhmviPp(Wkae6qq@KgVKSQQ&uB`?N% zCr=)1G@&}OC~2?yUVC#{m^h*^u|7-q;{$@}>>*c$nZ}GQ{)hH&%fIv`|BN2OY@XXU z^aJ(BmLF-uKlEVJd3HEfh$?7L<%TFlOcFy|h7@$`G-BcN?Fj5}c1|0O7wy4dU{FwF zPUa_}+>yeQUzE`K4L8g+a`NyRa@V)4P~+OLnL{f;FIIOwQdG36++J@1_hc2AJD4SV z{>J|kAP0WHZ~uM(@{&Xj+#8PB9Z{QB%jNQ7LGJ%9Masim$-#(t|DE%9{N%G~#_g$G zw#*6>%#ATE-!DQOTHhZqx0`!1u54M_(KkoXB^a1H-rm|V*|~ihyNfdz0%cU{G;_?l zxpKYHvt^D9lQ@D+yB?9q-Cu>gMVP(CwkzGA6K-I*`Qe!2JPN&o9JqV&Zr~o`=N06x z+mp9jBx4tt5XcXHx3-^k_wtfkVMtOJ5-SH3ssqm-fwmf2lWqMuhtI z8RYiH4s?PzEPdk{vY-6fSNX0w+$j=c;Vba3=YChro-`@0n4y&>`MW~7$4WbGW@neP z>jsDR)fT?K~@-)$h6x9f-W=nIJG=(fgddGPu zSgq32Gl!m0XgvSK#FGA1jWiqg-`oEfV@15sd9F*cRP!{kOtQs91TH96|7z}R{ym5{HZ$&XR-EC#8-&vlD z(&A$?+1|1;wuia)dZ>5)hN1ZSSl~%HqQTngXyrss)9anNiahFE`eBL$7^51~lVNx1 zA7$kS6;|+P;HwqxqfyTBpwwyueQPD+bh|3fAE}qsvrpeC>r|AbC~E14+3YXrA3Xz@ z)uX-h+C;xQ!}75>s%BAlspr2RmQ>21Dn$%f$%o!M*>}A`^Md(zn$MBeohG$8k+c(x z6BzTpT{g+?RNM`a1M?O-BG#TEwI7U(dMZ%!9RH&I1+n(Ie=}1(wnzCvIil1YYu);e zChjsk&wknX5+Q%y?R?(&!XW>LFPnF(&Z=5>i(|GF&Ps|>3POfEwV5BLPN9>EL{?R}Dkxb(;<~wOx z8Y{p$bW#}ow?__)@BW+cPvHI%Z#?8X!Y|gZ&dcYpZZ5NM_8zt{Folo(tbGqjs%;d} zFG;bG)AE`-U6dDHI$M6R^GB|06T5Vub`d|1CdgfZ3{0+GT;fXM70Fbp@;hQPi&xZQ zwO1O6lrZ^5omgyC^KX;WHLhIX-qh6F8N5&FU6HLT&nt{-TjE8dyIzEp zm`M3S8vobnO7`~bEnPV~$eJT+=i?n#o@Zd9Z@q~jGCy)+v|DMrA&7Q9YjFc{RBf@G^Ce-E+~b=^!|Jy%{nca=Yv zpYju3vZWZtt?q4)Xbw{eynIb89Xvb@jf;$m!%|z}iXiE;B=UudZimOx>8lpaJUGRmR%1PRaNPJ0Bj@;h zdE`R0@Sr3EgEMCn4eb1m;u_IRpl}w4%YdcuQHrh&Pm=`$^t!6NQ!sAJ|Ag{}D!bT8 z$>egXeYX5Ml+hQ{TO4gcfA&%+;?KFoTv>|7PvLapt`%QIyjbfg{)Z)Y7gd&rFw$F{ zovkf;3xy=!X&a;db?fs=(fABn)<`xNwQb?jL$D?ekNw|kmOE>Uwm`1|59j5RFNPH; z7$$$2+&l1seA#NP#yq+@ra7Lf2h|UT_T&|A_tyTof1=Yn;C>t~7_<{KGWfJuS9SJe zIqa!YM#z-Qd+8~K=t=_ZG=p-;=_+YpGq*V$<@&GGwH|V=ICgR~wK@#KjOSYiDi-On z$yWSFJRykd5gEEVfl47Q=j;2COWJsjC*igA4g12S_okH$SG4WKv97cWM`$wI=zLke zCa;2qLww|o(A_7PB-z}S9N~%Mq%JlEoX%$@b=-0(PCtYrTxU}+(mVD13rPow{)nCR zb*3arJf6C)p}q!D-R6s5$GG?^`r zNK5R(q(k$+7k%ISJ-qlkfA{PYTj}BE=srYO*S5x$t5S1U85lvh$`ptu#C0!1bD660 zYgN?gzw?c@hkFYisp5uy0vjSZn5opY@j}14LR060;2j2I$IybZHdMkN8Xr<88?{i3 zu2rp5*>tazc8#~Q?laCXqlzI|da~)HZjftJo1F|_sdElL;2yb-C_Y|z?bmDn6duP; z)6*F|_R*({md}y)NLPjK9P99ZI=ZaFP{gZ3c8#|6TD>0coEBe*+im`5@08K&&VTF^ z>C>sX<%8`3!100Oy^+0b<)MKPAx|U?UD>f>8u%hX2;9jL>!mA83Rzv^?AoGNK5jCx ztGU(Cq|q2x7h6efAAGNhDtR!rzoCIw{fvx6dU>mgmQf=Z0x8Nt?OV7d66Dv=Emd=3EpbyNim9Go> zYV*4H|JM1T1R`&anu2Sm+*nzr(w3Z>b?g61Jr=8*WXyUL=Z=|tsEMbRiIb2QypuxK`o80^HcnYEvN+MwJ#V(>`IQE;ZZLza#+x;y&@P3l;R}fL$`xmy@IMRYg4Gg$Dq*me9h=f*ZZRQzOZ}~# z$$Yhh`MaRCrih!5 zCK<>gg@HeB7DvqGNK`^eUbrnY&qgQ2p}bAIyftwC_)F!Lq!lg8yHk(7ND*-ImK8;T zc|=SK4|l@zXLu7Ly#+!CepnN)_(XwAZD4}JoSdnT;e zE}_5-Y`$Q;cf?9IslyRt08cIR09b8OoBaR^IwT`QGEg6A&?U+mql3J8MlW{!&$jc& zj(1#YZ0fjh@<`{UCb$=nT0YDEQ~FIQ{|}zU`7fn%miwo8m`$w&z*(0zWkE)=T%stB zOzIEBh5xecX4l$3FJvJ-TbI39bNl?9uQOt8YIC4Ln<#ILPTl&nn8Ybcus|p9+X>~G zHY5>Sfn1;1)o`*4xOEox3gIL*+Mc>1YWXsj>AS3qtzkbr#1yngz6jLFIoup|dB9ni ztVJ#UP5d=*PsicT)V;wgv3E2t6Pgh7RexI2R5Zz^Ss>JjoZKKG58$Lxd3-9OciEu% z!kcg>6Xn(W`A^d0-Zzi))0Ox<9bap6i08FIYOpxD9myamAPxWSjmpCM7Zb-Wm4YUM z-gNIxyJMbj-zC8v_u;pI+ZHX*V7uLNp6TO%C01PXn$;T5;(A#olV$<@meDE~TjX zvS{sZX)%z}|LIT82jUuYnsWkx!@Z0i&ETIMISrI*Sg9kT53t@C@_FZIpeyWj8{leh zsK3r5?q)M@NJ3`X&*a2=VA2ny40orF4Q1Zz84r~C%^e_%Sn=hg&lpMPwWR4&`@}|s z3IU-pceg|zr=TImEyA?^bbVX)rHAhxQ4{)@umUH%OHbWuBL=X;#n}RgKSp@uYhDp`Ppm zuc^wL)^rB33T#T>PgMr%pgft)VVCN8unas^J!S>bv@JYdhsnqbw2C$O8#||}S@~5N z(#uv1^?pav*A$N1;?6YyZrNiB7S};O);)a~`EnrPUots0t-Ls4+%KH$I@0{Pn%UVb zt-%Jzs_zeilE0jmW{I#Ei{RisbX%L7n-Owhx46;;&#eNQb|zY5ephU4zie!}s{r4A z^sQd^Or{)UsjN#TK1Uu9KcDT;KWMFG&?dPiqZ-wYX()QlpTk&qUENNFPzdQ;w zvZgpe*O$ns!u$JA!$uH6R=r#o39QT%RJ7h&VzO_GBHRA?KG&?b=#=@?)#{Z=6ZN3t{%|Idvl=;4j`0Tn$soNoM0y;Vst!)U z-dBnddk$OOf!`IK7Z0$iS)4JDbx%d~6&hmEgmAIyYuMV#NYa8Kzg#`f_X&oOSFh=6 zwNQXLGIvz`anhRO_a9W?pkLmuWu7wX;1jxpp0aY0M<^1Oj>5MV*?&HwI6}4me;Fh# z=)Uj2-+zR(CT-1)mf|6rC^l&K{`L&I_8i@F)-{N^ zcyM`r&m2}4t8eaPeNoA>rBr4YGrFa9g(!hat`3H*4PW3IRx0>hl?)FyQajmyRwxS%L$0o3Gxk8)Gi_ACK z?zrG~jhe z`#MBQ?Ds}sdLalTOa}@<(o5Ev^P}H8!rEH4!W|#fP>(yVYD#cvMI76>{_x^Z)nX%?drXqF5D#d2#HY@54(l0 zXE+54F~{f1=ldjS8-Q&K6_Z z8fY{^{m3w(j)p4e&RAxrn7$sU!=d&xhbl$Gme%>JN;7Vn+Oof=x)W{1_Wx{;MegzD zVO1EGNPB}n*JO~>>8>iWVp!u93u1Yo95R3#FZZ~Y`#FmDyyR_1jX2OG9iVlp>ajLuF9nL z4u^NJw)3nn-;s&kd)h`@7wY!zEE&m2wf8|5*3R>g#CD>Y zh%4ZWSjFWO9z8!#6jX#Y)9@4lhp)<|F5q>D1p{`waIjOV(^quDLAzZr&?z=>+y+l+ zsUe@sG3LJ=Odc-M*L`@ogJOQzUzdj9`OqXi0iUI=_125$0}4KI_c~e&{nvo!rFVg! zZ|T+V-dQ#rz!At8tpnJoVp}J@k1u2um6L%hwE$~spUP+RR4C5KOxuzD``eB-HkQBr z2igudlD+umCF3EYP~_w1;B2Cx!hHq13bx)@W+$5;^w((-@|hw6(MF+@sym13ib#OM zW9~qE_dHKe^NzOV)-*gXtD;&mFquBQZ|cwk+4FM zgk4e3Q1zJIG9i_#XYwSXo{HpM$DO5%xc)E9czmH$O0O#w9u}JSZ)oCw+UYVGUZB~+ zOv_^bBHh%EvPu8g`k@Q!<`pfL!ZAcM8CN8fvdYV-d`1mQ9Hf|Uxu1p)s){P0`cr~4>~#v7iS~9DIq8%M9I2PMV6w4ynNx&V%>F7=%ZY9Wc3&ZNkuYv zG1mBLQH~tqZ8TyGm(5EDaKx9(5IiXmVqDz5I2XhGDSO3s(pT;=;;w%=$3Ul9@i?$% zm(|miqEc}jKO>jH=i?tErVMvFy^93BqC~{XsBXyT?dSrTLPYa7fe+K($zd2gCQptL ziilqEkB>ei=sBEFa0GTm%C|5nOlu86F0aJXEtH0CN&&f;Ow$%1nM_|!PlqANE3qF0 zSU1=FHY*357ucn=LP63C^`||f5c@x=PrqxtLCA1*q~o(l79t*FT8InqCJF&Cmy^9j zXb-V|xNzy_UOfW-&+kdqo`Nr!HD?**bxH*Nxf!M#Av)Q)E~BTc2)fU56vCY}4f_yDih!}^%mFW_VTq3`flKLt&SwP-PlR9w`yOj(y{PwZO zlUP{00!noI8;KLC8Ezn0k(oJ9kPJ#oN%|`dHJR|aSx{}m+dVF0jO>Obi=@0bN@_(oX?g}cm}SeWRMlUYT_4I{E=_Dlj@w^ zi74nd(5yYLE22*gL%1GE~mdhPT6AaA-?* z-u1?}i9fh%%X+T4cyJb4^U};8jLrCs`50#|+Mt;)WVkXD=BFpP+W2O^)>=HkXy2X_ z6J?DLPYaG`Bn-}STe?H8pHI8XaV*`nz?n;$dY5gJ$1mNcF71k2O43s1zNFplYXAD+ zKMNb+FRZ!6`#~3fE%`Oswrq>Au(0}5#<NM25l%~pPpyh|k*Gq^@9 zjxA!$B_TJiub5v#a&vm@c7lE4UJ3~hk2?pHmGLhw8slG*mFdV_ySy8>r>17$r$4Se zWY-6|AGf=<7Mze=o0cps6I>b_6I_&*YsorM*tA4S#na-a$-TR~#dnkA{b9vn$%G1Y zF}f2`OiWl9?w7tBeK%Ev!(ST?KMcW%;}z;_6`}WL?+q0(MD<_?IA;6`cY!o#)mu3D zXvU^hgECI_VCO(^`6#V?p9%gfgBiY}iy-o>aQ`o4$>-ZVoiU>|+ddZupUc};GaA$B zxwFX5s{~me(bSm@HW8h%Q-FQ&+ak9<$W9 zR2W`Um-}G@{d){dA^%mSKnu7SmGW1mGETsoqfq~LJ1RYZXSScLFR(8p`jw5C1?>CkN#;v z#+krui+m?7zxB2+TA;@HU8T}k!w8IsjvmN{H16B?%asDYP>v|Bm&N7QjC3S6m}4b8 ztszz_POYBoC@MBm(c1a9v&l+9tms3W^p*BujO3#BuUm!Ae(+_*!AIB8i&|vfN3YYC z!;eO1n$DpdxX*x&L08?jnKB^P2p3vGydEaQ+C z8~YFWzq0o`xS2G4JV^CL$RGPw2xw6SC)gDG@ocX^Dk!j)Re9Milv>Mh{G5?Hg)KNI zJ?CUR&vS}e1zvj65fj#<`QeLoG`7{*1HeNkxIMqz620EHsw-TtJkIyG_b^zn5gCtah>=nP5; zx!`AvzRIyhg+*pH7?;=0VHW+MCn2eKCmP3wH0W-doRjl#(O*Jb{dL3D-m8ZT@{Blg zuD!4|k@okyRZ=lOn>U|;9#^%%KfmoliBg*u`3oub^pRX`=3_WTB92i3b4d#gk8}gB z>g9JRV|1B9INms#^UFoi5Rq`12*f?8-;u@9QchuhzqnMo)UViuQXyYx6q?s{jZ~CX zE-GyUtN#Xa#SCHl5Oa3f%FF!)WXTkn+&T{}@+z4wR2y zZ7Z)V;JTxyJHnu-JJ{;W(#yq+W@njffp&p(L1$0rVgR%YWTi8v;Z?YmxB=QfP3|&% z^y-3TPf9Q*flMZF5cvc&(B#f2f!b_xiPx)~w=^OzYNU|Il!|E5yp`}2T~+>F9R{sp zl2)xhwdmw$CsqxI02VoH?sr)>I8>Pb)$G2XKF$hVE){SydGle#6T&z|<${j+4VKhn zzPO`+Xigu&7ch}om9g-bIOz}Co3WB(?6*8i{!W)A%;v@ab)Or?#dyLMW{TerEtM_J z5K5s8fFZkc6cRAib}#5*i|M@b*&r@66p?^sLP$OIG(<$eV~0inqbsR$H;Nq^hU0Tk z_GWCsN$E)^qha_3hqOb|q0Yd+#g7Pv7lX&Z14Xepzdb&XTOOJG_g`Wdwbqq!dy`WJ zND6x=%p_I1h+(l@Y?LC36eW*>a{q`@MJ2!f!=ZAREoP_6X|=##arxu=qWo>!yoF^p zGT$L`>ls7pBH#Ay`Gp=s-g5`b0MH^!Ecz?oi#5F}<$$ItqerRe*Kn{k+l|)+IogQW z@bJ3}S^~QfUd|wA2;mNiy*%H=Kou~UdHHUJm{rWpu5dD0qRswh7xJ>ZoD7y;^C*&3 zXUYXqDIny!Aa)8R3Yqr^w3x@i@#YI`+^A@nX&MPT3;)jKGHSA~M`xO+;Vj{!H>_3@ z{_Z{Q5O)ya4eV|S>X9(S-b*7?jA25Pv%1XIX(Q;&X#5?rPBFQEmG-MtReDF zdco1+x9Wa=7S$~%4$upZ7yqRU@H5E{ZZTs&O~+0Th`%>)s8)O$(2_gLBr;wpnNcd? z;R`Kfl9ecp@&#I3GSaNa>ab2vwp4^vaXBOj27hGvjbl3E^x{A8EbWKidTQ6QqGhY9 zS1m1C+RH#*L*t9T*zi}(@HRlwPH1*>WAg`z6faz+1B6GRGOLc{RXm-ibM0~A8!Z=+Zq;|d!wN# z1YakE@Xhj?wwo>CIC*td%G+nPhgf6?L_a zmYFrkf7u&>d6?pcu?_3iR<3pFw^dYWH?Or`*1RP{!H&wD=FvN~4L64SoA2CfU659g z#`|M8h)6QKC7Jwed(DhJ8!OIZh|S!bRZB7?@rLS*%o>uqv8@Ok)Y` zA`~7a!=O-7Yc3aJZh?Zn$FE)rg)V>zO|mQupG?hu@!-HNVds>;HVRt|nGwFM4{oY; z77W$21;KxPyUc7}YO|Rq54=k(H(QokZH15aZ6bcXklQ4Ya2x9dVsV`y;8*`N)d|HC zwre{mZGP4lEapylvYS(yFI78>oJ^EOnTG&UK&`(WTliq1(nLr#o6Q6!{ z|GFhmQN6)atS07azmg*UNtvIV#MLCrxD5E-`C9|fJc7`XMK4p4QHn1m*;i8&Qj##* zR2iQkR^iI<=-=aG66PIVfAryZuVcU&8Mw-V28NH(s&QOe=$U(D76>eurH<8FqGvHk z8FP;~q89cjgGIpuVSAg^*;oZ0kCm&kQF(|lassBF8=^XiK%9a?KkchyFBI{h_0dv- zQn3WzO{efSii_)xI7>e%DXG|g)LT_?)Kk5?a(umZqq&DzbN;_`VX2m9E{j-#Cz2Q+k&G#Da^`4+Nrf_1Y{M$>n?`++~#a&K8@3qGR#9fO=&VH8Xs^N2^Wol&cv-YPAHG+NR&vFVBy6h+Ovw2Zc z$bCWKp-bI?o}CBrCLT|03c26DL$?FqFPu=_1no)ts7_wHhcUits^s(M(^v9^t5zE> z%CB6tDlFU6QOYJ*hTR-0PZE+`W*Dul#qKEWs9=ZpGbXiUcum`~H+9|dFnO5t>tN67 z@WBVuAes9Kb;G6T<6&eDyvcBHfrAHAFD2l%B}cK98(wT)Y-qlHjA;Ygz_t9KydzuW zUQEaZ+QL1-(7-(iqmKVzEtywacI30Fp3R@`TyrmWHAt5On?+Bv*>T`lq>aX6BT?0d_8*z&tK4%mCY8w*PqR z@dfYVR)OKzCwt5Ge%ktJhyG+;zL>duW9L?}gI0qR2fn*=mQE(*=$}RDQDaBx?OfQx zLmBBsz{`VhYLd0gS(Xg43_1pf3x+uj{K>6nOh(hhb=A^qxNLgD7b!W4Oo@p!r48Ao z&OrMYFL`rqgD6$Y<7FCt8c{?gl-8n1Z3Z~2~!SFYq$ zykK?m1sK5g2nJSjgeI?FWn9$&+1KCE6lG2R>Yzksx;GQ%2O?DEKbjba9L~^_%k}%U z5m8Zqs4(DS!eh`{G=uNHLY*+y|dr`K@SjD{T z>oUe5PUj&}@m;mp- zzL3aZ{X+xJL>_3HT0PJ7%bqOba$^974W-*8K>guanEIU}u;a6^g!p&|%mE4!+?i-- zHiB44OXP32ZpxZOO~mAEou9=a2I6VkcWPmmZn!Jm)O|buBn+t{Jl5s`K@l)!-}f8u z+N9PWfuuJBGryf9py|*Vf1SJgJ_AG51q&L(`KZLr8bt&@H)%5m_1RJ}xNfHt^Zu|l zuymU%FDyLH5SwsMD4sJ7WXa=?<`|%1^9{t8GQN40VO4{iE{A{d5W{a&x2neqAJ;Hi z*df4;>1*K&0UpleK91n73PC%*3qr4is>brO$*0fEFfkdK`~XKlLkXa&n9L$Q@a2K$ zskyLybP1C;D<%>K+4fEl%bwSEG|QxqvUJtG(%u@xt;4nl9iU_OpvT*@jpagBGWT#u zDY;7*N0+1!uD9)Te7E*7KHNMJ4wqGE$WJ4LZ`^IhbG}-arGtit2uzu)0X|83*Cz>R zVlUHZ(8BC*DT1UoeT6wr8cjDx(9hYNlpDcUXf`LJ!ugHC0;&#^@&4}l_Zc_=7k&u- zJ)N_Tg9zW%S6KX8!o%ZB8vbfXUMXz&&=(14u~BUlo7vN4sm8l!CS>vlwa5(maHj`4{p;^*RsgexKK45C6`)jlmw z@RfCZy<~xX6+SC0EKX1nQP{LPyDCEkUN#qY!m*otT-G-shO~X=QZ+mk?BI_ z_d^AneFsD03fdR0*j(^w2(V~W`eE7}2|Y9b&_Dy#f172RI0L|<8Pg##M;809lx-|5 z>5CL?&MPdpmcF@^6iW;Gw{7J=^Mj@cS?o2*(;Ow_vDa>=UBdn6?YhE(sWrA5vfRI< z8y8aKDb6j|5?|dm6(dJ8w>6;j5exd>&79|QNZI*W2t;(tmo`s4v}DogVm24Y=Nah> zfZ*ZN%|OVdw0c3V{o_Uen}J{ndv7Ml*U?&jvobaBdqoUr`1p4F-#k{ts=usE&GP<3 zo0s=}WvcqiAVAfZ%2@RGSw9dW9YsvjML`Doi|oYzSbx9wV+!vJJBDm)zacvU2wL;b zL|J%6KN5dY#t{ezjnVA@((KJrJqzC(?p$c-a0X1!K5O=gomEn)ItuYHuy&L z{XTgyPQ2{MFOL;5>iZR`xjyMPyRk~|VT3b&s6h37MNHoJGBPN5GQSZuN5~odfS3M^B zv4L)ug2hZ^oUZeNMoi&tKza4B+7P%K$!c5uxu@(U%Mcmko5V^ciDBkwGiNr(ZjarU zGv6B?(~zts=2FOriOK$AhZsA1{O!WYT4Ez{Y`QPw=OS)PrYIdNsHToS?2q~}gs>4p z0-YklGjhTm3HY06B0pQgek#K@d@S@M0p_Csru82UlU-T8Y+C?%2&(CVI-q--^zoiu zS(>6dz2oHd2t3~1*_632(-}aAtA461ag>z*R9@sLLfA|Gx}Pz+QKDcHsb;nt#aRQ$ zu?dd9(i4P3FbIX^)zMYaL%V(JSfj3&`7eixsryRc5pk9J4x^Pk`v?D=dd-;VrhF)J z)^!~Mj>rr*0t`ZU6%AXr79qIyEqI}JtYXm0lT%OpBBKZ`rTvTb8H+%g=5$xe0$vHi zl$Yh8pJ_Q$EJx<4O9iPz>E2fK`!Czv9)`!&=5jOKh{u$wM)3m(WQrFlP<8(!OL-fc z|1e>%j3swM^Pf-un#ZLRBDpz!KvA%^alxz9zwi*>;=(kS*5t@jl%ITRDP=AW`^Z8* z6u1*oM+M`h&f}5=7A3U6?$aw?nk{FM!k&q)kF?^B_TCH7VndT7lqW5iE3h~%^anwR zklGD!)V98hoSU?Wuh^56{$a4c;GWWS)VTrmbK8Imfq{k(WKY^S`L@ zx_93%z5nWO9t9tD7VQUA?azO3?%xO=gOD*73B@B>V1k-<9hr!(K`H9iYRlZeLPW5| zA{I&eN#OgsIms`=V>s`Pnt5e8QZ^=iAp(BLq9}3LyU0&0i7oMK2)}hC@=u0HpX<)a zaDv@Y?>m6v>G)C?Q&ddM%C@L+Xpc-pKue%tP=zNMW7ISC<=b7S-8hL#^} z&;w%ioJ}z?;y<(2Cr4kYBt~pv>G|iWhbX+#6LJEX z;cH}MpB6A@x6-l&QeJ0TAAdjmsNXg5cEfo{>DJ32+S6BqKfOq5MYmosrGeZcT673f zCG^bfxXAagvyH-JWKg|SNca=|N>g0s+ePO~NzYD^<(~^@ZlcX4ft8@8i?3hv-nna2OFaQ(s81Q#Y;t((I9` zCr0`v=)E&nKojIjyFHauHDw*08x8Hj)1M#coj$eJMCukO8X@Vy8#82@{j2`ODCGe8R^ZpIg;d)|-W=KM5quuEC-k+kA0!QaA1x*(UMO?_ zfAxEJf^+WKHP3;;?-{2UAAHzB_7}AgYE^}MdQ?#F>Pc_TD z1y%kpyy|;p-SD^q?Rip%#3!oU`BLFW`8Mf{CcEZrBM*ezAY{tWOlmDvhABz$n_xLo z=)wlo9M)`DKxfm)B2-R>uyf9+?Km&k(~cBfN)nMe##6BZVvK>tmc=Y3wK|{9@GPOU zktqK(_}}Ivad-(VG`(w({p)s0Ji4q&;R-tO_}GKm^-0(%jScZX&&C*-t$x!rLfiHjU!by{jOLvllcb-Yo(-40DLlCy>zYF zUYn$d%)IARbc-?}WpFHbw<_fRM)7gtO*>P%`f*>75V5;U6?^8Y);RYlahZ)+6 zO#3D_jh#p-2!oe69r_v0`DFpxB%iyVsaU!O4sO>1<3}7Oj#!amAS=H`sqp;iM=!HE z0jPVU#(TUAsj~`qyoD)p(jtWd-dNh2p&81bPi~Ld6c35-2i+u&UI51XGf(t8e}>Yl zq(E%EY0TsGZmOdby=F=j{XraEm(S7ParXWepflUCMW&z9PO%x0gn}kTIyX|oJQz2e zj+Vqugh^V86vNUlMRQ^&)xiRo2>agNf}x^Q_rAc@zAHh?LNWy5rA34B}x5?NXl46V3Afy9Y{P= zYb@+BTzT({%)!bkJ^I{p^k-n)uwFiXgn+gOulFX7Ao(-6Rc|2njyapG8jeV+qkFt& zN)&x4j@}_nAD8SfB4j}r^7>r(s#wRcN@klR*|zTUiWFILOY|r(exO;BylBmg=v$+` z3KtRXa>_w%3f{Br+i!xP#E&i%nCLG|5>yQsRE>Dtg1*UjTI>^bJCP%hrXe{|NOn4dPM!r`4Q8;Yy5F9f(5sTURGnCd(-%DQK zqLYH&L|~!#jucp?6IOWLkI+-sUN>o5*K6H8PIj6Iq)E4FmiBrXf9bMoYVs~U=s9{3 zJDZ;mVuA~2ki(`WzF8=co@>)v^_4o95;h(nC=p|RlK85 z;jD>>fH@Lip=>T%e+e#IV_mk0=yuQ9I|e{!xL-N!nj^3kvrOqdHQ!Y#}1JVtFUHda@w;5$dGY{<|4kljfR=MOgQGT(|;n#z}Od zaLhtWz?}9uZ%!lVQz427Ux|0Vbrz%ctrvn4qXNawhB?e&p}So4DcmuUJY!^Uq%w$5?*_^lB60pENO)UhM&E^EG@OEA``T4U$ zPb1LE*r1iUL90N6ezSU5J0^)S^BN{0ef2QzWGi&>Dyv^beqN~M>F9^ z!lrjhp3NIsafv%|mJ_Y7L?*s&_$axZ{#8mM0di2cPrW2}`x;3Tpz6tcF`qqm6QE1b zNTA{(!6@v7OVYs%gHniWRoYmP1QaJ z^R-SreU_frEv1&-|H>qkUHPWRCS?_LOy8Cc494@C2|-l%WM}o9h`N~TGQMsKyfR6D z;Y&FXI0YqeLur=nObw_9TFiLl*@ZOppHgb8 zeXpWT^9_T8x6SkL^eK$IQ96H1n9Un49vzG&4787FgmR>(az- z_h~pD;QR4v?(4xr-_1?Q8wXS?ep=+gSImNMneNnQVX~&H#~*PAu z0Kw~>&O=g)8S<-pD5X3!P0jCcT7}8u>9;L2`b7>0)YHwa5ICoCpg1_}+#Gkv-Emjd z+;ROEjuO=ULWaxQyaV1ykmDgYkwh_Ka*1IWtH2f#_qaRI`Dt2aHx8?U zr#FP+G#xuhW38*^^46|Ore=IqH-umCr8C4}j}Q9o*=iQlnw=j`@7{jeb%5US=CcgI zo~YXJEFQfSbpgWt`GLy#mlF57KUw|{JO6m{mK5=iJyUk?Z$WW7q3##765CN9>5_Nb z%!;G-tcMW8CTczTK|6J7d6TZV4P+K>sz|zg%(`Og_@56yc>;>!0Ct(IW9o+!)*phF zD1sMmGB(ak*i7+~#2s(VMqmf^{xe%~ShvkK93nREftdy2Hv>UXj1fe?`~t+7nQE&^ z_|?W5!Y};t`GRiK8SAgHKmDo65VH+4G2%6g7c8y`@j5ycb3e~%*8`3hy5vFAWVof? zZY9?19)39puObwa_^C(oFZm^o=pGQmk!D~E(AL5?S-k`gX7G>l3*UyAH>KJzhcj#6 z>}!4=errGc5FhjdFNGM7kX2ad2EP6+iy$U(FHl8d+txXZ zw?~M>L2PsLv7TXLG&WN>Egt2Kp}9XkQ`Y(HEOg?hBX%6x@6bVi!76|K4XUK8Y4ao; za`zs*^AU`?Tg9h`x~td?Me*$;llUxi6@u#)o`_Gm#GJn!;!~ZmyAE6f^*oP?TY@+E|of@uk5h+*1O0^4lGQ6yj0x;0h`WzdZ_$R>ski zI7+6i%Wmp32$r(Hx4*Z)x4*Z)&%f^@Qu=h#r|;z+1DlucRoFj6%Bn(O{g}GE9MDfT z4fA`H*>Y4H0(zC8>L7YjP<;@+NIG-AJDs4|tL@eHYJ0W4y1%-L_G){zeKdKSm!;1_ zn?PU5kVaT`ij);2T)vATr0ftbFX%*CKD;{kk!6plMiOS1O;tcI-RgOG>qw$}y!B?4 zjPlm63XpBfjwYlUbKVI>FL`t`O=4H6I2~ooQvuMizU<@Sj=|?Uj51!P_BCN8Lm=o7d+&>F^hOM zSIx&fZ&~l+v7R>Zd6=*Hi92l9Cmy(u+`M{(d0Km?e7&^T{COy`eyC+xQXgNqd4S7C z$^|$2Qwq&3h4(M%Tb61!o<lC!unHsEiz6Q&k1nZrI8gvqB(MhODr;;0zlTFyr)W>Tc2R_iqNV(vG zKc&#t!Bb%Fj?cJO-gv5irczC4Dzt8+|OYes!-%9^DU8 z%(3{2t(=X_4=sMT3j%B2#XN0-N3hnJh!#5uRy%n&j%>ktCrtjm^%5Kn z1K*sp6iAkWuarXfmBK%k^tW_v>@@OlsQf?*&(YYjgZMqc`h=UM$}1i`vi+bQL7er? zR4fMBL5o5CpkA72oR49?WYx59yIgk%uh{2YW9MZhp8m-OuhwOcTaEDy>C zJq|~INgc!&1V<;F?_B!e`8KRmpQ!@_27M$*6b$h=46|AEivsD_rho{~Y-ex#a-F>N z*ti77d30{0^L-fmys~x#4$E2t*dYO1Bw&vOY?6Ro60l8@&5;x8K=Pf*>7=Lp(id9- z*bl&NQ7raTi>&&tlldJNEcs#?7wbK_*z1l*8TO-a%B+b_EwGmW6~HJx<9VY5KnW*6 z=|^s1;pFT8v2+`*lr5zeo7gmr()BL!yfG;DqVg2xW8(jYc|W)EqMvqN?0QCY>udu3 zd$S`y?bj~70}EJ^mbmntCig0bD-z>7bt+J4jSq;p%5L@{1lfC8+B17^SW@F7f-3vj z#|?tA4<}_G4&PLh)B5=T{>cnx6GW{Ue6Ch+_n#4(y zr%YS8Xfb?r$3S#Rp4o8*z^@2YMmo$GFt)o*CG4M8@L?7HkXNm7pyDD4Khbdhtj?`t zlLlN4JRG9)S`{%eqC&CwBL4jaXmiQhGFf}>m#bL^iH*q2C20JRuwZicQ`8`m8lyzZ z2@XzQB&Q+dOj_k^klClo`DR{^WUnxAQ@{N+E7wVX{$6;ca*Fu>$xQ-Ia(HA9DY@|xEhijQc?x@sQ?eBQqV zym?l|E0&yyRzwQQkFN%P-tK-4ctkdLn#XxepFbr35O}jYE#S=ofa9Rs!%K7SqHp14 z$7$Pbez(tmR6q#&6;PQt$&!DgzN{gi?mYvsv}7>K_CA(v)z(i5e@t4aEF5KF-^*%* zvX(>nfkN4=M7(6Nr7)vuV~iKwRArae6YK((jfgkc1?5|YG6Q+c!M)YJj@Q`vvkw5D zWdD&@AKvUQ^0I!(Q8kRF-*qnTM&unFzBC-o6Gy#8)A3^VM;@9h+(BU@-*9oR^U*xS z1l9S^jW02abSEUQUyo#CLd=q+{h{`U{w_^Y9P!&W>M0A{bDeu7(9&;u>%zwe4E zSUw|>ei!h)gN_8?kN^EUN*oC;d`5Dom}mu-=qr@I{jPey@LTB3OTN=5ZZCWa8fy~c z%m1bA;QxOWzwyKE=^uyuDKPXXSNa^`V*YV|@@Jt6$9eyY{ki~&BL^My_lIW$uDvJx zS3>+ZECt0MW0o6|iQ4(`U)M(7bEy7(k2_(Su#@p~@egRhsx%=K2k4T;V0jDW*kc+( zUT?J;ytoF|0G=F2C;ocCyI74L>PY}iU!LMbO_$Blv_C&VLSE&7Vw9`Vtst>mYo1v# z6=-`J)JF5-97|z^mYFG77Uyx@4iY1V9J9^7UKI!^uF6L>{4B;E(-87{#;e-{Yp8kH zlMd`X%l&wAw7EZ{{VvIh)H{M&Zv;iL!o>ZASbM3DVn$0x73+vCPt`yN>bmNtcSD?Y z1A7#I$p<#t30D9%d&QRrHf!Z~H?YpWcUfR_mSzy}#qtau!20@@6<8y?OB1j+`4dqGNzyYh(P{JBL zxgF07Y%L2KP@Loq9Po)67(huHd3*`lMC=4!4EIQ}0Fn{|`E%fhp=%B3(rRI%XiOku zq+Ob`j&^3EwUZMiS#&0DAMgZB>tKalxw~B4>Y?G3v2B?ghWxn&G+A4y>phk*4^qNdl}c} zWP{pmephohEylSr?jFSr?PF5kIWr3wX6@}-d>r_5mEqCpG%Y-R^2p$dHrr-O9BjZS zRO@V8X&Y_6j2z8E=qR-_Yd4goYN}9lF7;$N_4AOUst<>AV1WTY3_apV*E$T*vd;K? z;oXtW^#ZA2YlcQU=V@dh^Vlvhf1VZv=#Ak3|2QJIK%)}j1pX9}lvfK;%8g^Y)=7&7 z?0SrW4VVNyaKLnkXMH}j*7<15e$}1TK*=y*AL&;|on#Xv!^HtQ

DfA=c2;oWu+B_)KzFtn_tdZcl9IMHVSj#_?#={Sy_8e0P`gxe<+D?mu~)rk ziIj8=aURcI1c|Im%YDG^nF*N&@3odnD?;O2N}K$Y>iZ{F>lFweqq-v)07cwW9|5nd z`TD&RC3>3CON|`A*|OD)PASd!fqFH)&QCLnQ7FeSdj04byQZLnW=6uUk)i7zW@2WL z*S^;Vtl%cs1vb((E(dJplzo%d-FdB}``zjpxl@dOz-M}I{{gH`1{GM(n`i`G34@7nUu{l`u-8a9Dp^kNi;r;Q0%xg|St`FRQGTrZFcwkA%rg$Fp& zaN@8#GpInX?^y#ah%K93G)fC*`=Mv#wE!Jc!rp9CUFsmX@{H3*ZwOP7PXcJ9)G4L*(#Km|l`C#^ z-enugxf4tX$AUmNI}>rK63$+Ey{cUa=&^8ZJp$iqnY|b@cM5iee5Y|B}fv+BP!Do~RCWW))Y3W4`r;lwZu zoGa@K!G1FoXgI4)TzScgX@E&jt^;~+jB3MYt_XH#)@O{7U?Wr@Jp}v9dIAMPv{TtJ zhrokNeHnr^*mc6klEB`N#=KNfeLVV0=E{>u#CR1~Dxj`tZ%}teBk!9i&3rbBSjG?A zLmAm(lBHLxlS_?qa~dL<48-i>BRI$id}NI$6CviGO$vau0Y@BN3Yo{V>=qH7ulXVw zawlkKI~D}moN4UAqkH0VOYO6+WG1UUEp{Wr7};-2W%^?-#;Vzgcovv0%6{2Pl+<&N znEjB|SQPSx?0`%+V_vz1G$f%feY z2cRGNqg&dmsf|!{g9Cluimz}2PR8LpdXG2(Cp3RJk|lBOdlkr@u!;>N1CMCLAvsSj zY@2A?TPRSdW1;kn@;#~2c&m?Tvte*|w(hR=Df|Q@r?1RTK;A9JwWjDmb^1EhdSGTP z>iLm{c8`8Fyl+I|o*v$CpG`Z9B)GBy6rcbFD8Mj~$R-!?BT01Qj+xgZH+Q9E>w9Ry_b!htqmM|Tf97zE6y<`y=kGziEL?Vg_}iKWCis^=*U z2*~J#3$)P0nkYT1Tj3o=vP0QqyQSczr~Uw#>9m@?yV zXf!gG+edqz9uyk(yc4WP2eWoQrL7ldet^ktip1WYQ12rkAfp!!v;pg|-Dl%@lE647 zdJ)m}7{NHxA(#vB@g(((_e|`KAiv z6UZ}B;5Be1GSA45LIL+S__n9KT6Y(FIYxZGAr1Gd)y|hZ zJx33l?zFc>$kA^p#~Hp#_-RRHYRWq}4MQ z064zn_#9L)kY~so z6M>xjF!d4b9@Ajq-V_d`=HTFc%zHpNph}E1ao?i+4{4G?nV{?wB3J3 zT0_OUuM#7!40EzJ!tdVpvbRG0Ig6C3P^8{jc)UH{m`VpFu57FA^|%{H+7&~byWs`H z9v~S0IhC&v^eobp_!cDUWvF3@8p{!Jp|pHK%4Oit!v@dbGZ$?=aVti!E>T&eNJglH z9udBj#N| zIKFqyy3yN>AAvKpcF-Q79gLiYx!%*m<0g#DJ1*1MLWw74%2CP)Dbf-uk3?cZ#kec9 zpv-9W5YzyoChb)I0xjst7RVR$g84-Wr|zyvtt{fo4&I;Pe@gF^_wXO=(}Nz;1%LPo z_7N^tSH{0*5$&8qb!CHGsWD34TE0tv(%m_Hg`>jdteYk$6El`XCLNrj1Xb^@=m9_l{Lh@WyoIxf_06M*29fZv**XI*D&c-rApSOFkn zv=lR0k%f}8s41~P%SVsq}3c;d>zIAt?=V)oxS9p?H1_(?2DwF@^v*fkq42}T9 zXnd|XOd}!U`mbyH|E~whv3R&5wj{x=8d&7IGnGQfQwwCe*lXliw%pMZIOm=Nh*+|% zQVvrkoR_lh^UiTU#&8m`;oqhy5oWdgyWm_;zn^vbf&#*n@6`ZqV&}O82!4pqDH1M| z4U$`XILEJm-%TX}AXEO$B}o1^r6**sZGqM!n~LQo=U`H84Fo2mg^dyzfV;?BT$Dqv zaAA^+o*c$nm$Ib^(junWf`kI_S6v={%f37@nsZRm<1C18&u}^`iBuwul>+9%5xaG) zM7XqvP6Jll8;aP87NMp5*?Jc;6P2$3wN5Q|jrX(9?_y*u-CP2+Cvy3P$W*8islM<*ve!Mn_gk>qI# zRLDjgD-jmQIV;gLJZz7R5Y5!YQ=ma8QIDE2I9cOjB?Pc76R}OvDgo;)v#}t3f}iV= zz%hFV*v^&S>ap#s6G{I%qA4~>Z4it~LJUm+AV5T_5@59B0;7Ow2OYjWh7cXMzCEYz z73A3`MfCz#N=ygLQ|+Ug>Rsa8j08Z7{)m5>jl@MgL=LE};3X7P5 zrR=BiwJs*IpW4|vOl2Kqt+41Y6+m;Tcw8S8VQsGgH-RhH**)mWPtD^4#uMI8Z^;Q&a~ zP#7)tn`eD`nRoA^5Kmx(8>QWQ1%wo2)JPyYGB`(R@361z*uK%U{V{@(&3@Lk1o;Fw zq1)+vY5F6DTv8r;P@O>>q$_BObyXp@P>@52>H}VcB_(hKuA2^TRswu-u8KAD6pRF( zCV#AnCU@;I3$eSk**z($>r_0j_4$%^e{9z)!a>^WvRV2e5q1(Q|pMT{ZnvGZUA?(;Ix zV5f3f9~p?Iv6~23tSbW1%@G}e*^Gj3^VF8Bu+Yb@W#Xh}5$o&8Ym#ik4`0OK62-X#vs9o{ZaVA^3GOSd{>_sWEM zGeJPeY95C1%uKwfIzxE|I6H7|T3f1mIiD?Ms>D4Hj?JMU@@_kwz-9UfwoUFn5+IC* zEmD`6BN-c2?E}VKDJWhc&lN&&165wGW@OcD5i>=Gz1P2Z?)YZ@3m9f%!kurwT(pMH zJ+vdKRHF=}j0wZ!^AGeS3&sK`_uO?n?K!I8I17_tVlywpgzB;fgKbx@^f)`eVWj_M zPAStiiybpWx>p7{l{_XX2u~OrhG2U3H1g+aY#Zz|&(N9a%g8jTH`*~`Z%rbVIlkBI z*oxMLSzzP>ai%fiBTR#$=89x*DSAq?CP{A!lP-!xupHCghg2QL)QR~7j@XAE`h>F7 z4Md~?7tT#%8*Ca!0hJFs^vHtAIl5(MSJZhZs1gQEPFz)gSfExgTwe5(`DOH{++ogo z3zQia=|oG(ne&pGP-B4Xv=f&hN=6aE{+uXYv7wO_=_;ydoy+6V2l?4&L%RiR5Y~_o zFG}Z8vBDXTTr(Wy5tOsTX#!lLQ(zLu8R8itE25g!$G;0bEaLK3usivT4Y}Qhj7?Y& z=(z9klAaTH`Q0{_NC@w^;q>dS)55;`*dwgtp6WO-{3+<16ck$%q?*6#ai-Lp{6^J_ z%viW*AqS>x5E~^($=^z@VAlo zy@V)FDNm$=pjD?W0S$)~4hr!eHO+z7&RgY}zDw5wG$&YT>lD)R9$O%-i1B&reUTld zlaOPzA0HMa9IyRlYi98QWE;XZDQu9k>SB%b35tWMMW=o#!pO|E8?9;#pAo!7{ouv= zh6XA6K2eA%Ov$9uK1>%!9pDBx4@;geFF*A+U->Bpfry9Rk@~BCXU|Ly{D_9=1kLy zPQP`Ug>>kmB}+fg!d6b;Q3bG{G-<+fm$%)~e14E~HRdw8oZJ-*UGk=S{js<_yV$F| zsYD){X8dRXFdGWd$6m`;62o`}S!u;WSCe?jTu;ir~g}kDDJ9JcyZ`|FF%SSv@9&=Uxr(SjF8T$byFyv^ zVzeM|lld;+>=FBm$M0WWoo$t~E_UpCJ@;ghKja=u%D)&DS9FR>7_QF|DltG9wY-n+ z@zVw3;;wxB^<$l_w$kZw?!T@*?^tMU!CEE?M*f9}3ncY5>JnNXVwsheIvPS4(E0@+ zo-Z<>2^zAasOPHeg|*5;~S(6!zd9&G}*6 z4=<%|)!}9SqEDSI_8r*IGX9*;&JwQ8J!GT84d%E|Z?l1AWm6`QcuIhQzoJ;iRhT*+ z>*`O71=gnsbrRht4?0pPlCA|nA;ytZ24zE#dT*r622iIECi@lDbcd(>i*i@9=HpL{ z%D79C6w~%g8d)#53T0(djVs_s9{5AWHe=-7nQ}L2MwrzpAy`(0%*N--Mz4y3keeGa*w5E-$v3s4hp3p*fT;-e)wb*Y>f65`zP>zlx9;j8 zdLO^Lxhc7A!$+wO+i8eHH#nz+zjeSfM)sK2>~p{srF%i(IJwH$h1uyX71qwk{(u^8 ztcO8Ou01`OGP-PY4rLL*C+0{(_+&?bPliy-QbMwcZ44-Oa}kVUO7Q7&B=2-IoVmcf zHmov%w&H|(FmrfOCH7u*1=yFW$9) zxrkt`K>z;n&qnieqb0JsGj+03J%Y_Dl45bw0&6q%bB@;7*keXFN+y_gt0lBO&eesA z4Q)DBe$c>k%dVYl1yGPsWnHX6m6QK8 za?2it+Z>s!VXNuC{rVIYF9;PO22%BPzx}dI4s>s|(aV#=UQ68E?CDU&jmgL)&;5qf znGuzJyzfWfZ!5HS03$llR>l5F_V^?70zdoZSp95(ydufDTR5qS&>#hNk2bET;~%wx z6dkjA#-8!)+H#w7f2ibFK|>L^PW?xWxT(nO^fo~n6J)gj*7Yi#fYi-dKjIp4&(`tJ z^{j$~x6>{*e)#RWjNWRcBX+!kQvfF|bIwpF(eX1irU?;XAWwO|53CH`5 z7FtzqhBq`GEDwTR1h2;?8&v1f9GEIhs<-4~xhg$%EaZ1L+rjy|rDQ^GT^i~{!K({9 z!P@ju&Te{HQrP_|xalldV@)XlXDj7Eqpu7JmB!V{rvzYJ=}YJ_?HVW%w7P=D!eKBP zsRvH3Qw49bwyS$)40ZQl#q>`IDJ)IMJ^e=%`yQjLwR0wSGJ-W_VSGhn&p9I25|<-t z0i=>vOfZX(lCiQ@0=q*8RSzrifwV|@>=GKv3MsEJdL~%hRWkq+wD?*Dc5GjJy0#mU zRXwc6x{IQs;uVT#@sKVzw>c!T_Iu*I3m)DR*_EfrgG|oJpC7Q0KI2ML=4fy^VH{XB z&jY`(IbJUr^m?tp8$zWQcYZ4d^u9{jzO0HIvVMM2REf5T@<(W+h;4o0uDjeGSJXBXTLFZkT;LUWJgdrGQC=)HAO4(74&0Z4%pj zy^H+aU-vIBPm9isGXPLPufIc6@6C(FAA0)l@CTxVtHt>+sGoKDN#%dRY{dM-Y_d)D zoD%St9f3V|MWJa^6EK5-`snq3&bqkTcJ_Q(etnb@@%TEux_ja7=Ih(@<8|2{7)uBK z;VbQ*P4iE>yi`^D?Q7Z8ELXy@men@eS#GB)+iO9-cS>`{HtXV<&6JmI{(eOW#4G>4 z^7da+^=s4p?YA$_k2?ormoDvHIBtpjCfXM&cH5i%8r*~R))Qz%QcMJ%SK6a%jZ!Ex z!9&>~LE#!B91-$ADE~O!2bFitwM{6&@6-J5(OcHZ3^BBmrx~{~-lFkXDnF9xXIu70 zOm5s{miyk%fSe8aq9V}5i9~6l4}ozs> zg1V<0C)uDMb+weRXn*hT0;g7YZxU#;0miIpjJ}Ofcl|x`&;K^_1j={ib@8y5GnRfS z)C^a?C)2mK%x8S#ri{INWegxA3Jiopt(I_4sGb`PfJ3dPqK)!zx7Xonts6vPpNYCL z^iO}Z4vh*2hg0x5&TM>8mN-Fc(736BHN922>_0`Wv)W_1T}S zQ+9S1PI2YOGCi|pJVHMQ7}2%&FkrTM%M6>fe%IUT{?s5|QwO!HuD_2)3BW};@H!V> zYO8WXyR+gO=)14;rXop5Ue7hrvMw8QEG!}tV_eutkG^66kn_o}wvsiNvH)?NysEX} zH4f4w!n|V0Tsot4B)Dr9aowp#s0TrGkB($p?O}Ze7>i=klT4J%o{IKyek`-qNQ|1} zzw*(`Ti>VaGP73j_AHT+ETV|i7u|MUoJyo*s5;l`9FY^dgoS4&Hu$PHUMYtpO@7Ix zTELkuM@skN{(SuL^~?PMOmE;UW!QQ8VID1Oy{h2_H*_|&=BPbbu zCIMi9b?4qIp3K6_?Juz%O22a@6%CP^zG3VrQ`iHeW3E+|;eD`h(w)P+Y;^RmJ|JOH zjg7`wldJ&?S+g+UH+v6NgQ!*;Zw8b(s1@!V9T5NYtqjV=KN64#jTk9BjoZJa`tV}> zBAgJihc`j@DE;QP1_G||DKKO2HxPganwN%JfN&#$UD$rcejB=1Q@?H}w(dYgstnsQ;`8RBk-$a-%+t`pMj1xq}j3uj*r z4!1LXpqsQ6-Od@%+qbN@s9!phyoWuQNbQHPjh$4Uf?rMv18h?wwpy&~{oahJ3;v~c zc`7#IjlHT!%GzuOSsgjSvgV3Xuud^eIuMfyojGlQ8|+OeAEvz-vBmY^RvTz7l@6vq z(~IG|9{rpjR+-=6tg3Z%fgR-6j9w(wrP=E==rm!Xc539EOHX zj=Qt_*VpIaVYtoX+}JllV$}7wBA=dUG9#qw3^e)W?8sF`z1j zWB|{Uw|@c^n;T+te*5R>7nA7=yiw*m$S*y zr0|yW&GV^TQhI7~5}M_2L$(af7o_5xNmg5DWc$VoOU>06^xmgcdnjbap;i{|LT(a) zRMqr<%V@C|oo6IAU8&dOg@upMo(}DFU%nm9@!AH2^RrErc$RV_Qk>5zP2ppsm^3I; z=AYZ|wK%>m==|v_GcC4w(K4@L2RUqbrmF@j&Us7ef86PM@;Yd^vy=RB_g1sR$gw(0 zb3|`icDz;AII%=5i$im~tBT|CBd6Ta?QOO3ZO$v~qH^4O?c2v^*;I%oozFE*=VPY$ zaIm5Di2X6V$W+m>!|PPh=6#R@s{sOatnB z?q{Gu_MdS2s?J@|L1%!!P;&&uiPSuP={xebd)T^Py4XoL-z0 zZxtIL8j7m^LoQzjWOeW@*=DWI+Q8Ru%o=mff8*484$PievVUrGArDAqIsTy@RN|=WAOZE79XMQLgf|xo?aTcKnB-ISvGZkq;M|b2 zp7qNE?;U2`p5QRBJ%O-V%*!+XYkT0X{+YZd>GxHHllq4)JQ^SSrle}&CS*8In>=vB z##rR=Wh@oq^5pedJ*xXMff@RD1A{ZZQ1PWsrCsIJy8MiTNNs@2QDz$lGk2JI=b^C8 z*`_&RL#%m10^DEykRD$1wvNu4KPbQr0-lpNjz{TW*r5C0v>plqbwL3vp@|G#*7h(> zh@W1&n*7ei&W73Bx#C|A#7!X&Nk^uR1FgSt;OSlNI-LqPRwkz!9t%+MhJUU`>?r9R zwUZrwWUbp*&4$i~GBW+rwK?ov;SMHT0KV-cOiajH7qr8Bui$SksU7$nRIITNaC&<1Y$*gNUNH!2eg0*C0TL#h?p zvQ}%`aY_)P%$mGGgDE7P#_MFIZArqWFYTsv(?{!;UL)b5Gf@f*kPK54H9~`j?rwO0 zw7}8{*j`5G&2lW<59_q^w8I|W=I8Fy%QV%%3OXD=y)+`&*RsAxoYjNRu zE;6`{iSWuP2EJjw>1J!02S0!{=wg2ZjN3hP?fo-NYZ_=8JT4eeg;V8pfMZrZs3&*TK0fl^ zjK8SjpY;pY>b2l4zIvAQgEruY413;=GD!OAH>CW*lXPN2d5b2|T!lTc0V}Gh?bTGwYik$qOOfu z;hcG4!10_$*$LQ-+f%+IMuF|=r>y+qlK$(J9e}KJb_RmW>wC|+)_57ONvJT{1ZX>< zj|3Un_H=RrFoDyjeL{9s&g@fU23p7uwBNJt*)7GFGVNDkx|d*2MCftzT35NF>vQl3 zq?kOg8;@A`r@okWay@*n;_9#ytB91|Ri?o&>hg@D!844$spGOXTpZLM*{m4;Ikriq zY#50nVMO+DZVf*^4EiHe(;E=}~*6_k#gsj%(#3~IHtMYaat zKt%GGJX8o-x2r82g`wGdtYU22lYR^_bNmL|oT{Z86rI@JjAat!^6Uq!mRxrzI z!rC<16TV0j7B&*kR8R`2=_+v(u$GPT)z87U=?M&1Ghm~Cw2G59m3W8kstG@nG62Al zwkRKqC@`^Wnu2?%`6ISRe?#_xT8= z?>7tBku+zM$ePiRQQ7Z``HH*J4$QuHx}(1g8laH^Cm-tw96ZGcj}NbK?!%*~J+PCw zJlNd84DFrFB}rroc01gGa?2#BL31ESfXKf!ium-T;?i)$iUOH98in?G*WoSjw>3$-)iSYdcZv_D-Wm!px`4&B(j~RT5>W}U-OD=J?>m2^xM0b zJS1J45vBQ@z)o278b1Z^hh$2VW1t%+7eb=@y7$OS5PHv^?;D1S5vk3BscxFFNs2B?vJp~kgZg$|QSI6XfR|3ddrr|DZugMvgnk93Q(`)!Ybhwz3 zv&Kw5w$56Brpkpn@3tEqqJ94cH4}iG-#9*kj7Uv5 zr69Hf0T(I4pGrc`EvO;8uwTfJDj5tG*qIA77F{lS?FUQXl0i^9B352?DC)f5XEiIa2N{xzmmIBIKrtZ4anS7{_bj}+k#faikKQ@dtLI*gA_ z{t7~IQ6-n7Yh}77c~!mq@P3ormnHtR#jMo)GCx0D)uhG=X{gZ}!jryv;&LBC8>(5ea;}H~MY{Kggqq!bva~zD zU*>tQ`a$0&PaqWi?Hiy(a0}sm))$DPn)P$Zl3FSY$Gb8ayvLkR35F2o9><6xy7^pZMU>3vQ;(w#&cG?9_F&ms)f5F z)#RHwmc%K;OIzpdFk)>Nj176>Yf#ER`7%0j<3n}etMb>*S1sPHU5~%sQP#C@FJMT5 zAMHH)_y?i-6}%i-86oO_CtvaYOzhHzayOrapG5fj?+WGTZ;12Tx4(XVU#9oh4}Fe9 z4TIOdwgpJNkE9PI&5JyAtV9ItNcTocL+^t({7`Ba;fMw(i$uX7s#&ugjsd1fKm3r8 zNb||>IzQ#Tst(WdXWi|~%@x==q3rs-#!w$N^dK}vaz8C+5d`477{lkypY z@AqCMppyAzXM%pjNVW7j@9{8mPyn{yubTLvwoKseGg#H?pxZTTIXiu94!ZQczI{=( z>)S5vH|SjtWmmSlgcZnvY}8c0dT5N1PIU!$iCTwl!x7QrYYSEDYu81FqI)mh+AYrF zG}Yiz{lmpE;F_4}2ISg|Z>;MIWK&pu(msQETILxAp&@Dz`pc7-x!(DP<|w{*5}HAw4NBHX74G&eH)mw~Pn{REP@> zkD-Vwc&1@r#h#1JZT~(Uq&V9izJeHF66*&yxqTt&g@_0kn7d(wej;vM(5ff0tLS$$ zadcFOGvP;u?x=cq=;{40&@jM{1BLx>4BdZ_iXBK%yO3a!Nz;OTfn%W^?@p_WIV??X zIXoK{^x6yxG`9!Ln#*x`=`aWwdKyFsV8F&WzGh_BtqCg-$j?tSEC zNm5UL(?e7-D?%#0cHVtB3)o@kN|{;8pAFk7p+$;&SWTN9h3eJXb%@o;T4?TFy15pe zI3~{9VbEOZ?AL^{M5rp;*1aSedmO_PTj4hAULRXs_MTNk2>bfp=CM*h@Ke$|kti8l zB2M-Y#fGLtyebo+lr$GLaMxH4g2o!S*tm34^g3v21~TG2l?V!4bIZmkMUvax(fL5+ z#FJuZ)J8Qy0=o@BHN~#DdoYSf1h87g^~Wd}wrjfum)Fp`=k95EqHLB#9WkvIFy03l zpsLw>Y@LQQ2ixs%%$xv}gs0@OD6?dMY8lnfEUaKP4$1VjY@)go%LoS5 zxJhP5Xbf3F|K{!6SN4mMFu?W$g+1iFf!2SUdKO!4d|1W5-u#0eE;jV7wjSuQd)O)> ze~_gmJGPC)&xZtieft?aASJ9Ja#0=uuHYM305hh&=Zg(}8s;a8&zw;B+c+&g&iCxF zCZEmv0T?u}CDsZw7jU=qPotuu;%2>yc0X9yY8*6M%0qzxMNm!>zqJI>RVTrBTc+el zo>9X)bz84@egM0(_X@`mv)$?_-=aoF)<@OwHZaNp;Af{3IN@8px@kF*$F`rm(M&o# zuIVJhB|E7ufE*Y}kxQu(r~Z)@;tV>ZjttqTyxl;I!YOeM_C;G){y1lE)xk?~ zk_Q%3T3XP67aYpySeL148@%N8uywwiA4$<-AV%1VfOjfq1tF4cQ1!;t=T(f>w5pGG zm(@2;^W&aWn+c(`-u?%N=zi9O2F?Hx2|Q`1f{;S1J<5r#{+m8^cj zMQ!#Tna&71iI)BFCvc^^A*el$FN$?@_|uPvD!(qiB9w=57V*)15{DY&6RlIjrCi#6+%a2MfHg#zS| zTSB2z8pUh=w_$himm;>9$kze`_ho&L8vVJRq;I~D-dA$Y8m7h(1MUp%(+bg`dy;1% z18QET&uxVA!6Sxk|A@qK^khjp&|ZRha^PDBqG#Jhzo89|BO{#|p~aGk*GgicO5qKG z%X~VTz_M@tBVm&?2a&qj+{6oX?vQV*y4X+I*d|?RK?Pk*vH=w`V?x+QJ==tH^RNqJ z*@k{{LYD0X=gk1gqRN1nX_l-CPUvBV!hZWqA;F10joB9V<*L4sNcDEFo|6Em&%fdZq#mc_AEa8O8!k-)PYTbYD`*h@~x`u0YR z`l*7Ng2ix>jg*!#RhDyskhOmZe5;JZ>~Fjg))44S?C8MB_97h{qvVYVtpmVgb|^Tl zx*Xe7tHFar1Of$BwJNApS+HqZSj43Jg*5~CwNBSKn}!-#XLn?O6*ZorY}a-6!7)=~ zrc;gmpl$P1=NLw*1Uy(0k%kx>dVpK$C|qrBo&Am=Xyg{Fp1j=Q$v0(TFuJUDruBnFlu37+F8MuF)Y?Lge$asY`gxO`?+?+P;8BKGiw#kFbn(O&R zUo%b>n7@>&OTrdEh$A@rd?6Uz4A&^M8Z*3NAbrRLa>&Q0eO0%?_TT0b%&p4 zKrctA8Qx^d`5f~ACc_+^A75a_F_3gZhjf6#hbd|M^2Wq<{+e?^P zERwEE){qDCE6u*Qs`_Ac^Xm~nqVPuuiXYncw#h?KcrIRS>FNh}TvRXFOe8R=owrB} z9}C4!l;;fYFHu_ zTQTS!D{Zoo3H$OWeohF5sUB={C3W-S(6Y3Tw6{8FrTe5W9KPTt_CE^ z4*)4^dWV6ykI$G&;!h3aen*fK#aqSf9xOO_7cuTc3$AMKJLgzjs)DmE^rW|~F89PcTDfAbRY4r_V1BK~L1{stk@0MsC6xU0r<7r-OPd&(6Fkdg z73Fp*Oc2LiXynWVdymg3?nM;6lskT#J;z~{iiO!%MuE0M8c?=OJWu`t9{tTFLesJA zRfP(Qyx!~)(}EDAvLLgH^cV{z)OvfA(3HPij4m?q zIfgYn!~%(0ZT%<YVz?VF&h0g|WErnpe>-(&%$;0o(9J^t&|_(R(w{5gdu!j%gJ ze{xowE3djw)^ zKed~M;M+U)jeSy$QuDR^fJqe<|D?8^Xftqe752MG@dDC5VoJ2g^e03PmsNK#Jl(81>%B_C63&HWl&KY(v$UYmNfL z3tu2xb$9s%)hIRg;GnY2g>e5pCv8=YYC8?i(u#4I^$7B?0;;8kIg{O5Ns=UCX7(0c zHn`CJlo(eI>je!I(S+|}RI(Dz!Upid1>`N!Te@Wl$Sxg@rCJs6J#Qoe`C-$V|jrsfg&t^&``hFvO(OIWQ>ts#1%cXUlIBRe}w+#}s-oX;j(MEla?K zdR}%12EQcQW-UhQuh*RSx^FX`ym#s7#}{zH?M2@`KSGIgm|mWQ+wqe#sH>`h+aY%` znQQEMfG4FD793L`nM13Df-es&&!4Xm{QO*4?R-`$G;d}Lfomu66!$caIdGGxix+70 z+qn|jB4eh?xxRK$Ea}&ai%luEA(%86F1_|A7juz5+o=NwbQz9IKPz*yAZWol%0&LvD74$=^4RoRHpu&wg=+qJxs6ZGdd;CPnrmJ) z3hl}7NvY{&>VNvE{CJTp1E3m(cE?u_-e0u{YhLHI2)e`Qq=_;|TLwTiy6vP^l4Ivb z^UZQ=Q!~!Qppi{k>q#&^wd7c=wYR-_MY4V+r#|wV8OdToozlMXE>DCjS)t7zbkx;= z?-}!AE^W}hnOqa6%%3%wJLE5`v`sMA39Pu&AJ22&yZ7bm+WAccd#Dbal)rK=T0C;a zphaOXzph)|)T_S50B~~q{r62?5LXo16MuL`=;`+LU$|*!j&`{UKnaP*0C-C*f^jZWEcu`ig-XWG%rZ?t;gxQ^Kj31d1g zzhi|p$Zn%JZLLN6=de}e&<5+S2wNYA$KK+0uuITu9N!uhRbIND8iXegm8;x$PhI*v zcMW1%=dl@f86d_n^7Vo`{Cov6%|8MLZKqc)kgR6-5BHkO6gw?fM9pd07{%XQ2-{SN z9S^)4Ee+b}=`7t*a>w;ou1JS`b~Og30SqoLwZ^r+V*f@YMdMZtoA^7*aTNb1NY#}_ z3*=XLf5hhwW!EY$nj_;&isQ(XiY8T~*x0nWCy_wFg0W)E!9B^*pxzOR^2r88y!3x{ zuWtRW7n#J5t&LH!3*PvT+I9u&Q#Uu~C}nf3NC$~QS^F~(s79$h zatv%j$M6x2;h@UojPk+o_*=v>6IvPRbKkZ~;_7s7g~@XC!UIYOzN_Mb3c%hdPQ_Z3 z(EF})z|gsFgXbEsLx-01Vg1!>kQ3qScsUqvhb8(jsSFzoYmhLJM$vxc;P=*pCzI|b zx9cy^MJKtKnK4EDgx1QMTCB+O0)j^)LHhQqsUpV!cr^eZ+mjzY+(2)30he+yXDjMR z7{S~ETH+Imy>pZ&{8lR_a$U%}pA`m!P@zC2PWKJmn5gW>b5q_6p7*LP67d+BT^D|a zbDR3IS?)!-?YWHs)Y8HdF{j}b35^%Kr3efFKRy)wAmdF0ooU23wyUkI9@oC~0B^n% zF)=>W2}^Zw%y8o@5P%O(y)1~!&W{BN915@UDS9E}Jpy`cooQA(rRZ>x;HEB9mpnIt zJ@HXZl}o|4&h+K`!)8k(SSt}e&wwE1In6kyN7b^Cd0g*N&oN|))ha_ZX3?j#YpfxK z#*JF3ol_Z`1r+a4=oNo+|4*H0xGw2?1KlvZCIRJ8C_y&+5D|@W;j##ugl$)T{203q zaergHZjm&VNYo2CrJ*g3M=jnP9UPOT2TXA00mPvF1)<^z5Veo;!0xMzVs8= z+&KgwK8@){CXh0>o4jAv$3qcxVT2mx>H#80MCWYEtfRr#vUn-i@O9gf_{H=VJ)A?F z;kCQDYRgDF+Xggs0}rQ&G6WUgIx3KL69*_uJibd4I2Pb}F^;~V z$t=MX-8m4@84uV=c%1`}G$>}6=w>kT0Y|B#*!+6$+q)@roLxS=^sL%1&td3>>p~8W z3DRQn>ms1HZ`4j_OgPm?_TK$%HiAT3nErooxAdou6)*Fi5x7gs#u1BXG?tq&sV4r5 zDeh9YeDaQ$v*c!60X}tZ;|SuqnpAbDZySYX=8?j8a-QQ?c&foDtd+7wrudIBI+pCe zxNhXGE|l|=cd}7RSlJ-pDgS&@zLM{)sk$=7%h+G?lpgLzDNh685JYnvaJ*w@=_l_I zp;c0EQoDI5=41kcIV3Y&M6E@lbu937C|vuohQL0fwOooFoZXsDYpQqso;=r69(qTg z5`%y!$U{?X8QpCCMYS-*Uo4Y-JiY^gg0egCEs=;*`y2j~N*4V1{XC3!I*%ksEEL+>d_z{DCQBat|!OoTk;3!`L=IUy@%_JeH;ET5y@0Er+OP);8u z#D@tOe)g_T70*}W_jxH!!QN$K;N&ryt|#*8qfS8hbUd~h>0qr2lUzDe$bgN_G?ewu zMB=!Um_3c|n3$yc6(o!jXY>MFc&T#s6`fsAdY%dv^8+Xbcs#*^b{8!KE?vE?(ae<~ zz0X#8zKAlgagsxd)Ti8x-W4;;XYkXDiBB5&1aSs`@zsK>mAIA2C}PS&p6p#z7~!>oVPeWFxnq?#vy2|*ib@~viV(ED zv0>C3=-l;tLOARz`|iutli{*)=4F_*(w0p|>OB_B;Klf!%!lI=2ID!k?W|e2ebBvF zh~&YnwQ&qA7XM^J3Iyxg#K?_c~ z3e?g5B?U>K^yO(Cw`saIjSUT!*E|r5*_r?uk{fa{EvLs4J2JT9^c^rIiS@)7lhp}O zx15QYF;}r?bBU1{a($3Mq$o4S#hwgc4RSmHc`L`#xv>SabEJ~>v1lk5v|Z1Qn3vY9N4@yu~0VWbjNbW(z$zhA)B;f zRb<09FY0k)?XuxW4ER(?FQ=vs?#6(Op?F4e1}#b=m~ftZSgDgw9Vb7vv1MLSi37F5 z>!cmJeRc`VIFC|_JU=n>J~U`3cR+Uptf(q4SCxbxAPP(H!XOIqcczH+N>h~X`1dqD zZvTZOxn$Oihrd)xn25r0Wj4!QJg9l{elM1tmOj*G;v%mjEn!0J{I78En06Cf)x{S3fTpte%My* zFh&{3c;}_m>}_F~*r5r35yvy4QUuaPMoGaFG6@>AVk$Hni@|_ap6q$16}QwtU}O-t zUd6qDu~bdF3!721SsG(p&MAn6+9M6{YO})3`A9^~5@hTp={fFt#w|9t!s2Hl#AufB zN>IV(-5zHW-PQVvqLE-O*i0BZ<5gX4qf z#-r3}&#D$!z;CU+j)efhcaPnp7VTgNZM1MBqcqs(vLp4#7zrkGt)E^>cqnCP?4@lA z)O1GPgV+4mDFn6!<*FD;u62-rgm*lcpW@G%geO|j7GkRf-zwy1@bunpOpIwWCvR9r z$?ruk_`b>{*q|3YK-=m=hn~oUmJ!&ws1?WXa;Y!_r7bINn8p^ZSO%Z# z9sm+_!3wuGoivC&8syl+SG3B1pCZHQS;Wh%DQrDV7k$^Zm1H6oL`o`hnT)03bzou= zFX%VqR?`RUBHL}^DR00aFzwO^T)$`XxjZ}4779?xla4%l&7?G|z2nsJ>eEz%W;fA4 z`iV1-4VqVwL50uQ%tbR}rD@E^iO#W%r%Rd3{us?hDVZE(CEeF*b3xBex`T7edeI3tJRuKV8PI1 zr%d?q$thkPm8~v#3zloShm=VS+e#cvo!T~)szDm&3?!SAK0q>4zu9cF%Uou^VeNSL z(byVg$qEzg42z%FjGqod*8HhK3mg04BA+%_^UFB)CbrDFCNpGgNcSWu*>Y+*oxG0#5jDHQ8Z?{m2=wU z?cS#&T#cwC{T5;N|Jr7EvW~DH!~Ue7uo8Yr3%>zX+x?lDV=A*J9o6Aiy4qJ8YQs#F z^~EEPP93l!PtGy%sxUJ!eNUX~z`S5|@}2rlWoJrq3)p~ZiHur$-#p%1XTubGQp{b5eLBC22z>a{vsOM5{dqU7*^0cNWCz}DNywtzF77)mAN9HqC) zf&|}u>AR@u@_;W8jc7TWO5aVQ=TiX}37iPkF+>b%>)9YRgF_26NZoSKgvQCuapFUR9QK7nr!DH_ zZ`*N%wklp08Dg}6Z!tF(`T41YWl&*B=WUHdb{?eG`{jum4!5DuEp- z+H|_IaZijW$k2kHOMU2TIK!8lJDgI_7lJd28GVMjF)KHeWeOyEMepPRI@miDcldw& z%fjVw*2p`kE4fyjP$p_rF||)U4^oY{CoV#KIRD^CVlonyX-Gn)F=(XTILCQoA-z?g60|G<2)xl+# zw#Q{tY4K83>lo7k`fnD_PraqNgqCrm^?!yBH<%o!c9nZOvQP?=|L!DdfDc%wT-}z=Gmd!^ePNMP{&m-a!mRP?PY{%nM`bOwY*u_lJOp;*v zNdA#kjHVemXCrvoHG{$_wknR2I%W9)s^sS>zJVdmz_CYrlB8TnXsL zd`gWoTalSHIXz6jHD9=Lerk-{BDSm>lo9H-Ue=L6)u?n@%9`FRAyKbyN;Z`r%h|S8 z>t*x0e!|ZE;aQT6+Cehhs#PkfFX^gfk>8zD(H(ycfwqpmHbIXpK3MNV%tvDkHw*yE z2?wY?`F8@sBOwxU6UR6NfQu1uq;%ac^QKbi-)hM()+sFp?*_*_5Gssi9G*#en!=4o z8K7rB3J!^F_OVz!O;->^uyyPhw*&if2<7`k!Hwm98E(8uC%E_V!y|Xvcky|#jKI@2 zOlNZYe0ud+TDrLc%_LxaYLq0mnnZ)V=hio^Ym;m5!;+KT1Pb7k&P zB+~`9s6gF31n)Lxiy0VR%D_*L-lwUl?*^HMIS3KvWEzC&;@@@c(ToTqrCUma&95mG z*jx3@^l)*KRRTF+@WC{aRCjVGdtPSwLyo?cZ|Z2E1`YgDftNB1F1?I8UgY$ZBWJyd zwY2a7b@YspWq=jW0@CKcr8^0R=XPv!v)~dcKDf8{+#~4my&HuD%?i-OVBaNmlEq?tH-Ia3o1HQRjO}rWJqrZsFX}B$YF81T_z;H(Xf+0VLexDd9%df9lxH z&R8qR(3T#2QCBpoYQ&8^-j_MSOt^7WqtqN|2ePCqv_uOdjj+In8=Bxozxjd4?4=Ie zc(rrMsf{{!AtU02LMwA8SaBRj9Kr3K|`1b>7 z0~abjtVG`iaoPvO3^_ZMgJ$dkKCTv0>{eP8gQW8z%#f?d24g=r;8FpYfkFYz8peunT7o8=)w zsU6+fKy(wa;EHbBNR~ryv{mptljo^svdgFb;)RDWQ{GAscrCb0%Z$Jt7ZBL_8FVF3 z)T;y?{FJBGduS2dCqNYD9pwun*nu8Ay9MXkdC!@qOnhoAhPOM)w}#-~hmo@GUGT2) z3=W_|kq~G}33Yr^ER|KwM1H|aDCtrQAs03k>;%?SrfW zNv$KODLV--xs12j1o|Fl6bW_;!>CLmVUv8oE8ad9h@lN@ zURAqDbNKi{f?pC_YR*gJ%tG1awYU-$sb6ZO zD;{L*=K-!cbSq~IZA_u4X$-iM;chs+E^C3X%-D*JqiO&eXg?)UM2yc15RaSc6`8tr^k zecd*^x5!8>xc!{7-C9GpN`V|j2w}PHug#FcdIK7br?l$)V)i9%5_eN!@e5kTm-ukw zev)o>rU|^j%T0ScD3@Pw5F1`9({zC_p7$GjPwiLy4d5K8JPzXd+6#Zt0Ocv!W>Aw1 zJ=OzCV{08ARLXA@AkA(wR!IvnR3_nYKdA1<(nee|iJ7=};RXb4HaJRFOq{D)0e_je z2sgnL@u&Jyj{_4lT76XbVFJLxv`Kj_(AEWg;_eUaHPqS7IW6dWk}l}pK14ZUJEZ03 zp-k3xw=heWM;t}kezxwk2<#$Mqs-E!Z@r4N(=g+Py1OG8c~=M{PK1OzVUPkLkf_?c ztbq`-Mm`-e+USdu*NMP;BIun~b2+S+eZZ0lHAO*{LxXA*tEW-8d7SDn7HxksFVuLu z5y_l*3nIyacY*?^(v2D*Ec|&+Ck0R03WT5y&otIZ6uCUc&eSRTA)QWqQ&B`a3dC#v zr5OjSrh_*`Lt~-LDs-%T;Q%_0B44t|iCVe=aZI1peor)ziM`nKviF5NUB|##S>0pX z1MKvkcD<@OW^dqv{COn>rp>kZ>OIZA!hW~A$AN$u1KXtU3_Id=2acm8=v@dGXku^d z&~+Gd_Mi2Rh9xWuW&ybAKNorI(>9@e6a<9`B*zdBYDo@Yqr@h>Q z>vvytMr;Xxc@ir{a)Qb8)@m=iFXc>Tx>X^&rFkjqrR)S1#H zn5CGXm75PLKd(9mGbbh|c*a z-UPjTo4ao`u*uCz8vqG5vXlZJV@xLr83Fc30=@4cuTd%S>l&uu)fX~6BlT|II&sqo zM4SR#j#}}2CX@&lD&5034@SWF!|SlcnWV(5$a3=dQui+7Z*+c|>-;nSo{-3$!hA2s&Y-&v>MkloqvDwP?`32Aovse*+_~WINJ_AYL81=p#>)b^wSLqYD*G(Qx0y1Mj6W zuAxEk!)um-p@Zti*01iC@i$di80ZZp7KHC>^YbRBs4WnSAc(jyafg*+(`8=9J^fJQ z%4DSJjLtS75_~6OBJ!pyH2uo;I~V3c^Qc19AXc1l1;jiZy!OP4O0f4)m6TlJ?mG7E7mdUWvIqp!2p&U$IeGKvPd0`dGpJVG&x!nh^UH(-N;lCrG*Y1teUzKJXFlB z=jFmxQpHTfpkY;y2w&L_@QGDa!&~?kV6{+4$f}`%S3oPr?7dwb6V2ahVNT2fRB09so;QAS#-PKQ2*IQWmI%qQ;|CuRH8INrGv61t-`?Q?ctq zO4f6BIv-2){FdnXq3b-{3GS_joTizg2Z7KpB~T{ubgXhK)2y~Q zNi+Nopuv(wGj9CTS`%6QsM^Fxl`AqWZb!uekCU(XokskBDR@q zZ8(eXXGO%5%OK`EWHNbNJ!)@g(cCU@$~M%U-1`=e)hf4YFvQ;_=?uB=8|;b3cJLeL z9bAx~rIb)pL7I`8qmjUZn#WNntg-^D-suB#+$B$)WV|iMHmfJ8$h83f3TGS*FzHKp0G=t zU=}J~kXy&X!J#gzpyN*Wj;st>H}1Q;8C5O_mI6l9B(wxZiv4g1IkLhLNW67>=UN8A zCTmCcTs{bZCJwuL!)Fp_?Hwcmxx@Dv8~rUA?RTCoQ|8%CEXiVBva`EKOt0H;c9EGO z47W-~fsJ}wuh%A(xet)fHhoqZuL;3QX=GC>b9O*_h4JpX>WUJHRB(F9LL1~ftj(#* z-o`>2YA87aXE(o$+F;ZR(O|APH-#;^h{NZ4- zp*q!$ul6yk>+xlLMv^yL9XyjFOA!j=YfUL4o$^6zu)JHq+sIaq+E>CfQtw89?=AH) z&h$aMj~fo1MHx*zfF+xX88|6?H&)xoV2BP4I`22e%;2&wZgD{+Dn_H`I9VV`YTgY8 z{&XGQN_Bc#Kam9dOi?$P^yxB#3vC<5s|rNbG2nSluFSJGj6d447JN9Rh4qLJRH!9kPal&pmGax?Y5MJvG$zpK-pasp98H`cE_VD# zfzC~uZ-@c&*0#ll+{=k70mzxVVlQTW=3p&^yRiqIJt$q1eJ0xcgoKoGt5Y$wK3x)U zv7{62M*#w`|K*x;(Yt2X9?ok9E1hVVFSzj$e$#J8{r`QmK-647oj?rtNS1(X?W8_7m(BxJ_Wj=`*MgvdlADncdZGAH~3dBeBa5a}?Ido&FE=IwJ_}RFKx7f|!5zfdh2Qvyibl9Hn%UT&3SOeMGfm$DwreF|yo~La#X( zwJ4zB(DLb}LS214@L;^Em_!deEd)^io$erYl)VxL@TWx$FpBxUI*XXK7TvsW2Y_&{BdO1y^SWYLG`RfDHo)d5o${i z58>!k-ioewT331urHDC6Ek7Q=T|^#r7rLn}F1POO!kJ020ZxD7%xil-SnK_X3fl3d zff?*r(T+fBzwecotD@p}OY6GW*skT2XGtJ46RsCk1@Ag5HGb5ViR%h+i=@TPf4xe~ zk21nY`uh_!x5m1KnMIF8@xME1%w52k_emKLd(d~Wt2)chC1G&N4Cwt@50?2b4)G*M zx`H0vjI>U{lFNg(tS2Grw8 zUZZFPXrEoN83ohiCM_L;M=CWB=T|87^`1DJ+)2M80+m{*S`;*qyov#Q4#AZa_BNdM zD<-l`sWS#8+oLIVLlgRj05?HGK9THZ@#CMf^2@w6SY^Tb>*`IULOowfwYD7#=ypoG zy&e#T@!1Cp$YhkSM7uf%L>tVKmODGaN6~lY=0I&%GXA* ztsE-l#C);cLPz}M>+hqkADi#++x!(2;24ArYc17`AbHM+J1DyxK6#SSQjp*?4^8AV z6BRI;jjbKOBR|m9uI|h)JuwS=h4j}W;P#AMsFBzO6^1z8-kvwsH2kC0yez#``Lx5{ zFs_-Lpc-_vh~3=yJCz(q!x|xvsXSXja~X#-d1W=2iXZ`d1{{>9(pr^7?i8(*ALwW8 zH?fX>^i!|Wl`iHeyOt^41kw7NjL>U3zTB=Eyy(*6XmO@Z3Y_^JCP;-~gJ}!1HGfDa zMI8IUE?_hmE$>8@z2$)MqOUDPT+BSabNCkRXEjymeY}TLu&FLiE@e`epB2qVOJII= zp&;h+Do?Pn8sO}BFeHg&pn40!bjC&n4Q8l+GOc&6jTig$?83 z5t@~u3${LK%9%T+I*9b;CxJx7fwi8j< zCe>ses;3(r5a5}6q*bd1fskOjG><$^8mAzh>b}0h^*wgT@f27Z>fpjy`eecsym)&i zd^9#R)Ziha%lzC#a*oZ4p>FoJZL=+l-Re=aC7NmNbl2)6ODWzr{Y|w-sg%w3;44_FlWNsU zwuCJf^3g0blgvrJdKTlYGCidzC|mUPLs@=82|uL+2mwhLxH>dl4(S9k&4!%QWzZu&9SkcL4p)DK9u z>TD#*J-0CKll&d;`FofjOivHjf#w1Xj?FHK-pb?O4((`2vcD71%j8&S3gZFy*aGQ( zlsh~2Pn}F=h8!YNp#nX=uU$TDO?tOhKM%5J>#l`asj)Afd~{VpZ!g=bL%&}%u6%h9 z#$J0qAGqP2*AN~SC7ZLT;k^HF4j+B-TraQMr>|qqraEb~ImHA5lY{MqnT zi~qETtA>Id_Ih>F$34nI_eXac_%kOPVYj83>gG46QjrMt0?ZCho&|TaNnM3d*784O zTXlnrq};BJ1d{f+&HA&tVUPF&-X1&Mzu#8GcdCJD&NIReOV9p2s*6MML}wkY96fKX z8JBV2T1^6`KlWKEn(l&Bn3Kj2r|q)%MzhsTf1Eb#m}Clho3gN;(J|!%gR!QICh&lf zfZM8uor_zG_{XNGOY-JIk)GM0YQv#DJhpAdd*a_>-69UOwuRQ}zNu(=>1|LwE*yq& z{t4)#^~bkHMe6UJ!9}OAVk^6XX4llch?!;69Yn|ZI@G>SwhBe0P6}b>lxiX5wRN3$ zYe$7UCp=^QT@;V;zeoT2$6x>Q?KfZjT{1NL@V&QQd*#JH>;d@ejH3D47cmpGCg$#O z=5E(HJ#ENYpEH4W>AGV0Ro&*lA5#CY+3$Yx&P!M36!eeZedBZQc-@m8bkh|l9kJ6E zD=jfoe_eFYR0Hv9DyNE)ig-Vlkp|~aXzth@Kfx+Aogm6BYzk8-X|;yI6Qedm%|)qejRn0t)wL9 zKoxGA(Cb^Bxk=X zW5s--c2T_h)*tIm7UYE<8AwtWERCn+k28iq%kFHhD*mDK?J!+tt*KWo{5-L+@%73` zBEa9jDXt2ye0KGY{J4aQ5juzb2sog{K*|xcAAf3@Q~HooGj$@Nz`_sTu;Km?AfZNk zvdZMS(h5+DGaxH@Z0k}Voz*1Op$DZt^EGQG4aLodpE zI@n@9{Sne~fh3?gs?FjtgY8DWrpb&QQC!5#i6tqlqswWT{BS0diwbSq!(fykgV@96 zZnxK&u&6ImIosd@w2F&pWf9vi3M15M?}u^e(3 z6PZ343j|36axtGj9A*^AreM(3c!{V5`YYsJNVOIlatG&LvqX^igRyt)K{OG1EbpR& zHmn7wQQnn6^4F-W=Y2s(7*3b=$?JInz00F@XFEhql$J~$!Zv_>degi+WLJxfu`M}2 zp8C`5nQKiHS;n336?*Tpyz-BQ?O<@xqP;Cj(6wM54@&hpo>H4b(DfCZFdpVUEZ7;r zUJtiA1UMePhQJA$Ifm1qrA=&V;_yd>84lZ)2-QubX*u4z2pXnl=~ITe-A-Q(As~ZD z;v{KrUw;#02aKmSMj6<<#9GMnv*Mu%oH8OMmLYdWLlb$WIiGGOPdOpKL{AJZ`OwiB zrY3ac?_(etAXGn_;GGT&DkK2sz7{nm{h*_#s)iwgf|&**z$xHl;AkKhcdl7`Cp>5= z)y9>^W~%%_mnY8rrq4$-rS*>(5=pKhf8XHD@}|v;;P7NRt(~X%sa@P@)=Z^8Gnk-d zG}!OwMhf_CAwZHg5+9GaQ?+lAAi}Mzg7D6D=!k0(t!Tx4Q7)E(vF3Bz0y4IOVh#HZ zmA%9cEHhbeI0^#!kP*e}PSrfvIen6_eu}j${IaZrsPtX}R+6}GSYgz3kYIreVo?wp zc%@x)0=!xAu&Kq=IEax!QG{@8N(M^57f~@Q?Ss1V`&rvb3ku)(Q>=YbfFX^vDW863 zMmMKUz60wGbVB&tkE>dS)LYt@379^`2#C#M zT~S&X@;kTa$&z=VjM#8ZNq4}Y#4lg=TJbth4aT+m-i(HYw zT&iEIdw$n6i0KEEh*e$61;t7l#DknT?_WFHCQw3_40Z>Xk#lmrV4%U{UES7?W1 z$(Rfcr=8;}oov@)Y7bcDCqGd(pps+LH@xt7DQ3Tf7|nuHH_Re>l5s!K?Z}PIM~+T* z`Wp=UcqXRP69-#2L27-hE5J2a!tmP=J^4*#`KCoU%aI8f_r!gr;~>jbBOTp^w$>OG zVpHwErey~7tU28Dl(DCch!oBqVAl~$;dDx~!9Ied{5yLFxR0D>eJori#U}>Wkx6)o zW$p}eY&$}~q@=X_sfo;Yq$1wYrCQufmelC_3jKuW59`_&7%a!yv{2AHW!>v13*emA zVNIvx-rB`#L%UKk|E;v^wu%QHt(UK|NUI6kjKSn)5ypzj;h_Ms;ss4 z(Bh>5Dw3O>jqGWQ(Tiu}40o_s9n1s7@kU05Usm?zN75+=Z1~n)2aq!tKrx41@a#v! z(6bOun4vJynge?ntiW}VNuUKV&BD_U&N|Jx&dj3L=I8A)KZt0p?R3W=S1F5K^eyZE zgt82Q-Nn9`QhYaRX~gwo^K$Td58I}JO|p}?Gr*Eht6o^kxD*_Q&)!0=3Ubm9UrDw< ze!pMpz3Faaw~sePf}_XI_87xfwE%12iQDQ-HzEfGrmbVg;x#&WmMTxj?cGKwI(xn@ zV8O7A4Y|XBY{SKP;x3na&HenS{Q|u#EC}YfOOc5)RZuL39t(enMi{k67VsD_+``V< z64^<3&zZ|G)Q=2{u)-ZdV0q_AM_I|Cz1ijJMCf46IGDOKb>Qm)4E&%AzoAnZji|^% z-OjV+pf)jABUH7?qw&}5kB_IQP)@{p`Mr%uarqTWHzQgmn_Om2iKg(nYM45qY@RbF z5JQa?Lt#uMGOdCvpqZg1D<>p9czVi17MBwU$y%J1i7zgQ!s}$RB4N`wuD2T%+r#ka z@I&X+zdYe?kQ{}}Rr-p_ee~q#9aL3jFv}a}@Sv7TKP@s0jpSy@O8ADmSW{4^8Amm!^HP;ECGzEZh5#>F zoG4)i=<5hHP!3kv%56kxI z{Gj`yaC}TMU=BdDA-0^X3#qo4sD@V=zk|^uYj1j%>efPt&FeOX+~VQug3jx^byi~@ zXHd7=O_n%hv2Ca^)!0UIauLzf9ku>~kLExa;h8r{94tfvTia#aH~K#zW?UX12GCH}b%8VyIBAb7)F^s+D%`1Yzw1ir= zHsIw!T)>{d>)_IwRMvv<$Uc8bpecb6y_00^UCLC>CAUw#os z^e>+HrQ`c#DVs`iZfeF6l%^x(Wd^)l4c~WW=(|`l`>5LQpFsR@{5Zq!D@ZyIP4WAA zAfvpwqzRQNug5Y?_|(9gcI2MhP0{wq-VI5Ule(^$K;AR~eSY9K$&YKw{-zuRtW^ua z?chDo>LE3DK?xaqV5uEpWI)vh@^oPjjfcKsZ6aJdAxZ{e?63-V~U z30o8Ang5?CH2SfxKqnL0*Do#p>)0_NAxRs}g^!XLxQrv9rW0oImu|xps?-m|ppfIL z_&2cW=yzN+#YQ>0%4d*j1HM^{82%5mufb>_ldSUqA=a$)$A%VJiL)-w5=CtW(|w% z?=%!!U#4;NAEHfJtE}iIv-TjaciJD%ly38#?e2x|0NZ8ILsMt4G2~22LlchsyzGVt zSyoWa-#gZ|KJXt~ygRgC6tPnxSzbgqbbV?5*8=+z#SDm*5rI5bMJ~sg@m>t_XXd(H zq|BYq0IlU>mFx-omc)*yZKv0#rA*XSvgBem`5COePvpc)j6Nc# zW{Zd0!|6NqszyCdzph%1mQ)({cwk|?)&V*0h-5}lCeX7HfF|{*L;Gy@1I=Pw?a_9! zeN?Y->1`SLF*7B`av>~x^xatrnI+Vpts9Q>VYfUV-ct}<!Qx7_)k3@*? zPgZ&FHE#=l#Z+n?E8l2YYCP2>ne3jS%TG{Xf5G1@3VEl^suIBChR9aZd}Dy;hUXQb z!NfFc$JdS2(@U>WS>OGoMk3sU)h^niyZO6^FyZn`ypRjX9U2QU_<1f@Asm6O{)8-g zoDa=sSQpoR+eRrOo@=zvHq#E8LtphBcY0e@v1sbf{hrnx*f%wFo&QTR&%UbQ)^uPi z1573LFVeB)2`oBl6j`8XrW~s2P?U|Z;g6x$mjsGken~8gi0Z}DohbpIdEbb|A5*nX z^6)rtSsbC<&!a_B`$B=cRrtkFho! zua4qVV5`ic?BqdA5sMzi)eyEZzVTygi7Ye`6iKM6+=yXqGv8pVFwhBqouUzA^B7gX z-^1)H;nQ?!z@k!5ujVe|4r6RUqF7n3*d{)b*)YZ+Qh;GiQk3;C>Q8+Pg>Pa!HnRbD zgYQK*_mg+{TVy~T8Y4lpjPiUkG)Irx1oE8F^~GLN_6-VC8bIqy%9De(WTFG7f2GEY z(QaQNzAoXTF{s&Il(XiLoH1fDapC@aTfRt4 z4}xW5s2%^-@Dq}S75%kFl4{)cC5~3W&I8pQ%<|RR` zeQ5eW?s=Ig!nSs0BGFzEJ6QUHY66GOJtI`jL>#*M=Gk^K*sheo^=}i7=v8@r?M#_w6jfEE=8yBb%yT#($=(D1;#KK1+3%ae$Ubc5< zk9HV~ERQl7jY!GlYW)V>%aR@}F*0Wh3F>o)`C=T^r77aCJOj3WD$#3+DUh&DO(n6} z0QmyTOHn}lwWjkCEJVk`V&MWc(+i^~uj}HlXfr+z5okB@<>W0mE^*e+KaeId>G1WkG*}PuAsFhoc^+wAGj5-(whO>?M+O>n@&$c>nkS-A4@nmk8g2i4BymsVQ>5L zXjY=PWi9jU$uXE9oIYo@iLCJKu3PrTbj?Y)Z_it^q%yHz_;ysE&}Z`cw0M)Pi*_Dg znf|f-p54(V$Ir7he0|TP*&$r~^B%}m z`Oq*;Fajt9&@yW}m}8>lSa+6n-i^``PnL8TqAtYWq}(QP`U2>ysb)bv@`v{D?GO)rz7Lhtls&aLRSAl9hi_B|UFw){hhlKS+K z&T@1z^6CFH-SK83W`Zu_)8oiW&E;yx)#oMXJT#UwrIz_C%P%7Xp{WXED54D=6ONa( zA3h3Yza|s;HSihsVg8ie2MIq=y|^%O7eWYih*dZ?u9YInnIO2j%k}HfgB0%D^;vHA zJ|wa3DQ2!<_Yps$xdNf|c8VHDjmJ&I4Qa&tJI8HSO{boyChC+N6z$d8>HkYA&eF7z zp-N*<+eb^5`Y^W@NJ=?yn%xMV0^;44PF zV#?QI_++;8V>n$LFc6siu@Sr_<1f|&_KEDlr^EkR#qowly{5@3P`!7JT?GvN@9W2D!I<+L8d@h0tjyCjSJsiJ9H1O`G z`l~~IMCA-IIkkr70k4 zJn7LsE71912F$*;d93Jn%Kem=vE|+iz#o5XBf8frQQWptMoL(mNSIItc4Z+h-=Q1h ztarH!6GnlN&MllE<3(tTedOImh(v+L)f@FA^$H}yjtR0?_jL5CbE5aWYsT&`k0m7W zmwV^vS(ZKuW8CKL+4?>GvO(lXY2|PW)|hFMI;XTbzxnO-{P)tPdk=o4_Fp^k<;dZO zJBxzaf-a-m_s`c~_cZo|f=w1=drRYC(F1LMFBuV}t3NszYAv9)rbk5fJ<{PAnGP$c z+3eJDWSb{ATUN#55p8qtOs(FZj8p^`L^O0!d2gO<$@+vnteJ?4LFBRU;oO6bp#7Rz zgq|>+-K=K4MlV_1PK{2*OccMP`ze*wNtp?h9A}#6a+(Jjaquw)j5c3DSCLVWvZ_^} z7qsn?U&BtS0KF(G+?U_a5Cj#wh;*1O6~<_bT4c2Jyod^W5fphx)RX%f-rQdjVsP*o zd=3$IO!NPr4(AFI?HpHGbx9#pT6XzHu0xwnuu+sw^CO*Cgu4Mx2Mk4!kP8z*f?vXm z{jcd`A4Kf}lf>8Hx@5xoYAx@Q1VOqaZ_h|wVf>IM2rjeq*wK3vF>Z2t3+5nOHMLj6 z(f0dyU)Xf-*j~K5TxGLw`YG3m2mjrBKFJEG0{#PN?bjH6gn-XKVSOG4znh+xCqByk=Mr(m2BE4iH&^KoEHpuKfI17{W=vte*7O>NB zQI?dN?23cK|N65&IBC76H{ED2r6m0s6(t$&A6=oufNN-2!vkl6?BGy#f&I_$==jH* z^PBu~z@B!%?$a8T;%r9Iki7uOFm4+56cn^%P;mC7I;&>r-cRGk--iaH{<%6n`t`5> zSfrrVU$Vg4H^I1#01pDXVVXt&0G{1yOke12aL!pP5H>f#!Rm3e%nd64d&ts`%;2LyOrx2?PYf66((z1@jO8srRg%$Q|)@ z#sM7S*LdV`_;+jPKx44+%s(;Z5XJ*MjLpZ49XH;Jd(WRZX|lJcOtsRIN2a?XFerFN zNT@4C0Zct}R`_gJ&54L)zAkEBv`grrf{RZ`bhUSrl2aUhcUpQzW)|{;IT9bv%P%M_ zDlRE4E3Y6>Sw(Q90pR3N*VQ*PHZ>D!X>Duo=(6^m^$MAO-FIl>5 z`3fQ{R}o#kW-YOG>o;uNv{?lT%+1>jT*NY*~e@DzH)*-Lb)ZEhA)}?E= z?mfOg9*Rb_cUW3kqgtMi!Q$|Q)HEWA+*L4@2GSXsSx|a*|NYHr8p-1egd(w|nalVM zlpt3qRqEz`zOL1MvyZ`OGUw$N6c!bilzRD#n^#$R1)s{Q>YCa*zV!{f8=IP2THD$? zI=i}idgu2oSh#5MlBLV&E?+@!HSQazQ+y>2NBY$>#C}suQJhrCO^~U)5~2J2cn#`h($UJekhsi{)zV@z=EX?)Hb{ z)8RpIzFcqj$Mg06e1Cqo*_jA>cE`?LF3s6pPrdck-#5oM&|pIi{~+)4MjLCqi6)zB zx|wF1YrciPx7bq4Zf?a1t+v*>hnWWkJ?~cA{ZKI}p4|ZR%dxsOeC1y{=p3ArcPuQ! z)pF^b!4JBKMVu%Iy#-DlhEoio8^B5BusAO)=`dN!GPX~JXDFei5YIbc`E;jelehGP z*Gpc;(60PDEigot#q=9X>^C1iHzv{;n3m~EFCPu+hKVfOaXmi>qc};kIkK=-?J3$9 zT|bP|41f@fpcqb&6m2SsxQK(K%PK0e=nTWOutjMPS2Vsbijy?Ui?XVlw(EDx67MuG z>$V@~<$Ak6o&eyCS$<|CP#7G6M4>TQ9G*a|ph6OvLZ#6eOctBNF7A-u!KqwMx+Cw(l7yBJ>&>@E%K}twUNz2H}$tx%-k&YrN;-K1P zIlSZO42ewf9HkB0QLfG5^7!vZ;tL?cgfcFq(#FqHOGXoBi`8a#I9+ZZ&vLb^Us2bD_6Ir(7dVUZ_agt_vQC4-+cKt9;GmkG2io_DBO#b@C96^Us2bD_lVfyOw&Qw!5JoJceUjxxS=CM3^}{&L00_ZGqrotoASv2pv@FL9qNFt1 z9aYl})3P1cyFcTiI7zd-D66_@yM7p_d0DspI4{@R{qY1q2u4s0CrFBBSdJG&Nmf)% zH%!sfaE|NwK^Vn^r(MhPqO9ts?fL$cQ{>ckJsn- z<47L`NZPP#dR__Sqlhx9sO{HTos3rVD9cr5 zT$h=E%hZIk;v{dwB_}1R!6z;0AtVF$w0Tyt^Nf=n739p4y<;J2u-osc zPL13|2r6$lhuK_NB8nJhF+&PeWZ+;|s~z>0-nB?|YD%y>@LHcHjG)*$+nP24-qu%J zl}?e;mG1QTxChO*3|MH9ZMG}K248EP_4cG0%ut3++TF(rH{%yud2%sx=4IZdom6#q zK)l`nzcx{={lc6xE*H#~kpJY84Y?}V>?)#*jQ1E@Qbw5~FJsIp8BfzbpY8L^aCdfx z!tAb*u%A>W5cUcGOOZ9YKboZ6a~k$=J7PIr5GA41tEXz%L8#N^_5gq&Fa!#NBakRG z28+WJ6x??%Q>ZjLgUQIA>4CN9b!XS_;4c7MP_iU(QatHjg|ep0wAVwe(dzUDqseTs z+U$;H!k~K@&;7&H1U6e{Wo6(nNDrCOcHuog2%|VjGl*fjTt^IQnziePaUn5TYw=w7 z^M1bCwCm8ROSc}qONI&e&458ehK(3CrZwz}(zpY;;S*N8|Ed!E!%x5bUP?^YDGp`G zg2&$P5s4vST_`yea;LM2q4BpOmkuYU{wksD?V}l%k#GH1qfZp-3!|%H#^AO0CiU7yca+txeBrum9*Qnw_+7X={6LCwc(r zqP7LdvZ@7E^cZ)|n8!Is>gqC~g)Q$%qSlfABu%Z`nU>1Cqd%vcJM^#o%hgLJqlIrFK7iz!#@dwCorj|K;zv%yOpMU&C*)Jd77Z+mp>U>~Sfi!XxQ>0pG6mPDY=Om6UdlHi5u78B_NhNT)wrKwLk= z=GkKa=m`BN;N<6Y30B{2w z{dD_IdV3DE0C~(o^%Ghcv&OFMx7+3_-+X1Y!*UvlJUCJL)(%r|!;EG;)=v4_>Vwg#OFvgCQodUk|h!)QB;q zTz=N)skvPqhei#sYg>AVZ?5qS@M;!cf$xifA6|GN6`$%LFTfZ<(MDZ_GbaBW)&LimU85kaUmKu%*e0{cs?N6Uw z(H2@Q=A$_oFZ}RQ@xtzZhF>(h_B!k#eIdOZ;X#_VjD4lOUZua2ryZ}zT7aNB&XR&K zfvMT#+%)s!cnym3>(}M4w-RkG1+s^v-Kv_jw+vT2R}?oTd7U-JQD)af;GZ*i-a;4< zOs93Y!DInW(+oiXOL+vSD&vj&Kk!#`p1-s-Rmc|1M<9;@88#a7-)7aYlFtfF{1x;r z_B4+bYtTfIr`X$2P}+MOCH`cMW=}%}9N`xN70ZOlN@6pg=Uhrdg>_2Wa5bbJcNviT zlmHt70|*$pEy@#&-JIM{ucb}<+wV!Q^3bEs_YtLsu*_!#jQmDQQ?(4ou* z(m;i~M<31+X3Y&6)-31GFbTeF{zqZ>iwn`am%C0)M));x88s!yu-W(g{tV_OO<33* zuM$n({Z9Li0m&ya2o#o;foQ^D=x8G*qKp_tIEhjO_{Sol91x2M1eZWtBX0!S{M-m+ z_Ld<9HlTeqzbF?p-K{h+5)@IwokMoHiktS^!b|LVFWtT*92Ia6;8@lmf8I!(ajU-8`9yQ zz#`I(SSnV5Z56W|Q`HoU1Sy=UJ%J3{J=j)iyDIym1ItyDFEF3%5kVe{DFnfSE3p)* zLmv-cW6p{R1Pl1qL=~s(7Q5p*T>dqdqIS!OZ$s0j$5)O%ckS+%_NCr@NIOoBQw%xm zX5ARTymcZ(S2>?9Q*FM-x_r`liJ7?Jxz1%ll6G4uZFl@Tg`e|t`(c0F*&H%|>f0aR z^Ds!edTPTd=0A&QQCKX{puf+5`~gTzwB>vY*R+>y($7_lPC^KoYs8;+m`{~|3$z?7 z@0Z)^sTc?$EOk>jmtEA{H;Nl{CE;Ws({e!@oYD>@2SqzbuG5a#Kas0#!-ND73IXG) zswjoa!lkgc4T_iB<^w^*dIkI#R6FK&KacWb2^76nwhdBr;|UCvRiQS<9l3gJH3vf*g;-T~F{ zA6K@hm^B)(U*v!el(M>VC}e9yA=n!3fFT%17!=^#o=0^Y!0SqgB8Q3)!k|O7P?)U1 zM*Mj|^ymntr(zLl0024z&IF1M#NKHYC32Lh#UfSp9yg-g2Z>S})OxI0aO_KEUnead z__aXN<^tFxEqhvyYiZ72b7{c#FiO5aP2v7wg=F6uI`)`k-Ea?#Q>kI z4&gOp41^vgrh5Q2r)w0#mjvv`Axsr~i6BirTAB-mQ@QZ&@aR)Hao4K^uigRr)r4DJ zJp3{c5ba!jrCZGjF>RpFCz_?1d(8zyOIGg6QremH)S~&)k(2!j!sCKaU z6JSS`U-A&32~-pZtv1L|C6k1VKV$uwK*&0DI?rJ+t{$XPYSm|(!V-K`yr`AzJsPG@ zsZ{-I$Q-(LNT9cgls5k2xJ4o93bq=}^dIRW6`2SlT|1(P3+7}=TiP>-p^T2Sd<9+@ zC?r|Dd_rljaxE3MCWM1%tw{grGfO+}f3{1Z28sdq`9)QF>xDpib%?CF4>7DSXr$Kr z$pwI7LabQUHX(O{9rla_FZY*Vi2{9!ygDkEv6HuSp*hnyINk>Y(2MsKD+=7OL0(|; zA!hs|W4}pLzvyQhA01nzMOgkz+4t*D8&H(AAhY`@EVpAEHp~LlLuc$V0)MViL#T~M z=V_?xjcUbZbG@N)wLwvbeoRvlbKfZ(W2@gH;hHsm3B((FBh1a=wSf zc%`Q+hZMb(ga?5h_}2{t({n`aCQro)9AO^Kd$6(*L?wH&&@(K1Lyqg-P-WR$XN3E4 z@~0=|G)dk}y+H$28bld};bHT%IYV#Y+mygvYGDJ4hYWR9@S&5DR_lz{QDXl8^m?XR z=VG8E%mE59Whw{Z-D)|Kd|1jK zzsptjU3!!WObY1E8ak#Sx|L7RTTD`O{)*>YprfB~e3VmT>sH7x>7HjbDkiwUd+TT~ zyrgfc>7IK8y~T`02rV_;TefJ~tUZOV0!-m4sx+zfJCFLbrseDp&+lZ&M zRqmx#>*~>2{ia==i?laSd3Hv>b@J#7m%8Q*kyvi5C|#W`ZJxPDSDpKnmsaPTbI#R0 zMg*b!&CBRzbc`^@7-Nh{KV!N5T>V*)V^UyumM9yd;S=~PZ(AYL3Jd@MD5aE9N-3p` zQpy-(lrhFAy$k~rQX7YX2^plkQkyyOyY-kTrIgauk9Ht+=OTSSCzSh@H)|M#)W%_8 zk+s%3=bUq{?k5aPNNobf7-Nhv=~wjrqb`})ExDcrT6S8Kn$PcM>|5Xyp@m*qvz$M# ztjGY{NrqyJpn$Ic{>g8f99n-UN^zd348zVHB@RaF@wI3v!U&wd{;K`Fz_<1`J@t5l zc`0H77$>4v_v6-stbB>dLZcABn5~Dn{kWsuCnz=Fe#&F=%$$nthaGNTNQH+U zt?+%y?LH}xAz#{tOJ)lAZe>HN#%R-}=rfH&`JWk(8bIrvrO$WF81-sAJn#?`I4RE+ z1^{4i_IWTOD7{WdW$f2|=c8XL?HOBly0l-Wb^jl!bk`VLH!O@X#`}Jyc0_~_LROYK z&+|5alS+4uv2_Cj004j)GdsT}YBaqxMpqw+o|Bs`joGn|UUp|I+WnQ5aV}TdGq!H7 z*14_UrP5tvtPu8)+vOiXf?6QU?KYqSPv959ns|c_2vE2bD#V!c&zoIZ9XZ1#gZKf``|MBlEsSetVjS1Y(3h#LM*7&wIW4Lp z=ZkLv?kPZ))4<9OLVGp2L;(OSM!D7bU~+6+DY-onFu$IsA;$zL;}s{Uc-p4zY9NW+ zpA5&&kFH^S!eWOB6QGIM5K>wpaJYmr-XjRY+Xo}5*(7l6BwCDTt9f=nm_S$_OyY<#yza+w3>s-`a#1=Uw z&^0V}Dxz@rd+AM2aIh*?K_!8jL?RVPPzYo$B(o9`)fq@Q9z!>b0)ajhQMG~q;UGeg z-!<`1>Kd5^Pw0zTb1$$Prm3VgVR(n(L=eUz_$Vi~12-pS0s#;7ai-=&j=2&>be~`h#rT7EUzw>5tX#*GY z=G?PPEK)%LijAKmU<6?N^zUx}<0Aq_0E*!gPtfqw4%GmXzx4bh7y*3`hObccFu@2w z^W{$nsXIczK|wLR|IC5lod-kmo|6QOfP&%aYCSz57y;qH!237HlVP4A7y)TMN(LhU z?Y{v2$+Jr8ju9{d&^F^83^mQNEX%Suj^j9f+-a}88E#$VI$QVUPtor%0{R{-b}DSe zy^tj_b$u)S(6@+o!jDDlM)juezX8a@Wksl5XcIDkP3X%t3!Q^6x3s0`k}a+#Hy*F6 zhZUH#0?IDLtwAHF=Va#X_+hnN4S-j=9*G#?VmGu1{{!%SW@PNNuzMI4%^11?3Ddn84217zV5q4&hx>WYi#uMaq0d_Y>5IqOjl4 zv}iC4$L>-J@`O*3s}tdOX*AJitV-{lG!!%sT?*QU!9zGs?bO{S>G?=mh%nV18H?I6 z3{oHvfci1F*3q@aX)d(;+zWga1MUa~Tw&&BlNS`y0T1B5${V>c#w}No7A68nH*z{v z;C&JsDKpzakwn3jp>Sbm3kXxz>!<=+Jrki6r~%+X@PN3A~r#MoWwiyVn9=C!9bM>A5e-%?6A z=~yTC($;9kYAl*UVa_Na6513^sYoL#k-907Dh83A?rTVxhNE^!N{ZD<+2+((jnj(A5ilEjpGQU z7j?u3uAB{KbIs5q1T896;t_3GI!50?z`diCd8Sv{*eG_Z(YdPZ zfzi2e&-~^+tvqH`1K^`z4=!Q=LAw4DkNI<>|+BETfet_R+q#fT;K1K(L(2ul@Y)Xvu3@HGDmYcEMuf^?vAS0o$hM zvdMHPp2;hACLQ<1K^YjLGY?ox|AAc%g&Gv~{?A8D{1@Bp4z>dg4}m^bk|SUJr4lya za1(;M15Q_b_Qd%*M;!w3DBJFu+7>|vVYA(5!=`H_CnYK)ppXOe;b$@zrUONt&{-@e z`rdhbzA(}Ea@qF&%b+66%J-dwuyIM@B=jX_`+uksP zanfa^?4DbLN-d~>PRYlh$rp510*Z;5lhf^G{!k-Rt4(ZTGUU{@FuDR-PH1160Yj%I zN9LA6k&?PE8`Ri93TQbYnz@XoNkoWY?IR3jVl&0k=^C#4YID?(9(hMEMT{VCZxHdx%IHntbhl|9FyAhkuxr5$Zxy ze0IVA!?YLjum0t9mG8*cYT#c!{qF;-1^1|5|8J+UaB6;DEL&1ONaepO7K| literal 0 HcmV?d00001 diff --git a/static.files/FiraSans-Regular-018c141bf0843ffd.woff2 b/static.files/FiraSans-Regular-018c141bf0843ffd.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..e766e06ccb0d457fcdc8d4428efb796c7772a497 GIT binary patch literal 129188 zcmV)FK)=6tPew8T0RR910r;c<5dZ)H1}VG%0r)%s1REj%00000000000000000000 z0000Qg9sah<{TV>l?Dc20D+=N2!T=wmlqKT3XY3#jH+}2HUcCA(i{uYAOHj)1&l=p zf!8YxfjL|CjcTd zMT&z@rx%hTQV#E)CB+h%C#}}#9Gl67CpH3PX8-^H|NsC0|NsC0|Nq}#GLg-az^*OD zC(P_sg`l`5<5@olDT)&@4IRWHT+7Fv;O8}uK?Pm(ODyxqmbtDNpI42h0@o^q4r(k= zDXW+=)$3`4noLuxEp)oQK=D2eXsKe97Rrtqa>fUThSSant5e_r;22c^Dm2y)tu(Gg z1*a3OtU{ViPE3)mvLTK!20>3N$`~|LgOQpsYPP@%G)FpeFi#7MOKe&56%M{CR2;6+ zIu%{ArHPf5<}wX#per<`7InxFI$&+h6-|(m1__%&$HA6Zv+aa=Oe-ETyFD%`B?2Pg znoqG!Yivi0yL%!a0wUnJQcP)*)i>E9_8G)wFb!HDD9~y~1DXsSlv&467;!6Z7~U>W zk32FI(xK4?h94c%5+6CxqfKE?H-s&#X`L12gOi<%m1xK)Dgz)-E2cpw+8VulyR-LMmO~h&~*jKm_Cgc{yYWn=qQ}U2{bZ@kCsIkftBQ zj4~vN7qo3#(3c`0&dYtdAg9t)t58`GIzA5ko!RouT6XxE!SZ-9L%*(x7 z=|vyiieB!Wi|7XuaxlyJmHhoSy@K9GX~C&-9=q0fm!5RsNz1vny%W(wxAidFvSh8T zp0Q;C`y$+n<<-VSY7o$6lv0{f#gosVL_oxW2qkWD%isIdsV>q-V$vXAS|;B?B&VWs zp2(+SI+lDUc?!vM?#plvM=Mf+tmWHsEJFlbykTpstlSuYgN)xQ26tym3B_Ey7rFK| zmaTF$b>T=~&^PUizCR+xO5Ab)=PP3Ktd&&C$L!p_!2OYfMl0;HCFifs;ds3I@uRqp zvuLyULhVamT5XBSh+2sTj(;J>5P_U)K~xY|kaJ~-8X}N$e-IT!Am^t3U#Z7in~!wO zJq`|8k)axel5%34obgOHZr!>*>9esGrA6Zm033oKjuIRhFw18+_zVa2zy=7i;tT)( zq`9V$8rpedNXlqBFAS2QfGbjB?Zj>MVk>%-ZFya5m*SLc?wyLkMLR6Exy?<*XS^Nl zQABg@SsBh(#W*grHS)>J;fh=pfqKp;0UTP;(80D_2ADz#0Kb61x* zwZagiv@=$v^ldG>mb2`*Fs`_<+<63f5Kn4N<@MGk>WBEU9Y4AM)j^(*-|t`7p1Gly z6aZ0`RaI40R22X!08~|ks;vI;zsg$upL6cL?jDgPC@4WBWFce=2|0r1z4s-V?PiEC zFf1y9W}+fTtj5Yi1b)Sd|%fN(=#xBKCjH{N`Hdn?2nDPxU{$fz{XKpADtx8BTtGGqJF@_f z`yuHlzdKPUt`JoLh#=cW&SY}Lkjz02*Bc4;Jn7cFzkie64`e9|k^pNY5SCy7Bd|n5 zJF0*bE5;H%SFd|s$6l{Cxmud`I~!-c>lP9KU=U4B8awG;5$FjCOd%|Z%_jGhCVgu{ zqFQkpBdRbUu>wW>N1fkyWI{=nWr_ilJfZ=*AEEsVR4=#N^xM=kJoh~7|3717-Wa{H zXHV_c%#7Zcmvp3^m+UK9XA@AN)x!Ic^ZBjHoz~ItU#P^D<(G&2k-}5^x3vi!5J8H5RqQU0$ zn;KS$1tdoZ7x?Oj^YQ5$ zROV9JsWgp7qfu!xgK#pXSD}`N^!x|KGb$K;(=@3JhEtosE#|D8ou75j;RWt25jgPy zeILt|6d^POElZZ!-(z52fpWQAejE-*P9k4cIybZO;Z_2-5-4CCHM>VWIH7%L&Tw_8 zjtm`a3YCdy&L0X~0RIrk*g8zB*U0FMsOx$oge>B(AoDi43u0Nb{|=L90tAeJh+rG1 zv|rmE&kIT7^rBG!Ut=dlc5S`>%%=}F%Pg5t<~_i<%$gJ^nkGR&;WjYZcCatKT7nLo zgA|B$s+TYbh5yx=R?GJKB^^t6qri_iLT zVIojTATf^W0 zmJ%+w4c)QqKTkIkV*vjDf4}E9&wYEZwa&&G?Kjjj9xYOWRT_gtBAG@JNv5My0#S*P z%02?h>-3fnm0S9d3fJh-*U!dtEP>4v;B=DqlHE1F|860hGxQ_-U(;TY!IA{5U;Ai66t}d?{jgw>ZU2rW zH^?I1bUmB?`u886y_~AcNNkrDHGL2_9}#2N6h?Y>epHxaBjy&LrfF4B5T|>5F0oul zVMP7M?a$F$@i3>18<=O#6Y+spNX@8hcnIs&>pz{azkrwsPtls3<3oJo7fZRA2G0qWqfP(_nJ0RcVi z^4g+0cGba+$^UCw%?7rae!1m+zfu5ZjBkl#m8tOm-+r(5o_QhK2@4(djf%9% zn?Pr7%WD2xRe&n!zU%T`)o4^T5Gg=gsj75qRN;Br?^{)SfAws0DS2afZw2xBzYH`n zjhzthpclWG&rjePLTyVWv5lJX|C|2*^sGZmsG)8nDZ=3tLS_$bCqsKVlrvm&ak;Ujo7zyAc|G#f) zmHuA0aY(5^SuV zsC$FR*l>b)gCN>)!+ej{>RRTNEsdf`DH&X zKt{N9MTCqqaq+**mFe^{uLLW$>L}zKC+C9<*<4AeAfx~9X|AXHFJhUwJC>a@p7R!n zWIpDwXW6jS(k67Lbxu_QilgB4kvtZKZ45y?!&@)3YIls$V6K z9A;mqizz^O@6h3cXyL*=c7UG$|2A7~v!?UV36=`6qNSuXsnTspmrr*1s}pQ~R`Mp; zTeBQ0y@<_HiG6$yr{`=(Zxv+^JpXT5F17!)4M@>I1fj{sL?kg`P^$M!hJQ;eded`2 z#kPx8)kMvrYO%=69z-~th#;nkaOf~2f``u=$hJpaI3R7^ZAlk?O1l}voaDcnmi6a9 z=war9EW-n%&pLg z%FAVU{W$?wjO3Jf0P+d`u>cSL?{&v_<|=q9#^N1eOx3_vzZge_P>f0Z>txalcL*U~ zr&t!(S#}!-(xz7CeL}nwL_a<;3zW6!%hb@h~b4Y0~6eBZO!Q zyJhB>6_Qtg1MfgM;Q8!Aq=QMGTrvRC&6g2uQV?lVDi;^1IT0<-+b`bvPR^?T6oW(< zPlw(Z$kveWmVe|AeqaqlJ@_!BQoT4FevB|%uufNEt|2eb*l$>0uatSt^^f3$-tdti zK{Dcsdo_)O5JD3gaYM)+z32D;=?uMhAIHw@>+I_oHKM8_A|j%q`oAEchYiP*l$x1i z=7#;Z`md{f|2m3Wij*QEA|=QWLdfn7&)@$4`9EV$_SZdMTejrLk|arzr2BYn6S8HL zR4e$zhTA}qf@WxjVOh*^n8(ov#$r=)f@S}q2>&j{|Nglu%B@tX7=#f<1QSdUW-yP1 zr-}Jw-b{NZy-X0)3_+_-g(_4bj4>uPSz~_B%iQegFIv>8EM$=&BC?2xc<=WahM?%y z9bryz3T+vcR8NpNb>JX+p64)2BZLs55W@z>XwC6fRfc17Sm>4mrHEh9FDgdiHq;u& zBNs;GHfGorjp2(yFo`_q=gN7L!l`^F&H_b|Wm$g-YvMD1=*@k}6<0vKT0PrIhiwMA zv<7KsZ+D@ruaH+B34(6-ehxMT4Mo5^Z5#Zl^{s52WZbq)_c#ef0*Pkm5=fwGXWv)9 zJNmi$wwbs(jxWT!35YZTf@Gn|ovZZz&OXuE-`Y;Nk$EUxu2jjT5m80bjWKt>7XR_* z{=c`7+w@$0Wm-`WHn31jB1uSg;BRJIj%Y$xowd%@q4nTt;Y45evq84~|DRbWj2Crp zi!wq*0f`a40UHZ_Kg_d8+Q&1GKF&Jp)LN?|>YRu%^7$O~>^Jfkw+4$C;&Cv%Uo63r zfOEB<&%2uULu5YP)9adCd9Kxauf77$lrU487<5Yoff@$QGVa*{OMdV2?Wvy}rM7Zi zS455yVgJ~#?ODI|(0#YBlvN>Ra%tJwCj_L*wkUNJH>;;bBcqa-EP33*iMHF6J3^?-x#*Tvic={xP{bh01H=%@@Fsq< z&|c%j2Cvz2)7aj5pyj}z!T0|eFb1u)??hk5hO@b3em{ify@?`Xg2 z#sO#?TyAWODA0Rn2p%Lw{}qatVYoWtfRD}?o$o#tjH&Nu*NpSuzm%W#ef~4Tnm0F9 zz2Ti|827xlsr#ossBe65*^}C5o(|e@M9;aQ<2nNu25vBNX~HoRS7w|rb8W#X3pX}6 zW98NsH`%yzfsQ@*?qSJ+2a*2T$1RRL0&x4wd>>NQQc}~oV|LHZ#p}_NNRGGvxi*iKxWtt7tX$c% zd<6^)2+*Hd9Rw5%{QK{}h64h!`(NAy1r37}R(>5WM0qN-nQD%?uC&A&TioO>1Ry2` z&@7D>&M)#0^FOyyp7riE05l`Lh2hF%ri8i9;hH*F_kMC&H|%-rGj#ou@NjA#9Kb#A zy)>Nhg>cJ%z!3m^^|uTw0DS$QQyKu@{>s+y_OHQr{-yW7Y_uh02B+I_=g5G4RPz5X z#r~=s4qIm{Wce4|Qjn|^*R7AgiZab@c*J?~Omb?iWY*MBcGsA%iR+u& z6sEp{y&J+b8x|rj9~gM4K>Ea7VFG2=xgN0v{S}~u{o>OoC|T``64nq#zq$hhfANz> z05Adf3EoSMyM;pa%X-QAVXh(KR6xX7!xY6TJLrT#tlG?l#3VlW&1u#d`j9dLa_yyD zG+1)4_o|sQt4%S>kFekd(Fn1nwZWRQr5q|su z;4b*{`a`GT2x911FTIXmzzQ_(j=7)FM0QzV!fLMS zX`R6WxGoE<3=ya)?suMXhC#!Dm$lgh9g@r3bvk9M&r^L{Q4cl{9t-p$@!#6(*Y+lo z|J=%5$?Xots%0(+9ruC;y_q|Ml5Ow%2sCH>fSjaTqacL=FMh()O|d?X{Zj*|ix^;C zB1k8mC|ic&Fs%swcqexXH@~%<+JM}x;N@%2EpQLJJttZdiZel?Pfc~!Z6M&GxtE=(iqFN5{&w51|UxOGhi#jhMVeoUb^tl9RQ7!YwF(&n!+ZnoJe1e z<81%DT+oknMXxN~tNgrfeN(8^`Xy|YZY#oIF5iGYJ;6kwDazCuvZa$AL%C1jO>;k4 zV+)NYSq(e<26-RM_d3#!VE3IGJ_2eSF)*l;UnJBcUZO-o?xSWuq2ULt_5vu5dKJb~ zqt6S7sKmHLv1C(6_F{99-Od=oVt1|uRc0A*y0c1Go(^(3?_JkYT-~nfQH+06KAr_T zw*5F69>AD1FGK3wzy;h`4MSNgKO`8sP!}Lk>|%T&MkvfTmPduj7`|=VB({ zF7h{0_9?{|{k9G1cGay+ML+<5|vWWfazijXe?o%Ko}7 z_`Qe$2T7SHZ$UbM_X?`zV?0gcDfv#iqL0^K=EyX!Se~UgsB>lMU8|SN+O*JRQ;A7; zwH*L3qlKXw0MB4Y3wrQdMMe{_)8&uhuyD1 zPH__V^#GcF(43=l2!8~8ObT{ZkqASCNa9_K1tUE{*UM3gDIZbp%R?m}T`H#vs*7?& zQm2&+iW{@hm7MGK4YOA2y)C)wTe-e*g&HX|kd0ZVzT9FByi3r5|F zU?XV-uZ;LRY{aZTg&%{<40;>7W_Wb;#>6JNgDxmtF+S|g5oO$OkF%D}$LlRF0qP9_ z(D%2%AOq~?)?6WX>a{`%;6#2t@?lxxt>L}wmQc6>(3n|-LNz6EGY2bN%LLM-T!jF_ z^gx(SEoA$~NvGzB$>l!gvNAD8$3S@*W`^B3&|D=$t(&RO1+xNpxBH-w2FdT z{(E*Q0yMG4sA{RQ(!KjyFdB$a%TJ&nfI%vwfDK-Gq}i-PWdU_~QW9QRV2qm6B+ENk zHVlrMC_1>Q#T4q7k0g{Xr#LY9o8FectK1Zawc`E=Vf2(b=RwJq z82tx_;D*LP%Z1UfREzAVos`+ce3A_Yn&3dGGO;}CbYw$?BS5ygm;l%B1 z@%^MOLY~V|%(4}Xm`ioI*PUUpRj^vHL`=$NHp4>O(=1S-8dkd@nBGbygNEOXxg%oV z|8liN9Bx!MDL4;?+4C1wX7)H)Sk2}}drVmV^wS^cP9KpspNp(D<7K5(rpQbD#44&)Do*hJ6!J%U8K}#+p?fY;pI|)Iy-$#F@W_ z8~)k=yY;HB>yN($&}9S+vwykFeROzueb}O6cM=D$9;@qf5C5NwbldLTUi866Ke73$ingOiA(cOkE^<608 zes5)zs;)C(Sstvw50w1S7=g$DUXOPQ^7;u=ODwGrZ{&Qy8cgN?kNNXcr~Pn>3S`D? z2Fz^IDzM|JX48LK_P(a1YPgb)5t-Sc3X9>mwF_(1nG0@e6Mo+amqh`2P2@}HOV;l<$n49{w^k8Zd}w1 z(3ow(Z|<>AxL`&fGsT^w@$$%%jle7+&RQwRQn1gMrirTX5+w5tW?RGbO5As_YsX+8 zK2H4vhbUnC>FSNI<-frxD)Im!s;vD53M3S$BSiPUTo|ap1mL7}^*nI^h~BB)aZ21A zMhN8@ZBvg33bG-d3zv|g!GsI{;n#=~QU5C4M-q@r1sbC-!-xf&96g2UcOrD-BS2_j z2!*>BTO>flGw6D3UmyxZ_r!vDY2ipmytQJq4+Pz^VN40O&I7BR2h=ZxUB^4siSEhfD4BU*)v=R{UV7wHK2o3JOi`AF@@Kw0&{5SpO@3n! z`#Z-KZ!q=aYgcp+?^*0MHX$GUmohT!6x)+caaL*5$Q1lQs8<`g(ZxVU8xu5APK!Ryu-xYaMxRcD6} z1ovT4FqVNQt9bAsY7dQYzu`<-u`|_2cO72rKcZytG*L-A+N8Y=#~8r{0dWY$wfyUW zHFn3hok3^NQC1XP%{ito!tL2k=Jbxg_p!E+v z-g=(n*nJ=Rcx>#RVlOTnk7&e_YN^!>#&WO|6RgNL9KOuT)oSaUJ2Ly8>~^_cKmG$g z$3`9q`{eixoJ!PW1zYelRQ1b&n|`C7-)Za*{`8mn6JFsN1kL>|knoOyV|;=``vWV4 zL$U>Tj=LlvHxe8T$0Xw7_;WAwuLt3-seTJig(hcOj|C%<4M)FCxCQ4U0ELKBf;8nQ zx@BtKk(q`-EL=;eL!XCCh-NJ29^zI~+Q@U6_~(2b!4zH!7a&J02oa(1zzxxh7le+m zyp@Lt*9}V+L|mzSq@uUdf@pyUDsVz5R>Nsv8V)&w5Yr;WT4x_VPkDw(M*I!#t?nE! zNO)1O)o`409B$0(Q@ak=niM6286pmn*QS;>AeGh&eU+fSvP(#JDX=^h4-Q~1GSX7B zQy)J+7wc!2_d#$FvQ~F{obmgY@F0N4F2bMUN%)J`EEUhdbD;KJvFL6*$xdn1cNLn= z*MsMywmKFyZNb~mrJ?so#6Ml+J{0irEezBn7(?}tR@Rg1GJoo3Al&zGQgME>v$YU zlH;f%P5SAC8D)zlN48%;)_e~F?gElagrTmCVlWX;rz@5tET`zhMhJFXN4eh+|1X0p zJcGcbnMVy5ZLo(w1?X(#WM{O6Fr%LkoZKM6(N2hjn`>lF=o7mM|HV6lPFPYcd}j2HFZ7$s87+I$5sW1s8 z*Ha)~8P&f9j69h@`lln|GQ%f7fq+*tr@KimvM0?ogZ zgdkzpxCqdd=Qb`GBLj@vJ<&YHdT09fj=Oz5w~X9M4TVfhWUwuh#bP z4h&2j8?6PknLryX+*3MEVANlK)cB8F-? zyp|hNzZ31wL{Vyh67+GnEE12zJJRCF;$psojE&1U1*8yHvdoN#gxHSEJz|lolE~O2 zJ-qUGCs5pkJqa5RnA|G2QbZ9-2w*ZkcOjhiw0IMS81fywgL5RfkixsSTx&T#g`Af6 zQRWI)Lv}V(24%<~?*g=9uOpLVPSGAi{`1Z|S|`=gvlPLxw8ybh;|dqrUxE zcEes<0)|aN8HJ#fAgeU^ao%59{L&YEuTxnZ_ks7EKS?WN~p#Y$@ z#N@Ib^c45>C&>E*uR>xWag8$dWrhX9gftd{ui>>bFoW}W+=a*?aBzbglv9o?u6}92 z7nfmK3F=-?3n%sDIl|8`pzz7H64Hey<_H)KMOYM$=9wHIp+DUfX#mW5*r1nr0L1S! zm!%xa1>oQnEjv)b5oxQ~a)?8OBknY#R62S&B?5+4KQs@H(6)!PkwwA71+##x09t>V z3jhYF86uSULn3n&E_0ci<>nvx3Fxnjh<|<%MyJe!l_LO3?WJYt-$WiTGC@^Los==9 zqY!2LEwVR>yHY*>4Fv!yE)m5W6aWF@X)yOHFI`##!+DIuu@DIA zAIYi)*9A1_a&+bE-q(Zl6_(v3{zBP(@#KmsoM4+<-VzZ3gepP^A;c1EHKke|rG4gW z0Ge=SM=kfGq|Ei3RfdZ$V!p&*;4(Y`9+)uk$6pRdX#9n^6G~>u{1Y!0jqIH+D$f@` z@&vu3np?Ot0_^8baLM(gw9`QGv1beD(Kr<2w1JXYI=JzVM#6)=C^;Dsl`xN2{s1)n zNTc>W_B4Imyv4MAMbvi5gavn6V%rw!t|!x|Hlmgm`SgSMheyU29o4{yK-u+VD|fkz z{8+DjH80P~@TMO={{LDX>+%<=bx&=xs3K|8>cOH*rx2Z4-Pm4MV+9ub5wL$RXFe3Yrf%@J1qzMLPJl6XI@dUa5rIs+Y81M zi~~%-5pngQl;P+&9*#v?7-_`AifCQ$Ez^crV~R%};`}5#;5_jss2B{xmc#~hH@Pnn zmq~tNf-9xsgZfzNXYA{Y1=mhjX^>GcogK!j=UG0rp4ffo^b_2+;teCa)AqIh&<|uJ z6a(4%Q{)1nA|wJ#nt@!ElNMFhn@q~;s?KoN`Y+ix71)Q4cTzO6`M{7tl&T* za)*C?GYoLvAOk#&T7bU=1Y1D31;kMENi=GN>WqLqm!JyQ>6P2mdtv7SQM{u zw_S4rTnHEfFC;`D24dNUAYI=h$P-i+3CR$23F^Pi8WSuD_ChWM4?08e&0ncN!Gv&* zO-+U}Qgf*&wVY~Fo2>1rJzXjvKhQbUvc{&4#Mq@4oFdF=xnHC51mT6!Bw>2EBX#N3 zKkqBns+I?KVnYOtU@1aG5V1;pL_Cp+;(<(6Au@=nkS0;zYD%l$%0(L>W0eH=lrzsD!kfqOw|Q#A#~*n^D$KTV%9}d>?%0C?0|NrZ(?`uU`e{RCr^bsUB)cgbK&7kzw1H1a!Z4JC8sGb6apF!fSi_jv^;}fpHu;I zcr%Kf098QrQSSqhax0?pYSK;h)J_A9{C%R%Hj-a#qYxi?x~yZVaZ30@YPi-vp++fy z^16X4K*2&%J>w~4Q5Ak*7gc~FQ!An{DA(M|N73|qQS>PnM=@nbR$(tb-tkvo^}axt zS^E`=wX*iv{Xm5&;+*t!B1*hJ5}G@x@qNlg-}q(%l)GC-X`TS3F0TIBQ2H7f%3w#Z zo)l#a!r`uK@NVv~P|$J8jH#~`WA)jA!Wv-}{;$1tV%-pL2;{)JlZ9A=&Z*)%D$n*} z1laA`xxmkK+d;VnEyE9oA+FJOgY&-bF!%-)mFar#&w#?MCtyaAh6abN#LG&O=9xdF ziDd3JfW4Vy^U77!6mr34AuT(pRTk!qg}H=D&I|yQ*Ox{U#)jQw_@47-_E;DlxbgLG zw4ngI8*aKt(HZldRvk)8=8%$XU$C!D>09%c%3A)?li1s(OpG$l_*I7iB^7iF`@+JM z^Z1FC1|-i9`7}`X+Z0sPm{WIwQuUBJT+o^*_A^fXT@vx7Z>t3`-}B>y(us%>CU|~5 zZpv{K?la0@or;50`-n92$EokilF4325K(vw=WUY$rr(xWs|aK|Bvx3rIMXZQBY0@3 z>!in?#gv|m5zR>57hsM#=IEkZbW?U;!UPt1CG}7E0{~V0rn-?d9tYI;$P|ns`n@q~ zQlB`1{A`ATcsr}89CD|Y%w*|M!1xwA=5Y|g6R8$8F9C-SkBrv}C zyIhgYH@PmuWe#y@VKg~6vfQz_m z`YZ~yY0@(Z)CZa%vzkTm*bybl{4Dgq=5@KB;Vu@AW|6Rj)50*DE}(vUq)|e;NTzqE zZey-K4(-|nt{AndJ64!0xtq|-WNFOzSYdvVwBvwcvJQj~JYan{H=76dZEr!f(BwcrwR2~QI90DNFu>!b23XVSZXeqX||TE z%Ql)cQ}$;5nP5~+pW8~RxnZ!-2^Y@cQU5qszkqMo-^?`k+i1QN^Q^JK`4`T|)AfqM z#VzNOl%;nC7=XUzNr}N`q+vKU&JKCzCs8%$1wJk=kJok;dg3>0(}tuY_Zn*?Bo@Xy zPYhle)?4MAZ!T=th-(C_+I!I4PLZGSLN=c!U?dF9#tCa}vZU zNd=Noyi@QvC2kMnRMe9{w;AFLqy>(y-iWwCh7z@O$iVfcUuFI14$Qg-yK$A_<&mec z2+2He&vHgwDP+S!hg{@g_iv0wW|FxA;DDd^H2An?NlqRuP(cHIWhC#o-9|oAFjp3J zTjdjhT&Rae(L|%DInu~!5iYm2X+vm51?cSP*F_5+wi7yYEO>R%2KbKI>o_JB9A-cS zCKBa9bYiu_98VBOV(I>h+i!nafiplRXRVs3Mi1l}Ii+8NaF}A0**9s^oY&H^ISa0! zPOsFxvn>aTK8r?figljfzLe{QWw0HpUEK%7>X3rn$|>bS06bC@lxh`&!pU9L8<8!D z(Hnyd%7nU6@N{!`A~WB&_SBU&-rzkReKJHiPAOzlg-Fj@gNcHO)XDslR+aG)z=kW8~+NT2) z(rDBKNF!GjbvakdAmAD-woE&qk6~(3(9Y%-T)5I3vs0SA5MU_mp9EAwB%)GC(IFP| zNH{K~&Y@1AE^=Bd#<2cN-OsJm1Jo@UJ!bolVvk;eE}L-i%YpHv$(WeQKUxBC093e6 zufBaRP6l1kKu0k#T?lS&i%TNo^?utW;jTis-yt1_5L@O{Wq5HF&iX<6LH)rXj$X-# zA_=(JA-hoktfedEk0o2t{n#KNG)tuSUfF+~$a(Aa5j>fQltzsZ-PoA4ckA0QmF9?(#2S1JTau+xWfTFu%dS0ReDB zcpa;GBDvuyQRxe1sp9=6R54K|s>(?tEB3!ttu`9cYHFk=V8WKEsgcuJc(@5FiTkXbd1qI%SYYsjB$8zDC!Ex{1L}578($70t24`kZap?Qs90k1{15 zc8J{#1U+?`$PP)H$SI_5V{=dHkf9zqp1X<=nVSw}iykI>kJnj1Wlz`9H_(^Rw`opq z?IycWO(0|p7{PH$ah3}FOjZ9?hcP~6$X4K&i3Z=phyof1w?V%n z1#>0Bd3E_aS!n`OxhTKUTJt_$3lhj>((LoTL}(<7jQ%3}Xha5&L@yl7+;P|M7lH`T zkR!?oN+ZWbUsi#ST$3RewXL|*_9cdy5C~zCo07cIWM6~83gF>oP%9qI!rH=P2oq%I>mohuuvz=VtJ8r#tJYAn+bCQothV^AC zZj|C|Tfom$#S1s-P0|ID^c^>bKJ+u{mj>S}H0oHX(e{Qk6ZtHCAV5P#Na8%&OFXGB z@#L0KCSJ5Oo;lpjNrmP<{aS$LGpE$5u9HXBSRd(`oBR$d$g{ld*=b~B^IHY&;M{hh zuLMe{8FP_Fg#^;MTsl`&Q@T*DAC?*#+@cQpsbRsr6QJ+yi~Lntloc{96!-C-0|S@= z5tvAn0lm4I5}DLpA~C=uKT$NV=8{`8h;SrKCHdy9TO}5bz3u~Cg1;jZuHjGMeoMjz=62y29bV^&+D>I>-xX9;DFf`U=CSW z);{Z$yMRba1q{#mU7AItDBUCW$*)^tu3}+CgPWa3wxG00hSboRyW`aEPGi=4WvIR- zV;5jtjpR$c&OElK7HM%IHHi-bm}~|GJZqKFOKTqN&7wW8-rHC|&`Vm~xE7$8mQ3)ts^*q5KWXXJh~foZr~VDk_A`VyP;3)qswmT!wa zD`GyS;Sg0}G>@|NhrR6twgua~W7D(@*>3jLr(=g=vy;3niwfpj8#S4<>agpCK+!=l zSI*38nyO&S|G_)BGuiiQ@b7fC%U76r)#=SqUSW?WGv0>HR*b6=kCAvV?PfUy3k-V zoLD^tliY7N}MjbNUWST=} z=I)*BGP#|X+MYt@J^E;PLIiP6`Rx3MtdM`E*(z1u+diw-*Ke4;pviBGy$rwWxVc3? ztbxAF_vLaF`se5}Kd=vYnL{B*!g=m8GI@U*Gr_f__!+&1Bs2N9sO_Z@kgK@PXk=j< zIa=R;vwI1UIShFeCn(K1DvsBd#!^;IZp}KSHR_vT5wP5ZCuhrIS@~cyTzAagiUJb_ zzyJp$+)n(1QZP?~(ye0s!BZg+s}!$j6g6M9-hKkKY9M3!=;3OWY5qE<02am>3eVK< z2%2!g2`(m0LK&am_sgQx!Awys*hVXst0R-PxoD$Zn+;ml5~E|$otmSvn6CJvvFQFC zV0X#&;=j*WuG>u1Je0ew??-WSxDDkHuQ%^h037&-3y?sKGGJ_l!@CktiX`ZbRWjZ@ zRiip&0Hok8d%%qQguT(TQn7&2rF*^G<2G*gQCd|-n)~=2=*!eG&3d9x75(DRDxbIN z_M)?z;5)b8_7>Y%S-y)f#s@y}6{ThHsNyPA2YKj*%&PwjXk$I&QUI#+Ut>$-$QY(z zxE(u?dD)-*Kgaz!MZh;ln1uychBerf+fl&#-jAacr}zQ|a6NIi%DyA}Jt6;Sr|YYn zyP_<<_NM5o2Dw%g3Sl#yqUxU~`SagCH1Z> zCe(1|^~5K&tSOUTSbQVXEL(t12UkmW1HjJUk4rGiPcB_ z8N`s(jIK|yk$AHTNIE*M~Brc(NrEjP~l>T;pW^qEo6HP}jNpxycXPu)X@ zJz*WE$%|{6W?qob0Fg$2dUX#%9lpfDwkN6^hMlUCIDxLPh;ATbC8-m-g&mZWbjQp* z6ld-l_1i=D_OY42F!oL4iZKZ<9X;+s)>qM!II@2{k;>S=Pa2Cx+P*0Q6_(0c;yJFM zYNntU*+`WrMyy@W2JiL{(~~rYK4hc=eMx+uzKxdf#ZL!*B*0Dg*IC4#S2X^mlr0nl zjT|AU@%P3H1J?sH_!BEwHKq<)suYtFVb-_ZL>oiqO(-Jez~vyttOPv+np zMn;BC>!UrU|l@c32#8i3Kk7J*=yOIvC6AyBxN-6wHpi=V}dn9rM;+GSzxJ8I+gdCE zPn$eFw65JeUC~@g@-A#KqGKB*sn)61zvBbrVUc5uvF_D7cN%p|--^jGq3a1TjywCf zlt*h)(c{|TjyEUD*&F8C=NJ#s^A@}3nMHc)f#mTZ=oyfc!?v7AnC>2T5F+Q6l_gi4 zzJX{A_zZMSlIW?#5C#W>pR|eCC>uO%^6-o0ctLQAH!sH`h;&8O<+X30Tm0JVJ6cs$}pB$n69>_{(s%rGE?&3x)#@g`@~=Uf#u^XFXaZo1|EbY^hlNVILsO zQH<1OVSBZDe&HMj|Y*wgMPc5o-Uf%Ay5O0ycA z^X}d6eqyMuC*?28;*tc{!#z00s?nPe&|(ggc1q^BG)Q zKixuFpODa5`4dAF3~Yc~z`*Z*m;?F&(Ha6u#RrYvZshGcRibJW`iVyO!?h{``3%jr z@&-UleQQNQcXS-@77j&vWT$u(;&|nue2vA*j^ijtI#l-h1=hBb8sAKJL{jzS45%<5 zQ(;iVPQ{7`K&mcTI)&;eP=l%mSxM_WY_k4rABMUkhY28_RDMTr#xpOim4mNv?2x7i z-ol|MjwkU4a9l!(TX02d?Orqd#PJsqMS}FDBBIDj&e7mXLSNGMl?rnlAmt81SJl{A zVONT@i0~PHRd^TTO&?-$qrv2X8eh>`^Mh~^F=K99nVq`@3|QZ8BPgigz(0fq5Q~6b z4`+Mwz6i<6r-}h)NG+5Oif=>_zeLhMNcR0<)*~pnyRS?@g1c9DVe0!x{n8XcaNxfN zkV6a0T{UZBC04f{>#F}nv&da2JG}{%nLgultT?5W&FDi$u-#Kl!IETYS$1}M0ANJl zFC9Fc&L1Ezb%CM(A(-a@41UK$z-XHQj6ie0D0Ncw%GjDZ7Te9oQRLDiy^K~v%WYLD zUF>`E-f+z8+K3+iM%|(wnLPmoGV0-ZQw&Vpu5^1_j;iw!3m}n;6|nVYLAjk$>IQIW zcj@Vf1(2v(nDX8F%cogax!$Oh~sIb^aQt6wGB!^)X z##r~bh-cCo#YSW#H%rNbpQJl9_8ud~jm1|qcsCIY*TEsK9lJI?e=9P;R$ekK{PU!$U%yWq5r>(&|DLeeu!g<|&N$K&d(Fwg|tJSsOk zi0@v=QpPsU8x341Q|ir!8QXNYq@h8x}Yy9dp$RECK>6fg?v zoD68Z1LN%o7w7;#asbm2lpAanbDB6|GlFl=M{P@70Fn!nj#9eQ8NMx!++x$5i~@nh zq@xT9qCBBtL0Kb_(ET_+g#ut-4)Jsg)L$JM4tcBNeyj2eDpTXvaR+=C287?EqMEhy zTmeP*qLQkj%uMN7PZ2Q8=n1{yS1h z4dyP!+zqvCJ4$Zm&J@Sa7BL%2%)Z=aC370>vhLp*heF0c@(M^Vod<6XO?(!;1=E$T z%aH_?v+7zf$W(5=+XrtLy{5SJB)gArkufZ2*k6s-8cw%qFc71fBKrneHFT5rfm=Lg zJl4o#3*#8aRN6RhIk{^nm0RoZa%@uXnAF#Q)@oZ6{q;a~sAue;s-3MEYgZ8qDGqN^ z?^4-32MWe?tSjW1&M0EOFH2t>IY+PFE!PHqHlxxPwth%|2i;M#LW<~S?EGs5WcQ2i z`>0}qxENjhBD$q?ojJ1XR?{;X@|$}yc=NDKN>NxBmx@E9IHkciL-k2zMM2f8rcZc? zj3VE4D9ZD${!(*|4nn0@r^1Xo3MuBQ;{8)`mQAWERb=56l({^Fm-~3R!__4Zp#>Es zZB1+1l2o=zD3tZGX?mgb~$fMnBW6bL>Q34(5v-{{nwL z9$Mtz>1wXEa(HMc#%Ro&TuwK_TE@Y$;cZV?!%@Imc;mzmwT~Fen?S=kI5fJCjYi^h z&;X%$aro|@w+GNkyd1n1 zybio&`u4Yiw}H2VOTjz9JHh+GN5QAT7r~dnH^BG&kN*Vx3j7-U2K=dP=O5so;Qy)J zbG829^oaumAQ@zUY>*2~Pz=hzC{Pz3-wZmySkMcmdq2(w=Yx6RO0Wp50PDb(8lN&! z%`{E>^vuAF%-CF=U*@-YIM3$Ie43pAbFf5~8a}e;`DzkRCdRaWR*i@#srkT=@@p|DVqrO9Ea2lT>{DiE!0?o!^y|Qj^DJO%@y5VT_fg?S!*->Mp z;KL#(=s}jTgN7>)@II)%+JNjMM%S!obda8dRW(+P`S6jd^7i^YzsWwQ2C?}swCtI8 z{5R^`2w?ynf$k&%JiH6Pym;&?pKp8#8?Rh)>mBv|zw>zDRN(B%99O>(xE#0^xY@#d z^*e$4fk%O-b3B1h9iC~!d>!WB8peJ5*&sfJh||Y^ok&skzI^X2w0Q4rOm4jTn&A52 zrr_54U%nl|-NAjqgTW)gAB?5P|y5m->wu~c(L!ETt>MSJ)17iX7s#4zh#`?$J114b9xv>gKjj}g?jnR?TInS7Gv*AA0Q6BWQ-jH>O)<-O zb8f&iR|QPBE|>b;F_I}*yc0b}{wBN52Ow8< zC48=%NlrmUQ8F?!J5${&C!b%&C1Bx?u(A;iRYt@j<*}00G98l@y$6S+_ z8@Vme^$)cWdl*WX0v2gX6zcS77&GAF%}jt<0mj*gDF@Os%)`XCVlL{+d6ln1rRvqI zrLIYXmNo0ty$(H$d&vx=y=*RMEhu^;tO#4;30slr+b~%}IQ(G}*(g6@U;B@J3EzwMmu{(ac+9}+h5&rj^ff5Eul|JBF) zr^M`QH6iA3YiPO!hM=pUgxvlb@RdX7vd~L?OY5SYc>H z(o4!Phz#nu5RYcRClayU0tJrGSIM$5sZ}>uSy`y!cvVwrZyf^ofHp0B_U&KVv00W)R|}*vam|B%RcKq zEe8Ask_GsK+B zcyYDn_#nmirSJq4N=|rjl9Eue^q8e`mo0*-qZ^3*pGJ|yo>i7ZruBR z=&~P=RONpLeN?pL0owVDv0Z2t1og=U)8rcr|%NDs_*LuT+=VW4gE^srhcQ}aZ7(7 za94jxKki+Bhx^pOabG%)D_0jJyfR29>%r zH5*G?^Ms|N1+Ju9K>+bM#jJa&QQevh3DiHQLB( zvW3-bkkw)*t93WA+J^EEyxNC3tknUb`*)8#_S7@8=B#CB@`Da0*x-T>A;geE4h2Fj zl_D0Yq*Ys8wXQ1L1R}kVg)VY&N?qD=R#8<{UDa1x^;LW^E3GoBtGe5)Uqgr(Miq5z zamF1_ic^v*2(1PSEVTMH?70EN$;Hh>yhMCL(k7zN0hK6Krc$*I-KLms1^|MPXbh1| z71AbM-QCX`@0O1=)m)!;(IuB%an*o9LxznQHD=s3*WGZ_Ew|lq*F8wyv(LJ1Qa7CE z^iLR0`2}b^1f)=4iUF9?1mLRGeK`C<6buMg%p#3Eni$iap2Q|TiAhcR4%z2nrVS@X z0OV0Q5H%_$*(9Okd9Yf=zh}{GNL!hyE z^0C1P-^k?)gkp(Q7Js@?IR4kU`McZ)@SJdQ2@Kcs^Lb0Z9MGXtmnr)7^bL$mOwG(K zt*mX1N|uAdk3&|3Ban_b28SAZjUtsTMGBQhXE0d@6#GO3LXlV^m96%{ zXH1=m&ZxwUK9iJ!dB7(hC#eXLqxWYHD<@I?OjJiz$`DphWuTEqlgT(Yx=|8$({LVQ zh!>UjohI=%i#$)YRLe}x!?hf;QJk~YULasR|vUcBYfWHdfGR*DWu%y zfym?`h=4ydgp$X+7P-91Mlk-udyYTwop{8jy~$L~7mV=u^7XRh(c3 zNz5B*EXYfx2vS+|j6b})T$9;yJ(TDKlDI9YD$W{B-a$UwBss6_K;;ner!HMoU815lvglaDy&&WpXqRDSbh_uSjhXiIz}O-+87VmeS1u>ECtn)kHWXsTsGSE0aulGYeBKvb3zqHdtqq4WI@l6=~RhUw=~9<|9cc8=^i6Pq?)X$tJ&H%*&nMqtZ$w7+lxB)(uU_aVk1>< z)NPF4=*_Hb>7|<^2j02cmU?GczmxKyDvxd3RmY}?{C8UX@75; zEmPFW?|%P+O_;v5Q8mE|JQWy#9|heMJQob-ty+v&UyhU7Bz^^>P$W@AA!Ltv zUh$I4DnesWPZ}#LoLR=h6h9s zp&sMN>k%5_F)H!|jq%jW@%8BP0;=h7Lmb9ZW^~wxVnHf4=YfMS0Td@>6M#sJmIMlprw5afV96n|q7hk1n_QPoC3?nG z3y0;bSC;02;^xT%-9hc)jfzX;vqZJ=v#P(oE~_-$HDXk%OuRMtq;1ZkTa zsav%rZx2#-EKx(>K6y7vQ=p2eNZyOceMJ2bV;a$PsA@(d^-SXoLm|hr%#zQ+tzn+E z7TQEz1k&+RNb2R-j#t2AuEH(;_kh$51Z&eam2D-^-_c zKwR|^dGb++aT=X>26dc8-Er}A8^V2|ft4;H`T@~pU{qfL9sMJR;iqos25?T_WYf=x zegRtg76|oSI*X)D4c>EQ%g4$rsc?lfrzzp;pXbOYD*83x=oOx2oiw+D=|Jlq-UsKP zJeuo_>qTEiB9Nd=7!O>W2+EvQv2aN&u1peMRSg7H4boM^mcvPzqL9`VTtNql)JUlb zFx1Sb1jy~MKn+{;FzfB1OMi&HwLX>lKz%EBm4$aM zigA0q&RPS@+0LQExnY!tC?A;Q0-{12x(zi9!EqJ>s5FvIXdDKNu_6Fr6G62}3m0bU zJrPrYi%h*K7no)S9cG$6i-Tw4;z~RlEb}cKBtlDqsxr$jzZ(w0m3-#{6{udf@f% z(Bwa0nD4_`egO4;2yQ6&|0$50VuDQWPPw6#%J<1Pw{in4HIpIJp;1gOQfYH<$1$M%Gx50B7h;A*l?ZG#md2 zE#s&rWk<$OXUe;E8+3Jt(L=Oe8GWXTEJmb0H^jNZueKB#caDS3a}5?|e)G>2ONJ-n zV&N6kqs1~h0t0J~8K6>8+2tD5ExsUGTZ+;qSzVyj4hWmfCT|vDnjCcN!#h($xl$w7EK$~`wpB0gWog&$B2?Dil2o_oDwTBV@$_;fS^L?(J{a~5 zuJQ?0hiGNLDvtuW!l3Ew+syU@+sAV{0ZXVdGB^+qr98uELJk3LzGGwAPM|3k#w>ajb6`SX2 zZF`{TvE3$~SPS)37qq-Fq*JE5&IFvN{jDR@#bn+^^vRr1&oo9?LH4z?Ct`B})#nN< zO-jY&pbeA=$Ve?dCo^bAoLWOKUjJAr^OOmPHix!h3)%EK%}z`~c;L3ZvZ&)o#vv!T z282Zf(q{O@z%x8go&WX_)KS(fAIfe)1g8ykH;scuPBrhqh)qwm+{<9y=i!@Cov00y~|}Nwo>ofVE?ACPt>UFsUt2 zrw7;sH=dtOXy)QC23WV@B8DPWBK9HR&{+o1ImRYH3IbR|N&&QUAVolvy3PL9>i0zc zoK273vwq4q!&{_xFCDKcwv$?z&&K0}_YC~8=-Te37TSAqz1RKpm`iS(qkg=aySsU) zMRaa)dj4wl$_VF&d1yPyk0)>WmU`@P`)~Iw`f=~Do#Zv+oLjO*dExCX|8!0l$TM!i zMjL!>z_pF6fmLX2YS1(|8W3$QCofL$ez%aso{OhTFft}0?;5AaGch`+@O|~6heYd?&(vVQWOsz_$ zy6T!S@BO07Y*rMd>{c1AvRGxVRM%Cjf>ITt6h-l^bFIECm+UeBy%unS6DFWI`pY4I z+;&aH!!eFoESOjTv7lk$K#XyG$OBIxRc`Q1pEHD!Br+#*l9=47Gsp=^98P3q2u}nq zXY{x{zj+ft01Wo_jNn=HOb`(r(0hA$+aubG%AhPNJ2(iwK@92!L;%D~bjziy3*M{EH(bwFHE3hwEJ9O?V3_VRJJ{@L`Pr*!R`qE3; z?4WBJ*3#a(jsAk#K7z3^V}v;s8#@ys( zYph>qhUDm*xVJufIb$MgEM8*l8Nm(<+zrqLgcu&js9eD|5I6W1+#+s8WrrYJ00G39 zrN~++m^OeGB4q_zAvhM=BGxk&1S`fwIkx312+^((D;3omPV{QPDzuX-Kp9gdo-5?4 zQmYz-ic(g?i?$-$pi(JBePt7sRcM!|Q2VM;O~;O&Y9B>|igBt?rZh`wlQa~y z4Jg|nNL0%}sR1mV7{-J!omH8TQpS7YqzvJCB0M3^gdu!vTa+Xa5qt+m`hyS+DWa(u z0V!h8BOn4nbU=h+2qPUutk6OQTH)%v)c<%?P*uB{64%SeoD$KcLJKLaz(PWGk@|`` zRG@V!=wgcgnps==a5wkr$3IsatK-vWA3S{Ti)8i&!hXe4MWsr#P>B+S@bh-9sqw9BP!70fZmMxc|IhG9O zlh=BOk zy6J&3J&WaoDY1J(h#BdQj6*%a+|7I}DJxhGzpwL@lJ6ykq1>6YmpGE?yEStMtQtu2 zxya3c6c>=J1uPAPlJ7-_G>`IKZbPKqXK@+tBXStvAw)_Ma8t^Wl| zZpdUTDh-3=e~vI?ODYOPO)k!{q*3mEz)Qmc;d;+cPZ9pkkd6m&42_^6gzb%s0u&I4fDQRZvW^AVSgk__a5w^ur;BMVVyprP?rXTOJ}-;S zg+qDHCH%#k3TkQ#QYwb*9hIlJlI~yzIRGDAxTdU{_M7E=l-yK@l!nVXWk1b=nrf1! zVBFVFV?|V0ab;n$&+EK|33L9Dl~TXiq$laO5s=z|l?x!_`n|ZUnug#f0UuCugIzT> zTwEmhBn-$ZpI$?>;NKWA@Z{LRAID^=P+w9{A;3a?%ZnlpH!nFpO0Rll| z1Q5dI25p#KeJ?!-VxTpfQcB?FtM3i4pQNO4N$-AYz1~A_Fsi*`g^CdcY3;0aB4VCNpglxsEnHjE9VHq5MfB- zN8UAXiT6b{o?e7dQo6X03hTT3=wOJ=Eb=dGAo>++oz<^hD2eF0N z|5Qq`l=K2hRu3N@{*9w17>Kui@ z%S!S?1(OioZq=Qj2rVs95SOnx)6#4Bnk9Sxb&q;YwKPUI&j4N zM**9-O846C++4VDRg;HF4jhB>J0$%ol#rF!fRvfQlv#{sBRU6g<)RZD^Ha%uhpcMe z9+7uSZ)-fdy{hpbN{`={S`8nnyL(J}N#oJ`_>h;28_-c7JM-2=#$!OJ<=55uACZmtuezlyD_f?zOxyqq5aYW=zwrUTPQJKoYDI^ZCiHK08 zZ;=eTf~$+f!8{&(;vo%Gu3sf?p=@FEt~ON%04$w)U5`X(iCHk!>_%!qVx3S}jMiA) zuti>p1Qy!vLuyGaGMlQUva}4bAhDI?EOi5ZI;*yy+kCD*Tf^`tNZBp?J z=by~$Gpx*K(yssW_HQm*i+x`^N(28Cm4xe;Qd3kTMz~J#^xLm;0_cgT$0xpz=Qsxj z-Oqq;+Xf?e0o7gEFFQdlGSaEIW zw0Pwep09fE{oP1;H>tVv4d0he+P741ow}{8S+ihC>4i=#5lhsyU28Vph;dB=tPoS@ z1pU#t5Qw=>5N}+#4=6MdY`z758Rd+8t@+rU1#vg9tjpqX-ZHK&XKekqHU|5ISH9SSBw_nV85B_pAhf)v=Pr z^{Nzxv02K`o+9v(LH4t4{DTc9B7iy?Vqh3#Y>4TA5JXMq?A!w*G8O;=h$t}Y%-LlU zG)-kKg{7*|XhiLAK4xy@MpIM7P}OSoZVukfsk=FHH`|OxJCnAms%k5C)cQ?L%BYU^ z)IMCe(;I`JNlBHEP(~jiv4}<}L?9vxSr3q(<^Mck{=3hJ>5Mo|>}HbJgh{cO8(khb zF-Qd_vrwfvg+>{01oZ_w=yi6T_bX}Zw9+cdzkudP@K;m&5vlL#d_>-oPGwcAGuMO* zkyAOding6{cKe-3qH?V?&;rOx`sfu;tM7$T^B35X)?R*17bnK0QYc%t zEve+Gv`M8(4=1_0Zl_o#2NRlL#T1k>rKt`a}mQw(d zP||@ZL6cCc_PmJ9ZL+sN?VF5n9lz>Ue=Vo}?O${*Ef=y_2e<+8F^pEE+yhCj8U?cq zDFu2oA>~d~`_dc&kN~;CmeFYez}CcWERh;DEvu~PMug%h9S1LqU?Y+Dz2Us5teE4j zSoO;QK^Io#G60RGyNX&FP>@v@%4Qh~SoNZ66yly)bs(}yuu&*O5hRFclM$D>Nsm!_ z*s^oq8ofv9vCzJ3UExfpd(OTUlzfCjfQ-v0dHJ60-7pFep^%A!OcZ`S(!9^Qds%e- z^^R!v9{*<4+!5s)$HCRj)y?yLo{dNMad-c?`v~`qXxeN!MqBzm6dl($;ya%gqyAoo zyz%nq;tetWh5!KZcZRC@lb0>0d=ewl_<)>MMMIY5*4qK%g}`jnd;n zpb~*cZ1fldeQnSS&;{JC(^|~R!pp1FhqIi!>pKlu&1z=mtnr3M2uFC|J=Q`JQg?@p~C7eqj0sesK2kl<*)RlwnBnZ5( zG#ekr*G+v#M`pP(tV37#1iI17K?s z>0j}2dH&F{zfGCJYtdAf#0gw!Yq-()P z&H9CE&xvbqX8nqt6S>cwIYGgv&5f&1A2_QRj@1kMGIJaF@x$!X*yNkID-64mW{a|X zr{OfCPCzYr8Z!R@vh>Kip_T8*FLPsw(V*yO6Lg$n#muTGRYNcGCsZUOPf?BhA@SeD z{j8SFuU{noAK?!pKYth{Z0ZddHt^LzQ-h-hK}MR7zx7I}yJcP52bXY`hG{kvNQ=xo z>k}y{nbe%oWiAJY18!F!Gilqe_I_+P$xqU^YR_42E8h0wO?0CEzt^UAAVBu}{nc|Z zqc!-B6{m|VrvT^`sWk&c;Avn8B0s`n_N_E#jp6B;-IGehz@yGgFp+NyjwA^pE$75$ zgJ*1Z4vmx~`5KgwTAo==(=kD5cJcKy~Emcmk0Kjon-Z8*)!_8(!Wt4*FqPC5Yj$4f`(}8%d+Pj7XUJmnF z(d!BPV})l>mdoQd+if#C2F7NV@m;(f`yjvta;E=9-}#rvaYf{YjFOtp9kY9OuDe%w zt&b3qQc%^@GxizZ#YcmjH{{jb`b=DW*CgarH1v!tY#iAwjbrco1cXE-q~#Qq)iktp za^G$H>JLrKEUaQvf*pG>U;qIzQ}mXy4(PZ%eP0zcr z51+o`yM!p{e6VSI*ARj@cZrOKiHq-=gq$jCmc3p=JtGSn2REO9P>y#0z2-0>EvKlg zrlF;yZ)jq6S>WReSBOoCcI?4`0R%)8bS%7^aR2lWi9t%?mX?8u)dMFFzhDlNrP-pG zl$?^PhPIxesZXoezQyQmULRr%zyJaw3OW`ZAu%aMzP-!kiM0$&tR6Ud_yvW^p>Y>H-NB1IHDS8?u&igcvoQJ7)LnT)ZAV ziHJ+JvLk^hcvkhI=}phOu@9fV;(P7ysL$@|PSFlP5a%wD(J*oGU6VBO=AfdXXJldH z;N}w$5|zm5XnNN)r>Lx^p{1j5Xkunzl{W{v_N+xGo%Ph;0K<5YQ5t0eW6iWB=TmB; zbcsb+ihri#AuAjEk7$J3P+O7KHTr%HM@X_R8sQvjr-TIx8nj4oWCR3L+at9@((33f z3diJ^XoNGU-6geKq;`+g?vvUBQrjoB15&$5N_S}5&KEGz^b;Sv+C!f5lDB;1D?i!o zpyN16a0nJ65Msn57nNwnFv}cs?@az(Exh=$E3ct;1mKEL18~ic%-tVxl(2^_oZyZV zpNDe*tLMt-wFQ|slK)*z7j)r8+Ng^U@~xb=zGOiFu=Xvj@x6;MZ!w7 zBf~a@ZIVr|q?_A!z3b-_|2kWhPaHdkyP`o~{?}F?c}L*^-&RyKbPP-^Y#dxXHER82 zC~@@sFC^qEPzVYJ4gm?JLZ#o)m>248-U!m9%K(unOST-j%9OhZ1SP`nw=x^-0={(S z9{>&L_o%m?Kd8?=e^Q^efAhBU)!B*h+K%1H(u~fR3H=@&v%g*alrvGcN?oAUGAIm= zKv8LQje?>IR83t|OIt@*AA#iY1wye@=6P7zDptF?(fN28!fAX$Vp4KSYFe#NdR^3_ zTeXKiBlaZ*i^CI$Br+u)pYE@*iK!VDhbIt8WD1o=XE0f84mWlVR~=W^w&2>=F}nYD z=?_`iIk|cH1%*Y$C8cHT1qDUHP;e9n%7s;@E<2elHis(`OQbTnLa9>o_yXbXMMKdr zG#t%=Mxc>s6#UCxyIj6(#j=&lRxMk-Yzr2LCjdkenL?$}8BCDH=5Tp@=(4qN1kxFW zw&HVfE8^j`8o3XZoag`Y_g;At)C;NYN}x2A{8N69b1f;bBoX-MkR8Y0PjxT)*{^=L z+)97?sh|6$U;C}!`=dYmtH1lFfBUchYmjI2Z-M3R;j%rw z7dwe0GKETGSX!CI=5Tp@flwrtNM&+`Ql-{tb$UZ3hn3O-1cB$}EabeMgT`QScmk0` zrci0~nXxOSOctBN<*K8eZ+*chv&T2?ez!4 z(RkWlkr&Hk1%Mj}MoVPP4oyH|8v}MqWWtNm&&z z91sM7!r*G^8k$<#I=XuL28M__Yu(UCn31uGsTmfBClE&76x~o@MKF3}jl~vD& z@Xd!BX1EbXVmOaqMII{kv=O6<7FVBM$Kn&9sTI&{r5hOyAlk|?NI|K_tLf+&{QUp% z#jG5}B&1y2ig!l*V9jczmH)y18~R za0~*2LNC*qY_32gk!{1kFdP^pMn<3zLJB1`{2nr%AM)ET$}$Fn`ee569lEk~6`(@- zfz_q1Sxq~u{GkV+Li~!vG;V8FbB;MLvX<+7tj0g zHYKf=l0sO}OgCc|SZ15EXyoXk`SRp#EseD{+GMjWK60Bu+wHKES#I@e*M#o)TQLk$ zSx$FG@O0mV+%o=Z*SI!)pcQBbI)E#JLFAMT+A~ zNlO2V$l9GL=}AmR-_3($TqbU2;Pvh^zuleP-M!tfE-xiESz+F*=I3dnSzGONt3`L( z>!724ND4ah%`(a!!$IQl9=2wW0qjB69lq}O(T}jg&O8Mk1PX})&@R*`XrJHXe$T!1 z6?g=DjyLY!%xwD)kcb4IkPu7&hcADZ`C3Hrb zpUXySn04fxdoG1=`ylC;VA_P9Y1fCZCxo8)3P&&XWO_gJZ`@?C`!_?o{|Twg?|GCL zd6$jsb(ETxQk!-S%>^f~zFqvDFm2AF73;R_I&jS64~ApOOukg916XUou(J8H4^H`) zVc@(Hq{&tYg@A?wAg5*Kh`}zDPF8EzN&m0(8kz%O7!rdgQP~Bl=^%{pRJQQBwu-}D z-_+W{vrqK6mdI5az0qQGxP5_8G?C5~%e6+U(;rS|3kUn2pa>L#8zG<+Wh!4J38a-v z)#}us3RI&G^=n9gFts!gBUZ9Z?HD+P#3K2evd@*S zb*E=I!?`YUnXBC3R(HAILk5hw<$)QqmTh{=`y-~{)ajBy8rc+rf&dLpK=Rb-GY96% zTWOWm)>wNzC6-n}WmVNwdp!*_Qlnl})5P>P+8b1CJ2b^i^F@f0B1^%fQ_nbXMJqiF zS2y+=UQZVTFwDMa^5`S*Br3ZgH64WU2iUWjVWw_-?+g$M^G(uZO!njtY*4S2jx@Ak z4R3&vj&ihP9P2oyXna#X)l)ys(>cA9JZY0X1yeRv(=e^mHT^R*z+lsw-Vnpgbi~nT zWA>8$LKBn(SAu>;FZD`ZxvO;5ukJOzme>BeT#tL^`ra!y_=aOVyC0b3Lf{xm#*eYR zt~`eOCI*u>c+4f6JOR%+Eb#nf!45dwg<~_8`)f~=!A|OX!ee5C&*4}28X z?_1cQf5nD<53BbdShpWzt$wlHdi_RYeqLF5JExp>hL5w(Iqw2L{w}&AK%gL3T@x&% zudE{lV8EiDnyZDB}$cHD_5b?aayl` z>J4DfkYOW6jlG_@`?IMfHG??|7A;w^+U7dj!nPf|_Ut=w=*Wq47cO17W(wTgps`KC zhL(eO?OTLvX}1mvsPd%tA>Lxp7-;gP^)Ug=2q~f~klv?63MpYIl+ouT3MpfPg7hVs zLMm8bGW#=yLPxN{W%XAoU95@&A-k`&4?;(AA?5UUI?~MNKZXY-w|_EbY^K-}pgxyK zW=okXV_uF0b9^z+R}1)N;o(J#MlQtC^=ip75D6FdL+hu0>9>}(qCe~Z&cKCQPT8;~ zn(r4*s!^d#$pjCzDwQi83D=IPP+d;Ygf6!+pczXGj#fNv1PVkHiYby%ETu$7nVfnB z4N4kS4Em3DB6moauY>HVh^MPwJf%-PKNYtY8Xi=yo0*(3(2KD10C+hmT#s@<*a95&oO3Q`%jaF{d@(4r) z!W7}D5CJ7h4S_l$O(a^#v{C4w(nX_B3<4dJIG!Q+h7uS?XgIMEq(-)8$0PT$W~s*7 z{q?--_V*1h+JF0S6ZrPe)rS2`Y}|ir+W-Fl&HI1cjt0BrPe)idvZ-bU3kQ#Yh=hzn z#k9-{fB4HkR#{_R8z5HnaoZ^!)p;gfY{eT0PO)>E0}EcP6l2eKVGc@c@zKtu@hSG0 z6|eEv>#TZ%b#JoiEw;SPj(6_2=iS)%UKTX}7AQIk1UmbAD0EJCK+%VUtbwti@J8RV~W6yWzf*dqeMT_MNyE_gVE~IB~`G!M^(JY$07CfwQH>{){~q zoc=R%9VzBsp5y3Z8I{z?B``nfmmo&hlTS?I>*WT_H&OgRAL$hl%gIh2S>|{KpS^SR zhi02^RgbF&DBLsVK`w%ES7xBM527t37z;654s;d^~VQC&n?{miBoG22?g>}r`X`&xa==1?2M zj@LHkRC}0n?PV@?kh#`zcA~BsW2+l=GhjWaCvnvCdKGV97$N6-cz-w-dUS|?kDV3~ zUBq}~eGzy<7f=zzQct{VyoD4hukfPyiz!Z^gc1cyj;W-yGK9(^C@;4H6&2+qRh86Q zzg+6lQ(ptdHOT2j>uHlqqx-Iy+H*!{H`%XdHQPJq^{+Jx+Kg&(yBQ*Y51>rKDjc~8 zYap45wKYBc20Xwfd@p4)fdp+K62Ub{QC&|gNjH;@(H&%xb0_)CZDpCW*PV#qV_+wJ z!kL24Wa;Ov=X_cEZL7cUO22On^uv?gTk3Qhc-J{>h`yRg+avafd&3v%3azFozmo5hc23@@t+|t_K6Q7X05Z5UY(~EV} zHD_}*cPq-PL3=|4y$s?}|Lbb6uIj(JH~$vI0dYXhtwUP&2*-RG3S#`j8m~w7xK2ZC zI8P+h?1-rX6#x>@wA4Z{NEJbruQID9(CJK=+(#5yBP35Y6`jHczDX+9&Qte z#C2`WTtmmkBjqq2?xXamJ9>_1xj->f_cNJ|Isq&P)*d>_&Aq+%6;Aj7xcSfpxci9ja&mR@mUux>e}<6|FtpoMQr;j; zg^HA`q?@UqLYRNFPy5i}2n^=4I>6gM@x=)v!&%0H=JlqNvNqh|*$K$@Ys0K46|aM+ zde%m_^jzm-=4GzHZY`E+6fngCD{OJV5m!!dnE*DIw?cU=uzhQfm(A7GoSXKVE6;`URbX-Y zO z32d=baTeHl0zhU!Tk$cK>vB|Ju~)`o7<@ z)6ILP>(iZO#Qt@DSw;^*T{iPUpjNlN_elr+6bD2sB8Q>pgmW!dhnU3SyKRQCI4 zS(ogmS(ok?S(oiMo4WiqdyX&DehZbk%YrV~q@apa@vAbqvlu(PNhW|15P6tuNGjnP zU7k}Fhjt|A_eCgvqFP4yM}obv#AwGl#>HOkxDv%_HHXiV=Y0=wL+Axw%Bhi!9BGq! zNuR2Rj08t!;_JCfwuWe)a|lJQX5!Ln52@)}9dbG0LXn9Y=ue-a<<1I=ueH9cXdB9_ zJ>S@3rUigwu|@5k!`fbe^j>5Ty@a^E0^hxg?Y#!Nr#F5YWZ3&=$#*~e^4GtcwJ$Z~ z9&+-8+Ji5fJn|`M0Y=bDfq+`-aO5~nIOD^sX* zKMS@BK!!Ds{uJ;gycO4KwV?L@Pq1b{Q=w;kwrmG&3#>x|rhHo#vL9dqJ5G<+`m4}T ztwhUH9c}?A{)j2yN(b9D075{$zpJKi&)F-^R%Ox*P-gkFJ_Vd}; z)ut_gBjpNGK~pocySTnK{%5{_`%e0KhV9L@(C@Yh1(8r%1sQ5J?(i>+ zTC40;s!@eH^S<=4PqF^jL@SCp7P~B4)k;=&?Mu;?oyKd?fD)&(q$MeNU90hS4>~`b z-Dv-omFrqN*>1N#D^Qlr*V|3e=XI8?kE-dKvfXOmTIm^T*D?0XSho4O$>pa$GPIV~ z+@_!8lX946tk@Y5-!P~W*!|M`nBPj*gl*^~o^7~TI+>Lk-+~smw3R%^%YZLd2!snF zD9-5B&FGDKR4;efKUpv8Ch+Zd2Ji+aFlYCY7)O{Ty0dp3>)&85=5ns(W`57}ycz4P zzmz0tQd+Wt3@)TF!;3Ir+-XUBx-!Mu^SZ25q&|&lPHV>Z!G5%cr#0U6^8cArbnzvY zT3Y#S8~RrjtSrS^$w_7MbL5w#Ds7p{vD_+Bp-Gz_>uhtH8!3DEZA%~;B%MN{NKq6h zM=3fKBMK%KHg--WYSd}aq(z$!U8c))6I-no9Y)}qhG-KSTbF5{ilXvRg{Y!bGF6N! zNo7#gsXA0csyX!vHH;cXP07s2Y|3oO?905Dg`x4&glJ+kNt!&(k>)}3q!ng;qkX6S z5QB;##CXK`#014e#mHi^Vy0qVVm@M{bZNRQ{h35d-h@;I94U8J?xI{!ZF+4(ZF6mR zqt4bLfeB119i$r+hMo&9n*xKl{_)2*#v+&R!fl*q#Ow?5hUs|CTiV|bf^F2 zGn&=PHngcNZRxY_iK*%Dx|FI_uTisB?K<^H#!{eMomO4O z)O3&-QzmyyG7~aWsdy@pN~IHm+9ey;zMe4;)H`xG1I=TOWJ-YudH3CY#DTC!bw3)7 z^i7^^J$s+^CkQ>x#br)rYs(Autl=iG0P|sww&4Q-a4fkl4CNfqoKcp|f>*$k(6c(M z=i>!u9{Sj(wscL`h6*Pi+5eMYHQ#wHl6Y_(yw-wo??Q2}0tZ??h~Mde+GcJ}cIVX} zCvfC0K!hZDj>ckKv5@Z0yWmx{H54BR-U47th}mSk*+hx>5=c!#w34_T7?_3h=7 z=BlrZ;-%JCe@z2|;BEP}K6qIX)OKuV^<6Kb0|;c4d(&>#z4jDI{$Y!n@!C%Sn-7E2 z13bUe*{B9~1WuN9;WI{_8#jp~o&ZTf<1RVcfCtn(y+@U(61A#JeZTYcPS*HF6~X<( z!u~~z{^s4VdBMjkuJMWnT7QO(95-7Jd)nAQ9W?Jw*tuIJPN8UsJ&6X~%1Po-YH`Bk&tD`MuxUb}D_>XH=$&Fa-NL;@s9mQ6CF=?Vo6zPA_=WLH;yk&Q z(T@;$%*#h<2&Ji&6lQRrwq<*qtkTk(kl1IobU)wcfo@zKy07KcJ~P7oAV*hv`oe?4 zqIjdjjZ6}`sSbQE!T6VnZS=4*6XQqmw9#CA_jlke6yXk;gwxR*9*82lb?Q^A)mq(F zS#PgKr3C=|dh!&7TOHOHHQN3aoy!;Kip@2CHNk1GqVCYY=QG|?ZqzRQ8Qx#ci0blIRLIjFaRaVw@w)8`9i_<-P|z zB@-BKfyPacxD_Yvz~^2B52CssIg&?7_=?yI6nsutDq7HQitJZxAFre8{VCKRf}L>9 zY4J{pbyCdG`>SXuH4i7dZNzFDQcXjxWn}6brG^JT+Ln=e9(P{HnU{4cG`xs7pqai` zR-&*vXLYk|QU77GS+AA4(40P7XT56!(0NceDED}WyyU}S`(gmQ#+rH%P?jn6Ojb~6 zT1bd+)kKSARO?}anKIps20QgY1BYhxY)(9si8_%dno5lox!&#ZfLoqST4G!+>Wdd+ z1Pd*Wzi!1_>~K{cUsXK)_rLs4$;?N7SIuqGxsAJe{`+?1z8i&D18uN0RA6>vu1ek` ziSu?zUO|2wwY0osbzXP1CU)DBzF9rLz1dM;j>v)WIW(1VLrWvqZGW*agDf$%ns7<) zJvEu0%`t;{E2Gm!SMKeh`ek(98Jc&8o?|sWp-@^SwO;CY8K%5sH}c)$_sHDlqU*?t zfk-jc(KfrwJSPKcr0219mRW9Vl=jP)t8-Claag+!cWnFApA~r_9)I_qzxlzxnrCtl zP;Mv}R3!KaM>0}c2BlSGv7|QDsYq4IQ<|~|b@@G#E)UwVSNC$4y~4GwbKM)*Q`Pw; z*Ztmo&%NeVr@JoT2va5g6$r#44sUqV<#H4+XQ_)blIZYz!?rBm!7FqwKiMbuzz)J? zfa>ny3dmSX4F-gRl~k17Q(kk$BKc+Hy{&i9@av(vrmmsBcBAK(sMuaygCvQly0*Nq z9E|tu4grlK*7%ywC8H5S2!LnXOE4Xvm%e8))C##oTPC%0HoZRT*>=4r_>6D2zEAol z2f|j&?YqwX+4Ei|)0&GfrG%1WmQ-q>;!1*abqDG#P*%})8`@sO``^g+8{I)~2Jd^W zwYOhu>+WAos7_D0=9AyYJfYK+uH2pE@g#*;5T5kuc$fn#)@<3ZWA8X8j@)?hHreg> z21AM_r-E20O8@$E{A67C+>>2*|0Xr z)_=x-zv#VERr}HQ7dzf=uowML_74vFz!uWhR9KiJ+?m4_;TGv0<*{YGHy3m7`QY{F z6Y-7u`8jTsFix60o2Jat=9$MWvX;3s%#Mh%^40~L08j*$KxJ?RQiaxFb$A2OM24sq zx{c{zySN^{PZ$vU7lAY)k0}%Cls2Q!84Ko;wPLS18}633;u&ul0{X9y;ddsJ>CES!K7`!~O>1ngY|0`ifp#N3_ z44_!SK#C&_qS(M-N)d)owirrf0>c){aTpFGC>LSmhGGDtC_9X%n8O%K7>uRZ!MKIu z4C7%2EoPXxp_sueiWAJHyk!pMDRU_=m`AaP`9d!Sg)X2DSZF9LVhk+0KNS|+Ep8)N z!ltmK9bhSY!qSdm8OO7%lUdGrEbk&#a5F1<7c2P)EBgei_ztU1e_=H;5yk2#0c$KM z4Qs+$r~qqkPz%XFBXunXEtR)i^Yq*$FfJ-QixRg?e%P50f zPGtmFP+7p0R0~{1Wd>JMC&D$9SX@h);yTI=xSq-!ZlL2Y65qct{iAVQm19 z7zmH*43Fstj~fI}m;g^&6`ry91dZ@A0iIQ51x?5zRZNTuqNI^6;J~72*BuLwryP|2WFC5g3R1 z$I26N7-2wz|)!=11|C-GVv3U zfuD&M{6gg5SE2~N5j*&u9D_e7WBfT|BmUz|mF6>-6yP7E1pksU{6~iPpSVMVj0pZR zh&~8`A3}*{APf!&C;B1>{1HKnMPx_il$eRjq#%wMViIy9fmkzsDHX(!+ss;41!?3Z z<{+*!Zd+1_HIN_86fjFH;es*>5i6sx>$S&8#F{9A7K#!}A^~g?iLH=?3CYA3NWmki z#5PF76UB(Fk?zM$sFK+^_X|EKN$iMH{jLrOakPi9stj?svL9Ev=KRDyco-IxH%HWp zfMT%Ho+P}*POP6)72(O zb>J*@38#8+uKI)z4d4iNG!I}}H$ZU#t)@hLA=(tb)IC2V|cHJ5AK^ORpt|Mn+xPkBKMgq|te&I!$wLLn*jCp zCQT-ak+~)i##TxV+YSxek0joKDt1sF+6hDK3YoI|vi@#M|Gb2UGwNFe)Ovh1TQ5-`NA1HQkCT*JoHDNpkSJ`vH%?_plyZIq zA5K#$_zC@-xpY}a;!`?drKP*v7x>`(GDLllxw;<{u|0mpq~C}waS`J#5hwT^|NRko zg+DizI%%cAtNgvOQa#eLftn*8P+UBwiw*_VPuUB&Y*7GZw!)lb&;oMln1L49^!fjqyJ7r9I*d^i%!S&e+Cd605-~MOw z2+1A6DeW4TNHP(|ZNU@2ib#i@MI`3`T305quUN8bm96wdm6O0ugks-UKMC9z+BLKD zSR!r-y&aEtu?E$z;B6!WU5S)E9U)?t$``TaBc_;#&f+SqHVN^z93F@6Wyw5TAxo=A zilL>?o`9`A1^2a_X*MpP&1xK4I`oRw?pZjSh789?lay}H^CuAxgt+Pcn5FkYO3`Qp6h>L{4VPI2w1Dp3$Z z+$!JOU9eqFR*ts^O|`#rThY~Cf=}Zee4A526LNZe*ppE7dHcA|tnsvdx7f@f+Sqkb}s@!<|dRb@Ay;y`3Gllx2_!-5u&*L5$u-E6;2O~;#IYcu z;~Fh;u8`~J61ibNT@mG6BoX7goF{7kJK8w&U`=8t{Y=NHO4ad#J4v|q##p*`uSYq# zl61RMP@HCmEEn%I>WX-F&CcD0M&bBIB=L$YgUhrk|gD-M3 zm?Q-?26dqt!Mn&`Y?ERs(WS_(lmQZUnQ}jPkP7wb+v`-Sv7oC2bELXV4Sj8Dom8nq zoYa#eX*f922!7JE-jG@8FNTq3X*pcF6)m844t;GLv9)u=*HK66_zI59dN^|Hot|8E zGVo}3@o@b-QoE0*8^pxMFu#X*vq#g5+>G)p>H_0?g6Dg7_+EbwBYSa}qrZgFy(w3h zSio;nlW!ITUhh4=>;r!8BYtcezxD~=HUt07B6M>ciOqAQx9~Z#o9q77rG0~dEh1=3 z2;6sE*)lE!P!$B%gCai|27;p{1R_GBEEGyZqb3Zx;zWH|#K(mP@t`;yqT)kg{J5DA zDicOncr+%0jzrNA0d*149SMVxQ4s}qqM|JtYNLalI7*U0XObvL3b{$6y+asE1~JK^ zC^^J+78Vyaz}aIIHxHZ zSJ)N;UQI(FwvC|Qv2YdFxWQmbYzHBfh3gCdd)z<-Wh0U}>4;*Ji028Cz!N5stsrUP zq#+qh_6KRSuvKIrldXY8N8|sOg$g!>O4PF@G@y}fpb5>J*M}BC@n~Hr1#K87KTHrM z;4vlR2{G}MlJJaD@%)bgpBH#Z#dw7`1i@QOQYog0itvu@;yvZz1KYz#%EvVOk56r{yi?lo)@2e$O=_f=sVJA^>|ulA@Ku`N3gibwAP z1_(7!;S`u7;7;H;&J_ZRJ2VVuoWv8BJ}x@AS>pLW2fX+x5+LX(AtE%0(z71II%ND4 z1E#-0f)&a0Xv_DDd9>lq3y0XT{uEiqFN#JuI((cPc?!HRDC?s#mN7_mbYq0NbfV2= z2A(ivWRfx7GgY`4c<65%&id>xJG(n)#re<+_`^5x`r$AC zczO~4T#CP!k62iBg`WUx0{IKF?y8Hf*%0iK5Sv0>7G?{Ru2kdFrXK0D^khuEGH2;y zQI+MsY**yimMcJ>9r*&?w5vdnLVJo_RqVeK*Ob~LBuic1rlHp#4t%Tk&)seFpr$xNGcCdK7xOxvLxiYpSBHks_n+)7cp z$>v9I=w4~eNoXAusB!%PyR+EYXg`iLJP@0hhvAPVDR_wl5ecwwfbzH2W z*QJ&FE7sWA(keX_(iB%8A$Gf)rBy30*1VKH+DEaL4wgRFJF(WTl~(JQRF+0qt9M7N zy)UITdLeeF3#B#dFV<1{(poi_O4?AgcAdq#DqLEpwo<7Zy4J0y*!4=5hSpFlzIvs( z>L$jhSZU*0iOE-~v|)Y34p*j(K}{b2xc90FqorzNWuCq(UH=~Z9J^UONAG=ppY8~5 z-%(WGF|^)?2)~bT>yG2b3+3|%UKrot7tZG&yc~Q(UJTF9#CjknVTpweKrWIcH*AuJ zf#CbsvAA07kty3 zUiTDy_cXnsF9GOBQ}ibgFH)wL2+Yeg-7E0V0GePZ5jTw9F`CF3L;H;-hm51W#uHf+ z=v}jkzB%-bW$?ptSPHBlXS@X~fR*H&RWJ>#CT`ZiEU=cGv<~Kg^~A#lmJ}3?sl6;%F<30o#a^?Jy3!L!9k^31BC2u?t3l-Q>7Eu-jhJVBg~W+(nw~hrQlg zIWGfXv-im@2VtuZNR>md&0$jQ2yAzh)HnuPd`K#N1ZN#5znp;6J|;hW0uOvjHGKw; zd``7}0k?fgm3#$veN9z-1NVGOk2neUouaC~gFC*b%6@<+ex$li!!tioeP`ggpQ(Yf z@WMH2=sY}if$I5%2>6v&`i%&=NUL2Uc)!zHe-KfB(t3Xpg1>2l%Y^6(ZS)Tj@h`3O zA35SG9dnJSxK2miAV=M#kK7`fZvUoFC}H3rtA)Z7CtiXL!XrgBK1%h7G=;XWWjNYr z$LOR%mr*NBS!KeObK6|4j>iqzIZ5_BFU*0Lb3;4taxSh2s70Wl#$0vnA5#1W!9rRT zDy((a-55l;h~Y#_s#~(m@K|m(sQ^1=OON1FJgdE-RJQJc}Wj=x*>XFm|h#9x5ns|hp(IQ$auH+e!`O&p5h6f@g&c` zc#0QZ_rv6%@1{0e_Rjl^eDE;?p9W7f!;^j9e5zRsgZtuZo4ySOv$#2wCEs)M!_OT3 z8c(wE+w$_DS;33@#{{i10c%Xi2IIH6If^aYS=q6dm;Zy8Fe-{co}xic$N*A+1(X2U zK#7nKlvKzAa&>J2$N@@)P$&&TARU6CbO?Yl3Kmf2*%Ocgl-+Xzl7NgtB9ONa3$%xF z!5H#`B~)721`7940r5b!;0`qcCa4Wup?QnzoG%B>2WVvh_z$!YK0=EM&!NSA3E(oc zwA>|wmi6@j3PBrS7ic4VfHoDLL7V#)fRoT;Py+NM6a&2s4M49z8PMxc4~*dY2$P03 zFd1kIlZ%!xes};=T(pK6cODPm3T8r|4!{Ky1I}QsLFHhs9S_TOP$8J>M@8owfVmOy zNNzH!$jz4bom-3yxz(s7`;F>u2iyG0_!H5jw;90#Cr} zNz{ecC#Vy=`%xqK%0=zq>*&r2P}6z9`c2`t!1~SbO0a%&a&K6_9qbL(??m1V>vzTt zVEr!SgYf)O)J5R=qp8cm^T)v70M8#wt^>~>2iJ$^uU?#%>sWH!V;R?r_gly}&%6WZ z4+Sr;B02y0_x#kEg`>g$G!6D^7l~!u!`dU!f9-#OP^Yk|p1mcF&W!;6DPyjT(VqHV z;la@hcwifK*0Z#91KWTaz>ZCO?`=)OK~KER{m10N;ln~!HZ_h)sw)=!`SjNB@CDwb zMV8+D1Jd&b$L&+1Y=wC*ry3_DnAZP_^DrFQq4OSm0-MbzTt!o2fPgnW4de3%9gDZR z;lZcL^uhh&XtDD-dGl`U72R9OQN~}XSK({dW?C_PEw*YaVVvd-cqH(qz!H% z&Z%5zUc4q=A{A1_j*@-b9Ar5gc$rRe4oJ{KaIMEe=2k+Mh(n_8lQWbCILxGC9XC0T z!qS!@pNyO?j*t?M+ewX$e`=z&(&lQ@THC2?xw?~+<%U$)iCVfBx@LFG5Y#iDVBa7na4 zGT!W^#>;uWN>XJ%0x5X2o!;zL3^||Xr`1nI1KP0Pr>*s&ETUNk8%$$M%t*4()YOIa zR%(v3aE)W%25m-(HE3`R8FivC~rr#h9 zYYo?$_7a*zEl7}v5acwfK-ur)$vPs`ah%aoTc=!c$6d(*9S!82Ksp)~mJyf@36f<7 zZtftPCpauCI4wIUmJ`&Q6hb}p4g{e6sv`Se)dtpx%{&d2B(D_*BvTy*sJVdZ1Jpb~ z%?DIJpcVkC3B-oe2Rw{3DLB56oN8vr`m8T+WCi`HKmLRaMYJ^t;>hdAzuBk6!B-UW37ETRW%Ye&){)O$|I-jTZ zpoM&XJ5UAhEPR}DyRY+d05HMtxZ)%}?4Lk>WR4G#iURf8xJ@v$Y) z5)70caTjRMyg3abO#jxxCUh3h*iP2jk*I>I)#3L}LW8W3Fv&Yofm zGz1s-ER3vzX;42wsHhL_#;z%ib{vOa7OTJm-Qn62A8h#$hdSxAd0LYrc-JG%NpFyK zL9thEF{p{@Oqhcol`}nMNuU+CcXZcq^%bW)8EosYc2fIf&y#dm zy+EW-Xunfp+ABIyj2Nc9#MyV?z%XmKDiPaDtF$!5v9f*iOXhNsSM1ijQoU|fy^LJF z5qZs0^IA2l>t*KpjmR68nm4NLXhQ4@@rQnMx&seB99%q{T;lJX_&V9TW&(lY2mj@y zjTbElc<__{bsvXMfAQlxUIt=zJpUhR`zIZO6OsFbk@>}EtyeNpcH{= zCL{n%bzD{Qw+ZKy)0}vPwww{{j2#hdpV-d4RqM-jtRT@usHv)^Z{?4KcVrr2Cg64A zku)j&l74M7 zi2)|lZY0u)qeHM}T%NO9$&p!VRV#{#xH?cjXypzodi$D;6Z8~mUsxd(bw!QZMm!xIoXFIW@~rs5j(VL9sQNjEoaeHV zzbIEWj+II_E*z8fP@y$cvip(YWKQPZK|Nq`u2ucSx=I|p`zK<3l^pW*i(;))Cxc%H4V&}$32yoyLkAS>#qEoZZca8w_q~q%8HQw&l9Q6Xg4BoK`(0IOrbKOOzr7ThO z%7CH~k(vhP%s+}WR3L_mrN^;V0|@e8JjcdN1oh01PpoWIR#v50&b*h;syyMpBT4NJ z!KtecNda@fs1Ux{afcdku~`(WxQX%yoqSUBgBw?jRgToGz^;hY3P2(?4a}Lx!NDr^ z?)Y=>Z}>K=2eNQwB4N(#xqR5oHLuj!)gGBgyF0zx54M77!6tjyeF`OfB49#9>cI=% z!gkHyJ>^wplegv#=94P(3}1g6&lh_f!J@}wwf~t=?@Ks4`ydC$U|Ljhf<_9uF3R0>rQ{+Nom`0l0W5hJ#mT=Zpl^MY&hK zAc^tVRI?f}T?XAX`xyV>JzAEBajq1RL9X!UM&G{uPL!5!`nl-!aHHeVsmm#SPV+4c z)Ki=GEj4xM;Wb2aJMQ@)n)#p1k}u;mbM!oFmsG2=s(W~gYspGQ?%F=we%s30q#}=< zQ`NVVFPl+dhA^%pQtr>)yi7|t&%xuyNt&Zmub!mQ+KVb|D3hgLPa8FF#_oSlJpyfk zTck%>k^+c0DkZoiB~G&nr%??7`gSOY0K7)lF35Se>~e!MK}=RPN{G|V__xoBXlgy8 zXBIZfDg$azftG3LwNpz_7e2&;cU%fjLi3rswfyY*zLg`t_#L;B#xR`m3(he~>eJiJ zThvqWMs4~s?n^0Sr;_R)m!Mi(t?0I2Ibphsi&i{4^0{qg6WhP0r#kh>?4X}zC|gv(nq8IY#~ z971F#An1rzO5(SF*oiy6ie`whmVx^|?DlrfjHETENq=)RwD#0->_?W|ho4PfgdTm$ z*Q9yXb6;jV`N0CSMn)~P9>{gnDg_6nS_6m3kX;{eW#aPmnM{GW+JFX;8OyU>M}yV6 zWaRkkUhR@%HVv(FZZ1)Bk9I9Uwqry>l;0AVF<;w~H1?LGIa&i-U}oUi6>*qgjHe2q zfWYg@lN0Y@y9Lp`9%EWqCVqc!?RA|7HSNm*lgJRc?K%z#wzW8GjT3Xl=AkqW2H0>G zXM<9#Y>gkLNZD4LM7wjb_)NB~4M6l3;D_E=JCRYu(&vtnaHdgNSvFk32>$6;qCpTv z6XEqNkumIU?A2_(b{v_V1MUDus7lczpwj@<@GB4@SnSd9cmN_pj=A=J(CQv)*95@m z7@#4*-04UXX@EEes_xkVmXJf}5n`-%cYtGJ*+sm%tpU%i)gc+k@>ax|6RmOp?Tw>m zAMP9#cin?8_KXH!SEAX!o;jbsJ(m9mAqAp-NJM&5hCY7?)p_z3f902T`|ox6QjeUr zq4G@R1=ERGI3u!S_3t#V!MgZM#A8k(@)--X2yH$nKP?N+nbZpjAPztG0m=yeH^jD> zc-+*E>I0O0F$L>@YEP2c6B(b=)UV;?Egj%{cGdS&Kr;N&#-_-RT<;GtPr7i`7||)# zew>TUlU5s@D~^Zts6ED4sRr}-t*qrMJrW7WKq#|E+U05zG06hr>M4_H^XSXERCajg>k&OH4fIP^`-ueQtZZ@{4q}_9!SSB0ns6 zKX|)5#OG5(8<6Er@a0S{Y4!~P8mh??ME<5S)KfG>+XD44vypy2q=5d>G#R^v?}IP) z7fe|g2&teKr%;jGtODBi9rfpbY3Z3*>o$0z@B?kwjpF9#(ihcuSuyJCb;bUe!XCSk}$`eJxzPQ z(h8LuNLZ@(vJ>}@14br5Q8e`~D z)e)%|N^t0w2Tf~KOH&B7_<(^F7T;B9$vK%~(ibH(m58z9+h|dNE;&>K0BdYj%o@k- zT^=ntqiaF1weYhFkat*DDn+on;h+uhrdP#T^~V1ia>)>Vjpyu zSLGLMguXBGT{d&ddCQhe!raP?A5#v|1%#6oUzNgqg(8RNPGE+TfiBV+@``6~Nl9=+ zKl2f4MU+h@si4}y_ttEd1Alnbfsp&bKG^KzYiLIP zscbYGFiZp$02h7OI(J>p`V_#5)L>ydNr|+fQiuvEMTIeDNjEA@?X;AJKKJA#2^MCM zR@s`C{%gTLVey-gY!d4*T6bzNcOG{FHG4u~ldGpgTcUwH$?>nms!&Kd{;WK-Lq4yR zQsw~SvOxyaM{}BINuV@*-Xc$>&PJZ&2P(`N;{3gALGzS;KzyYyLz?-i-)Y)6HH?T_ zIK;PwzRMD9C-}4&&J9fLh5itm&O{I8THv`3d>qgF;GD-=cG%xp#~<&wX8!;=1Q=sa z|5$v5?@-~nBi;G;Ksl74_TMTrBM3NVlG^;GNs(qD8OzI?g4Ckrnwoy|_+GaD&KM6} z-U?Yfi-fmn4)gCS(0SI+!STWqg&a!an++3%600Ab3OnRTl8QE2+QIeVzW_~4xMh`Qnbcvt9 z37A|bcr>%G-!uC;qHJUIO8k)G$3u6zJXQyc2wgZpFu%&{ARo4vQJxSMSJ)%Ev9Jky zG!~o`Z|9lLZS=M*wb^Zq;|gg)rXjP@CWOs1VV zJ6Ad%1OcbZsUu%1Ax7$>l~#5V6~X6K3H7U#!a2u&ot^d=jswgee0nh599$8JYcE<-r;yW*OHPdE^L>lM67+b2pW#Uf0Qv zxY=^xtV9fZFvo2QGE&LyX?+&hmqNq_{6}oA3oyV+PHS2+B*cuS^eQb%sgmE#qu(kJ zk5~Y5<`A6|R3w0FonjiCZ#e))6glb5yN@ccs<)3%gq+&*`&ZWh`dO}4;d||^W!i!U z!s9soZ3*8B7G|Bv8&Q{wI(rZr1RqOB>59P^A-rgtxpWMn!3gpa=N&GdzSwxb~ivBZYT7a2IC8sie39&lCJ(Q)OUbg9oGp z1WZYw0ToI{@OvdIIz;v?4LrEN2vLy|AV5g}1ezo2+VzxmV6D{fvVcqw;$6lsjy8S- zA$j$e<&WXcWmSCLA8yNo`WlLT!nKR(I@oy@@>MnR5?K26oCH5CrzGL*FuupUsI7-e2T3&EQMPu!;Yc8B-*^(mY^NjLG@& zp^Gx?!$(nPzGzn#U+FGqCS4Rm)L_IpsPL68V4+lWJ zfK{fn8e8&A)rk#)!qVs>sj@jzn=Ooot5GJ6{VQLQ&_AGHyWL9qYjffaWwWJ$${G92 z-@7Auy}*E3Mu$}F`X0Ca&Mtj8-T01t4ZP*8rcFDuPod98^lPIM4FxUxmK|6%vo5x`h2;IjmqYT4?-#L0d)8f4 zOCh23+(@yQDIYlA=EPJ1288g`>s5U6XkngbNk2R3_4#8nYch>*HQHht0Z9etW6i}P zhoWnZFqHk|9lISp4-i;a>LbVGz}*7H|q zOe-iAq2ebJ`ad0!di=Yap+$ik-6AXIF{MNMA=TrZ7J0q08=0O<-=B1shc-$Z5}U+E z|6OSvUj-PY-(nwGWamd?WGL7S4y|$g2B<-n*(+wMA_BO;ypzH-I2+%8*k(x0MH&T0 z(p$6COZ9&cnglv258$hh@_=3}*F_C@Clz0rW4}4%109qT;W2-@a$68Hz??F-m|hsu zQy4-Z3Ek)vhU`9vB^a8X!(ujD{pPki5~S1be+JQHW*QJT5}KGiBBnY2F;9JPOstvo z^@g!YZv_XOuuf zw5NSHMmh*piIb>1oi9)@SXo1EQ!1chNP0+|lv&hs45gT%3Q&%^ZN2sT$x$$LDER9d_jny5zfRS$wNnlIAeY7t&OD$F{Q7y?8;Ug`PusE_rWp&%Wj1 zJoAj)LaSk9$GFM8nXOC-bv>}wL)2(xq#L$!SwLoHvz%3sLt8uR4q3wx8<(Dy;xseJ zWkeVw6IIt$PBw6(x$DjQ2Mn9K^WwB5GWchn`F5bk^F^!$az?iVp=Ju?j_E}r4oU0r za&qWvHogpr>@tD1eoZ{YkX1ai#9qQ#J(YJq-3rx+ZVku0Uce*My9ie;%qfyE9*_dN zz`1e|0Q__zwP&G@m$dQ)G%AAqYJ7EY{Uo6AI3PO!!?}=>r9qszm0b~f?)C^H4KLm? z08ZDvz*<_MMVJrJD2xfoC!_E^^f7`KJfR;Vk|*ms{j$LhXYM?owpY$88ZD2vWQ2He z_?SJ>c^@Zhn~MjKXdtw#YacT;TkRc}+#QGsFxZNw>bicVF*xaAV z@UOT)s_47qP)Huq{V6#&Yw6z;PH5wQww;X4K5RSOaLtgm&i(3x@G_BN)_wo1mGA+d`YkT>}`2(!ji7zC|uKa@!;yi^q~R-Shz|(eQ`w z2eAARQ!zJtM!ey`#2|1Mo1YyZWFBJo0`3k8rVn?RNdA#CobF=>f6y z>fsPip2oF-ch1uQ>bV8S#7CL#=W@vLxyO4K98wh~_2tp@|nTPrPKj{-z=8d_8r z5Z(}4GPmut^m(Y?L2dMBM}%e9s3j{j%azL+DaAR|lLO%bI3@qg`+!aaBrp?Y)t_gn z`-3tBqzGVCT-B^y@;7+4Ye#sv9sXT=;?wM?q{WrmD{1o$A%)V!yFYp{^o-rDZx)t}QHe*M6R{|e!1aDBz zevDJW1gUeO$#hlg}9!9Q#ODlF(0(Fk}+%gqF>Im<9^+j zl1~OL6=2At{8euW3=#W)7fqb#Sv;0*?rzHFuFSLCW?nDPVk(nC9~8->1=;z%)sc;T z$Bm*h9+nGdKeSKakRaN8ON21kmzBDQ_YHgBnX8010VZ+N!wZg|Si5e4A2!Z~uJ^nR zvyJk`fG1gAP;&BK0c`JW5)ID)Y=bj!Zg92%J12}kV9>3FHlYHG8n~n!r2J0iQ3{cE zPa<;QPf&X-`j5mz28k9E*7W&Tl8zv{=pG2l*MV*KK)y27xxzALpmnu!rLX==H}Vb% zA?SUh7#UDmr3QPJYK*{lDJob1Y&Xxgv{Ek~FSll;0MSp0V{CsTw4Q&xH*-~Cx3G=| z_-eo?x}1v}8P?#3qlB9F3xpYw&*4k$H$DvkRrU6Yzgd88wc{cmulsR*PGW-}rpfzo z@izdh-KccOv(_b<=wc)(T($yui8HHZ64^7EZXSZb!F%3Fv*D<$0%YTA`23SUvKaFF z#<4N%Ja~prBXLrfa=Qzrb$Co&-Jf9$$)$#yy}3u&W^tJSKUY!1p+`R9l_4^#8R1s6 z@7d#rL$25fXnjUSsjkfhpFC}dXfOZ4I4NAD5M%6JE%WFgQfdRQA`=eDRrUr;kYh(% zBnX5iVFrU3|BU(Ov6Tt6_o%IxnP#=;wWU*~@BMav zoy%Fm#XCP(f$W4q*D?=wgz(_UjpyQ_Th*^(hMbBj(UhuV^vycpD?ZM?$tYn7FG`18 z>%_NvOIhJVsTmJ5W!X`TEwOFNYdDDZPvI;;Ghc+ZzR7_CU)Xg@9=iJnz5CRyiopzd z`g8p18D9(nYB@-}PI*~;HV{g@Q$wj?{{B>`^z%^!RP-?Om*R>Z7B%o5*KjCGUoa!e5w5B}m;qlRRA|xVo zxs&pyZURSM(n%Q;zWTBDCQ+09&6^KAUFw}UW_!jC`;5_^DueT3YMQ=_?_1)EK2jrF z@`x7hQJNz&FOGX!0m{8opMYbY1aglO*MutVV<@0tLi157M`HKLUf{QfS3@FIh6)B4S-@w4w&U;D|xV9k@zJRqv66nuEp=nN3sOwV5N z7Cj>%K$y+dLbI;A)e713VG^0Ic}-|BNFscg7}uh54rG=ysM48Hsm*C4X%#e_?XGj`dFbef561Uv4_B~$##Hk^`5$oD8rG7?9kc01m8k zCkDLL6V^%0sW8*o5P#Mys>kmOGi;ZV!;}CMc&KAj-^w0TRFgY-_##^8cG@GESTw4T zQMSp7x{rlz3t6#p*mk?Eo42goV)RYGw5Dm$-h=|Xa&`)~##-9jIQ zsQqCrzxC+A5N2$n?G>;rt7WlZ|)!c^1y1H3a+o*yLLuno2Lmf?=GPF zS>?X(aU3~&=wK8z9@%2lt^TTT5 z(F)aO(EBe25t9_MbnoQYe(8-@Vv5NuSDw7z%R82@S4veHw?S++s+^$w+L(h5J@}l{ouBzkdJ5!1Ic7I3%0Org1GlhuxHS&F3(Lw z<1s-;oitBU56Xr{`7Cd;Q5oI`xf^4&t}X>2x@cxsE)ik0WC$K29|9GE417QrdfeJj zFQ$z$iK$$ujhPgLzm`q=3FML^Rk9{2A!KM?t1fO^MX+~nSrGsmL$ER&xgc}8mUl+@ zKo8w2r-KrF_zEUODEc!e(nTjawH_y@YA<66dhe5qE;mGzwLYZM z08oGi*57~0LF@XRsX{VCZGMPt=Za1z(oW?LCBWoURgxj)MS)0rs8y_Ovg=I?Odr?6 zS0bg9=?E@KYZ}!)KfRImC1sELOIH988#Kh`px5owxt=?6=HFjHGL=UTkO2>n0jc>I z|F>^^5i)t@@*!4>KariK3#419TOb$K1Nf{x0V>a3Cs8j&<_VM?sUdX8z?jSYMpKP( zXG)L+Aq!MMUI5ayee&yG8=_S+QLA>^obQKUdEexzpWgfO!cHzrTTxBNHXo|I^5`oL z=!ENs_NRLr06+^@!Z0HNG|0uCoAcFv@63ksNVd~}o9KN=t1Mk^c}!qzXA4muS)Ju!YtKA~{tAY-U?L4@`-hppma3>2oU=^b zl_5Bd-d_JaxXT+DgLn3AkzDNvYa};5gtr5hNYF9C$G=&2MuA#&o2<-&$Muv~(Pmo% z6%j>X(+kK;YVf<9t1v(y^kSjp8{k+Es4%ZIB-^ayUWiYZ2UKH(xR;TWGCT3cl{TRi z%hh#YxW|MTtqU84E(aBC;Br8BeB=v*d005uVfHW%xpHM0TwL%qM%yt)4pHCvWPlzxO4VlFa%s_7m83>x|st^PJM<6X`dZLMltxN zn`I;@`yP=t3t_jZ8Cm4)aey~7NPH2Ldcd(VWTYR);PKZX30?EPV z{92%-qE8}8ET>BAbAf}R>9mc@|7`DTy?u4HF`w^$*0~h38bygVivAF8)x>1e)-CET z0=M26JWZ}u(pf&?^sQ2mwFgtPNMC#O=sczPOoG8; zHAr(3lEb=$f1-@5IJlVefejmmexSBElmF9uuf@&mP|bhKVHTcZG^~P*xm5I_oUZjQ z5&GBYaRv)S8&5I>3&;7)N}ehTc6>T7CY_F~n8Ml-x-$L6UO60B*L^ED+s?%A={#`Z zNA^^&b5~r`*jC=S%NTKt5&JP4X}6Mc+g5+Y4PY!0`I*S30m%b0oRms~z!V zGwHx$$KkT@c@m*ml{(3l_2p07 zXp{BYbq*WG_5ZpG_>9DX)j%FZh|2Ht8x0zh8Z9CrSar=&) zG5og0J*MD-b3) z*Z{R!Z=ZASADl}9Fy!+KzorkI1Wi0&ZOTTGX^+*ZK~>bSCvN3~Dx;ex`w#O&PkR^j zpCY?I{ZWp8cr=nrBJdUc%zMu6%?0 zLnx9@4@BRj6q@;K5cUZ47m>096{Uc1S)oyWYhnn@T;W_YgLou9j7pDF^vrenitDLr zHLP!3|1*2exQ)~Iu+0aSh2fDn*LzYaLN=R%%yBBVbLGx(!n`Bh-^E zP!noAl{8A-DWGDN><`9UyQAF=8$u{8uBCrr-@|5W&sDyKG^Q*L(olLB6WmQ*pcQc!dk0=OYkL1M>iW_0@97)7ZUXUXc@ z2xKO^)WcQe0y1Lzu}8TRvS(;Kb(jESYa^<+gs@|CU* z#|Z&OY=%<2P|S}ZrN8}h$uGUM6byG=t^umlj4PMf4fr|Zug)!v{M4rzJ}<)JSy>VC zn+xRd?61&5cxZMXj_Woo+mX^Vo{pdIMQJGGYnYc@K?fkqoLB3Avhr%E8^_xX@Z|8% zi_#k@ix);q=iB~F$U}*CN*T4XILG#u>gJAehn1ndGgNl1SG3ako^?!2&~D{*!0}}* z#kaF1SS-;jQa-r&Kq79Mem9{+puVOrIZs( z=i@c53egOlesv0ZS3aty;Weh`@a-S<#KCAOI+b6d3S^l)3ad$YYH5d>(e3fIEQo~} z-?;>-V;Q-@|6JWxG=dqN`jrpCvIw$0F7ZpnMrBp9`mmd@H?cQfE($PT|4X?(73THl zunx34%=MsdQL#|ux`uCmr$s-Oi1J0E4kaWUWeu?8?ThO7CXHWyjGflTY0 zCwQnGWTP0GqaIPo%&;eFT>Y0~;%)W5O^vRVHS62Zv={|g#nY`?`1jOKI6m?x~zJtobhF!5w>HHpJL zE`=)(I#d)RRubi}_i7uzgQH|l8 zxE;U}OZjVUW2UJf;7~3wy`4?d^~^?VSnFeP;Zu!IxS$ey+zF{+Vg=QiZa6DFRY2)b z-C!+@66nzBk4=DL;O^SN{V}{oG0cg>r-G1*Mhv6Jq zU$tqgsVf9kT|q1}rVh==x?%}h0q{~CLxC@3SES-O^g>g0R#u?RSZxp`nz5!{7K8S$ zP#XS^3ii!Bz%#Qzd@<5Y6)zlm^P( zg-qq@0@Ff)XhNmrhxKE{Nv=-n@RM0wz`G*hl~#5#=}Xn0=coUvK;Ae2K7Ef}2JKsK z^x(UNqpOH{_W9hEXRYiyV`vtYvIH7bc2C>-iS!l!S-&hjd6vOlGyh_x8s{1RdtuKD zp=%VS;Z2#(VaQ7Dsm%EuC()PtlvA-nK*b{Wxt6X&)5BU`VK5(U{p#YA&*6oIcQ;XM zFnn7u%U1cdJ8Q1g9=__FsE?Go2ZesFkrYRrM*k_x)oAN>Rxe<>481on^9ti9NlOSi zWK6I{BBn)PC15T1cKXgK(C4w}rZVKgbAwU)2Xt>=Gw=zxf%Ef)FF>LT z$#*O1|LuStC1*BvniW{9j;;#_9oC(_OdU-pJMy`Z|V@glj_#miOKluNWBI-O5EW3-!0b)i;#WbY

zFqfxF#AWI;fH3Gzg+nlNe>fOE#tPWC8f`}1A=2sfXYKzx)? z{{q%DYHWs3^+58VB*Nx_*w<_*myb>&JYeSZ-B7=2(fTMithXQaV<+`4DY{W>8#peNh>Y*P)J@X1O7L7r~`hl2BTa-w(ISHjwb>2+|mMvrepB0s9 zAWxX6EGF6-a{gXvHO_+dAlxrB1`KlOQC$N-56cn^)9xXrmGoC^#Rmso)d04r3@MTu z*(HYyFB?3NyBlyDw?q9dPK*&}ff*UF_$_qKZHequ8tFNx@%u5;!3bE{b=+(qk;oGx zI7iTz1*|Pm94`kchXh<37RG=tT0tGbf<|q%xtnN5OP;Xpzds2x6t8}zgTy@vA*Gml zsHD1Fm<~aFlSK45Vh(wEz#=shf1pijkc&z;Hm%Ch45pcAj#9p85J(ZWKn4kdu3v&D zaRUpIgVNmpOCpJRhy$;P3egZ!u}K{&jwgFBSi6TVP!&&%7t(_*FLWmN9H36i-DpOW z2=H=0a8&0|h4Q(Uh+vNUD!MRlO};<`8M+!y!^2zFlf=2!k{PE^f)ab>oG_upqhjlf zOItuOkQaDEsEAjXurl=J0W0AVk9Fbh3H@!>;?3rv7JM0#mX&irQlx(({=>)5SoJ(L zG;3i_dU<_7*ptxM4cP%weAHw@RFul(sQVH&qHJdXey8iV;nrV=z0$AcB^4#`=#Qn^ zrg=^0ChGXc%L!aw_QTzmjRrn*Dv9i*D2d4_o!-^dG|#sgp6*38{Jq<8IuYLk%Ue;5 z5$e6~;`!?0@bO&pT@ul7r0GIOK}}Bl?}#k;=isQTzjQ!5vSVK(UP!`Ba}qW~h|#H? z%uy97exlBF?2NxUr&lotsw%tHQ)>vKSt0vG-3XV|g0j2R-!e8uCEd7bgQ;ObVk=l2 zf#0vaNbrF0mqqM$bT{^ zTR{Lkqv9xLTn(%So$>{vddNP;L%>+tw_r}mfD!SZ?ce)eI9K1R6|b$UldYYqQ4=QQ z>YxJD#~-sXLOdz$-xqyhu?MDxaCM9LiVw(ceenV)_hds?-Rv1sK`)K&<0233xQJu@UG zR^U&@nmar?@9c@uRns?(%)`i16t0%0l~v3}XFeCPvKp|w(ib_eqxg;oJn%u^j|#@a zdPN@B*g<${m!cs4ak6=^xVn6(ro(n1R$1@xCV?sqU#?VB73eG8um{iN&t7H7yGELz zT#C2)4=Y+b(iAGA!3<^ZJ2$;+_Qzho*QJJrD4zs5E1X}ho%niPYmz48r_FJVjCpTD zeJp9TEv}(|TI-xV<3%(dM^EUziTJ;nWThG{zCISow zFI+*8$vI4>LMU>wc}=TpQCv|Cf#qPyEhc{8Ymt(T!>AlcK6~%*NS8e0m4LZ@kR(Sx z_$$U}>~F(J_`hSPsG%|*{k~0J!+QBBoos*nmxm-RRmm%nb5?VSlSy+{6J+92cvbNS zX$D>_2iO7`U1R3|bSq!EL~-+%iL9@Rs&cpjsKnE3bbEVk-NZlhu2`bX|LGRrym~rK zD&SLO8I#E8z5XvB$R41bBh@*ly#QA#SE)qYc*dx02TbX^>QEVV{iq}NNt=S7j3SyT zHf{VO{s8O%$(@GU7lVnP@SihJhin+?Fhn;lED)Md-gmWwp-QY-B^YL6BXMOks}Ksy(nusF=O$!Q8Qu^$8o1>4(a z<+YSj7&vVqMoC^P+d&}tF@mJFS4>SFu-nd5#K#6l-#B$Qg&`nVzhVkuOdskmCKa(? z9|&cM9^BFYuEP2X>~7}>)sr006{%G6EN6j~nfQVZfpQ%@C(j{u*kS=XFCbFnoo zNpS5>Dn{XqL80we-}SrfR66nE+aWn|Qb$W{YKp1};8dpLo02Xhw!WXN3&mzW;H2GN z9+ymP_&_`oI!MHcW7))do1JQRW`9>?JJgGTbxo)6BK0(uA0i5p9q%LW#hVWO!DQ4vklttF51$ z9~kl+IQ$YWB<|PQk{x3bO-U372m%{*49iGoiUb-mmDFm<0ES<5*aFy@5Y!uz_>p@3<9rrVQ#MqBHgtp{ z&N=tuzh~SwJld-je^*~C{;pSNGWBZ2-__NK*Y)X*7KLZ}yt&?Kmg5PD#}QH00y~Gs z@wPK{x^_CpOJ@r0e_e#D33Hu;z5PO#gfi%wi$kj}Vfi{h%+(2u2EC9A7({wpKAx)P z*^!+^ZqylSn+r*XC2b!S9&#Kb!Jhb$I_FtQ=tSZTj!>R1j27O74XI(Cyk;x2M0jR+ z;Z=F!+9apq)ASn??E~eKq1#(o;9?jDbt0}0kyz~(MP_2VYvI_|I4I%k2jR@DXAk_I z&*YQ@sY4}UaH1!-^?N?tQs&DqmjAdk-J)Xs)`;C^6-Q&Kpf%c$#f_V_d4$xd!1m<0 zR-=6Ge5I469-FNw=+(yDbB7RH4kW?5JCk6K1*h|m+)}mz?`~wX=Q*UI8U(tX>gH{AK8raLrPlySVp*Oy8GB6`2c^xraR?LaL5Ua~aXCK;8 zFJ9ZL)z@p~FUmP-aAV29oCWqig+p3kJ{mJ6s^qgxIXkuZ(fX;`D!>?QH+~Mh3 zMgs4X9Y`%ucWFcsHwVD2NjvP>x8reFjk*hI4beNYfio^kpt56?GT}B(KsA`;FeX*G0 z9C0=q)wKq$L1E-+3Gt#XEuh9lWUXM1TdnXE1#lVjMFnPvltm`yx4-egnc}l z|90Wi!iT$ULmT9tt{^fBx5ZnQq|wFV$+FOT?WjBdHnm!s1}6!zn2c6V)^$#-0ZCA^ z7&KcoUOv}qmi8L5i5wk^k-chsqzvM=CHKgEm(OMk%UGqdJ)`O@b^E|`=kwy4>XL=; zoF`mP*ICW0RIL5iE})C;WOo1^zrLB35H;FO|CWUj_$bn(PD0ABNi*=5w0zWZrO=Dnz{$T1rhI=>u2l*7)dEi-8;qmZIQ`db5}98!Rtx zoKxO;FkAq=nkg}?0B;UTG%T%L%~69HPIB{TqeH1IvXo}(li3_RRmEf!Y55eJd7h{o zN3~GQWuQC#^v8}Y>}wKAo?1=$v!sBB!nP7?dBM)I@8I;`gp|@sn!KU2yZol}idv+S zNJUD`6<6w$-|zJvL7ai&Fv% zy;b~aXDgIr$`7=}>P}Cm)#B~yEN4#N|8^s+*ddrv@0Kj;(-_cccq(er!K6YZm-_Av z`*uon4ev_*fAkqA+R2{PBv%SNRHB#jyYr5SD`%>8ZOtKRf$<5C6FC#%mc{MeoGF}^ zp<#Qqz29Cu-Cl1uW%>9(`#hA#XHX#i^~7_K^j*d3rK2VU!N3p+ef0tj#F%x7$$3WL zvF#vhDtQ@Ew{%U2ysb7qZP$!o=Ejt5NKA*%1^AkkQ1!hoZVL;Z(g?ACPiWZ zEDCNFU8`UxIrZ%X6_GUWO!H_)h5);ipbd7>`0lg0In~C>i>0R-!&QTVewx3Nw54pjKZTiL;dq&J`JzV_*m{>ew@7C$xKB~9 zB*(0Tj!u3PjV6ldBsNA;8&hRzhh_`>YvSUPmpD&vm_CiR^n*Zup%k;OX5SGzq3xT1cXqH_lIS ziBrYSDbBBrf*w`82vyLdz~oQOH}{2>bX+q;?f=3b2<7V_hKw7<6*)B>3#Vwwon-=P zN*rJg0scKgS2>o6mInKH)X5~P(8FiSyxwA|mo;;2r~f7C7#KCTqE@3SuPs>cYw5)( zHhC5n{VN*>pPNe+k+rqDin&qXn5z4dXWnh(+sk-ME&B)#8*}bFcs&qPqXndTGYl3Tzg4Ec~Vo zFymkB_}73--xp(6rU}Mwt=X)GA)S?rIyJa17r@2v^VZo^{reOL4^EoDK99*OF7`1z zw4ULVaP_=%Sl&Gp7CerH8S`NiS>0m+u{h=7rGkOX!i&BW6s|Jr(7tSggBb^mC01We zFJ}66`>T~4EkjdnF80ft=}rFB1PK41?O1DG+k0C^Sw=mn0D+3@Y!Yc~k~QrN{(D!X z#pq_C?c~ZaUDJyKw=O~9!Gj4}-)|8qgGj_YN+u)pIi2$sr*tgWNK&8mm# zC_107dS<&dMak5#>OwaCx&0px{>NK}AGS--L)%iy=Jjf^opu3RM-k4{jN3x9C<-w3 zo}j3-g6*IK1kJykbJ@MYQ0vVkFlv>#vm(-XXV5T0!BC8;{g9rUw3uyOVP*gG-RZQq zqsw*1wKdhobu089&x&7LzRI+AxzSTEnK5V9?3uIb8>bJ=oi#AKDdn!B!xA%OZ`!NP zp#oHFTc~squxNg|+OOQwgcxDMn^&JBjww=fsmMICkC({-ioIT;gA2iZT4_SHRJ6~X zq9=Fxgd#$ZzdQiR->0#dBRoU(2)fWXwv5i~=Nu}I~`i895plNm*Y8;6#UAcVHZN9CqeQmHix7NW|^=i11;;}lndNcdJFCI1jB)KC6jC~>ej6RpxRPkj6mK|ZQ& zqmgf;(Kn}PImiy97Sm}F(9{@h2mqu?N`ipV417epR*mj91GEBu{>HeTd8v7jmycrJ z8#wqk&XP-D`n<(7FTR=W^^H{(Nc!IInkwuH7H$Akj$(H}{~BP8)E3I#=gWU5*>~iR z!ziX*q{u!50k&p|gMXf_#S_ZB#dvKX@qg&$#!xo&LvCb90mO8fxRu z1j}c+A3ZDArVy#>yg9kBJ(4A|l}c(|DP1To6_6W+Ua;N^%gtcKr=3O1?Odx#N^)y1 z@Cj)ml34(9$+*cswt9=WbWa6IEG$NJYO=%`Xh19#10tGU#lQSHd$>tDz!rLQ2>AJL zzlwRc75=ck6X~=jVYc=hZEu>Bw|nE-zAK;}@02BS7&?m|BUj2vd`@SM6bSr@y9Q_O z0;GMLyt-LURx3i~XG>6n4j{23A>ZY`m^NW?FzVV0VBsPX}dA&3ps z(rgbcncWcEs9+I~!z=F%)hjXW@UCZx3h188+nB*D&vQwdGGcj}Tq(dv*o$4r%b4Nr z!hC7&uFY!pPT&&#(&zVmDAqzffi<&RldVjRj1)~$!NK9`986(;P8)_9Dx$E&=)$$6 zLViNvHia8Pa@6W%O?{KA<3XNRp%)H^wOHj8KAjs{oe$$xC^fQj0l8B=>&w+6Zu!#Ypf?ge#iy*N^!dmA~U4k5fWS93%8bc(#i>cC032&}HR zAV8FeAn z5sAVtfE6r2Lmz!U7-37Np|$DT4G0qea1vk8w{)jeE$-{?m|Nx5ahnTyaY#B}?Qc>i zCbrkjEbV^tr=Nu^V=>uU1&2MTZ7h_lRRA}hN`HO@4d&(Ks&8hLlank$ktBMhTu!2ChGrS!& zHGV(;4a|~fjeX{;v=V`YEe7~lNjjHoKgt!raVoMQL>&SYAhSmbm-0{UOO#IsemG3l zIRKudLJfw-BY07|f9q$dPuz6f4)h#X?>XfNEs$5Ye>*}gVf9lI&3p|EeG z!QjPX&;W*~-G&BP9nqq3-*iD=?uY^iAk?O+@Yr*oAG#X}7wU8kW&SBr)g3@&h9DthCe^lMV|`^miTqvF*-v zq)^qoW;wRaE}TRttEg{|a14Ht!^w2fmbljWDvCH{ua7FAI|_e@WeYQ)JdR2vVo1IL zQ7e>yvcncKtrDoLtVj3RPMu-{fQX~wL4_IY*dLsQ3}G>a=;eCaiCPhV0|hevdr7XB zM&WBewzRvb8_IZ(r-(=KmQaLrJM?HQo0kFQ3RNP21DrYq3R=#JVidE9cp8TQ+m=$W z*qF;;*>N}%QDd`-CQn-m=KX;*6{qg!gYyM|VA^vp!^sU;!8Aw+9*U*glzD~0FOlID zSOYyrWb=Msd3(Ah$3VQ?&aG@vfRnv}XnWiE{9|kS zW2b5dt0=pm&~L{=z=yVwe5T%k+!#dYkOOj-EkwK&Sh_3 zsVIxadR|06vW3R})D)xjLgL=LFpN)8Y}1Vu6Nc3I$(3P0I0i<6vC$18k4Jp~Q`#N6 zFnoPcCgNW(N@=>K;Ur$0c~RI-@)mGY!gx&V<0%shq1|&dmS@|XrLI50Kb?T{I(Xex zbQmJZF$qY&rtsVgl;qD~%mA9v8Sg0Z;JNhyU{Y7>$6^LNP6zb1>qv5N0x!9D;5!!t zDg@m0JUI_LBZY^V>q!k#3#Z~@jx?^^(88_W$_uyhs;@#$y(!5It_Q-h54TdQug0JH zt0et*)}(2!cj1=}a7m}0S#Lc{B1T1mt-#E@;XWO<(Ei;al^0wp$8RKfstj3PQVDi# zO84NXIez04%ufJ^^;WGN7e@fb=8Xw>0csii~;inQvYYrINJ34{qhk(+%nsw$LIGTokpM z=O*BU{CB0b*vp~2=ZtCdJkZi?6p)GpBobg62PJx|HrmjA@-5*@vrY* zIn9MN=0nk3O&-pwq?d^{X61c`kT;HKlEhMqc7dUv@Rm(7*;y3KKrAMfY9)nr$o|e* zmBob|AF~8HvO~n%NYvi+X7_McE2hM6x4EpqSnxN=@7nKyT=WU^Z znAXskk_1WG_%o8x;k|9G^;S4M+;zNZeG|8?nO%e8X(`K{MhhfI9nD_d8+2|?6*<;F z5C@4eRkl!abgX(|O1tV>O`^n3HbXLYX~v9db!VJODa&j!p z0cJGNgmuWcC0_{qZTX`2QVdaRLT)5#uRa}u$wB86T3oR1o1Kfv7001#+OHT7y7di= zN-Sk?J!oeP-n#23U?%Fx4CX@D@cFtz`N-Q(`Gv=Am^z)(pBz=s?7Cqnl%KELGL}+N zQ5z=9@XbSnCoZP-&WTl;c|5<8=!B=rQj{8{+7>E?iE}bukR*+9(up)9oVwp&ORmfEWwk|o_>r68XtHGp=`R&qpXt$c$ zWgrE;qqd#?b@{=@rvBT}I4Nde!5BY5*VNwdFcwHYgVwd`ZLYMEoLlkARz>x=_8y&| z%5_Vad35-fo0Ie!2l#~%a_wwB=We8R3%;n1?pxfYH@wR9SfCzmaoW+qLP zO;^!HuVhxX6R$xxt(00?vziYxzwSZgfCDM^xqY1#OFib)zipw9RDr++jXuGnUoVZd z6#UmPku{uKDxBXkqd4G-E%Z)VV8e`tmRIKx|6gn&56T1Ur#I|3v7C?EIDrg@S+jGG zp6$BX3L~clA#{#2=YqTtK{~w4v(y=TjyArSUW`mZvN06`l`m7Y8r1EESARf!6~EXb z58FZ^`xW^F1-$oDtO7M!4fJfF+`gGyQnvE5dHSs*AF2;}i9UnYY= z8HbPhI2f8uV3l~1O=NkBi^= zWWBx?ZLca|F zS)7w%NUtg*apH54gv?C8ccyrwjHhhXm|B&BARbOb7|Tmlo0+PT{7qanGoKUx z_bMw^aoHLtP6BmPvkBxV{7jRAEd*M|GRJFm9-LDMg?w$0#3n`;Se|F`F$9cK14Gj{ z?^#s{%fTX_Ufq4BFzdjDO$*cWfWpe5R4~qash>E#% zRQ-1f`8c~TrEXsDZ5uG}mG)q9N)z!szEmz@fg-TQ7TVht0yNN|XS1^al>gX^G$M^B zEZ$Qss-72)VFqt_{uRqO_pZ{h=$JSOCRJeB2cMwAFSBwvUK0?O_s<<|Au{M`bwOb% zy8|H9Z}C`q<4*`2!%FA{OM2UY5cF}+dwxDcxHVJQYQdrCV2I32b$JHYk#p;|Q-=d0 zG1`XX*K9{G%n1Ro+)K5XYu`_x$8kbD^2V%+yR&jldZmVt5cz>ZuF2h9{D}4+Fz8am zs!TS3s!t4Gu2czGSo*sgpXQe@%l%zjW98|qUDP%RN(zH12_&2jM6#%w99}{Qp%8PB zfXjfUiC1#t>6~_NnayBnwwm`f3ZQQx9PM_1lXi+m?gNCkRAhEak%~o^2=xg_D>pU2 z9jOAaPn3dIyd|3=!t)Jcb37;NSx&}Bgd{i4Xx7n72&IXdW%OS0rHsG?x>zBuTq-Lz zXSJxBo~TdsM?xrx7$weF-lf+pG4>=}pA<>s+c1IfD=t`$j+~OYrULI9T)AW!H>kyTa z7(4r&6sT56y6|~`2x;!3Y`=z;aVT}-0gFZ!`1#*p=y5Q01OwF#xlPBl26plv5x6bXd9djIOZ;u2WKbB~~q92_inUBdDEZX6<-X7mlfzyb?!{ZVPd)fJ<*_G4Ded)P zc|L8I%aDLX{K_9Kc7FK-g6p#C(on=+qL(@V3_fzV{v#4#;!Q^fw&jKMhM>JBMqw7( z8z4eZ_)w&(%($|b)Wf}S9=C#@(vtDx@OenoP!VkCG<3+h>dFemf7ssW1U}UYl7OHP zBk^_V$IQYIExZ`hkq|0x5Jq<>WFn!rCh8$sXWnGfI>ydNG!>c`nawc_q6g??3}4F4 zMCCIDBbK5NQS)L86XuLs{t|f>xW?}^K!4@p|NUp9VYMEZUcHpbyP1fevf-E@=M%ce zS#up+8stE4ddBgWRWuUwwIDj{8--46Dg^SQz>8yAg*nxW^g_U*1HJSBE);L2!k>{d zv7SOL1r%meEHrBj*=1iR+Cn>}UV^oL&OCGb>yx?9j*yt-jOSbK=$h6Tk_?bTFMJK`20i(}U9F#)V&6^XKCBS^UDHH)t?;As>opXYh<{t3Z$6XCSQU7c`bC)gpL6n2Jg0C!YU z)sSb3P=)Y&yT<9R1_>ws-}zZGsopl?o#jb0EHgnO=#q?YpwPuXul}cG9a_LafI@P)Svvw(0Q?ZD|xdi+Z$l9w&eZx-j12mq1>o=`H# zFp7q)-pgZf_+&!|8BO16(wF|6K1Ls3DKBBlQtf|P7-CatZLP6Fl3N;hd(@mumDcmw z{SF(iw~h}GE~d${{T51TEbj2er9Ch@NJQeYrHT>#yYtF&UF&Qngt0 zfE3seEF`=>hR1=3W_Zaum|S;d`RJ^XzZU(dU%NchOPQMgsCqso6yI6Etif++{%-Y# zo|eUg{sLeNN8`4)w|n#kgm0D!3?buff9dPpE@@k9gf&MwjBTNc>Q`+D?y|-f4si#b zu(hJyWHYqcDii}Rq|aa7mhpHv8l8`3lQzD3y#0dc!hugBH9-c=dn7)opCAhX&Sef| z*}yv^BWRfvmimazTXB$cxN zf1I+kl%H{k`y>=6DVew{sx3$ z)R|2m;M!wprxhX&>lJ!o#G~uD(uf(HM*!#SRA3fo6K(Tr+-ACfE(N9UKjUbN`R~o| zNrTao5*r+Srt*Gs-i9D38Vd>z)yOsx4H7b-0j@wW&?$930w1}uj;qaT2bo`*TV4OQ z;64}w`Rd&EPPW-4b(v84PDsWcReXDSNX;YUZviFgXOJr{_eAFvb|hKjqG~_aEDPib z@X<2I3B@PDB8mVee=lGF|188$z$XOa4kANBdfxi<bI+zwRd8$cdou>#*1W7?S$pAwe$@!2ll`1|vo&--xOpDELBjJaSTm}xs)VM>8)3mWSm08bc z^@1R)zg{4h*Q3+-*{$rpdZAn@)|S`S>&m37@7-OE$T>qpa3A-LSgUd)bhKp-_D>}R zPjhCEnn+8Z3Y%2@fC@e!6 zDCe;?KkI59-NaAb0E@C zs4*wvd_pIs)cP9h<4YE{whF}8(JR%{QqNUvlHd+s$T2 zx1~(_14!7w%LXu<$|2yM5Hswnh=)|$4)Y3X^Dk9Yg9Okn@?SfGU#1L4mogoBN?9F` z)oX9uAMO!0aWi8F!ic-%k+^P>x`b^PU{we2Nf_|T0K5=sTDgmPBVW`9uigvgi7-7g z5}uo06gd0ZJ8S`R**$uIQ@G$IIueX!VqS;^;y_H-?j#J;oTbUX!%56XEzV6;l&K6! z7MVoe0D8Hl`MN?5%}NxY;i+6H3QW<<*hs9vlt;myG#A;7f$NKjF_#4kIZ2dfv+{9V z%<{A{^1OMLV3%5?s39g+t7q zIkOh`Evs&9TQoBz{$ow#xUU#yp+f z%4tmnQyV#rv)_~-EJO1i1s7yLi}>}lK9g>HDjS6x4YUQ-?vFW*a#m?|h#*)t0FhI# zK3n%3d@f09njG0w$ANrd;WDb*3?ajD! zl$)*K)ReWF&CX6s#pYF)eoNt~#}uq=K9)`6;drv&6=W6Dqvo-65-<&jXBWWV;FMx= zyiV4}0HJtU_068rm;#a1B%;PBu>AB-mOyuj7P^F}lm>QL!17Zf zV_XHGzEOP9{JXR6+EXvFnko0>wE9w(fM!IX)c85zAl``PNbKg{;;u$VJ_7&9x17YY zOG0Uj?|j+$#zwr&{IvS1yZX7~xgpCMR)opY?0Fm$okg-AnSQP%AdI`YQ7! z$(um}nAf8V$drg^i03dq^*%RAbGx+nP5&FuUc~yqlDZ2G7d-1HWoF&FZNGH_EFO%R z72{4n`^#tQnbGD-45;}t{d2~K38 z6{!uE6cSg#3twRh{)EE!*|I6*NBhO?zsYT-wtE6bPA;z~i+3lR=g8$1tfQ}#FF|j4 zk-0i6MBXFLT^l5;gnl17eISWv!HOxg42_%Q(y8sc@|qr@y7wBSgN+-)WR+w}cv8U> zIQElWkt$w2eS6~P07TCA9STl*AzRENbBg%3q+|YSOu0B60{Puf(WAdiQ5^JI;2*snEQ?`9 zW3>cCs^+CgIyI@OsjPOc33aNaZQ}*2b1&d7C{Y&+E=sw~xh9&I;x)L2jGab|0cp@_ z+XH`@lOx1Fown3;JJlMjqx{1CMM-K_Jd#B&UOC%B_K3=t6pV_ag%zF-XCpgJoDs}R zyukDPvqVp}mSjhmt%okh#+l-@-;uuVv@61jv9i9Epn=x z!lxzx?ITY0tnjL2NlQj_!$d91aQV9(xw*fsxopt0SgyUQaas0agFhP{Np01&s_K0_ z2lO4rxeemYLU~AO?&U`gB-*lIJ6-86=g6_s153V?uvsg1QY_5L>+1FNf=haY4}!=6X`rjt7f!^%_w zSXJW;aZZ}nXFH-m_m_d=3nNZXtjFnrQhy$?dmeZ!D9#R{%u{-({qQx)gCw4+QLKZs zqMYSeEk;J1FfAg?J@+zPTQxy1uOrRbHw1R_WKe$p?}+C}n0Nn48je<#VW8hDziJvf4~-0lBbV$YXocSYeUejHFPf88Mw;K(uic9C360P zHBI~46B73u?K2n7a`x$~-}Z=iQM39ZD;GmJNjx{Ncv|&Tk1@hwQSt$5@qo_?MXJ`s_RTmLQjEuw5uA2uID+ z(rD?%bc!j>^b!|rY%SpQVQ5vEt>V6zVA1! zd&UpvZ+d1vw0xX^t1PV}vG85lHL@wBHDpd=MDU_#{73v{&t!=4na`2JvG?Pi=~fO@ zsahLK9JZ=*s}&Tj1ldg0uLzcKIRY_VTEze9B_L?UZoP;Ux3GE8D!dIrtv!Klo_d23 z;cfNn>GAI=ZZ$9ikYiH!{|XUO$yqoro+Q7Vzn$b01&=vSuL4$?oTeh6C~i)K2Km#G zfzU`{eH_SE0C9GE;LSZMA`D+O`XSg9?YY3U8p8dxw!Q`om0|$AfI+7$D-ODokai^n zA~hLo$b1$i5F6UBMnMPE+~d5B5E8#~JwI+YX*X10AF*dax0ANVFUj?z@Vg6Yc^px8Lnur0i_aZy4G-x)rOfu&* z#<$Myfh|8N>k;Nsf!crfeN~jp1q ztw7O*ZfqVQ6rPugA$(#s<)Kv_o_`y#zznoUbXDp~9}k8v>Vx12P^tLj(Ud5FL#p zMF*Bi=d}Rx-l4r)?MV~6t<7qUqdBmfecE`wNMeNPn#cPGi5gWGJg`1sPFU4Vx!Gc@ za6Bz<>??rDAE#dK*(1edLrJ%?olR6POkl|HC*I}?<-!b`gVA_`S%KwuF zzl3jV`Yd1u`p)nO8nuC6F%oqG20NcdH(GN{R$*(dnXovL6H9mUYld2==m@-vi>d%C zQT{^v8wQs|+Yhc=E#&Zt%p)|$^x8fU0J#MM_trXz4=QS>UTGhO6oGs5Okys9YN9HaVQ_mv7mrk%wYnnK8U#Y7_*FzIc>fXNU$q#B=g@|p`l8VG z-`!)XE3TO$9Y-tD3nT`Jj*Xcom$wesoSP`w29}7v+d#@67oJA3%BqFdNdIG{V`2>Keo5m5T`vm~S=$GhmTwiGwn7CUerc;P}idq|#1z<;8j*`*UWqa3mEl!IxIkPe;ISe=YHOl z!wJQK?uawebGD9^LDhj^v?t*4zj&+#d-TL5iN&37fVbwi!mc;o=L}un7gyCS;I{d; zsQQ)@6O&@hR3WYFtqQ-|-Y|kHGJo4#6?Hm@7*q?nv!N#aRqqVq)i{dq4;>o1c6F{v zlCn3YYW@fQM=%P!DeS*doOM4k%Khwy$UVX3DP=R}Cx}xIL@0t>aqpm~t%-k;Aa-I) ztEr~BhZOVGf{JYMwbr(_6)t}I>oaEYy8-5audDycPRFkvJ7cFt~w=sPNQYKT&u7T%qv*0;$i1`(oTB=~Goy0fJg6E*$ zJEE-Tww*JhI4cBmRqCOp{~C1;`C{49gSDJil+&!HJ5&^?p)11da2@5+BH-Q2i%6AV z8$FLPJx8NnoImnT`Yj=SP621XEA~j$c19!+9We(pqS&NuF_^Xm-460~#Od3obHZUv z@pob70L&923XkP^vIC%6sypXS)l<4k`GAv8IsAm1!IWzK6nBBU!8`i6#FWOleZ5Wd zYl{Tbqvt&NG(hWbz6IP0&@vT_oV_=fBDASQE-j^)PwLPq37tN%$ki|qROzTkE6+i0}dIxP+JZs-Ahl`XV&TBxwSnk-Bcpjc!Mj?1~lD$mLwuC%=; zu)*;h9O7CyLo3=lTo>B7mHJEAG5HvpcL_WhS$QJTX`ReGEEzie5~2zRV_&igFIA0k zTm5gq>EG)8k#=J=^+0JM$`ps^k@&Isv8d>gb0$L5HjLeXZ67x8DqV9Eche?%h#fbN zW2PKbJ}e#QO#bjx`7m}Ww%1y?3|uoxS5qZEe|k|pQ2!i!t_8IBmzwI3t3a(m{f=*j zeMe#!K)*hj9=0T5q6Y_0sh}9a&4#L9UdKUuR=N5L_o&{XRfNjX;)&^QkwGPw`O6ud zhz73P5ojXLq>;-ITzvPj?*(asFZe_J4RlAYTZ6d`=!S%n8}5z|Bo5}$AV~=*eYTL= z#lYf!0thKe2jMFrFbW}3uRG;FV;0hL7}i(hEK4ZnIoQ?WV0bhC-);dQZw;^XyHk61 zO}Mc#Zi0e!Fb6p*2Vm93wHR=5LdaSUPi>Y0YBldR6D=t!0MOZgr&BWuxF?Xu1;J9Z zXeP9;WtNv3qMU=Z@K*^`?lbM`1Vc+#vqPn@?8rNo&_~C=tr*%ixXqbJ7U_V}%a+hv zrGReRc^3if>m_POs|v>qJVz&GUTHUlg6Aj!1>jh0{aSu5<+=T1%e@hC>#%v~6lY{Y2rXdg~%x6*Rbb zO*Ebq5#m?h3-)2dz%T^3*)N46q$Q+uihpT1)wQn56{}^ZOWB=Ml-HEfCtwu#K-ho3 zc>Y7GKr(FU)DA|~=+5EZM~Z`TpfxItZa5`J9fMrRJU)nr>sICQ%P)YV(ub7u)cUD= zIJ2E4TiPh^0j+mP!q!EFSG0F72-!Z_3Ej-2r`zffJnaZ%428Y}`?AC3b`%!mZzKnG zW!EEE7kzHWd&f)Hf2rbC4E}y$n#U!VfSl{u7G&MvBMhuvsu4K8#Llyl2UniU4l66QH0jt7V++3Uhg%$ ze(}TL%Cf08tIl6)Z`6}HcZ+v@d&})*SxP!sfVuxA(I!YQm9TO?C(gF3LXo$vE40Gi zc(0`Q-8fEw7L;p@Pg0>JwF^3|DJqtgNnsoP%zs7J0{+E64Wj-keD>cY?KBl7QRB!e zEKXgl>9kSFAaxGzbeE~LU>OWl&l@LXYd3U%gsNtBlTNGeGS<(V{gy0YfQ&~H46-0t z2q(LGIcHd`*u#kSz3smn+3VYru- z=i~sBKv5OJSgley{{<%*LFVGo=nq_4xCBMmQIPi%Rme${0(LrH1n5r>v{)WrZzO6w^sVD0uo&Y}I9y1nFky1Ik zm&-e1EL;)nNeY7ogU?<)0|^^biL2VkJbCt^aL$o!?5rcpU5h=lJ@(9zjSD;b{5V$5 zjDR^^P3;Rh`~B!v`UeMa&~A44HMsn3W_#Vf3}>@j9FrQhTvRhF_a(dpgvRO6{0v?t zYe|Z~qtHzbtTMr^H_yQr&_6l|))$9g7+)NDVTIt{js4Z?zDB)3hHfUT&9ow*RqSts z0E+xYn9c5GyjmcB^YS`Uby*u&&69yQ{SpBrJb$(SBtA~S`CUk_DdNS_2}KhHjB$Bk z$*2N6pR`e&qt-@)&e~@3ZHj*x4-&vTFYjcnWSy~P#a*%=6_f|0%jR5)E;+0uzEb~b zW^zsX0P`Q>Km43VhahkI7qSYoeQ3#?&Sf_bp4(JP~2ONJWe&A;ps@VBOfxp;w z=|t|!CeUd*0iLL;g6?Sl48B?}UJ@i)zN67fu4VQu9UAIiQC~52D6m^P0aO8B$RirM zruY_r`#x9#C@Sh}m8HT}hlgRF?$*`ZDeZaQNLG^djn+C%+*P@ROCaLL36yuCt5++w zaw_6^w>9FmVWJf>+AL4YB%*dq{b(z_Nw@ zP!@VyzA!g!f3m0Np6{s2`QI~sW-R<(wPEU^5L~j`{TZ`i{etuS>@NGTQUI3P^qPa3FYPOt6k(sk=1$1hILhl|kCkU#e+62Gxj?Cry!#V%ma zNT|(iQYajHW%$z)WJF}}wL=sQRf?duIS^#ok;V)xIT&=B<>%Gg0cOAtC1ki$(Gofp zm4nqjka2wrE`5W6%;=M)L*k)eFxVtEJyM0sky|R9uknTfB44(GmmtGRwXe}Czznww z{c>3h?ODx(_qm&GC7>nTlfOQ z7FhajNb&;qwoYpNRUqsMTgK5&{jt#sXjXB{u6*~gIbLqc@0h!MwoS$*WSy;C8=+pD z4CM2)8i7C~XWv1{UGtFuADH*{`Kqlq0CRJFp?7>ZIGrfKGj-5@+Kk1wt$T2PA;+q>J7< zSAHNJn=>fwn=Dyh;FQ%lf(9d`RG*@uZbH)Ic*0y`mexW!32+tY(EI?NC*ug>7Xg&3 z&-$_T>PHgvIaxCi{cStCcV1ZsrX+V?fpWsY=u7f}Fb`X*qjd{tVG zmYAaK^9n4gk0I4^bHd|^>u5~TxU#Eg6$Fms8;A@`(dp5d`-H*g#eh!mKY{TAs1enV zucy&PkE?c49-n(3+E7H1O)hqpw_vk20Tg6u9QMHkN^V;zXY(G)of8$yp}@zrdKrP; zY&g1Lv4x|4((oE@<7h?94-f3WiaG_HviftmMHlv*w9!*#)q8i_cP9*|B~5N1@$ppA zJrR2+AX4|UoYh7{BHOLuR$V$NJ8k2tErbtFvexIRpJOGycT(t5+$h^qes#dzpnjkH zXKNP_je)#%5D#E*8Q-jiTT}0Q2}W^%Yy;rpAWSx0ZK!QGn{U+dM2#YtA5#z!e)`h1G75y^S2Q$6)1wSFt=18Y6*Jr`=c#g2Mk+8&4thW)E%G)@UU={yw_ zcQeQ_L2ak71Z=czGzaPwstKsQqrGZiRaGUmQ&L#1zNH2dIepDDi~4L6Ii@J^wu@9?9zGr02eI8?0ubYc0~LS*(MPbe5_7_7xjKk=9AFLSQR96g-x z88%Sc2l*_Ld2i5(^{3q{;NGXl$@)<AhJA_c{*ls1L&DC&|R|JjS`c~ii`0s0$gN@Z;Gj98Sur3u6-PayO==Na&hl$ z;U9~ts$EnYf}o`US`9ZO-Jp~RlxDS_5F*49xoj@&4xwS@o@Lww1h3t(@mR}cK3}r(aZ4f-;dDp$yMrE z&Bqj4T=L>!Eky0H3B;@V7Z?dbO(1%HsHBYXEsPP3N*O+4ql<|Vii5ha_<>_u3;{pq zb_O@KC;Ym4NezPM@%C`< zVr5CwhxuZ8RpoF09J*zartL9i>MKgR+h$efq0e>&58z8gsqv<>cmC9h=>dIL$3%s` z=K(TZL5@*+X$B(c47mc}R7r)doD_}imKA)O3e7uWCFlj>U6E72>+2nu9(2MKI@TN5 zI;BMh8Az3YDT2&tQkUGM4N7ubOH@aqF8&~eLkwa?w9%Vccu*N98#@n%O=HexSVIp_ zrS~cO;?0?J_#M!y+9XHlcly8`0Rg+wed6dfYLHx_?l-nc6h++cD#Ismxv^D> zr*LRO@YjHwiyc4^0PH(P@0nu1yjp=ARieUSu>#u6mnYVKy=<#%9Flwu zVMV1jjUcb(FxvDwMt7}HPEaNow9a3cbH)_P9)H2W9)+Q}&HvJbB8X6_0K@TetC&QX z`u8q@&3+#S@h%u81FF8GEs-@k2ShsuWii9>A%-KS%*qeGLwa7OV?3Ew;p}MgR);&zucoDwkFk#F7a7lys*p*{9XHzgc zM;0~q`cbXafq;2UzS6}FQ$MU^)BNW*dEg3%#_q>=_}f+Tn$>oVQtD9KC-I45{7rMS zyDDUredT!E?q96enLMV%Uu)8e0{9H(b$Bncp2zGm8gM0VUD6Zcjf65+sis&a)A~xi zB<~{e38`&}P;St(yBh>D%!!GUI(L8S(=W1|clagEn)(;ui~2R1V-t}GExUioYzMc$ ziLazvvgce(;3UEo*7DlBD`ET?{o%`CDwWX0RHfW|mbWfnVJoStwU#O1i`(v0+p-zT zCLX8XVdM8T^QD=u?jPD;9$kobF&ILx5}-uSkH|E^}4GjhTq@XRPwv$)eV($Mvr zO|KaG&$74QX2s;6n+Rr^YRY;SubS5puBf*ADvC*6M-F+1*^{cI#1l`pdAf3m?IXDM zkPJWc*TyZ6=Xp|$bi-TEy0;T97OQSbZp!O1`6a8CnSXi>5o({}^F7D~+P>#PAnA=_ z(trK7_d6>uToA5}(N_X1rJz&^C^s%8;hGXJ$-XBPK9gZxyX5F63=teh`Zwu{8zQPB z+^@^IeRG2&QtZFPn!$wfN8d0h_rb2flvf#5F(1QDJJ=o>z%H`8 zc|{`X`t&J~o}7%Rb16N^2Q$m2ZLS^Oy0vzsrsi}NsK{J(xP~KUO_?{3)x+hmd*;pM z-8gbSNMGqF;QTm6gN1DV#h(k9q?)>^4GqYj5W4cT!I~bllYCQDO~z(35~V;f0p%`U zfKDf-k?kb}0kaqZ7EKgDpllJq;PHuETquxT_0v(%2k`}*RLB>-vb^;3M(0hIO&Pq4 zC*+X*%Z>-_Q|~t+Hs}M+K`F+PS`UxvE2RjTPT0(*tNaW&N34=axLiug(IK&>yvlb- zhsHXEB1)x;MsKRvxx9+8vCgWL-)6j`h;=jl8kiqs>em33o3}(iPbb0ht5`r0Xl%Uw=-J=ygr+a*WVKQX&kTrp!Br}T`dobVSMmOa~ID#u0MWtreZhJbcvol9}%A$^rn6d4_`tb6|TGc?n!p z8q-4>603h!-!exYe0mUHoE zDD1u#bU=Afk6rx|a}A+6^cOIKQ+~*R#to-dx@nBo%15kbY-qHqRTmj)B)M_sq$ZZd zm(k8%b=M%J*rN&CCrsXaDqdDz@^P}c*{c%fwAQJTjmv#ga)q9p`O^a3ZY2zZ(RhrT z!>1PYml8D-D{BGav5e`XHT(Arr>3@c&G2&jYNv%H)Ll z6R){YPwTVAh>7V(@N}lv-6pXFOKd zGq*K>YQ@C~B1nyMC$+Q8McMt`s}|Msm%*->*uX9q3LjNOv}n`)bPU<@jBn%~D&1U$ z6$nbvR1>wmpK8S^Ni?e3UPvU`^QlT2o-ExpH}E2v@Cb;ndp3w9j**x&36EH~kCVUF zRDhOJXkr$N&^lT(yL+y5*9uR6^0G7Y=Jos4)+-P=qJfC@@WnJ=5s@KmBk3nLGrT+m z)e0$HOe7XDYX!_V^<$WQwL+OJj@frmdTRwTf!I`5S7)ve2$-%LnaYH)za-KH(rq&a zM1KM0FkMKz3Qx#WcUAN#(YVt}$!vFDWuXv(;ZTT3(JUEVLg1q~Oq=_YRIz%Npj0pa z#BzeTS86GW5oW*zQW2|jHYpUyr;6w#)FTRvd(+S}pUz7za2KNUeoDHr=U+x8*yi$v zG+zY;;J6#y7i6G#viSsDTH4WLVof8b8Rp~NA{w);3TBN)eLF!>nBtKd7y;7Gfyp|w z6mzU0#|PA0ee<>HJ3d#oCfjd2D)9dInj6xO@Uoa_CQ9H8z6zPTNKr0Wr`ZPJW!FmT5io28I1fB zCOVAE4{q5u-#fb!oW zrX%yOwe4#_k@aG+iGImU$lH{aJEtIfdSYg6MhY_{c|NaWp`7n^5?ylFQPPxXZc^=s z^1xC-84tFMOUs>Q_AV`P z=E;c=I8MZ#!w7zq3DdCAX%l&=1%SM4T^*3POm~zSnp1pOLNEzLA_Je0x1ood#ldRm z?WRUe#?eLD?)iw+lyKVq@6?IO5s)0tg0ytZ88p0mI80hr`z0@jh44{*@TRc z=%UMWu0cdlPE$-1;eCxuGgCCP8Ih~3k*jC3Qnj!(dSy&xLzf~ta8buka1R8zc8<-# zV7{5L8xdl~Hta=#PZK)kEBNEmMAlnv7ksB4*o+!pqZQr1<`7n=)SI~ zlNqw8TPi-0w~SY?>C)>M21(v`kELkDCTQN`HwBV$X&-;s7jjY~*?v6r7rsytw_a&v zMQ)8Fl&1c|1*EY{l|)v6418e4iqv0L>}VrcREd(IqgokGV$v33{Nd@4A8m~bH`je0 z$|!)^P_QHQ0VeT^kWL@=LwTSpCoiVm=L_ZW>y<`UL>m zJgcF>x5yH{NVSL)3=Roav+q$qql7Z4Pa#wBIb6BIr%(|1+&sC;r%+Ag^HmCkPbTLB zOQ*9$TrNvQr?dZ|uCIR7KGY#`3I^%us?pisA0Ayk{U-?`?ML_ogNF%sySaRV6SM>@ zDr43-^EeY$bAVCuz8h2Pj1QA<;y>o9l(GU&JWj0<#Ue_2I%1p6uK=szwKTD2db`u3 zC9{kl3vcAC`S#znj{kPO|24BijjaO}n7hXl&dy@P2e#CmnT9T7*~-gp1L{1fd8<12 zo9*UC+0x@?*#`O2?@e2?wIeMF!k1myv4^>*##SR^%A_(t=3d%8y|koysI-mgN}=kE zERDp-(UgC3tZI+cu@sX4iAfZHB)V?HgifbHkF)OnY2w};}i)UgJwgUrEcj%h>8A?pyU{-V*hi?);IroOLslxQc+t2cPz zhL<>*D#E=}J(-|hDs89gYOOE^=IiQ+Ns{-s+p)&fm7MmOg4V1xf4zQd{q46O`hBn3JYawT*@GR~fpSnl z`TszBDd=|P1BI@(7Mwb??h<3EPigrQ63B_y0)D(tKtf0R+Be-~}zF(1D0c@Y5CUg`Dcr+KD z;srRkA_IYl62p1}%KGQD<;3y!O<{Q^cx6E|h9we6IVv)Gk`z+8Zhi4i9!R$a9+}bB(UKiId?du*esz5OCZm7YNMQcT){a0dR}zEgQ3e*4 zk4LMcl3we~lnxiZ81H(p){_&eu$NOuKgbc@Kx3qO!4t!&m{AFGGiap04SlB+$ z<+PN_U+_&r`IJ>01b?Mqkr~7cwMbg{4C3cRnkC$MYgKD!MDW?b2q66}^r!xKNY?7# z(T$0>Hd zk);!ENX)HY4lR|VRKi9@2yqH2)`}3SJy29OK4;*kU!ArUoi+z7D;~&Fu|u3gX#7h0 zM>@l8`)$C9z7rLFu1B3J#tbYWRy-?~sE4!<#k$$L=nqF7DvLCKe@5o_osppxD63~wn~xO2=~6v6f6t}@b*#ydl-)p7*OYRJ zF8l5Z6u|Q$DS8S^2nyg3lnf(q81;qxZ~3|A0Td$-mH|^4&;kTm&SaxyIXM@O3pB$W z+Hh7qwp-rU22@v?-F;>C`7d71(dp(I4NU7+gK_R59Vyc)83BBQklP{_ahriiR4+s% z=C;HZO|2{)iI;Mbtr(m{5*3MZ~7&7IFfn&duVLE7WcY5$gZ3P!^w&grsNcQbk;9 z_E7$KowtrVh$)Rt%DDIw;=gRy*w0e8aGOXWn!?c>8juBF56nzMO|+!)i;^d1=7j{k z5=RY`Stn~JR|fCtl;$DDSZrj{JUBe^li+jVifA-CCND2P46<{fcUpg2gqO?a;ks#L z?pnZCcL*%qR8ms0<*=)&;;^%NN9FuA>b1tHgqpMeoeBQ?uhw2$wpzlC{5-W%!(jm!_<#nl;q#Ee4BYpnEybR)cB{3lwU~?cn920a(f^n%*=sUMrckCU z9?w%M3f?jJt0}qOkC8?F&-$LZM=9E5SjaZTw(rf~=a_|NA#C(oDgMs<9e`i_7n&DZ z@$xfYci+7;W$M(>7OiGK*#B!A%Hl*;sp15ap1L?sg_F*&0$7>Nb2+(&zxH)K%qLN{ z>1z1jWST-x@0Ias0bT1S=~7K!Q2&d7q6|(#s&U`efgfNs38*rzRPa zL@u$YIFg%~YMP{5&lylo>OVP2m866wsuPnWlk}(h2Ll2lHcT?7YI%wOx9#CPkxdfE zp{mRdL8!F|UdHChCp|&hYj~U}i4x{}(*C%ihQFu$NufukDR>k=)ngI^f8j46Q7Kzd zldeL93C9we0)J`Ws@WPbWq|^9PhjWl2X%PaPWt@iTON;>^;^ahEMFlg&$?{+^56nz zM=6V<5UV)|Pp72EoM2gX#p)>Ss9=TMuosfBUBaq%rK~;{EDc6aft{z@4m_U*NSsa5 z2Aj&3rA#EHv}^ zSI?H>ljf5EIeQ+mkOLJBj^a~N2&twKD%GV&c3}fAG84m!`{>=IoB>x_BD5V&o2q0g zv_frCn5<9GHy|JA74%M*=l^l@-xMacu;oq6e?^F)#S5^^^;Dn~`80cA?z~Swo-@A4X)<+qB#nQ)8d5|^uUtRf*X2>yb-$8BB`+s( zPTBVedh=TL+Lo*}{hs;&Vf4-Y$w6^x>YN-`8k}DKP{%yXIINutkpjd+h=H*GnK;m&qdGezE?gs>Ml*B_ZkKlb>Q@ zCT`%}fwA|W>3d4$O&oXWq%A6DkgQZRU_?C~6V4awueTJ#lH293NM3Yox3EiTgn#Uy z?)hlQ#0|OH#>)!~Gf*wOE)lk&eHv05`oTqW8MMja!=3}x^ zv@j!J{4}u*bkB)dL#UuCWM5>RE9IC(XwRHs+5X%zEZh7+M@UwU)dAn!&i#W)0iYRA z_n-YU;}8j8?p5whOuWJ5|78cM-?3m>*(ych_?BhPrKm`72=BMN`hLJaCwxRw`}t2| z;-balZWf#A2zvhE2QwNKO^N~6Xa%#88JNB@Mp1j>u2i zne;1>vz7x5Sv@x#>T3uIa+#d;rZsbVTJPTmN4oug8&Xv3*Nv8fAOHRvdqcvhjcV49Nctz#em}7*L{MpZ zB^!mH=LbrO`0~l9!Hwe!C8){AbWp(w6Eh)vb$}I|@={g13+hh@;!bqn`>hz13IT&f zw>-Z6dPl*Y6MVxi&fo`|HVBnVA`@ex#aA8NfE^?gQmD7`K1ff8cqq#+WNHcvk713Bl`M#mG|lCV(NL){dZ}wac;H;z7NLD3rog}pyjTDs_MUDR(EFWlBulj?ZHP)E zdSWh18yoin_}?#~ZsBnCS!#K7!*J%cN4N}5a5YHczKHJ*Y9ZJ?@yrbp+5Bq$v#kDy z3qQ{B&mr54-vwehu6W;16ai&-Sm&*zF~l^`UQ555JNYp)N9X|P*=)-UxpmygX@?Ko za}?yBqt`}lOz-})p*f=ZH!0*lSqDVP++}3|Q9!Q0RwF2xmh>M3Uw8Y7xFpOPhbBPy z^urpT6y=6{qy-RI4xBd!(zhc>%Z0PoshG@b{7<4RiRZDuo|5=4cK1f&5e=Ns`H|9oz>0mkTKqZ8^m?G>Co2Cyk058lQcWx zSr`<~EkvckyvL|*|LgQ=4r7HQpRmY|<1#S;bFIc|`7vwGR=x{7yx|BGKa3x-fJ0sg zF-k?0N$@7?($*OraRwH2Q9@rVj$6=CR7e#&C6h2ojupuFW>G~Ra$t!xBZ05BVmh#M zdfa3cXXVHozG$P3$AM~mNRkzgJ&fQq6B*70Wozs8AlNMI%2Wij0)}Dct-y38;N@c8 z-{OcPw)SWEI->a*cDx3G1TCvbXJr+#9``wzj+pINp#Y7D<#;GUJwwZnv&2FZWTvpH zLZXg>+&KQeR8b4Mfj|dl-GP`qS>ggB)u`nH61RY`VkJc(!g+Zv@U<$#j#)Ndl4=Qv zSsd>`hJQMuV9YU1r|-96%o|3#IvNIt!p_A_{eqf<9v?x4IeDZZT;2`g-|?i zp`F+mZDIb3Nht^tFPl@S1%(EWG%5QKrKyG^{@F`0SD?AW$!460!&pI9{vl(k1CJZt zN!iq8Bu(I(w^+GdMDQNxU#RwH%I|e_lLsT!!Xcr72{rG?K z@!x{N5m_UVi25?pv=efX{+5gS78VRg!o`#;nv74gk-BJpcmPlR{QTMV#6kd`rVNF* zGvIuBvY2QX9?F5BO9)SfIg<3}=ljVIL#Eo5)*~WEvKIa?$wa1Dekrngd~im)|0HGDEP|sH*|T37|C`qz3-;Fm zxp1JX1Z}~r6TPA?ScNc5!o_VUzx$`vPlBfdH)y^|Cm4i{< zgjq&mww5x-obk;Q<}YQ|qNBeJ&BXcI+(0Hu&x3*Bxb$y@OFV>0qrjAr%QQVj#hq&9 zx*dJ)=RBU9GXCk&G&1yd#&nVW_v(+tLob2J`D3v(`8dms~=*DL$l;TWZOawU*}iA-P;=T!=) zFk~ZU`?P~=p4M@J>`uURgn0&PIT)oFW>G719FH5@FlXbI?lo3Rro4Dvr|KUbEeU)@ zFU&K$VhZ+rTITDrE52g8{wAaA#eMqBrX%srZLft*Ok0K0-%gfB@#t0H5>H{$Bw*eM z?Rv2NdH~4QxlZ@pw;C#Y@<(2}%o#mC(~kaS96bh19Cw$rLl4U@csDW)Kk4@?vApV%${GRY1M{9i^t zq@L&KlQ`N7M|<<1n$-s~-~197L^Yp%0+{FkCXGi@)(sNIQ+(j~JawF|j$NY_Nk1kq zk}(iwow><4nnXLJ$X3A-TZKn#RTweP8CTsoYx=#ws7!!a{=#e@slbJq&H)&d-Yv9( zfhqHH^hqRrN7%^dQdbL1F&R_4B80s@7?`dYW+;bQddnPdqgJiq7CWh>8>2f(-T+K< zv16~N{Y?6w-7__I@p=nn))5}HBWCK;>3O_yspi`;>F$b;RxMI`cw;jyb0u_IvVCE1R zxJbIhACj1QzLXt+?lL8~|H|=NUc!E$x8is>9l>p|0nI+#nP)ND@h^21|5yhwSkkKA z1&r{rqd!v3wuFIlB@Ph`5X!L=lEV%5M1Sfgqh)lS#4%g-|zeZ678v}Abk zUfZ;r#G!E+?>O48Sz$-@5##7b)bn8>&$7&^o2CHnCs`^^tWqq7K24&To0s)F@VYrL zLLQ7~XY$V-t71ezB5nLfDP>hWj{5ywv1`IAhhYs-9o0aai$^Ids^PwQ3uRLdu$T3F z-T*M3t<8_ym{W0YjAq))Wn5Um6)*&PICxex&a!$%W!NHpuq)(Lv7eSn{@=-(jTgJJ z3Wdnk5tv^O-$>aTa1+r5(i8IhW!F%#=YN=&1g zi!J>hWz$<67-@8h>l3CdlN7zt{dDmkT`jPn15$kI!0=XK$|yI)fO5kSJE_I9qY}T9 zu+;Nm0V65xVMasIH~usLjN# zbveCRAojGW|1(|w8f=l$^8u!;8Zth}(X)v8E0}<#x**##SS3H!>exvw9v|I_#||m`glEoWI|4{PK8xwAI^zE`^#cs~0U)(<;eGjc2{T}R@9KNjO0PaZ z;?dZgfpZdAEN!_n`rVS&lq+C#y&5nK0bqXU^*KM#f)Uxu#G^=~S7QmeasZ?TCz74Od02#$Ug!L2@g z9ew-C+ks8jykfVLcTNOi5l8v3tJQ=(L~7~O4Rhn~>W$SU7n^3ly1j3HSfrwuAIqI( zknA>QoPp9-4fKWC0d=a>=k!n?khyZ!zv)pXAl)kfLrt&IqWhN{0=mv+M_^MA`ZnUx zY_W8$tpAeaQG4ANo5ysu#fPNaV@4eOYFAlo;sE|sejuF-V0iANR@S8P_uadb3+haGe``l872*n@f5Z60^;$+N$ru+L8j-=4V`BNmN}jjlG`|2NHm z(CbcWb^ny)?cc0$i_dV61;}=DvR~m$=l8xQ@gpiCBCC zn>rX*HkH6l>Sbs3F>&7|sAX4Y&5g~8%bh9MskV2Y*bjXbarAh%huSb-g;MMUG+Q~1 z#_uzht7DJpYL6VgU$SYwPs!qe=6V0eLcq`UAKFg^PU5;}VvZ%Qu=wihyr%_?DBM=0 z-W6gqYT^5ixKLI{s_u+{ApuWQ;&^fR%L^ulhV84rNRMnlx zpTpj6Kje&&OKhG-qjb^NaruFTzjB=$y7kd#|CnPoYB&2$bz^R3Pm>NYIi~kNzjpSd z+?bFxHlp>SJvaIc2&2FPx%N?$zlJ1iw`E*{rQEoS3MQx%TIbC1kYWm%J;8OypeGb+*R-g zDi(@Jjx9u5^gqvAD3oZk+&@AY_r5op{;OVG?OQ(cW`C$OF%JGf`REq}oKS!|6!(wz z4?i>x!Y!dqq=Ayf*GuG`5bSRJVE;j!XukO9e=!zS82*7DP9XA+FXMYv>|IeOI+F%sxeHKQm$YOEcVBW8Y`hef53yeQ=+>tx)~y zGqe*?+2Ozl92vNzV7h_BOj}3>4z=9ddSJ-7o6(k<2<&Z}??-?7q2bGEmg>>!(fZN) z(fZL=EKYyiUJK$&k9w#5)_uHst3GT7sV=t5)wPS|s=ipRx~V;+DkmcZwd-lJ!zsP^ zPY^_;_hPoq_^#BZ(W{1hSWG!9($6f&v}f}H?-^zs={)9}^eL^%jVj`1GS-M0v2|uC zu6w_{Sbk5j3oa-9d?=gj@Oc&gHD^;RNakr7YxKP3kR6JwOTL$7_c~w>(i%ozHuOA} z-Yz^?XB|8oy**d^J+k<#35+~>CeIbug0}zuYmT~esaWG;4_e8sMl znbds}96}NtM)DPhk}TGRT(FIx1)pc)iCKG)xI>W@`(7ivxskJAY0Sa#XSWbXFI!8J zc}B?!J!n{GAP@o;oTuJ(Jn#Ygj&^2x}@wzZ;{jic*uh8R5R+^Cb4P)8-xUPUu} zrMyu`CA}+7)@hfO%ujAs@tljXW?4(-EPJ*?a!%dY%nc;?8$++W&O5ceV?@Lh&peK5d_!L#apUwdO@!Ixp#Ra18H ze_IIFQEs%p?Z~>m6`&s#=t~9qQ)$xPu>$B<1^QNj{#9TMDwB{eY#>EAgEVR#Y){hw zb^)wLH2+pE;J+r?Jiy;6wrj>l+4ARKS>&p2{(Y@ z_Ndg#8S~9{CIMuw3db^zm8lf9@{?mFl6##&wQc2z-ACe+!Qu8%cDe0O)|x(Ct>XmN z@2bG%@EKQ%S2|# zVtS>;^lU4Tiygn)cK|yS0l0%T#=z};Bmv?r0$3FgK>`^RP(gzj=n$t`;iyt9Ab|`D zsGva%^qM#a$t`vr(DU_Iky{x8y73c$F%tgQ=lB6YSiZ{!FqGqf?#7=qpDyMFMy$D* z@ddE*Atb)+bx;9yK&Fx!Qvcu-VwAgmKM9(zi#4MWTv!lDD|~*$qT-UW z`i4du2@ht3o94m6ttW7TfHexk)CzqXXR4Ap^BU>J%C4j&l(;1n^&TDbq|IgC;~Cpm zCJgmxaY&ftk>r*akj?b>faNcs(+}RNx3BIjxHoNFSdO`ih0r#EUt{L*Dhg;xY$FeA zFVtIoT6+y3?agzZw~e@MDoXp?D5mQtwQ0+C-DzN#b7^i0V?PeQERZ^M5=Yw4e(n7_ z{q24W3k!?(0(to6^!hfs`F1$9sPCVqeR|yK+fbYQPx=Wr^81AZ-0z#cb+|R;8{5qd z{$y?cyRmNFAEkrFc0&tTvHx@czT9^fNZ8iS_GkH0ySgmz zyFjhNMBJ%jpYG}NgRhFvRlY}vR9d-Ca|m|x0Xao3{;Q>7OiO5%^?I}3rDhAOW*2I6 z0Fz2NgJy&k+u|iplIGi_Bn(2Ta;P*6qS;QDYQP}Y3wnBRb{|_t%*-EL(YBM>Lm$_I zjcvQ!>JH*1{@h1(LyK40b2cxVIby!F;WP5zdGdVQ61sS3URUM(w%p>BH`ue!+wCVr z`L=T9JBlELdyhzcyX9AH+vuNY1(eF)+cS8h-~K+7HU91tRaE8TU-NI1x(0O4)!uhT z-2#35FKRe4{fZox_ok|Zx{{=W;S&){2cyA1=3(pp0M>8(fEn}mxg3KZ6j?r?;7C$5 zz{merUUGzkK8uHz%i(ik@V3|b<~_@!SIrIvXhp?;HW&l2-LgAe&B~09Q+ua5=CICo zqJ9sg`~Q&d+bEv+>-n;mDM=~ZL;pKRt2+lEmv=jLed(YN($~mS+`kXL;Qh0i@j^EPLn22a*_oE+-@t-$ldFb&)F}K z%749AARIQocOd1BWM$xQnX1Eg+C~Zp!7{156%00AqEUosX4PXns`1;am72C-mqNE1 ztfc0M%9fp@8SeD1I0|W-$G|bo%J9?1K(U|(_*pY=DYI1Gh@}lJXhoS>1Hq)E5sn$% zWRml;nS~VV<3}nHqnC&^C=pA52#F9Mu_gt9?7VqzV5Yj*l9X_m|6zpryb2T8RmR^lhRh#xQ z98=5~cgK0`ndB8w^iegNiAba)yF8zYFgvF*UG$VgC^iq4upWuek%53Bcwi{R?@_O@ z4L9hp1Z4LjV_%Q~L3R{bjbkg@QkWJG&W*dRlR+6`05>afw0`1ob1D9JLKW`ynEe1=I z3i{rM#R)#P4GU`ao9Z%6YBLgDszYE`IkvOEB`G1lOBcT@C^kkS5EAGLAYfBlNhlFp z=Wa=37Oi*JQ$e^5`|H@T;o=ZLHntyk`cP^Vg1`X}F^^r!;`r_pjZ}yKN0EgV6{9{;hS1zFVn=>6_yJE#28Y z0Vylu;C<#kEB4^xRwxxG4LnMaX?0or=DicJqa;s)>jR=V3p-AXQ!Z?e-n-x)p2Sx` zVcIQG#GMv90?-6agsYBd&FfMu924w_N`#!FGZQMoOOwg7lsd#{vveJ1jc9;l63B`! z0IZX_w&WaZuURV{nvQbCb0Gr6W)WzSg5kUSN~0BWLvi%FMAhcA)Vrc<_zyS|k50>=v z7UjuVvgZGqx>z|j50*$g%SG(WkCM4tL1uyBtq7n4UoH*cdmwg3#I5E5J_cLKlM-ve z?70Zw2DurdKm%t+n%*q&JRrMW9*UasLKCQ~Qp?B6aqpkgiInScuq~;=F)QMOkO?xW z*`*{1PdWl@D5=egeVn>kd;+|!Ize-`J+w~+ze6T?xi!svb)XCdsGci>4eGHy_NZ4D zZ}0iU9F84<{t4w=0(q`FK-sESZH>gY3w(r3kVz#iPn1AVOd7bq1ijlme56 z5!ck#%3Q8luaId=y~^$=u#4TLT|VN7wwjShQpu3iLxzhQKY!%`5ip&7ffQExNG%GX zp}K>X1oPSBwPhvK1N@QQJ%fqd8dgEDpc1;**R3rJs-U(!?*HCK;r?!8>CqMrfSK~h zy%W!2lV@}nsm;vMNOe!$(V8VqLZi*3lQqD_IlD|ERyLRsWFxCx9xRb~@`~q(M~F!|bYF4md~w{sw|ZuQYL6^uWFWr+)rdTZV-3$p z#X-6I+7QQZ4`Bk7q2OhngHTzxO5L}+cTT?%evf^q6n3pY*n67gzpUlNvEph2OD0$6 zHdYaqefHM|IGT=Szz|_pTI*h~_NU9t2jqB2J&N>);gs*-`s&2r%!ViSaenvi2*aMD zt90y7X=%379kyBseJnkL+mjOR0WAg^5vDF z#(=dB#@6r0ioyZ+VOBQGV9>1h5K`OWC!7`k9}cO|R?nbOg4k|QOeT*4AZKleLK_`R z5Z5BFMb_7$m-=5ZKKsji;oiaN{=e3ax3YcHOW_|D3th7VOk-OO!X=zoGKQ(#b1)H4uj2I_IEC4F|Nuk1Vf3t@1u5KZ>>!drETVU~60`fN?j> z>hdja_9EW9Y)ceV>P{CY9NynJn9$wk-VWeE+m6}__x{vTe{4(H9!O@K6)TU5zBAy` zlW+|U7TZ2`Xc)${G_MKy2KkZp&&y(@7I`QqA)9jY8AV&^V1<&g zb-cArBbTWV&n3Nq2Oh&(GUi)E?~@~o7>}bzCV(_QR-N?(0LkCegWS7D%ah^zn0VvU zjJkG_4Lh2f)V<%0>5gJYHJ)GZEJ~>n^X`-75+A2nfDg{T84ZY7kk2R_kC?!oDc(&n z_~5J{M(}ZFb61ub-Nz{gd~o*7XfXnxDMLu@sKKo`yyb zuGxUsbglvdADn$N8W6EyKC@fpUP z2Ke+UxGtFw@`R=f&kpDaNJlwd!^Eg(YGGRsqPI3sN53s%*6>Oq&wgT~o^i^pvuZ+H zb6bV>ysOvWUhmE_U#vg6x&n)=3X?KsrlgE=z>6RR$#pv=-hu|SvloYgoSI%ELP9*J zN8rX;Hxz)Jo4xpuIc2B%BZbe8tead=Sqygq13pAQ8UdcR;ZU)H0B3FJ^5a2NoLa5< zeyC4BzFJ@fxv0t%cLD=GL<>fMr)@|*RuJH96iTTzKdf_~ygn%vwCbEWC_P!_J4bPRCH_iRY$PZ1v#{J{q=^oC53>rHLp0tHrRQWxoPl? zZ|IFLOS$TFYNK=?50Q?}JMK=hgmbmAW&EI^hLs&`OR6gv6jZphgZk!q`F<{i81U!JltL_6 z-MSc?tgXh3=k#q9zA-{Mlmn*C21ooj1j+-<`{t2UAOS4~flOVaEBGBcTIE&Atsj{+yR?lG0GH`C(0H&54f zyR6wMxPiD(`N6YO>Y}k|s?A`9WiwBtufZB4ML`{UUS)G%Xw}!Rw5GRJ+H3=rE+3>vXbLV z#(VfgJ2^CP#Qr67Fbvlk9SJ$5mA`T~JI&|PZ19FhmgA1>q9$9S4Bpgq%}-$OO;0YH zo!|N5evfCkKXu)4c9`R`(0Fsz7`Di~(PS1G>Y7MPOice5#{OIC0D49kpB z3w(o!^@_VMbFn)_%!Q0VVW*%rhj^kmS(WJ`kxCv#`!*D z{yh8AAna47mbB%Vn<#w9NKr{q#w#L;>EEzN88mkV9>p)|)T=AvB9+IPplRC`obB2} zQ&(AvVtAjpH2nK!T@hW*}Hc;NY4IeW6e$ORa z!_$?m!b$*&m?FhOR%A*F(#=6nOXP>wOqle#MW#e_$PXR`zSYZleMLu-RY0(GF>hOc z>}0GgCYYqq3BF#pXVl~^{r^RMd?cl)cxzh7O@vzwu#uupWmxmg1ror1ikBZc?IY#{+k;h1Zpn=2>j%p z14ij;8>9g7TCU;vxK-2w=?L^MUDiW*eW;)fq|J(4zmVDLU7&4MEz}I$MxXzyS_g6z4jvl`GZs;P90jyroSr^H&O~M4Gw+=E4cP z^@3n79}B$)thhT)koUEc)Hr%5P1db7G%>AS1;Il;XWF52M<9YXJQllyvt4#*s@+L@ z;%1SP&PwNaAmh@BZ$%=K#axm|4Vnfg;KHxvX{jna<8&G;sNC?w!b-_)kHqU{#Yplr z7b;{UPF)1zQHDcJBO@n`lw^bfaJ^QRvKXuou-T09i2>Mw-M)!KidF&I5SdMi`HWur z0xpHk0T8SRrxKsyGE$>P8#ci7Jwd@3HpG2Qb@v+FGB&eSr!nL(&0ZVt;I~dw=0WmPAehE>MR+yr4}|W z(+}xnC5f;&3b@AUrfIU5lQkeUBHxfQ|JypG8bOjoFRy6L|OKqF=fDMwQK z>uP#V(<>&Io-G%(ysUkW=oI{VNuS79g=S<^WVp9#>S(#K)7H}4UP*g`7BrX5n^#)V z_B<_W*#Fo?D-cJ}Bk=zA(1guoKEMxoWC#ZP@Ucgxi|hGHK_37shn9X@E(F#0?4mw3 zR{>eX$^qmJpdjM$y#Wz-Uk*KOnPk-hBXh}+MNFsiAYC>BblEam1cTk|!)&90f}p9? z4+YWNcMjls5P3j0a@TJqvX_t-E!9!lxT_BiH9hJpXY|fF*|B0(gcOWa>Cw&QTa&v* zP30#r+D4Rx8%kEpS?B~9QQ(S88Yj_v);Nz~I>Nj~`C_SuZcY<06IVp6kNgZR_Fm9@-0~Smv z93r$TF$8894>>1CXb3v7`&8lUcELeT{PjTVK!Wx$X1J8)x|IvPU*nN**Xm&C81^jNwg8S zB_^YYAU!Llm)r5kadQ!`c$w<+Jx|khLOz8*!N!2y8r%^)38r<5EJj!bfh<%bLps?=BRv zXDZq;Nx;e}G!ApKHoYa*#Tsj_1%r#zEN1g+-mKhV&=2*pi*bnq!WElCi&wfxi`kII!bZj2mWJ4tFNa~GlQX;J)oE?to(*>0UHux)a- zIP=K%$2RsnpSi@2rN&jHr8>CLGhvwRnTcq z+zrQjt~K4*BX9X3PYFfJ!9-I2c{!8nsbJVL(xgQsfw@m>8Yy$`hlOZKt|^(&cU(1` z6ytZ&wRVo}K+{wUO(&(V=aCT_<85?sL62pSeoF~S*DnYU|AclYu8~@ORr#BLnvS{r z*%hlFo+jhlgGHyl`SRu-Q+`S!Dj^sB3M^G9+vt-7fv=fw^TQ><^#1AV>$8WZQr1OQ z?LPhk@azXGeMe$NPf@{EeP-y?-Slb2%bRnp-yaB$-oE_x>;eRvuDtTl4Mp`s%Y?GRrN-GjpThxP{|HhZa7y) zrz9&}k=GMu1*>89Z5Y#pjK=GS-Fv;KG9KVb8>`3pX&M;+@83h-5uaM-FcASx#sFx#2nZ(srDyEooaWm;& zp&0q-%ouMgEs9`P4>`lOcl;e6I_>S7-3@u(4PBqN`QhXjT<-gn-?gImP0dK@n*jxS z9k)zYDst$Zc6Hhw_~Ei`VGP~${k6Tem%&FDqYD>5Cb?9Phleogi*!=U_dDWE#J*YM!Nq)7;`^#HfZ z9N0ril4YD`UB!+zynbx)9&f)<@^ExYloh>QZzTgq>x3&~CiS8M@9l;@;NB>XhJ9<% z9Lc+mEcu=x*7DyX%8_#<*^r4LB+0E$B|*H(+e1wX^0h#kdY#09!NYw1Jw!Grl_Qd} zWGy6eP4TOk6gG(rCR{BW?P=wUy)adYMHU(I(t&8rzrIY;()orZ5}B5mUL~M2v#qJD zXrUojO7)dgDF2XU8D_Nt)B^FyfQs#%-dBEbvPTOhMj_y=^=wVal{IVQ?dYW5opdKV zEBKPOH3fynU8mu+8Eb2_#$p|Qv{x?+LvE4;3ge%wgAj>MVN2AO8tu75dGcIrT zgrw}#ybjU31=xPC%x082D9nd35$Do@Z|`%+7Yma|C6{i+JU!4Cmm-gxCQUB)E_l_~ zNx`gHlFHPf%ACoIq+PO4+mN4D3bT$;@c0RZ#!+HPOMdH|!Q!-?(Pew27U|9>L1Oo_ z`;6+-q(RFtL{&miJT2hVr9V5ovW&~(<${R^y>>bmw@!n*2 zd&je9eq%k6_O6GuS$a5)*%qK)kMxdJrOVVsVR|F!KT5e%bFopGJ?imH){3q2aER-F#)$pr^)U zWRkgmQR-JJTP0syfOIINQ7}zOn zlv>Lkg(r|JVassN&4>AzoO;U_!S(~^>jqWV_w}0KuMt3fqtcN_m8Io%2AB52_WQhU8K)9ioxxgws+UQBs1)j*?DvREXsTxE)lyQY1Hfd(qJlu&Q1wLKK={D(6sR0&?|IHd8c ziv`>3@-~*mpj+-2qRX&bL&Qy+tHMtW0!eXjG|v0xC5zz*xdbaVNx}2;j$n0qpA^?T z^(Y+e32yqNi^>{y0GgH;qVP%)X=za0K2kbeWbmpxy9?8EUIz#6KY2Q{p8*qxpb)WLY6s9HAPV{b*! z5$KRswRwNWsD?K3)xW(U4MU^sx=!#FyBo&ki_q%ypcPB!yRMsdyT@wWxa;Ql;Qip_ zd!!$-1Hh@m%S&$<<4@z7gHo3oq5H>JK#sCZMJ&i2oY>=fC>=Lm>d@KPy6M~73D9}W za1r4(jBUjVKpv`h%F@`i(|m(H01n{qrMjn%$H;%^Sx+}$c1ygWg>kbi+;W7u&(d6R zchpQS4^Y)TIZs;G6tV!D3~-K70n*w=^~E*v_kXVMFSki`6uLv1JM%^IAFuLN!?ZMf zlYgd{Kau=jH@2DwRGaD(tGtDtS|GN#;~Gty8jtbq)HOgJF0j*B+m6tA>X>TA87Sri zDu_4PXny&Z)&&30dU+>bt@QNq`|Is`8eJJ9yUy)T@jn^Of6&XT@5a`CO%}O+vXo>g z?5p_72JIrZb!e=4iOpM@qfWEa#9|>lK}mdL64dkHO*nzzcz0*Ce08sB2p<3c>c{WC z`Rvv6A79@k;~sm-$iB&VQ;vHgzYFcFz!Ljp3b(VN4Q}Y<`_C{CNio}NhlB8L6|K5$ zUI%m=5egTKu*)cYF?}1KMwC0HD{RQcS8o38zO!j$3kqFJ%Zv`3Z@S|rN&b;ae?72S zR=COahB+s%{SMHwAzyU@O`Iu|CQ5pZ21TblFnMPw#^#stos zjvm}uBfC$H*=X`3Dt+IvS+3*8>)b2st9%Nb0U4#IM|2FTLfcq52lRxF!47$D`u+0O zb+wb5EZBT8_gE*Ro!1`_zfR>3y4r0VJKe?BmO$nP zQh^zz$w@l9Fz_db(1mRu0x5F{o~Jbx(d5Ca2X6dqWRAPYzYDCVuN}W0AQW{LQ`~Ub zWY*q`eL47cem&J{Y&?*In=IbYTXH4lE|!keziX0!*LoIyW+9T!fqkdVAy@0hl|Gs7kt=S5;nV$QHDC1;S> z>puN5oOKB<&nV$reH;p&J9>~N5$1J;TMU_NCCvJR$26C_ZV3dYy|yJg7?>c|R=ttD zrpz6PX{!z zSj5?7q_3R(^Y-KG+tby%YK=1B#C9mHEy`>ww?epTW+*%5?>F!mcVaZ?qnZSOetion zn(o+^!sjwbzoAmxH!_-_T>KYC3QrUIM~>SYH+ITFnG@7W`qi$E6o`pH z5t@EyN0OIBIQ>KCYt+B7t%rasd@js5WcLa%&ld>FbuBOnEs}VgsjUY77&L>Mi=j2M zkqc2&cPXuJ@b??Yz)_10$@*wjmPteFm}dn_X$|Q13pt=+MN??r9)r+=oj>4YnxIG( z=!K4FtL9GA=A;4X6Enf?XgBV=l`Q3YC6l_-W79uY{iB*tPqK9`YmMg{Hq^mBa@fhW z&UXC?rRFo<_n__D{g&?}xT?Q0An#h&p=roIRm`RS4wvozhyg2Z_hVp=#&2zq*iQ+wTpf^3g(@#qh6% zFCRppEAt6x3TMQHUcyQfIHKJa2QoFGAYEH=qNUC>HIYn+;+P}uu ze%j9#q;zUegYSL5-UM;~hR~FoSyHfGHB39LZNL#5T2kc7r@qNaA$Y83Wd0fPSi zgQNERVlBb={_^$ZX3usSJQ?T<$bMrP5eeNH7qr{$d9IRGkD68X4HgT4(YIR5#^mHl z9L6{0-Fhz^J2>5{vbGJekuUBzl+=2R{LklR z<48kd=u$EEj9L=jMK%mi-{e7!Y9pn(V9+!cF`eo@L?>BMc%8XbAMA+H?&>!3)Y(7b zvBLYSdvfc09DiFzOq7~`rF_4o$&AoALDHGcKO;DO>Ml>=PJ8{MF>Z9GZ&33S!+vZT z%aWzG5k1wnJR?DI67n&Ky{mBQ-O)qN)bAyM>jC%2a3tPj{K}kaM#AVmwo9vv45wSd|wptuZm%c^EDnG zX>43QIt`Gvz?bhW8griB)pHl-l>sPYBH%`U-UFE|EaJPInD9u6$r*!8M#lJ|PlY@~ zvWHq{&Tv2_PSQM)_w$G~Y{TJ#5nh9l2)8F!56R`?(%I!{OaUNcIm1lD-g3g7bz9#VvJr#DITUp;h4-KwZ#@B1Y0go18RX(zO=v<;+}B$(_Iv=hr>ao@#j zICf!U)kda>dk6XE3v}4xj=aux@eZBBv>M6FbT-^rSsX~XAJ7Hp8kerj8G&a?exe-~ zIXQ`F?*tkPT?8d$Hjl^Q07PB@y%sw*UcI_Hu}Xh=%vEA&#DF?CuKWv)kOQ8GH-4kTfJ!%g&Uy{xGkWZm~HbhcoCGR$ryL2SXptg+uDT~p~6 zuwzB%y)5D39<9|25PLK3iREr_EOreMMxs$R`|}*j7%4sJZ>`%NT_)pn8P`U(lqWLI z5Ff2!^b#5@SgLoVha`b%1)jT%l8xJ3ZU>|zob9a$)LGF_)j>d@m$pEK`UL;JeXa{u zdV=Ho7zR67WFx$uOUCVbAZ{|xMFzL2nac3;{+M?I!Kgcqo$tU|(nomLXvjS~%h6h+ zsgjqpK4@>}H(^{OSw!+`xF*cy&&r88B(}0Z$g~ILgdDJM=ZXz#*S9y0Bv9yytZz#S z?GvW@Fvc2B{5JH7V34>g(d(x?yvlw~;+U3HrhTmo2DEulvz+K7z~oT(OW%*c&P<3j zABj?$RzOH@i)bnfHj!ue4vLM=@`T>}V9a%asPe-_dv(6~9Bk*NF$3#_aqk_}NwO&S ztA1-&Is?HFXC(AIweG2%#lVNPc0o_7dxjhe-HB}txcNqh&zvl*f3m*S*L{NC!ehW{GMX!#B6(b~pbF=%iHm z9Wz3qqc0gVk$HcO**mjlZVAiSiaoRx6A`2t^Oqj`VDNm8T$ycmMB+AD_xYf7tnJ(l zxAKE1E#Vy{X?i*mtpE}@f6E$$_Qz=(qtmaeg#b_UW`eA)JKGKJR&C-~5lg66$BMz`yNwer+=YU9e&Aia~%c-zC0UHys^FWAufQe_q(!Q+>TA zL1yr{&#`$wmwmQVAcUh|XxhDI9;|Z>Z|v{4te&U6I@wwe*6jt&A-p_1NYSQ{gtuKr z^$X+w9mL)0^QR~?(&<@9P;NfE0bKfkPxAtAC zv+MUhX$w*nHs#cm5O5z#w5+Y>=SAPsOeFvyX8?!y8vO4ci@Ltnr+x*np-$SwNCDBuo z53ZO!P4k3JjAEODl{^+dsVoD@H!d7~v9`v*bYfa>hY--^`8r2wq6|Q>Hi>Na`il#y ziCtP929-5t1`$5!Ytu}t)vgpYl$eawVd#h+u$mBqE5Hw)j*;FU{%70nWa=)i1%QTx zoK@oA<(%awN3|Qu=k*j z_@!{p>kTf#DGN;+X(%tZN2T4A1h}7(z?n|;#NL|WNA&UiK{6s)7R?S`AZ?m1N1l!o zE4#njujfJh_5u?nzCo9ybVO)5ZfjtBoYvn*+Nd1ePN{9W!9!i?j0g!?4YJST;{VYZQz?rG+RX>9uQsN!ZieGiwdbbDg9D~?=3<% zbUMCTK>HN;=sFIpc}wgmY$HKqC@#xP+86~ET|42m=J$vRg0i#S z+<5hc>M>(~>1yGznLU|d3s_O6h93Je*n6VP2{8Sdh!N#z)d;4y*!HftMftlsdA@Sy z0Lmm(Co$R}500?)nvkG6azX(T!j0!d)}5Lu9|OBh5qFp7`}|p%kQVaG3g<|A_~cQblj7TkH~TNWh8IzLEn{GWV=!A;Gs-J z;oPrI+f|86Nep<*1^Ls}8Hz%{drvA#E@@JY(F`3IiL?)-cw}fO)-9?*3`gXoX$a*T+Lw>7(j}qXuRzpb zEP9GsM+hGA-r5$Wp|#m+MbMJT(cubyW-M7<123Nq9AvK#?bRbnqO22Z%wa^iD6|rMyW+p zXEUJOs7V`@whHznqEd%-vAT)1ns%!q%1nnHHmZ>md%WV!Nq^+jLLp!Hbo>lpt;jDO zci`m(hVha&V3buwvUU5SZK~vSaq7PR5;@D&NFU%)+ROk!!zVTeox!j$1iY9t(gww$ z>9BidLLqRC*Y~Gjq>sm{I^K>?m#G@7Vcd5`(&W@W-{9;^z_01B1Mb%>A#c3?`;0m* ziEq8TeR+FXd>l}3Xd>*3cZwu{2BFJrP|%wWyJsTgW8`@K?ld})!{mIy2N$Q?^;{q8 z5$q3zb7k0}Yb3^Lo&~fVzmi(8gRJ9MMcJu4>{DU~(b*;PhS!-Ps70nxTgNk*@n{;w zE{@rD$-rMb?ojz8ese`dT8z$VN45R@J-4DK0gSABPQAp~KT|ARy%cSglv3v? zp3JDm6RZN?)C?*ZuE&Q82I6;o|4wlD{QmR%*Xan^10dMtO)UfJv}Zn@7GFWR?Fk(D3ta-vN9w6$QAcU%Uh!wpyZI9{k7n?J@j+)pf$`ZQg2 z^I^dZ_&r~xn6`(VltT1YUjsyGy#lghYgB$4?pMu33*yia*F(DnM)}S_?MonOFe#bO zas_oIn{ijc$k)qLSCOuvutw0-OIL*ASq5SHn*&WFyBJuOf2Sl27Qj!$RD zwduJryAZG<>XRiKyvOSgbWbLqU)nbEcfT$`Y!_+I?bIWHPlqFy1SvQ^OgP^^Y1nDi z^@`==GlbAAgl+?J@E;+9ih@05N}z+h^dwWw+mgVGAAFGc3BbpA`b-Afx(karSd|_v z#G9b_+1ulhHA-Nl>=CDL##XYP_KTEvY}3DSs=}u;mPJ8l2tn8lVaB^aco&%mp>$|7 zUZmx2nQ%?<1%m~Ni6Hx0kLgbmK#t^N(BNaR@U1gmXvxqyzRl_yqY*EpEk>{5^803` z#HSEAPRS#r`-f~+o~c1i^Ka3JbtSF7W+Tm#ALg^|Bbf?*>^yJhp6_9HC?bKJ6#Y0v``C3}@68Kvi;LO%-5+SfGg zm{mPE+EmqTCdqn-o_aQiR`p>yKIMp9CYq`JB85>?+x6y+UhQrCUfY^cr@JL=*pc~> zoDc*m+`ICW@Lcmw1C9YE3a6T!^4f47A#WTBpu%yhXkrRIDXBc$QSb;p${UBEKk6X{ z$D_(El;TykW=#0%|K91Y!&qxn8V#VK4oS?|0MdK1oOpOwOYa?eZ5N3w$1F0wRaB&P zH9qcRK0V%rQG0QvQHTav_S3D-ns4lgvacd=@0`v- zH|KEB1b3`DM%Xv!CS5B91RP{$eR`p?8p7h79N6b^^hiTRkO9&kdX3!|Q@h zXDx`$&$L{aF9FUsxp!YIf%SenEfTuFKjEr7hAsIktV2r03kHMH>r$@YIp>9y0J2*18ZOw@o9R6<6p)1S!@p>>c8Y5((Ov zux4B-FcXP3sgk;rQ$93`#s`fdw5_6jpe4aw7^xAhf!4-&o|zBxiJMRTwuWUyJs^P7aT1+A+SO$m+l*ihbV`Fhr5~1wx)KwH&TS0qfz`n*t*Y_ztQmrLoH*A!M3 zau)xT(fJqpI??V)&}J3Z1;?IG{rUKMjUl77>p;?2qm$}@2@%Sa$jr_ua*|2f&o4*4 zoEC?bVQnLPx9ahx3vj0gdZwYarBidE&bN2S5%dwHkr8qV0;Fl`$*^R=?^W7qZ>ZW+ z+Eb=}`F5D4%|vnmJJ~IC^prXr?#AFcYHO|$8nmft=b9h0))(&oDsf*Hix5wZE1yiE zg9V~3-*3}PfqzuK#y7!m(|2tlL-jUPjCf zcRA4O!s+lW12LN=iutUEQpp;Pw<73&wpMHXDB)y=RSKWpQ?efZ{1t9G0;vx@Se|)8 zWbbPa{UKjE(TSv-?b{zX5Ma7wJ@Ua`u+d80u0D^cT9oudR{+9 zjry5WlndQFNsN4?(-AU=`NH*4R^D758v-?L9 zg4(V_KQvQB_SA$Y@jK>PQ)=&lgn$d;EAgg1QL08CA1NtxKIJeNa2}z!2F)tv=3!U* zraeGz%Q}Gcr7!xfi5^xY0s#~s<+x@tQQAFA=#V=BMzOQq!&=N8O!shiV%_#3Wi7Ag zo(kq|Yv&LO9w7{C*gDk9S+N%w(

)Thpg9J)x+@B(n?maf9&#`PQNHtKX<@|CQ`> z0~ME!G#q{LWV-3hr+>Exljx+IeN@slf|a@R@cCk0iKIc4zn?(vO0383WncW8->SPT6E16E!KO z?-NXec9g@DW0aien&-;CoTX%!^LP-n&l8N-K5;A>Ri!G7QI)4M+t*;qz`L zH4LdWNvQOMQL!b)jDbKo)s^`qet^0sjr=X$qC<+8!^kYoZzRn|3mB?i?*@66hpyd4 zHa|`lulkw7o>^+#Sx3MXOKn}}y?mgQF-bO!<#w31^f(p!Mzzr4)8x^r$@XZGYSgJ> z_w)>+Bo2^M-fjBTg#M(>GtCE8Pr7&5#j7MkmER4Y;5(XFsG}$A*dMc>dX+6s)iBu6qx!m_5LIQANh1Q5P()xl2zr`%^wMEIL*g=pkfhKwF7G-9AfY8v+Fty9>$S z?u^+(TZg#AJpK!E1B5wk{-}ZGRav_@_}f=8mEwmA^tvNLbPLW+v$LmkQSC=veA%Bw z9o6#1l9Q{PEJR&z%a?4TuE%8&RRNS=E}9)a;aJK^^8>vsYP;N!xlW`T<}BIl=D#O7 zTE<6doK($;_oFUh$x=o2wW!g=WM<(gACi@6bw9{N4u=PZm$>XAmfhPO%jo~({JM;I z|9Iu9AIg1=ZlYt*6P@%aUni9}`jDtgUQTm6p4DIX2@M6l%d)*L4EC0la&s$I#Y(-t z8)(~)=(OShOEK$r8J9N_9viZwU=)go=(3c*;-I(t({0++rInp zWe>gHa;j{FSAn2oLU7mROOCR`G$Fb!k2~XPYgh-b;}Bh!dG?S96VLMOmzAnGvd!r_ zziWGK9i8n8wp5Qhyi84xG1>LJggm>@m*9?AzF%|e!bR`IzQZ{SntI$NEMKC*9p$o< zZoc)`Nf_+a`;gC*UB&!ky=5ir_LM@CW@bNHk1x#TYy-vA&nw|+cGj3M#*G&J1PA#% z?h=@J{VpsG>-^OMJ&$Vf5wLA}UZkNxh3k(g%fb!ZMRI?`Ni;koDaCE*bzPeS7ey)N-8 zIA_B(7RZ)&ycj%8f(3$1T@S>}YRJzzylyvwVAm|LUYWSkt(@hwD0tgjM;*oTfSlx` zZ9(pd*H!1{Nm3{OA7%(4zeqW8Y@bBX0R9$q7MJuho#ogVteG2ovBRJdSan;<@P{C~jW?7Yj|)(K1^%Q85~?;?vm{CFG|cT3p0xdaj1xkrx!+O2Nnv#A>l@ST>p=b+=u-J<<2r z6;flcnAsb(i(f!Hq6=jG#s~KYKPV{L)S|`UqRk^$v`nmsj^Oljyuux3e4bqjvTus0 zmL|tl*NY>5*F)4L99J*%LsQX3oz8Lfu{l<86e*zu0k4n{J*Yg(Q=)PTrZw70jq}W& zcxSs%id%{mWW0m17VTgM3pe(s=@so(7|ND*6rYbNSNM1sF-i{$p+|ajir~AuQTiQT z)a7Q)Iu|1^kw=|9uItN^EuN+J8LYJ?2xld9wtK!A{QJ$a$YiO?s19E}@=>7y*jYC- zGpF$CSW)jeXGS>g%#I6!dN#p8|cUsM`|C)~0(|lS3QG_B1ILE=zthrVr=j>tI9!PVrrs*QTeoE zpT^U6LD`*_c&^Gx0i2YpLm9#o ztBqAg`^9-rY3D#rkY(L^ceJ{`!B}na*DEm(wtY2MX;fv1qTse!c>}RL!&N)XCB}uj z?vg$EvPz&z3Y{5sfoytMb0DOtPAQhRaYru0@C!e@&n__0a4zLH{9X#LO+Yy$L&+BK zpjTN@Xw75wzve|QFI&?PbejG+gJ8e!!44ovhC)t8w3g>(!sawbu1G? ztx?e{pc7yVg3|6vgJ_Xl6BORMnJtctv=93V90<#k8);$&U~|8{qtvCW9})nFnd;R0 zGGH7G=u2?Ypbz`YFaY5eZZJp?Il9a}s`%p?_V-6`S6^dpL$pgl{{{O%a;p`)5)j7u zU<$prlXxA583l7?e-wJfryI}1B<#J#*onefrY(Bt>xu}fgf*Ow8c{IO37W!xS!KBz zv@$%>0MrKupvtp?B9~f5RTWA<<<-i1!doE@2B?rW(A}mPN>@z!OyqR$KBBURS@2uS z8~M7%AhO7o^dUl*KFfI~x7nNLDCIrJ>Xo?Ed!fV{tv@vdeKsutpQQm@Pow^k2h{uj zbkV9DVeQHR znaUfW&oSBm<+Ydlp;OM!p3$LF!bJ=MQhpreB=1SJ(uik981d^6=kWzeW|Kl-{W?BY zf{AC(4?(LDIXa6$0=GMaLCTPc1fnz`ksSbOhgbS@DIg$sqJ~<0&()a?Ke=!B>_jQ^ zUXe$h2GDNhcT*SzpN)NX4C1fCydP#^!6f^KH>y~?s_gS#ieek(D9CvLT8vTrA3BXT zl1lAt!^8)~5Fi@Uc-F;mJK<`~VDFGT^L&5hUqJ{a)+!l^#Hlqpal}mQRei&ua>P0| zuG|+Xqul{Aso%31gkp2M_r>!Y&g3szbVJo+#8Kdp287V>S(=`i>C6To=^EbO<*Wy5 z?@TRhMn*rS$xznEE0SuBF?+81A@Mu*cpjt~FanGk>sHIh$>?L#vzAmB&+ICGOM&&b zXx6Y9;;oFv>Da}_7hRk~P`g<$rb;0g`Z@_Q%DmJhG0ThYGep}VW`9r>ETg|qtS~3b zbMKTyFku#^-sOCKHrAHQgciR$B8i6wd`_kEuC7u(dtaoifJh2*h67Qc_4usIZe`_V z&$v7!PZ6*sGK$%F9S^rAuDiD|av*e+O}vRXM3zUH0tS9bfahGX<02kd=JO0R+dU%+ z{>$1~JWdNK8#2xseYFd6c(k@FUM;ad~ay88xdphQOh7M&Qkq%^v*K!6ZCd^Q4T2G_B+ksK30v zg0#q11h95{7m1e}OX@g7u0rgQ$cPN~i{S!EN97@gk`TUNj^&CXbq&gk1R^~$D|6Ud z(XT+Bx}nJ*iNVz-Cpx6}lu_G}irdJJZaUDR{_DXIto7AsCfj6vCTy+hT zQ1>o8(TLa7%_L+9Hx*S`RUcdzSrR+N=^=9z_^8o^7qW>eRyY=&=0p5kS=qQ;(H_^? zlIR-KnH6*)Yb1yQOy_)E|jSes}ol%V)Xfl5Lsw%m#n$N|=bkX=Sm< zee#z)d%l%q=TUJ|)a}iFb@=uQpToU9qumFtnv#iu?UFHU5-H-t9CUu_D6Av@mjbO-Q6*!6T}N_7t6I~kuMs&Qq-G{ zvqEdz#)vD6U0W(6wIZh$S#dB0aPhIXNSJkyFB(~(5f0pA4p2Dw= ze4hIqV~$I>D2kk;u-tTlo01Yt3(yT-MYk$6-RLB<6d?HMZQwUgIla><)^~fRC=$#& zC__e=ZapEp^4w7Ju}AEWb4;ZI*18ajuDNc9^$UrgioFs% z2|uGmC`hlIRo3`3=5q?Ki9JJTPaVvM&(OAeM8PRz!Gr~faOGwE(!hZbodnkIwP8*r zi%@;Yx^c`=XlU3QY3COyn;$z>=HcYL&9o)>0<7}6dpgHR*mAoA7zFC7wF>83MP^9B zexa8$^5=O?Z*0d;Ruk+HH^#n2N}e>p(TerB-I8*~jxt27Ohl(>Uh^&c03b94ySeOD zj=G?wWMJ1yoR$OI6^fQ;J^UFnh0Pqq@W*~E4+2vq{qonAi*+|SEAr$@ zS6SI7s6%~}7g}##N-G6}IF{D#g?TQmo|>fvnCYNDn&YhQG|dvgN^jJ~_3$2=qiD}R zin(=4f|M8_%}O9OlH0nbDQ#OORy=>cVoz06;(YPy}J9mS8RXJ)99x>avHBH9BHd%AdM_}-&s-6uQ2A6}yc2#|O ziCxf)5+0ta49x#xj!4CnNqBbK&f&CeIM3*I)hiO~ijifmG*ONu$j%4OnS!7w_}6BMQ*&kW)4 zffa6*&GQdjjQPz-yw)^mz}#@EbKxhp_0N?^=)CG;PPM<)Hu0H@GQlZR%Cp;X z#n8kButP%oA$aoM)}B1YdB!h{=^u<=qsKlbo=)AEcD}i5+Po?&qcm3il6{c7)SN4Ok>j&t17dPs}*h^?YdI>@T!*`0)`4%iQQW_SQqAafINlKD%62+3TIh# z_7Y@V@)mGHKW~GdxM7WRVFfHdt#H%&`hBoE-kIK=EQN4@b zvu9wcrCX`f)j9cJG}I@_d%hg zBm4SQs3VBa@HD3E_cP(apM^6yr@Sk3W_|xzO_?s9Lo=HOOivw^({8PCv0g6vK{|I{ z_XR7}y%>HRQE_o8=^m3?F6m1a=x7q{i1o;0UUwjRUiZ50*Shz0-`9O!_iKIEkO0y6 zHSu=_jL?Mj11CvPoXW(fTyg0@QG4G{tq4|3^wi zV<$L?4UK5L%AQ?n2xwhQRhG%@P29z68B5|sg;H`@wj{cq#7YTkwZH3^(3)o5txc|K zg-fj2L`svP%6;-NOr@$&jzf%_OiHTtKFdxC3f`u!-%M4y-q!!f^HY}mHI>#lPLZET zhxV-ZGz7C4uaM@C6HO8SIA{zO2fZ#F}ay7J1G#6W`kQMdi)`k+Xu; zwP>kK;Ki)$&zf=#^BAet`)pn8!#vIObzWB(*T@dvzlrRyzC*FcsC-4WiM<@WCms6> z&M4b(`_Z(L8@_zy)`@0){n?QQzZM$@IONAkvG)0m5#Vosa~kzzk#sXa7hK8V6l0?P z_uyaBtrJyjN38K?B8t`zMR{GN%n@H0OS0omY&XqdYNyn*-d5SxtCP`)v%rjGQcF-5 zsfpZup=fi=Tc&j+8sO0p`ce_=+=gA+hu;F(K(J zF&LJtT-XUOml-DkYxHs$`I&wCICdhB`GQ!djC-Sqw`*}A`?z)lF$2)96LoAyth1HZ zR$L*IVdA=>d-WDb1Jf^gFo4Vc~YA0F&wYlWLi<7oU9Yre60R(8t3U)jGZ=_w*X5 zrc69I5>$ST_6WpdOke--kia#!?3}~ob(8Nj>n|NDwbU2d^~HtW##VSuR!hT{TyTY5 zrFeprA~6u5hO3r+8=S4=I?q0Yp&VczhLY6IO=xC6T!`H>xIZ^FgzZ}^ABLcug{GFH z3#>?b?emfutyITV@*g4*&Xpz~#RwKm69y@-Bzq+&P~P*4)Vy8e>LgYU(=&8jcsQ|& zUnUfKw{guY^H~a5=j=D)3IciQZQo_b;x-F*Xjkj=x2-p`uU%M|>sTKj{K8sYuVZay zk1p1MVnu&H*kMPHdt*9_Hz8v(yF%fGKiZ2gOlxDUQYVk@FW89ldcmT?_@~t`y`_xO z4J(BPZZg`bsCb#5Db~wE+O+HSFQEtcMKsLl-?#Ow>tr8^Q({ds4h@9d0f-W`ue0qW z99~k_8zC+@TT7UZ;%|!%8NreQJ@>SBNXUAar!o+Wp4$zcjBGx4?gKYi( z#V6!bA-KyrR`ZaZnqfi%2S3QjPwSq_pD-UfJ&nr*2xLdgC{dca0sOV+xW1_?fGe^q zx#1j56%3qWgmUo;OFyz?rKwDSV~~NSwM-o!3s5-WRII-30@;NkCfhGvJ$=FzY01r9 zC>(C0Te3Q>GRE$SN>$OgE?GG&Zv89{5nhzAran@QL&0K^GAqA?pbv}0odU#?RCBwT!og+{>l$<*qq@$7`U z+*CjhglJ$u03=O(Y0#Zxf32J79~WCEg+4%=J0t$3cq z&v1ml<2lXSEqGbBmN6d-1uMFCS+Qd#nEBWVrT`4e7?(o#@>*Y`$YQ=;{Vh8_HVm)1 zH(s@9`)d0rzmBZrsq2Vo-TR!u4)@5>y(rV~J&2_Hnb=T_hG-AKit&)b$hktCQX&;b zld(k3y7gjlLqlbCP?zkdptmx+o(4KyfPcj{qE_UE1+_A}o*l?~k|gZj{$@_OW=@$z zp=e^eUQN!i2V-NvEl+^UfcgWmT_@AklRK{SNo(Sm}; zS7*We7Gs11qbUIF_KfsFDFFq}_tTtZ(LDJgm%kMgy)Q(snnJ9K;1`ckl1Ag0>a;m# zwVTo?`E$U7dYLD$MnD~hF^_|>y zH%iu^&?2w<3z}@rU1EvSZ)VKXabuKXz&X4zd(>&)b&DTel+=R(@Q(Plf|q#SFln_^ zatGd#s3`7aC>9SBkH#EE#kJGS9$GaJav5$DpTs#v>SI{KTJyLFEFKb*Rz@hY|BH*1 z{9hQmJc+_m>1?ojIoya*I`QKmX-M9SCFQ3U9@a^dD_Go5buWpQs_lsRW^9b!v`Lpu zyZ_VDS$$avKeoE2)=hI0&Y%9pg)A}vu*sHuvo4`78bA=sozv$3z5gqk9dM>e;{Qz- z;feWY^4Vlbfd7qG%jS|~mH+pqSMK1c0zy0QGvPI-D*eS>L5qOcAHOY~26kE0L21rr z{iJGqxU4snU^Ff1R5~^#fCTl%Sh>n)CgRZgUxIl0NE|eRBe4>%&c6-~oL21nk`aOC zP!v+Xf@g~+5HWtZuY6gA;?W#wiC-rGxS9o}qY3b{`>y3V=E2v@v5vq ztm^yJL97({!qTM|I6qm-z4Vq6BEQW5T5O>Qb&tOhwWJh9Kd4jgKX(+HhPTm2SMJY) z%7oYkk$74=KmzBSk?0^SHoD%r$DnM(7PMiQMjaDj%oW1N4%5AIdJr78BFz=ZwPmi? z5=3^9^@;`G^xg-v9n0QD2IZ_L39@KaYPG7$T)F!l7-#Pu?>p+@)@O*U1}s_8pE8 zVnNrfd}4)3m$Bi-;Q|bx_t1pWKB}vkV)Hm;PZYH2xS)hU$rv988WwoWcL~H)K!grM zPf}T{NP>N^S2F;T->aFth_Y%-zGK8Y$7VXl9M)vW27_eBZEUop z7L|V+fNLa{ZCPhehoD!`&-+lgb_@lzSr`9?Wmb6D@u6bP$DpDdg79&c^IK)~(wV&# zM8bNvcZz*FJd6_aXtgPm)zV!js1bxU z%(zpW*AE?m01~EDkmXm}B)^QcMj8GlBDS$D_jx{emgrNxTg+{;{(FAc0YliBC};@8@5G0nR$1f z^xY+Rs8t^m`z?W47V|`Rzf14N8y-N`d?=`*d!E@(Ex5vy-rT2E&mHcT8MB^JuA22} z+faOxgUNS8niAByt}YRT+JjZv{K^WmAuxxgCONe!F#@2fO~Osb)*k`sUmZo)_`L1X zAETtrzkXzi6I2r}kU*N-(VtzmXAwllgm5uUd@up zNbOxu3?LHxNZCL1t_`mLO)Ba!Y&z7)nSi#AAYqK+?C!gsxp&BV$^bw^j$u9rE~v(< z)`=fRML2VfWY6V|6z7p2oyVcolbrUu)7B6^amFF4e>||Uu3mR?G|1dz7@F2XPJYX_ zQknLJ!J}^CWSA5pYt;2GyUfMY@G?AKrdMFD0Y2p;mL;6r=mAphb-8Jvv$r&AwKvyT zQ>5zaJ(f1Ae@XoKl|8%%z%74ioviBU%5)vN^0uly@7=m-_6I{vW4-&d0^0VxsVZ%F z^`p*9PxK~y-eipyPcJd(~17d(ZW zOztFBM}gfC8H6_nEVWZSTvSB zqh(9)9TBUS=yU>H!fWWd{i>5?rxBYt80b!d+F#MC%F=URLJbDMZsT6za(dv9^lPv& zZo7apoC~hxZI?ktC@6OX%Nq394m|IEN-bO4gqhGbAUYv+sfkgoWT--&f_9j&lI&Xv zmR7=Br;(FinKKsO(eVlBGW;$mbdtTZmaYSXV;0l_){r%r00wC=@K%3eURjFl%ixp& z0GSSMoux-eUibxzBhsTi(qoBPyD8QBdfAusB@NcH$9_&{q_j(ivjZ@CkrQdhj#0WS z?N5HF^>bDKtaP4>FxCh3Ho?GKBZZk{m@}JNY$?iL8!Mfe)p8+`iqBy_XgJ`H=MZg% zTJ)h>|AuQRlMN_NWM*`7q&RH%Xwf_nFH*jqw@~%j*p5`&55`>4y1tQ&cEJ8wd9vbM z!yfi0iZTdayeO>X2!rnwin+=6ia**zRxN80?oD~Z<>v@J50?QJ-!B4U~ip%NxGuY=ifQcsRWgo~Lg{YB=<1lgv zbPldkM3r68I*G%^Ub|e|It=Z=sG26UWDtEu!8DD?O^k)|W48Zp$I5TLcCXMz$G%@k zY^3l^9pmA^thg!&5-oC|MJ0v$9%RD4+Vpt*o+-5zo%NA^^tHVg^<6L9eILq=#Z-Zf zT`)On*VE8vf`M&=t!S&VPo#N&beZu*Mg;e$_5wTybO*Jvr3@& zF$`!QEY`HxqRSSY>?&}to=%brPJ3mymscD77j%5iIWD8Qr;k(fr(-WSrbHkr9w_JbX<{KbVcGLG3gUt z_hmV}4X>=%i|O9SQW(8_94B8A57W=zSnBgEladcyk@aAh0pL?Y|JMM5H2Ffh_reR- zSLPDhW;Wmj@b&V)@HW1_eBo|82=15@rHyRP<`R_myxC#UOHAiHRx7>P0e1^Y>s$2GmUrw~@ok5?TYwGsA z2py&Q+z0o102Bg+;s!n zZSK^(V+kO%d_`$Ko2X=#AgB-a;o-AT@}(I;Q0jCC5NBmcLr>q3 z8Bh{cU4vRQKjF*1u;A%uzKgkK@XMbpGNC@j8i2`ZaL>S=NYx2;5Nt5y4I99|Q` z1S#mJ-T5s@AVlRZvtaq8-1pL1U3Zu-wy=<4k2%~!DS(Lgd$Zu{3%Ph;!sX_?qHlT{ zFiu<8$PJ&yLgd1@F3Cawd~ z3{l>-EE$Ik?KR)mQx8+GNA-Dad9a;t+QW|GC0k#dJ|~~{-Ce^U|AIY9S{}i9`W`aS zjX=Q3{vKRZ=Kb$xEyW47aMA*BV)`D(8*Gci8J}IsN2gGpW^*ISUY)fo-ns_PM_aP+ zkOMZJAQ{EC-m+&~t(^jJr3CwTQu=AxBW1A_p*gw>;a8F!JR6Mw{Vh6GHl2RZJY-2B z71WwJ2HuR@JDPWJ)(IR8{4yBb9E$DmqpGF+zA<`Gcx@jlu4+`S>RILU3HZV)wO!`YmDd)85`pwh<~{BFZ+8asj|m~G zKVP%9VP0pK2c~8g{YWeRE){ONObQo~WiZW$rfS91$sBqul9$$tO2U|Azgoz-PA){0 zzT($g5z(7EOg)8V2yvFbyaP(XEE&_)yCTeY@JG!2?5KV8bsPzfzpBrNXXBUg{pmvX ztT&kA#)sboQPQ3|DhHuN!b^oEM-S0(g6oN$Ehs3PM~jpK--x;h1Byb31;YzaStH4h zjv;6%y52teh3V*?^4qkKuF#?+480DN&7g6#Bmg#U##IjR?p2sFexr&?^w5o*5H!*( zOK~Lg344eO+}l_U^m6g@kB8ZZx(W@r4f)Wth4a$6Ser(FB(1t%Jo*Ton`ds;#tMheiMI(=lM@TouRwNylySoCOy~ad`#J(ty({mAu;>KxD+3>%Z+*hbSNe<)} zpkShcn#|A*3|iOrW9#m;LPO;Q4i|wuAar+_yg~O`rJ}82t&n?+mMUm2qsGP`wnY6Q zAKt4aC%Z%1@AfRCNTWI50Sr{WhtY?p7bB| ze`(6tHlq_Vt5Qg|EM*niiYj#%*I`5PUe2U)^(ge(;ZV_@{^x$IOEK4vr)`P##Mjiv zZNSREXxR>QwHR%KgGOPzI^=7Ivr_CQZ$|X@W|aKb9%Fes)HOlxYJ5@WKp}C`%5zI0 z;BRVV0Cr7LI3#6NJ~KMB#5KR8Wz7Ibn8HYOF6mAZheLcVQ}-NKf7va!WpQSx`JS=O znc7T)lH~}W0)ymlvUa?s4Qq4qhqY>A^{w&?pS(fG-~WSr#qXK}e_)>m@%s=kBlwkM z5(Pw=4~aNQQWLiscDCME!Wtrho>&8JovgbQDZF6=Fod~_1#^l#H)b3v`Hx3{{QZ^( zHo(_}kBkjK_z7EJ?7&GrK_GQTl&Y2hoziL9aCxh3b6{~)99FYLGq0V~v^pYCiVxYV z8fetm2R`P!uoI1LUjFs^>a_TO{{N4Vbgs{DU%Zm1iq4Ew)lx!Exv8x3Pgi92k<#D) zl#n>#GtQ!8&KL>F9GInS!oy_k18T!BNbVGOkud5Ci~*qA%+-3T~|D}Twv*Uw%wxXGbdQYoM_k;Z#dd9>{ zkbQ2XtRs|VgZD8j8aPSHVGa11G$u3kABGxLavQJ$Rng5!csy~ANzE0>o=X4u`_^U4 zjHClDE1#J1gJS_`y(bQ{Frdbw7t3eR$bTTK(@|Xfk;j-uq4+A$hB;~c**gx5pk959by=2;;rbXKlAqDt9kjz>Z!`!)j&^&B*ELLVjjW zEeKC(K9mU$4LU`nUT|S%m#D+%Slwi64VlNZ+^^W2u>puScgdFVzn}j5?|=OLZ-4#s z@BWt$8~o*mZ@#L06V(plmt*%LC`6oI^T?ei?}n6bX2`uh(fNceSCxbRxS{y|FR8!V z>^`?R&nb4ywhZ?0FAh6kyB~e*ZO?nk{kFQ%HC9{Z3iHf1!vx)$s2~3G%M~jFIUM^k ziM0>*)duT?0Y=M`R7${)3?e5?%z$SbZk@Pvt*TDlq~lQrcix#gA1%p0H3~;6{kK1E zTppJKMULD;Je`rzm!)k`0)){Iq2G0};}<^qVl|Z`<0W=KKYUC^Rrwb7`td&^Gz3)Q zgSOSh9!_2KL8M5~$tGkp;j}ePXJ?eod_5DO4=r#Si-LjOY{#$?d6f{x<#OU+h{!U+ z=MG+H3>sH>2gsA&@1hKBHs#u}ds6X7y3veefw~#5%9-GyMR>6sDN{tS+tm64a78R_ zJq>rG_t8S`q>J$1-vuz0sNdOY-xAmWBl1 zLl=-Ky#W>MXgPKxCQzT|4;tHk9_d2X0lNT$XM_N3f~k|TiZ7cT6{>1!q9r>p-89d- zlX}VEMDnI#-nZn7vmjYw*J@c}@EK~pT2fywH*=VM1XNES^kyTM{3FSR-opYSQR+kv zXs{#IO6}<-#D>{pU}0prnemXvkhUZzg61L)$l^q-Osp+8O+ zGDQEhqwAT4s0w_*H_3SPGgW3vFmc?!C09!Zy@@X!qh7rcdg;4PRzZ)kC2yPEfFp+c zIY+Ue6dC|Y7?#jumdDg-7nD&k`RJnDp2k8ypNsnpWrv`bIx_zZZj$`X>obYZyZ}J> zqN&?WDH$LWmB%yaGuh+DA)ZejC2QM{9<;_Haa(y*R)1g3+<57IVn5rYp+dqQ22BC~ z<@@HYrJB7WkgCa)f!{t+G)+ml(0giPess3IpU>u~=N=_tLZ*)=#Sfj`W4|xr2&9rq z`h^kDw&zQO(BaR9-j)TjAxpe?NgGbs+h@o@$NHQma7JdfiAXY*iRgk^_R&+kl$+g| z8&Uh-J;xyAqk(mr_;Mge#)p3fgG2agGx3R3(Ev;h5P&i$xDAr_{_n>dd&2lS8p|2i zaZxc#jy(I(B>?xfbpb;lW$hV4$7m*laV6ECiXloJ#-$9%{}D?a%Jbgsg9qey9i2a} z84xvzVyqC#Z!FDuJk;;0~LxNKchMhKDDi#W%E6oJ;ISO-7y?2L{vI!Tq0*SU) z*c?^yN-r*5_9689k_N(N3C66dp?=?TZeV4zP`EwHIK+L5pNz&vhND7WD;C=+j6k!p z^4(U@g1a+d8Xve-PIM{(beSmy+-YLkae`P@ zx8vjhqT??YWhROA_hnOd)N$HNcR8N1x;x94dv9%?KyHQy#bmwK-_lawzD1+mb!$Ji z@rQg1v4L)HlkV}+bN7pC)GEeUtR24WLEEcc-yEBDF8W-zJ3v@Q0Kh-Pkc~ut<$(g? zxDTcy`B3;7H+P#mBA~!^JIRa+&ID6W68B{z7Pp#bgEP9Hf?BY`=`#de=to~1=ELod=-s!xNiIXTS?lz{eRrL46H&*_CV(=xeT zWtT51XZv9tCe<5&<@3wwem{TgHEe`(CNwv3nXR?1I*o~`1V!N?<1?Rayc2w@?K(>5 ztjLNE?6`}hbFX~|EHs>1jR%U;D2VfRT_B4-z3Kh@_k?~z^z^n;PGZoAP^4W@Qkw|^ zOQpqR5*Sr`&j`SF$c$$N=dVaROlgmRDKvQJU6tv`cGvGW4}H7ZrxT(%aSMP-j&7i$ z+`S;RH-G3)6+N+#lc!Lp|9TyxVnKq|89s!I@|j6JxCasP!wb^VHM2xF=*aLJbbESR zs${RX-J{SbJHi39vE}%~eNrA>Mz#MuG)|fVI0Wte5hJmBk4+689HdK?(>~?Ew6v#l zDnFI5)(-ZYRpQM2&bEAB#E|=JM5{Jw)9P4@SL1?G^IPKDf=u(UN7$uy;jD zn$?A%4!nBCwW_t#1+uKfYdEWx;!={25$P~gvvBLCjAJ|9j_du-DOanSjW=xXt5;=! zz)u)cin>}ffTH3|wLB<|!^(JX)jLQMd@&Aw&6&T(Rc=H0EKLg4STSGHn91SGac1?7 zRrFK2zvoNGMAhjzjymn zA*uI6f5*n_q1hELprk1xnuKSZw+Q_HL(L3Ilgq4Jn8JyNwG}f6o&(>g5P;BC?mo<> zq`R%&IoT?o;aN`NhMKdJ5$8P8?eNS@dyH8IJRz35|NGGiCWhH)g>Dt{q_dTVI8ER} z+>Mxsguub?_|<&xDuYqqx2~>kQqMZ7bXZPSk|u>mfd`F%qf1oI|8N_S5l?y89jzMG zsZyatk(;t)NR=o?gv~bmhUB(y2@o*ZYhVQp6C>i!iY{6zvhdFTkHh-kS2f3UTFAd9N$du7BqqfD%xbe_Q4_a z+k^dNKWux2um)r})PrO-u2%$GPH7!mD_`L9v3Ch(Gr20=I6JAhT!>|9+elVqS#C7z z?=eC1yDeHxoA@w#I20Kps-aLV zsxdB4A8#XCIY;fU%J+{ATSB3OB~8CvI&R&$PdM3?<(!g1M_X$HM(in5Km@f-GW$i4s6hR!&nDf?MIbB4sF2%uLv=~H~w>-N^l!11>c~0m~ zm9J-I2g^Pr$HCUZez5u|Zk0~q$X*PQ%>0Df<~;pJjE~1pU%=2tQUog#!w|l$Z6}r$ zcO7CJZiNkD7$y8+*aYwjK7H$YQ_jLH)M9gJPMlwhz1S^tWDL*hHG>=X>#1ji2`};9 z6>ZybQbRqyv%z!{*)u$Ee@g@5^)Ol=XL30zReXO)3Uj?w9sah@Ntvd zKU3Qu(%S#(0l%!k|Ie#R?b#WfYBb564KcM!=f96BaM$%~_5yvCLSWRpZYb{Ku9s|K z#uRw=nTxRv0n^Utt{F^J2Y{3wUxyY>Mw&%T1M*NUWM+Em~>0KB`WVBQ86YD#jm`j+l~?JhI7qT zj7Zem_sVXj%=>XP&Q3$Nx$yc-O@*f?Bi$3#9S6dRhWCbc=4bBeoG;b%{3tvkk*&?51D>>bPUw!SuV;mcu*L0K z+9cX8F|YnPeKMyhwi4?r*%K_`<5Jj7qkrJK@_BB;Big=Q${RQhL-{`#-@7*`(QJ@xkcJYMVo!wpG2*PG#|duXath%Cbj&2$no+X83-! z!IB4AuuT&|2NDQd%*%LGw*G?k!P{x% zB&V12?5)$|ssS=7!^fU7mPAm`iF!s1=`AKwYodM8*?s3G>BJh+AC0_1$?PM-dcW|1 z!ssK@=Gin+892>1&k5b}tJHr;KRDQ!u=>y3B2WLp;br%UOb5fi%-``oK?A4%J%cT4 z>h;R?Trk*8AUnMG2&3&jRbNqAR{EnYC4J>dNNz>R?ytv%p^~}2b(M0lhxU)^z-Xum z>e|z|(`k{xKje;(nF_&@;ZBB4=Wy{TGBk9vlF?KK{T$H#cCP%CF}WjcGe5^yIz3d& zRw!$$u^c&)y*MuEDOS^up!=vhDK>A9S0uB~X_~P)X3>w1CN+x)fyrbu;gG^?+hpky zcH0bHd@H5BI5f_;awHsrO=r*6mN~`7Bkkz2z%%hpq29)PU5kKl4uTajbD52ln4+F- z1r*jqzp~@lJ`+eOm_v_vZDS5$Ofo6{hPlTc2JWYFdx)C0nR^1Sa6VH?_Vw;+xM#=h z9}^VjYPh6VZ>1qD^|U$#cD1dHi~TcYI&^I;HU#VOJ&KoZXEUSk4;bl417Rv+-Bz`c zusjz)%RHxZ#L8YVX+a*TD<4~g9g3RPe0AQ8aKjjJ7gDL3zLJ^A;vhDnN|J5NWca8W z*m>5MKY1K8=8=+OzOy32-+(RmaAKtR9G@p+P>+|}1GYgR*!$bbp<4om$@`}pO#yw# z6z75Y$X;$@Vm{lFGi8C9JaE$lQ|z_P$@Jtt(MAd5kXa}uqa>qN$8#ddiY!3JrRpuu zM!qMi7ce(4B*LeRyHJ_GL~KY6Q>^wN7~BK90V({{CjACm>pv}VLc6xBwQcW8ljXg-NB{NQf zI7G2$ncY1-%b|5qL$l)Q-w_#Vs`QK+R}S-L_~#R%5@ZDbyU5gEh|*;|EX1;BFiFmB zF6o?iG=`(>!Qhfcvooo%%W5$ocD$+8WRTf~G-)^+i7p^&9wLLEB#g_B*HKZjArHy^ zl3#0Epm9EK*86tRXOGjCT&;^(Db<|>tD`St?}~4>WrOF$6Av7o}9mRG;RGu=dq$!^Tq?HdCj$0Lk(y*i?44w)tq z*^hydEm+H{RuB(H>BSn^9e{sw2kT-M)p;qv7mGXt);`G)!5BA;(u2f%ziG%9n0J}_ ztgS_`Om4&pyN7h<95`2MPG)R8!c zKxS8Mk+EX?*{A_Ke^*LADMqBT9LpZ`B27-zVqhyA${UqM2J|_ck`{@)9^hvh{%&5QQ>QC6^)7#)+!>bTDH$O0u@ypY= zmWgLhl8@|e4jjS4_pvy$(!q$`LMoAX{2#ON>Lb2}RRzfOevBHU$EhY_i}}7CO--R{ z&deEEG03xO)+?emy1~gpv(yZ0sS$603j9Ybc6#@0DQqvmYvLn1|1phGr&r)1h$Q9iP`T6uJ{Pvd4@@rgA?$Tg{(=ybl5z&Jqu{ zbf!rCj-8Y#!H@^H12xZ1Pca5-qsw%QKDQi{>uZNNo{S+A?&bK!4uXP}B6Wp8$dw}k zx9=MUw?|O6>99ui{v3T}xO^r*r{DM(&SL<>zcNC97H@2+9BuT^E?gbH7KWVR=YDPx zrOVxM%8@=W4l!Jl1%8p?3M=tsn_-yXe~7{Nc+pi~%ndBX zgyuhfpRwwKPnATgad(`?nF_S2zA30o2x(|*7 z%dvI(Q9OH^XIIb6h^~yO6Qf}SHE$r_aDt=TrnzkT6ZjQ`5wm>(NW0pS(vzNd?3Ylc z6zrD{eYG?r7xK8z-K2VI=VZ5k&7hBAyww_{)%y*5g$ic&OifR3qi)6=OwK`Pi>r&P zFC&HsFL!6a|9_|!wX*$L^%OqAP3j+cZVsnHt>LTg45w24240lAy9M{PszG-%CC(CA z<6;hJ{=Z#E?$qEt)&754UTDj<7*>|f|Np7{>z{E6PeYy0x`M6=o#c80tm*oGQ( zS5yM(wmyOXboVg0A=J@tq~fBu@tp{Ue-YyR&lrt~y!Jyt;Uq)E6LaQzVOsa8&(9^J zq{SDZhbSiZT0A7a|NBuS~W=t0}c)%G3>V*0ShnpwjLSqimFuW~u>g{<#7ArZyIVo*hJ6Z;BTRL{o zZ_K{Lx4#R`ZifQouLJ6kE`e$7ikA-|*3NVN9kLFrfQTz^!B7p~-7H+mHFg25V)W~+ z?owB1xkqcR|3}6(I>`kv68HzmU(YK61hhP?QE8@gf)ZEeD&XvU^BFyt-p}0hc7PSR z8wzb0{&fi?S2YAP)S=zbgiE|;ysp)PihhNR?^PtlwIYP~7DVMsfMglBl3jy= z9a$8dUCpxD8vQR$xeb?~lHvZR*>dsApHHYK^UqwUh7Car&I5oyn}v+ndRJjA`QAc7XT}_m+TWOB-r2(TJRmWmSrWCQi_3ejP8&5 zyjM6A#1)tc>M-I81uNuB$U`#lEb1rQIIu2@w2{?BPT0X-%2LkAGozI4W%()yk1mE; zKrT0o`R~y%vT^^Sy<-m=?l@%CYWm)6!;n$Av2Mh zsd3C2No>o^h*%82z!hR(6tXL!NWkS+W-^_)hWrHvi-Su>mDHA;_mi2Wg!6rM=rNP8T7*gqh z(V3x5hK^9+xn(ejZn%4f(h#ds1y$6Ewu8WaON3EH823oLRe%i*g!+MF7!zCz%muEn zsmyJxRhud@3CGaB?f;#@aun6Y*} zJ$}N(Nj#IM*lqceY4WDe2$?x+wtWAk`}WS__PqHE6f6u4^ZY&$kx@FEq_A=E2?`Y_ zCMCQ0d`~7VJtNcD41@Zd3GZZSU+FsZs}Eq@7MY1$UMYzIT3c>BApg-vojoPhT2|#(ezKL^74mWOMmK zu~e>9YgTo3qiJ(->+W{P?+!iUmV5gHOI2^;$#mw{#}-T9i4Lqc^D~f;9Pw;WB?p3` zux?R+*KeY_Bi-EC+|u55=U;aB_78Lp6UkIMb98)idX~-Q3y%7t(S z-Tm*i>o;!Rx_##^t^fY-+w{Tr)qrv2*ojkT&Rw{4<@zBw{)lwj9fFimRfwk*N|m}w zsdidj zNtYoLOIEc7a^%XxsiV%i>aM5W`np?x_ZsMagPqcMV{g8p&UChO78>h97rWG0KUm~RSNgG^EbyXh zUGGLW`?+7b)$Q(dw_p3Md;Q)Y-Pdoe@G5|jpO_ppqa^=Zapb!)c z90C#w8U_{)ev~OF8AX+ILC`TUv9NJ)@$d-<0YtoInLWK-Z{&k(x8n!pcU@ zi8zTly({A3Rm`VEsWRm%RH{;~M(ui2ylv2^NwXHM+O+G?sY|yhdbG61oN~hM=^Gdt z8Jn1znOj&|S$Ai5*#LkbFa!#NBakRG28+WJh$J$FN~1HFEH;PB;|qi$u|z79E0ij= zMjoznL6nqLQ~^K`7y^aC)zmdKwX|V7K@WTY(I|!1>`WY+n5uRnyl^L8B2%ce@tfFS zve+Chk1r64#1g5@&o*cT9T>*`oo=r`7!o8!Go$fjI%7Fr5G7erH9AnH z6PuvDil3@1p6mg&sQ@q#E>ba>4s_9j_chgxF}B2EHBEc zZrZND4C6E}>$V@~^>%+eTkTG_*B=Z=Y3Uo2Pa4FEzgf?}?ru1JbzSdJGUL*0`V zRnraAvK^Pr69j1fKlyQzW_eLobtA8!sHCi-3IKw@5GV|;rmmr>rLCi@r*B}0K%&qX zBV!X&Gb|2IAd<)w>I46iZkU$sxSk(`QJkb1P}mH+IMivn+#avx^Xqs))Jq20sHi5h z#cDIjW+*#93iNW`zbs)p5~)0QOvwW&u`h*3nW9dECN0`@=n_o~vBVKi0*NG%Op3R& zQg?HuQs+u_&QtRfBn%LFwk1iLEP0BQ0_Lbjnpiu?=**dL!-FhjZ{)?bK10S#nX_cg z7Dy5r#KW5dK^rZrT<;vMs@n9NzMmJjz1CHKb**N9+bE>g+G?*uwLC~hJIIcgo9G$q zDz&uI%P2EeS!EN4j-6M2H&M+&DP^MO&T)ZSylZXsH6TGl(c0Dn2lqmt&T#nk-U!D? z{8*_d<^uXL+W}Hz)S%A8T!C77EKZQDtat{)9Y2blA3Z2t!(G@_K4};YO+nvwJuKf1Y^6tO(^>l#T zoF8wE%P`zHWUffx_Tw>ds4tX1%Idbt~}eU1z2x+rR7G>~?p1adBU~9#=>Irsqv4 zY0-Eq9ghq0{*Sx^=i^fFNyTY;?@=_va`L?}a4DjL0B)GY|;iw}6fUZe;z^t}P z01Yw}hbmYh0Fkab@6?86(ZEF8PWZ3Vw7O*-A6C7LPt&9q@egNyUM4;~8PV(mKDVsM z0(+Vc8K+wozQFi@qdvz7;fiH?%f>(X(=DJ zjeIuyAn-@<&iF^dscmaAON1Ae*DKMYEt zk4Jv~C|sgmZI;~su;tV7mahd<*w4pO^0WLU3&y@K901K+sOf|s0jAPP7NP$YRSBF`#Bhh>-}_6;;Y?(B`$>mo?q zdiRJ%UD-dt>qb8<6JMW>ia%*;A7PcgZ7gBZGL*OxoDP`RUt`akp!jxB?+MZ}XO0>w zoEYo)@>x08WtZVKQPU%XO9Lu|(2dIvBv1y{kQYADOm|&bLGy|(^I|+-`RA>#Od$+- zBHw{*aXwu;=L61l*mA57hdFU>W}sn*6KrR3qZHdZNu8W$_=rTV8|xum2%Dm!cBbG` z{VIVMvd=eGQFT!bL|1_3)m?Z4UlQ8w#u{$Ap@uVopKp$^kT_|=g>y2o0Dv#e#nTq_$U(r6qLHFSjuJHxV{JqL z2*#{dEOg`gPyAub)0dv6X|q*u6QnU<KX@pqZ*qBDP^q zzGECEe`#GZrr`vF@EU>2nG;z_F$?p@Sf1H(2uxh@Q~JAl|{4m|HY!nZmxcHnZmr+dG&m=0fmrB)#p z#g}m&7Q+FjcVEVvNq3HR^fSxLBy+E>7juM9v3xQ~ooyaEm0=(=RGc^=LLXt$JV(w2 z*~(m&;G6b;_?DmaW>$SV2*)ObuZb5sO(_^Re81cu!A_%znE7~{FnjkK#T}z2FX=^A zVM!T?N)CpU7?FqyQLr@56oK}|-lh}~we^TrJ?xFV5_tEy5!mpSgMyo-y;`0r6|}iq zX8lMZgHz;Cj=r$#;%(87u~$d}rg>lf#}wO5F8`RoN02~v3vZ4=vCa;J@Pu@14d;Ac z!NzVIQcMa=>v<0Jb(@fC0*z)xtFoPCX@80-=RgcP+mqYRkv4xvL}UlCtX~DUUCdHU zRas_^6i#Y)9K)gqJ4!98vY$J!RMk&_d1+tC$}`(Ws8~2kE(4|TV*WX$tSCWHqupB{ zrfq&pgJ~zN^Eow=cEv>Q98FBmt-Siwb+BLGH+s_{ahx6F4=L^=qd?$dV_ zM&)9AS>=H*N(U-XrBQwWqb#M6 zmz`msp=@2PoQOsa}KrwG(|M^9vw=sT9Ntp)rIy!u0?Zqo6Y-qNdCg z^q>{6RUpum)^}K&D#;)d)FRa7J#7LHJ%DmGw013)Qk?8tq+aYDdibkisXC_~8&u6M zt9qoWvlK54us)0m7YL$QK#=&r(qFvG_q%Y9#chjpqcI^zc<-n1Nr`Ry^?X zPuGERZT!PxV}&W|Y%!VXAJRoGpacx0u0%`}voWAK?G90hO4m%ke7iA_PdN5gDDL=B z^+k6NB3V&5Onfepwm_r18|iHw#Tm1L)~N9FU?cG#53XG+fp@?@T*g?hL7P zy#=lB!G-@iAaprK1UI>q8c^!z?5(E`b)@1#Jeluf^!kddM}0+AgT8iZs4pk3oF3>uX*8XwR&NX-9V9$Ugu6jM8e z3TbX4yEhTV(a?7Q|M6i10Vw+0hc^WkMw}X!np8`KqtSj-m(B8r|DacMpTW^zsYeii zs2JSaLq=tQ&Sm3tjoDP4brNy~I`SQ2-EOU%V7v z3P%A#2qAgEP(lbHgc3q1rIb)g zDIu3aOt~$TftYeT*!H!BngM?09wo5hA%qY@)bHqBC7n{yn_|5dNa+cQRX<9fzWG~(zU7nk^Ovd$4WoPe z5Oe_rTMldXw^n}F`a}49h$rKZP)gv(xa?2$)?pYUT_AMsYSlea#OAgi)MLP%{rAjN)v9nt2GLgR=^? zsTJs4H~RP6>g??EIWwmNw?2d6cF8}b>Y6(5mRsSrS?R@k91L9+^Zf6W-2(flHQkM5?M2YQo>bG*FN+P=c+$S<$?lY5g*?DAaCm-($(+4C?L zkvaRR>_d!R^cIwc5!C~F8e()2%bP~RH6#OjTA@ttu7&N0_9$I5C=fyjHw%e(NDx8@Ej2Y# z%H2zCN3=)jnqkElV~p{Xs;xp(YQ$a=B`Zlv&xn~$jq1^eymU@ik?lf~Gsb0(kV@Cg zc#YXp1f@#dUED^io7&XdJOGt#QGa4fP=>p3R>r=<2nA^|0~J2>8zL`ky7)ksDB`9| zuXX8-NuNU?3S&2gE)?1KkxkSwMMyGj3?OsY-$YeA(at_`qL)Q?dC|H}VQY$ssCHpa zd@;CNfRNK5mH~4itMUPUwVQfuSk6 z3lv7r;`UHBuF-=45hf|IP9(Jiz;F?vtVa;I++>Qzvm1cXv$=(`)SA@801*z$3hS0x ztU3hfwPuVl#@0-`w(Pe=n8}?fHB({_ z1O&y}BaNPuM;d(;o%d3V)q&mp8`n^4%X^$W<{E;z4pNu<-3drMpG`N-B2Ht>{jL)P zaSP2g)@_^a*FKOE<4I#n&N+s?E4!AI5u10Kt~sMyhmqs7dJqqK7OAoc*60O?d>z>o zbIs@9agvzg8uMVF*JOVV z1P~~!Nl0U#liMr*T&T0@TzaWr5N#-a6tO80XQKa~q2nBCWYwFmhyZ8e8UL_}L16Gv zz2hR@Sv(e(0k01O96^4}@MIkJyqAq@mykLX|)WCJdNRiU|Ecc-Id)39;BOM_|KPi9n=PdeiR3En-3$ zx9nH^J%|YE^Mrm$3h&%4!C>`OAGdn$ap9y3Jpcv-As?s$L@)?S34O7brzH970Wcs4 z`9KvQfddRv02!pIE4<;_7$MY8Yl` zjni*r>tu|q96nB%60~dO((XoSBflJy87%qR!f)@8N=~}y-?@^k$!Mq{?Rsa>{nSX&>?S=O zsRzPLHAm7Tb2Nh#2n3*f;`=UqDIB3UKk{s`7XxkxSv)YXo5fQ)C14cft2u|t9J^me z8W~d9Wadb1AZIT!2&JuKctdL<}zSe<>8>PLy??A?=OZs2eKWj zQ#eHfmu$#!y>2Fy2%eJhw9W~;VwI=8aiyceP$((=P#((WN{@0xS>Y$r)N&&S2ewX`_)d%^`Cf}$w_M8YJTAfgaRi9|4?;v#&O-6&+XKgIDmfbsj*BRs+HUb3`L zMDUA~oqMtdzm(l6hOW^ru&~!!>mT9uG{68~tAC}x%iFunZm(3fDzr%4PX3^wEb;Phs966;F& zn0XANPYG)i$c?f*TB}*@a8obu8EfyH*D?*yZ|y zzBA-ouHxlVn$=7MW|BM!R3`P(LI#e`AaJGp@6C^Y=zn~#p9{W)F&pWSg~O5QamnGc zX>yT@C-RCqsV676v*IrHK4m9v1r z8z(4gJj{!&CsA3Uno%;#*1JGh9W+Rr-9G0S@s#_NRCd|y>4W|pZUyY<*(gyBa$wf@V?=YZls@RSndesl6_l7Fi zKfnL}jdunW?xucnyU!QytsbL3WpOffi#IY1-+ltc9m>zJe8ZD> z$wYss*d;Svq?v84CMh#5^;*AW)mkPev5(h>`^0AT)Ny*O9C3qix_`y1-6Dt5UF82=z5YZa;8_(Ejr8#f?`p+(GIPsAmL(xwp^e3 N#!G)s;2JO>~QPMdMZ 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

xz5_8aF@(pQs@zgto+ItjS_s2^}<|M=lFQ2 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,qWUc(1+qXDfx7@=bp~~)(TqS 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 Psah$GwaNdR#Q^{S={DW} literal 0 HcmV?d00001 diff --git a/static.files/NanumBarunGothic-LICENSE-18c5adf4b52b4041.txt b/static.files/NanumBarunGothic-LICENSE-18c5adf4b52b4041.txt new file mode 100644 index 00000000..4b3edc29 --- /dev/null +++ b/static.files/NanumBarunGothic-LICENSE-18c5adf4b52b4041.txt @@ -0,0 +1,103 @@ +// REUSE-IgnoreStart + +Copyright (c) 2010, NAVER Corporation (https://www.navercorp.com/), + +with Reserved Font Name Nanum, Naver Nanum, NanumGothic, Naver NanumGothic, +NanumMyeongjo, Naver NanumMyeongjo, NanumBrush, Naver NanumBrush, NanumPen, +Naver NanumPen, Naver NanumGothicEco, NanumGothicEco, Naver NanumMyeongjoEco, +NanumMyeongjoEco, Naver NanumGothicLight, NanumGothicLight, NanumBarunGothic, +Naver NanumBarunGothic, NanumSquareRound, NanumBarunPen, MaruBuri + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. + +// REUSE-IgnoreEnd diff --git a/static.files/SourceCodePro-It-1cc31594bf4f1f79.ttf.woff2 b/static.files/SourceCodePro-It-1cc31594bf4f1f79.ttf.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..462c34efcd9d6b70b42359ca1a1d9476efe43eeb GIT binary patch literal 44896 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 V7)~)yDZnpu49h_gZvJhn{{a>V-DCg& literal 0 HcmV?d00001 diff --git a/static.files/SourceCodePro-LICENSE-d180d465a756484a.txt b/static.files/SourceCodePro-LICENSE-d180d465a756484a.txt new file mode 100644 index 00000000..0d2941e1 --- /dev/null +++ b/static.files/SourceCodePro-LICENSE-d180d465a756484a.txt @@ -0,0 +1,97 @@ +// REUSE-IgnoreStart + +Copyright 2010, 2012 Adobe Systems Incorporated (http://www.adobe.com/), with Reserved Font Name 'Source'. All Rights Reserved. Source is a trademark of Adobe Systems Incorporated in the United States and/or other countries. + +This Font Software is licensed under the SIL Open Font License, Version 1.1. + +This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. + +// REUSE-IgnoreEnd diff --git a/static.files/SourceCodePro-Regular-562dcc5011b6de7d.ttf.woff2 b/static.files/SourceCodePro-Regular-562dcc5011b6de7d.ttf.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..10b558e0b69a74b8329766fffbd5f64356c7230d GIT binary patch literal 52228 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 z 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 D0=ucW literal 0 HcmV?d00001 diff --git a/static.files/SourceSerif4-Bold-a2c9cd1067f8b328.ttf.woff2 b/static.files/SourceSerif4-Bold-a2c9cd1067f8b328.ttf.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..181a07f63bef8f18e42a5a57463e0e60cf8e8035 GIT binary patch literal 81540 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 literal 0 HcmV?d00001 diff --git a/static.files/SourceSerif4-It-acdfaf1a8af734b1.ttf.woff2 b/static.files/SourceSerif4-It-acdfaf1a8af734b1.ttf.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..2ae08a7bedfed08cdfea76039c1bb1fa1d6cdf67 GIT binary patch literal 59716 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 tC40Gi`Mi4m<9BpxR%m?w=so8}_Gqj!BM1dG + +Copyright 2014-2021 Adobe (http://www.adobe.com/), with Reserved Font Name 'Source'. All Rights Reserved. Source is a trademark of Adobe in the United States and/or other countries. +Copyright 2014 - 2023 Adobe (http://www.adobe.com/), with Reserved Font Name ‘Source’. All Rights Reserved. Source is a trademark of Adobe in the United States and/or other countries. + +This Font Software is licensed under the SIL Open Font License, Version 1.1. + +This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. + + diff --git a/static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2 b/static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..0263fc304226d90e224e53053855ad138303b70b GIT binary patch literal 76260 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 G0RRB5qhxRZ literal 0 HcmV?d00001 diff --git a/static.files/favicon-2c020d218678b618.svg b/static.files/favicon-2c020d218678b618.svg new file mode 100644 index 00000000..8b34b511 --- /dev/null +++ b/static.files/favicon-2c020d218678b618.svg @@ -0,0 +1,24 @@ + + + + + diff --git a/static.files/favicon-32x32-422f7d1d52889060.png b/static.files/favicon-32x32-422f7d1d52889060.png new file mode 100644 index 0000000000000000000000000000000000000000..69b8613ce1506e1c92b864f91cc46df06348c62b GIT binary patch literal 1125 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE0wix1Z>k4UEa{HEjtmSN`?>!lvVtU&J%W50 z7^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+@+{-G$+Qd;gjJKptm- zM`SV3z!DH1*13q>1OJmp-&A)3@J_A;A0V7u0bkfJ)-`Krrb zGey1(YybBo_r#8#3kPrfo#tA4xb3R$F4j$a9H~9huUPE$JQDstTM~O>^@Ps(;>UH<3Fx0=LBZUre@8723HjVToWun1;~KVtGY7SF1E7liM5< zHa%KaZ1y+v;MF5PX0dXM#bh1)zI}?P`JCclPp)GktoyD%Uv%1HzQp-VwViVJr}FN4 zBVAi3pdsabJ2zzio=sD>mtWX++u%m3k>>5t|1&=?+*B*EnLW)#$^O=9J{D1Fvz#4w zCmkrSML-}_v8Imc2?OP1;|%KWmLM+u&^dKy+fI{C57UY0UhRg-3U_ zKl;3k)jRBCi*uZh#-8L8Gwj!FXV37syULEeYD%&1+S-jgUC&wB|>?y4oO5hW>!C8<`)MX5lF!N|bKNY}tn*U&h` z(Adh*+{(a0+rYrez#!Wq{4a`z-29Zxv`X9>q*C7l^C^QQ$cEtjw370~qEv?R@^Zb* zyzJuS#DY}4{G#;P?`))iio&ZxB1(c1%M}WW^3yVNQWZ)n3sMy_3rdn17%JvG{=~yk z7^b0d%K!8k&!<5Q%*xz)$=t%q!rqfbn1vNw8cYtSFe`5kQ8<0$%84Uqj>sHgKi%N5 cz)O$emAGKZCnwXXKr0wLUHx3vIVCg!0EmFw6951J literal 0 HcmV?d00001 diff --git a/static.files/main-d2fab2bf619172d3.js b/static.files/main-d2fab2bf619172d3.js new file mode 100644 index 00000000..8fc48ede --- /dev/null +++ b/static.files/main-d2fab2bf619172d3.js @@ -0,0 +1,11 @@ +"use strict";window.RUSTDOC_TOOLTIP_HOVER_MS=300;window.RUSTDOC_TOOLTIP_HOVER_EXIT_MS=450;function resourcePath(basename,extension){return getVar("root-path")+basename+getVar("resource-suffix")+extension}function hideMain(){addClass(document.getElementById(MAIN_ID),"hidden")}function showMain(){removeClass(document.getElementById(MAIN_ID),"hidden")}function blurHandler(event,parentElem,hideCallback){if(!parentElem.contains(document.activeElement)&&!parentElem.contains(event.relatedTarget)){hideCallback()}}window.rootPath=getVar("root-path");window.currentCrate=getVar("current-crate");function setMobileTopbar(){const mobileTopbar=document.querySelector(".mobile-topbar");const locationTitle=document.querySelector(".sidebar h2.location");if(mobileTopbar){const mobileTitle=document.createElement("h2");mobileTitle.className="location";if(hasClass(document.querySelector(".rustdoc"),"crate")){mobileTitle.innerHTML=`Crate ${window.currentCrate}`}else if(locationTitle){mobileTitle.innerHTML=locationTitle.innerHTML}mobileTopbar.appendChild(mobileTitle)}}function getVirtualKey(ev){if("key"in ev&&typeof ev.key!=="undefined"){return ev.key}const c=ev.charCode||ev.keyCode;if(c===27){return"Escape"}return String.fromCharCode(c)}const MAIN_ID="main-content";const SETTINGS_BUTTON_ID="settings-menu";const ALTERNATIVE_DISPLAY_ID="alternative-display";const NOT_DISPLAYED_ID="not-displayed";const HELP_BUTTON_ID="help-button";function getSettingsButton(){return document.getElementById(SETTINGS_BUTTON_ID)}function getHelpButton(){return document.getElementById(HELP_BUTTON_ID)}function getNakedUrl(){return window.location.href.split("?")[0].split("#")[0]}function insertAfter(newNode,referenceNode){referenceNode.parentNode.insertBefore(newNode,referenceNode.nextSibling)}function getOrCreateSection(id,classes){let el=document.getElementById(id);if(!el){el=document.createElement("section");el.id=id;el.className=classes;insertAfter(el,document.getElementById(MAIN_ID))}return el}function getAlternativeDisplayElem(){return getOrCreateSection(ALTERNATIVE_DISPLAY_ID,"content hidden")}function getNotDisplayedElem(){return getOrCreateSection(NOT_DISPLAYED_ID,"hidden")}function switchDisplayedElement(elemToDisplay){const el=getAlternativeDisplayElem();if(el.children.length>0){getNotDisplayedElem().appendChild(el.firstElementChild)}if(elemToDisplay===null){addClass(el,"hidden");showMain();return}el.appendChild(elemToDisplay);hideMain();removeClass(el,"hidden")}function browserSupportsHistoryApi(){return window.history&&typeof window.history.pushState==="function"}function preLoadCss(cssUrl){const link=document.createElement("link");link.href=cssUrl;link.rel="preload";link.as="style";document.getElementsByTagName("head")[0].appendChild(link)}(function(){const isHelpPage=window.location.pathname.endsWith("/help.html");function loadScript(url,errorCallback){const script=document.createElement("script");script.src=url;if(errorCallback!==undefined){script.onerror=errorCallback}document.head.append(script)}getSettingsButton().onclick=event=>{if(event.ctrlKey||event.altKey||event.metaKey){return}window.hideAllModals(false);addClass(getSettingsButton(),"rotate");event.preventDefault();loadScript(getVar("static-root-path")+getVar("settings-js"));setTimeout(()=>{const themes=getVar("themes").split(",");for(const theme of themes){if(theme!==""){preLoadCss(getVar("root-path")+theme+".css")}}},0)};window.searchState={loadingText:"Loading search results...",input:document.getElementsByClassName("search-input")[0],outputElement:()=>{let el=document.getElementById("search");if(!el){el=document.createElement("section");el.id="search";getNotDisplayedElem().appendChild(el)}return el},title:document.title,titleBeforeSearch:document.title,timeout:null,currentTab:0,focusedByTab:[null,null,null],clearInputTimeout:()=>{if(searchState.timeout!==null){clearTimeout(searchState.timeout);searchState.timeout=null}},isDisplayed:()=>searchState.outputElement().parentElement.id===ALTERNATIVE_DISPLAY_ID,focus:()=>{searchState.input.focus()},defocus:()=>{searchState.input.blur()},showResults:search=>{if(search===null||typeof search==="undefined"){search=searchState.outputElement()}switchDisplayedElement(search);searchState.mouseMovedAfterSearch=false;document.title=searchState.title},removeQueryParameters:()=>{document.title=searchState.titleBeforeSearch;if(browserSupportsHistoryApi()){history.replaceState(null,"",getNakedUrl()+window.location.hash)}},hideResults:()=>{switchDisplayedElement(null);searchState.removeQueryParameters()},getQueryStringParams:()=>{const params={};window.location.search.substring(1).split("&").map(s=>{const pair=s.split("=").map(x=>x.replace(/\+/g," "));params[decodeURIComponent(pair[0])]=typeof pair[1]==="undefined"?null:decodeURIComponent(pair[1])});return params},setup:()=>{const search_input=searchState.input;if(!searchState.input){return}let searchLoaded=false;function sendSearchForm(){document.getElementsByClassName("search-form")[0].submit()}function loadSearch(){if(!searchLoaded){searchLoaded=true;loadScript(getVar("static-root-path")+getVar("search-js"),sendSearchForm);loadScript(resourcePath("search-index",".js"),sendSearchForm)}}search_input.addEventListener("focus",()=>{search_input.origPlaceholder=search_input.placeholder;search_input.placeholder="Type your search here.";loadSearch()});if(search_input.value!==""){loadSearch()}const params=searchState.getQueryStringParams();if(params.search!==undefined){searchState.setLoadingSearch();loadSearch()}},setLoadingSearch:()=>{const search=searchState.outputElement();search.innerHTML="

"+searchState.loadingText+"

";searchState.showResults(search)},descShards:new Map(),loadDesc:async function({descShard,descIndex}){if(descShard.promise===null){descShard.promise=new Promise((resolve,reject)=>{descShard.resolve=resolve;const ds=descShard;const fname=`${ds.crate}-desc-${ds.shard}-`;const url=resourcePath(`search.desc/${descShard.crate}/${fname}`,".js",);loadScript(url,reject)})}const list=await descShard.promise;return list[descIndex]},loadedDescShard:function(crate,shard,data){this.descShards.get(crate)[shard].resolve(data.split("\n"))},};const toggleAllDocsId="toggle-all-docs";let savedHash="";function handleHashes(ev){if(ev!==null&&searchState.isDisplayed()&&ev.newURL){switchDisplayedElement(null);const hash=ev.newURL.slice(ev.newURL.indexOf("#")+1);if(browserSupportsHistoryApi()){history.replaceState(null,"",getNakedUrl()+window.location.search+"#"+hash)}const elem=document.getElementById(hash);if(elem){elem.scrollIntoView()}}const pageId=window.location.hash.replace(/^#/,"");if(savedHash!==pageId){savedHash=pageId;if(pageId!==""){expandSection(pageId)}}if(savedHash.startsWith("impl-")){const splitAt=savedHash.indexOf("/");if(splitAt!==-1){const implId=savedHash.slice(0,splitAt);const assocId=savedHash.slice(splitAt+1);const implElem=document.getElementById(implId);if(implElem&&implElem.parentElement.tagName==="SUMMARY"&&implElem.parentElement.parentElement.tagName==="DETAILS"){onEachLazy(implElem.parentElement.parentElement.querySelectorAll(`[id^="${assocId}"]`),item=>{const numbered=/([^-]+)-([0-9]+)/.exec(item.id);if(item.id===assocId||(numbered&&numbered[1]===assocId)){openParentDetails(item);item.scrollIntoView();setTimeout(()=>{window.location.replace("#"+item.id)},0)}},)}}}}function onHashChange(ev){hideSidebar();handleHashes(ev)}function openParentDetails(elem){while(elem){if(elem.tagName==="DETAILS"){elem.open=true}elem=elem.parentNode}}function expandSection(id){openParentDetails(document.getElementById(id))}function handleEscape(ev){searchState.clearInputTimeout();searchState.hideResults();ev.preventDefault();searchState.defocus();window.hideAllModals(true)}function handleShortcut(ev){const disableShortcuts=getSettingValue("disable-shortcuts")==="true";if(ev.ctrlKey||ev.altKey||ev.metaKey||disableShortcuts){return}if(document.activeElement.tagName==="INPUT"&&document.activeElement.type!=="checkbox"&&document.activeElement.type!=="radio"){switch(getVirtualKey(ev)){case"Escape":handleEscape(ev);break}}else{switch(getVirtualKey(ev)){case"Escape":handleEscape(ev);break;case"s":case"S":case"/":ev.preventDefault();searchState.focus();break;case"+":ev.preventDefault();expandAllDocs();break;case"-":ev.preventDefault();collapseAllDocs();break;case"?":showHelp();break;default:break}}}document.addEventListener("keypress",handleShortcut);document.addEventListener("keydown",handleShortcut);function addSidebarItems(){if(!window.SIDEBAR_ITEMS){return}const sidebar=document.getElementsByClassName("sidebar-elems")[0];function block(shortty,id,longty){const filtered=window.SIDEBAR_ITEMS[shortty];if(!filtered){return}const modpath=hasClass(document.querySelector(".rustdoc"),"mod")?"../":"";const h3=document.createElement("h3");h3.innerHTML=`${longty}`;const ul=document.createElement("ul");ul.className="block "+shortty;for(const name of filtered){let path;if(shortty==="mod"){path=`${modpath}${name}/index.html`}else{path=`${modpath}${shortty}.${name}.html`}let current_page=document.location.href.toString();if(current_page.endsWith("/")){current_page+="index.html"}const link=document.createElement("a");link.href=path;link.textContent=name;const li=document.createElement("li");if(link.href===current_page){li.classList.add("current")}li.appendChild(link);ul.appendChild(li)}sidebar.appendChild(h3);sidebar.appendChild(ul)}if(sidebar){block("primitive","primitives","Primitive Types");block("mod","modules","Modules");block("macro","macros","Macros");block("struct","structs","Structs");block("enum","enums","Enums");block("constant","constants","Constants");block("static","static","Statics");block("trait","traits","Traits");block("fn","functions","Functions");block("type","types","Type Aliases");block("union","unions","Unions");block("foreigntype","foreign-types","Foreign Types");block("keyword","keywords","Keywords");block("opaque","opaque-types","Opaque Types");block("attr","attributes","Attribute Macros");block("derive","derives","Derive Macros");block("traitalias","trait-aliases","Trait Aliases")}}window.register_implementors=imp=>{const implementors=document.getElementById("implementors-list");const synthetic_implementors=document.getElementById("synthetic-implementors-list");const inlined_types=new Set();const TEXT_IDX=0;const SYNTHETIC_IDX=1;const TYPES_IDX=2;if(synthetic_implementors){onEachLazy(synthetic_implementors.getElementsByClassName("impl"),el=>{const aliases=el.getAttribute("data-aliases");if(!aliases){return}aliases.split(",").forEach(alias=>{inlined_types.add(alias)})})}let currentNbImpls=implementors.getElementsByClassName("impl").length;const traitName=document.querySelector(".main-heading h1 > .trait").textContent;const baseIdName="impl-"+traitName+"-";const libs=Object.getOwnPropertyNames(imp);const script=document.querySelector("script[data-ignore-extern-crates]");const ignoreExternCrates=new Set((script?script.getAttribute("data-ignore-extern-crates"):"").split(","),);for(const lib of libs){if(lib===window.currentCrate||ignoreExternCrates.has(lib)){continue}const structs=imp[lib];struct_loop:for(const struct of structs){const list=struct[SYNTHETIC_IDX]?synthetic_implementors:implementors;if(struct[SYNTHETIC_IDX]){for(const struct_type of struct[TYPES_IDX]){if(inlined_types.has(struct_type)){continue struct_loop}inlined_types.add(struct_type)}}const code=document.createElement("h3");code.innerHTML=struct[TEXT_IDX];addClass(code,"code-header");onEachLazy(code.getElementsByTagName("a"),elem=>{const href=elem.getAttribute("href");if(href&&!href.startsWith("#")&&!/^(?:[a-z+]+:)?\/\//.test(href)){elem.setAttribute("href",window.rootPath+href)}});const currentId=baseIdName+currentNbImpls;const anchor=document.createElement("a");anchor.href="#"+currentId;addClass(anchor,"anchor");const display=document.createElement("div");display.id=currentId;addClass(display,"impl");display.appendChild(anchor);display.appendChild(code);list.appendChild(display);currentNbImpls+=1}}};if(window.pending_implementors){window.register_implementors(window.pending_implementors)}window.register_type_impls=imp=>{if(!imp||!imp[window.currentCrate]){return}window.pending_type_impls=null;const idMap=new Map();let implementations=document.getElementById("implementations-list");let trait_implementations=document.getElementById("trait-implementations-list");let trait_implementations_header=document.getElementById("trait-implementations");const script=document.querySelector("script[data-self-path]");const selfPath=script?script.getAttribute("data-self-path"):null;const mainContent=document.querySelector("#main-content");const sidebarSection=document.querySelector(".sidebar section");let methods=document.querySelector(".sidebar .block.method");let associatedTypes=document.querySelector(".sidebar .block.associatedtype");let associatedConstants=document.querySelector(".sidebar .block.associatedconstant");let sidebarTraitList=document.querySelector(".sidebar .block.trait-implementation");for(const impList of imp[window.currentCrate]){const types=impList.slice(2);const text=impList[0];const isTrait=impList[1]!==0;const traitName=impList[1];if(types.indexOf(selfPath)===-1){continue}let outputList=isTrait?trait_implementations:implementations;if(outputList===null){const outputListName=isTrait?"Trait Implementations":"Implementations";const outputListId=isTrait?"trait-implementations-list":"implementations-list";const outputListHeaderId=isTrait?"trait-implementations":"implementations";const outputListHeader=document.createElement("h2");outputListHeader.id=outputListHeaderId;outputListHeader.innerText=outputListName;outputList=document.createElement("div");outputList.id=outputListId;if(isTrait){const link=document.createElement("a");link.href=`#${outputListHeaderId}`;link.innerText="Trait Implementations";const h=document.createElement("h3");h.appendChild(link);trait_implementations=outputList;trait_implementations_header=outputListHeader;sidebarSection.appendChild(h);sidebarTraitList=document.createElement("ul");sidebarTraitList.className="block trait-implementation";sidebarSection.appendChild(sidebarTraitList);mainContent.appendChild(outputListHeader);mainContent.appendChild(outputList)}else{implementations=outputList;if(trait_implementations){mainContent.insertBefore(outputListHeader,trait_implementations_header);mainContent.insertBefore(outputList,trait_implementations_header)}else{const mainContent=document.querySelector("#main-content");mainContent.appendChild(outputListHeader);mainContent.appendChild(outputList)}}}const template=document.createElement("template");template.innerHTML=text;onEachLazy(template.content.querySelectorAll("a"),elem=>{const href=elem.getAttribute("href");if(href&&!href.startsWith("#")&&!/^(?:[a-z+]+:)?\/\//.test(href)){elem.setAttribute("href",window.rootPath+href)}});onEachLazy(template.content.querySelectorAll("[id]"),el=>{let i=0;if(idMap.has(el.id)){i=idMap.get(el.id)}else if(document.getElementById(el.id)){i=1;while(document.getElementById(`${el.id}-${2 * i}`)){i=2*i}while(document.getElementById(`${el.id}-${i}`)){i+=1}}if(i!==0){const oldHref=`#${el.id}`;const newHref=`#${el.id}-${i}`;el.id=`${el.id}-${i}`;onEachLazy(template.content.querySelectorAll("a[href]"),link=>{if(link.getAttribute("href")===oldHref){link.href=newHref}})}idMap.set(el.id,i+1)});const templateAssocItems=template.content.querySelectorAll("section.tymethod, "+"section.method, section.associatedtype, section.associatedconstant");if(isTrait){const li=document.createElement("li");const a=document.createElement("a");a.href=`#${template.content.querySelector(".impl").id}`;a.textContent=traitName;li.appendChild(a);sidebarTraitList.append(li)}else{onEachLazy(templateAssocItems,item=>{let block=hasClass(item,"associatedtype")?associatedTypes:(hasClass(item,"associatedconstant")?associatedConstants:(methods));if(!block){const blockTitle=hasClass(item,"associatedtype")?"Associated Types":(hasClass(item,"associatedconstant")?"Associated Constants":("Methods"));const blockClass=hasClass(item,"associatedtype")?"associatedtype":(hasClass(item,"associatedconstant")?"associatedconstant":("method"));const blockHeader=document.createElement("h3");const blockLink=document.createElement("a");blockLink.href="#implementations";blockLink.innerText=blockTitle;blockHeader.appendChild(blockLink);block=document.createElement("ul");block.className=`block ${blockClass}`;const insertionReference=methods||sidebarTraitList;if(insertionReference){const insertionReferenceH=insertionReference.previousElementSibling;sidebarSection.insertBefore(blockHeader,insertionReferenceH);sidebarSection.insertBefore(block,insertionReferenceH)}else{sidebarSection.appendChild(blockHeader);sidebarSection.appendChild(block)}if(hasClass(item,"associatedtype")){associatedTypes=block}else if(hasClass(item,"associatedconstant")){associatedConstants=block}else{methods=block}}const li=document.createElement("li");const a=document.createElement("a");a.innerText=item.id.split("-")[0].split(".")[1];a.href=`#${item.id}`;li.appendChild(a);block.appendChild(li)})}outputList.appendChild(template.content)}for(const list of[methods,associatedTypes,associatedConstants,sidebarTraitList]){if(!list){continue}const newChildren=Array.prototype.slice.call(list.children);newChildren.sort((a,b)=>{const aI=a.innerText;const bI=b.innerText;return aIbI?1:0});list.replaceChildren(...newChildren)}};if(window.pending_type_impls){window.register_type_impls(window.pending_type_impls)}function addSidebarCrates(){if(!window.ALL_CRATES){return}const sidebarElems=document.getElementsByClassName("sidebar-elems")[0];if(!sidebarElems){return}const h3=document.createElement("h3");h3.innerHTML="Crates";const ul=document.createElement("ul");ul.className="block crate";for(const crate of window.ALL_CRATES){const link=document.createElement("a");link.href=window.rootPath+crate+"/index.html";link.textContent=crate;const li=document.createElement("li");if(window.rootPath!=="./"&&crate===window.currentCrate){li.className="current"}li.appendChild(link);ul.appendChild(li)}sidebarElems.appendChild(h3);sidebarElems.appendChild(ul)}function expandAllDocs(){const innerToggle=document.getElementById(toggleAllDocsId);removeClass(innerToggle,"will-expand");onEachLazy(document.getElementsByClassName("toggle"),e=>{if(!hasClass(e,"type-contents-toggle")&&!hasClass(e,"more-examples-toggle")){e.open=true}});innerToggle.title="collapse all docs";innerToggle.children[0].innerText="\u2212"}function collapseAllDocs(){const innerToggle=document.getElementById(toggleAllDocsId);addClass(innerToggle,"will-expand");onEachLazy(document.getElementsByClassName("toggle"),e=>{if(e.parentNode.id!=="implementations-list"||(!hasClass(e,"implementors-toggle")&&!hasClass(e,"type-contents-toggle"))){e.open=false}});innerToggle.title="expand all docs";innerToggle.children[0].innerText="+"}function toggleAllDocs(){const innerToggle=document.getElementById(toggleAllDocsId);if(!innerToggle){return}if(hasClass(innerToggle,"will-expand")){expandAllDocs()}else{collapseAllDocs()}}(function(){const toggles=document.getElementById(toggleAllDocsId);if(toggles){toggles.onclick=toggleAllDocs}const hideMethodDocs=getSettingValue("auto-hide-method-docs")==="true";const hideImplementations=getSettingValue("auto-hide-trait-implementations")==="true";const hideLargeItemContents=getSettingValue("auto-hide-large-items")!=="false";function setImplementorsTogglesOpen(id,open){const list=document.getElementById(id);if(list!==null){onEachLazy(list.getElementsByClassName("implementors-toggle"),e=>{e.open=open})}}if(hideImplementations){setImplementorsTogglesOpen("trait-implementations-list",false);setImplementorsTogglesOpen("blanket-implementations-list",false)}onEachLazy(document.getElementsByClassName("toggle"),e=>{if(!hideLargeItemContents&&hasClass(e,"type-contents-toggle")){e.open=true}if(hideMethodDocs&&hasClass(e,"method-toggle")){e.open=false}})}());window.rustdoc_add_line_numbers_to_examples=()=>{onEachLazy(document.getElementsByClassName("rust-example-rendered"),x=>{const parent=x.parentNode;const line_numbers=parent.querySelectorAll(".example-line-numbers");if(line_numbers.length>0){return}const count=x.textContent.split("\n").length;const elems=[];for(let i=0;i{onEachLazy(document.getElementsByClassName("rust-example-rendered"),x=>{const parent=x.parentNode;const line_numbers=parent.querySelectorAll(".example-line-numbers");for(const node of line_numbers){parent.removeChild(node)}})};if(getSettingValue("line-numbers")==="true"){window.rustdoc_add_line_numbers_to_examples()}function showSidebar(){window.hideAllModals(false);const sidebar=document.getElementsByClassName("sidebar")[0];addClass(sidebar,"shown")}function hideSidebar(){const sidebar=document.getElementsByClassName("sidebar")[0];removeClass(sidebar,"shown")}window.addEventListener("resize",()=>{if(window.CURRENT_TOOLTIP_ELEMENT){const base=window.CURRENT_TOOLTIP_ELEMENT.TOOLTIP_BASE;const force_visible=base.TOOLTIP_FORCE_VISIBLE;hideTooltip(false);if(force_visible){showTooltip(base);base.TOOLTIP_FORCE_VISIBLE=true}}});const mainElem=document.getElementById(MAIN_ID);if(mainElem){mainElem.addEventListener("click",hideSidebar)}onEachLazy(document.querySelectorAll("a[href^='#']"),el=>{el.addEventListener("click",()=>{expandSection(el.hash.slice(1));hideSidebar()})});onEachLazy(document.querySelectorAll(".toggle > summary:not(.hideme)"),el=>{el.addEventListener("click",e=>{if(e.target.tagName!=="SUMMARY"&&e.target.tagName!=="A"){e.preventDefault()}})});function showTooltip(e){const notable_ty=e.getAttribute("data-notable-ty");if(!window.NOTABLE_TRAITS&¬able_ty){const data=document.getElementById("notable-traits-data");if(data){window.NOTABLE_TRAITS=JSON.parse(data.innerText)}else{throw new Error("showTooltip() called with notable without any notable traits!")}}if(window.CURRENT_TOOLTIP_ELEMENT&&window.CURRENT_TOOLTIP_ELEMENT.TOOLTIP_BASE===e){clearTooltipHoverTimeout(window.CURRENT_TOOLTIP_ELEMENT);return}window.hideAllModals(false);const wrapper=document.createElement("div");if(notable_ty){wrapper.innerHTML="
"+window.NOTABLE_TRAITS[notable_ty]+"
"}else{if(e.getAttribute("title")!==null){e.setAttribute("data-title",e.getAttribute("title"));e.removeAttribute("title")}if(e.getAttribute("data-title")!==null){const titleContent=document.createElement("div");titleContent.className="content";titleContent.appendChild(document.createTextNode(e.getAttribute("data-title")));wrapper.appendChild(titleContent)}}wrapper.className="tooltip popover";const focusCatcher=document.createElement("div");focusCatcher.setAttribute("tabindex","0");focusCatcher.onfocus=hideTooltip;wrapper.appendChild(focusCatcher);const pos=e.getBoundingClientRect();wrapper.style.top=(pos.top+window.scrollY+pos.height)+"px";wrapper.style.left=0;wrapper.style.right="auto";wrapper.style.visibility="hidden";const body=document.getElementsByTagName("body")[0];body.appendChild(wrapper);const wrapperPos=wrapper.getBoundingClientRect();const finalPos=pos.left+window.scrollX-wrapperPos.width+24;if(finalPos>0){wrapper.style.left=finalPos+"px"}else{wrapper.style.setProperty("--popover-arrow-offset",(wrapperPos.right-pos.right+4)+"px",)}wrapper.style.visibility="";window.CURRENT_TOOLTIP_ELEMENT=wrapper;window.CURRENT_TOOLTIP_ELEMENT.TOOLTIP_BASE=e;clearTooltipHoverTimeout(window.CURRENT_TOOLTIP_ELEMENT);wrapper.onpointerenter=ev=>{if(ev.pointerType!=="mouse"){return}clearTooltipHoverTimeout(e)};wrapper.onpointerleave=ev=>{if(ev.pointerType!=="mouse"){return}if(!e.TOOLTIP_FORCE_VISIBLE&&!e.contains(ev.relatedTarget)){setTooltipHoverTimeout(e,false);addClass(wrapper,"fade-out")}}}function setTooltipHoverTimeout(element,show){clearTooltipHoverTimeout(element);if(!show&&!window.CURRENT_TOOLTIP_ELEMENT){return}if(show&&window.CURRENT_TOOLTIP_ELEMENT){return}if(window.CURRENT_TOOLTIP_ELEMENT&&window.CURRENT_TOOLTIP_ELEMENT.TOOLTIP_BASE!==element){return}element.TOOLTIP_HOVER_TIMEOUT=setTimeout(()=>{if(show){showTooltip(element)}else if(!element.TOOLTIP_FORCE_VISIBLE){hideTooltip(false)}},show?window.RUSTDOC_TOOLTIP_HOVER_MS:window.RUSTDOC_TOOLTIP_HOVER_EXIT_MS)}function clearTooltipHoverTimeout(element){if(element.TOOLTIP_HOVER_TIMEOUT!==undefined){removeClass(window.CURRENT_TOOLTIP_ELEMENT,"fade-out");clearTimeout(element.TOOLTIP_HOVER_TIMEOUT);delete element.TOOLTIP_HOVER_TIMEOUT}}function tooltipBlurHandler(event){if(window.CURRENT_TOOLTIP_ELEMENT&&!window.CURRENT_TOOLTIP_ELEMENT.contains(document.activeElement)&&!window.CURRENT_TOOLTIP_ELEMENT.contains(event.relatedTarget)&&!window.CURRENT_TOOLTIP_ELEMENT.TOOLTIP_BASE.contains(document.activeElement)&&!window.CURRENT_TOOLTIP_ELEMENT.TOOLTIP_BASE.contains(event.relatedTarget)){setTimeout(()=>hideTooltip(false),0)}}function hideTooltip(focus){if(window.CURRENT_TOOLTIP_ELEMENT){if(window.CURRENT_TOOLTIP_ELEMENT.TOOLTIP_BASE.TOOLTIP_FORCE_VISIBLE){if(focus){window.CURRENT_TOOLTIP_ELEMENT.TOOLTIP_BASE.focus()}window.CURRENT_TOOLTIP_ELEMENT.TOOLTIP_BASE.TOOLTIP_FORCE_VISIBLE=false}const body=document.getElementsByTagName("body")[0];body.removeChild(window.CURRENT_TOOLTIP_ELEMENT);clearTooltipHoverTimeout(window.CURRENT_TOOLTIP_ELEMENT);window.CURRENT_TOOLTIP_ELEMENT=null}}onEachLazy(document.getElementsByClassName("tooltip"),e=>{e.onclick=()=>{e.TOOLTIP_FORCE_VISIBLE=e.TOOLTIP_FORCE_VISIBLE?false:true;if(window.CURRENT_TOOLTIP_ELEMENT&&!e.TOOLTIP_FORCE_VISIBLE){hideTooltip(true)}else{showTooltip(e);window.CURRENT_TOOLTIP_ELEMENT.setAttribute("tabindex","0");window.CURRENT_TOOLTIP_ELEMENT.focus();window.CURRENT_TOOLTIP_ELEMENT.onblur=tooltipBlurHandler}return false};e.onpointerenter=ev=>{if(ev.pointerType!=="mouse"){return}setTooltipHoverTimeout(e,true)};e.onpointermove=ev=>{if(ev.pointerType!=="mouse"){return}setTooltipHoverTimeout(e,true)};e.onpointerleave=ev=>{if(ev.pointerType!=="mouse"){return}if(!e.TOOLTIP_FORCE_VISIBLE&&window.CURRENT_TOOLTIP_ELEMENT&&!window.CURRENT_TOOLTIP_ELEMENT.contains(ev.relatedTarget)){setTooltipHoverTimeout(e,false);addClass(window.CURRENT_TOOLTIP_ELEMENT,"fade-out")}}});const sidebar_menu_toggle=document.getElementsByClassName("sidebar-menu-toggle")[0];if(sidebar_menu_toggle){sidebar_menu_toggle.addEventListener("click",()=>{const sidebar=document.getElementsByClassName("sidebar")[0];if(!hasClass(sidebar,"shown")){showSidebar()}else{hideSidebar()}})}function helpBlurHandler(event){blurHandler(event,getHelpButton(),window.hidePopoverMenus)}function buildHelpMenu(){const book_info=document.createElement("span");const channel=getVar("channel");book_info.className="top";book_info.innerHTML=`You can find more information in \ +the rustdoc book.`;const shortcuts=[["?","Show this help dialog"],["S / /","Focus the search field"],["↑","Move up in search results"],["↓","Move down in search results"],["← / →","Switch result tab (when results focused)"],["⏎","Go to active search result"],["+","Expand all sections"],["-","Collapse all sections"],].map(x=>"
"+x[0].split(" ").map((y,index)=>((index&1)===0?""+y+"":" "+y+" ")).join("")+"
"+x[1]+"
").join("");const div_shortcuts=document.createElement("div");addClass(div_shortcuts,"shortcuts");div_shortcuts.innerHTML="

Keyboard Shortcuts

"+shortcuts+"
";const infos=[`For a full list of all search features, take a look here.`,"Prefix searches with a type followed by a colon (e.g., fn:) to \ + restrict the search to a given item kind.","Accepted kinds are: fn, mod, struct, \ + enum, trait, type, macro, \ + and const.","Search functions by type signature (e.g., vec -> usize or \ + -> vec or String, enum:Cow -> bool)","You can look for items with an exact name by putting double quotes around \ + your request: \"string\"","Look for functions that accept or return \ + slices and \ + arrays by writing \ + square brackets (e.g., -> [u8] or [] -> Option)","Look for items inside another one by searching for a path: vec::Vec",].map(x=>"

"+x+"

").join("");const div_infos=document.createElement("div");addClass(div_infos,"infos");div_infos.innerHTML="

Search Tricks

"+infos;const rustdoc_version=document.createElement("span");rustdoc_version.className="bottom";const rustdoc_version_code=document.createElement("code");rustdoc_version_code.innerText="rustdoc "+getVar("rustdoc-version");rustdoc_version.appendChild(rustdoc_version_code);const container=document.createElement("div");if(!isHelpPage){container.className="popover"}container.id="help";container.style.display="none";const side_by_side=document.createElement("div");side_by_side.className="side-by-side";side_by_side.appendChild(div_shortcuts);side_by_side.appendChild(div_infos);container.appendChild(book_info);container.appendChild(side_by_side);container.appendChild(rustdoc_version);if(isHelpPage){const help_section=document.createElement("section");help_section.appendChild(container);document.getElementById("main-content").appendChild(help_section);container.style.display="block"}else{const help_button=getHelpButton();help_button.appendChild(container);container.onblur=helpBlurHandler;help_button.onblur=helpBlurHandler;help_button.children[0].onblur=helpBlurHandler}return container}window.hideAllModals=switchFocus=>{hideSidebar();window.hidePopoverMenus();hideTooltip(switchFocus)};window.hidePopoverMenus=()=>{onEachLazy(document.querySelectorAll(".search-form .popover"),elem=>{elem.style.display="none"})};function getHelpMenu(buildNeeded){let menu=getHelpButton().querySelector(".popover");if(!menu&&buildNeeded){menu=buildHelpMenu()}return menu}function showHelp(){getHelpButton().querySelector("a").focus();const menu=getHelpMenu(true);if(menu.style.display==="none"){window.hideAllModals();menu.style.display=""}}if(isHelpPage){showHelp();document.querySelector(`#${HELP_BUTTON_ID} > a`).addEventListener("click",event=>{const target=event.target;if(target.tagName!=="A"||target.parentElement.id!==HELP_BUTTON_ID||event.ctrlKey||event.altKey||event.metaKey){return}event.preventDefault()})}else{document.querySelector(`#${HELP_BUTTON_ID} > a`).addEventListener("click",event=>{const target=event.target;if(target.tagName!=="A"||target.parentElement.id!==HELP_BUTTON_ID||event.ctrlKey||event.altKey||event.metaKey){return}event.preventDefault();const menu=getHelpMenu(true);const shouldShowHelp=menu.style.display==="none";if(shouldShowHelp){showHelp()}else{window.hidePopoverMenus()}})}setMobileTopbar();addSidebarItems();addSidebarCrates();onHashChange(null);window.addEventListener("hashchange",onHashChange);searchState.setup()}());(function(){const SIDEBAR_MIN=100;const SIDEBAR_MAX=500;const RUSTDOC_MOBILE_BREAKPOINT=700;const BODY_MIN=400;const SIDEBAR_VANISH_THRESHOLD=SIDEBAR_MIN/2;const sidebarButton=document.getElementById("sidebar-button");if(sidebarButton){sidebarButton.addEventListener("click",e=>{removeClass(document.documentElement,"hide-sidebar");updateLocalStorage("hide-sidebar","false");if(document.querySelector(".rustdoc.src")){window.rustdocToggleSrcSidebar()}e.preventDefault()})}let currentPointerId=null;let desiredSidebarSize=null;let pendingSidebarResizingFrame=false;const resizer=document.querySelector(".sidebar-resizer");const sidebar=document.querySelector(".sidebar");if(!resizer||!sidebar){return}const isSrcPage=hasClass(document.body,"src");function hideSidebar(){if(isSrcPage){window.rustdocCloseSourceSidebar();updateLocalStorage("src-sidebar-width",null);document.documentElement.style.removeProperty("--src-sidebar-width");sidebar.style.removeProperty("--src-sidebar-width");resizer.style.removeProperty("--src-sidebar-width")}else{addClass(document.documentElement,"hide-sidebar");updateLocalStorage("hide-sidebar","true");updateLocalStorage("desktop-sidebar-width",null);document.documentElement.style.removeProperty("--desktop-sidebar-width");sidebar.style.removeProperty("--desktop-sidebar-width");resizer.style.removeProperty("--desktop-sidebar-width")}}function showSidebar(){if(isSrcPage){window.rustdocShowSourceSidebar()}else{removeClass(document.documentElement,"hide-sidebar");updateLocalStorage("hide-sidebar","false")}}function changeSidebarSize(size){if(isSrcPage){updateLocalStorage("src-sidebar-width",size);sidebar.style.setProperty("--src-sidebar-width",size+"px");resizer.style.setProperty("--src-sidebar-width",size+"px")}else{updateLocalStorage("desktop-sidebar-width",size);sidebar.style.setProperty("--desktop-sidebar-width",size+"px");resizer.style.setProperty("--desktop-sidebar-width",size+"px")}}function isSidebarHidden(){return isSrcPage?!hasClass(document.documentElement,"src-sidebar-expanded"):hasClass(document.documentElement,"hide-sidebar")}function resize(e){if(currentPointerId===null||currentPointerId!==e.pointerId){return}e.preventDefault();const pos=e.clientX-3;if(pos=SIDEBAR_MIN){if(isSidebarHidden()){showSidebar()}const constrainedPos=Math.min(pos,window.innerWidth-BODY_MIN,SIDEBAR_MAX);changeSidebarSize(constrainedPos);desiredSidebarSize=constrainedPos;if(pendingSidebarResizingFrame!==false){clearTimeout(pendingSidebarResizingFrame)}pendingSidebarResizingFrame=setTimeout(()=>{if(currentPointerId===null||pendingSidebarResizingFrame===false){return}pendingSidebarResizingFrame=false;document.documentElement.style.setProperty("--resizing-sidebar-width",desiredSidebarSize+"px",)},100)}}window.addEventListener("resize",()=>{if(window.innerWidth=(window.innerWidth-BODY_MIN)){changeSidebarSize(window.innerWidth-BODY_MIN)}else if(desiredSidebarSize!==null&&desiredSidebarSize>SIDEBAR_MIN){changeSidebarSize(desiredSidebarSize)}});function stopResize(e){if(currentPointerId===null){return}if(e){e.preventDefault()}desiredSidebarSize=sidebar.getBoundingClientRect().width;removeClass(resizer,"active");window.removeEventListener("pointermove",resize,false);window.removeEventListener("pointerup",stopResize,false);removeClass(document.documentElement,"sidebar-resizing");document.documentElement.style.removeProperty("--resizing-sidebar-width");if(resizer.releasePointerCapture){resizer.releasePointerCapture(currentPointerId);currentPointerId=null}}function initResize(e){if(currentPointerId!==null||e.altKey||e.ctrlKey||e.metaKey||e.button!==0){return}if(resizer.setPointerCapture){resizer.setPointerCapture(e.pointerId);if(!resizer.hasPointerCapture(e.pointerId)){resizer.releasePointerCapture(e.pointerId);return}currentPointerId=e.pointerId}window.hideAllModals(false);e.preventDefault();window.addEventListener("pointermove",resize,false);window.addEventListener("pointercancel",stopResize,false);window.addEventListener("pointerup",stopResize,false);addClass(resizer,"active");addClass(document.documentElement,"sidebar-resizing");const pos=e.clientX-sidebar.offsetLeft-3;document.documentElement.style.setProperty("--resizing-sidebar-width",pos+"px");desiredSidebarSize=null}resizer.addEventListener("pointerdown",initResize,false)}());(function(){let reset_button_timeout=null;const but=document.getElementById("copy-path");if(!but){return}but.onclick=()=>{const parent=but.parentElement;const path=[];onEach(parent.childNodes,child=>{if(child.tagName==="A"){path.push(child.textContent)}});const el=document.createElement("textarea");el.value=path.join("::");el.setAttribute("readonly","");el.style.position="absolute";el.style.left="-9999px";document.body.appendChild(el);el.select();document.execCommand("copy");document.body.removeChild(el);but.classList.add("clicked");if(reset_button_timeout!==null){window.clearTimeout(reset_button_timeout)}function reset_button(){reset_button_timeout=null;but.classList.remove("clicked")}reset_button_timeout=window.setTimeout(reset_button,1000)}}()) \ No newline at end of file diff --git a/static.files/normalize-76eba96aa4d2e634.css b/static.files/normalize-76eba96aa4d2e634.css new file mode 100644 index 00000000..469959f1 --- /dev/null +++ b/static.files/normalize-76eba96aa4d2e634.css @@ -0,0 +1,2 @@ + /*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */ +html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}main{display:block}h1{font-size:2em;margin:0.67em 0}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type="button"],[type="reset"],[type="submit"],button{-webkit-appearance:button}[type="button"]::-moz-focus-inner,[type="reset"]::-moz-focus-inner,[type="submit"]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type="button"]:-moz-focusring,[type="reset"]:-moz-focusring,[type="submit"]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:0.35em 0.75em 0.625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type="checkbox"],[type="radio"]{box-sizing:border-box;padding:0}[type="number"]::-webkit-inner-spin-button,[type="number"]::-webkit-outer-spin-button{height:auto}[type="search"]{-webkit-appearance:textfield;outline-offset:-2px}[type="search"]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}template{display:none}[hidden]{display:none} \ No newline at end of file diff --git a/static.files/noscript-df360f571f6edeae.css b/static.files/noscript-df360f571f6edeae.css new file mode 100644 index 00000000..4c310ae5 --- /dev/null +++ b/static.files/noscript-df360f571f6edeae.css @@ -0,0 +1 @@ + #main-content .attributes{margin-left:0 !important;}#copy-path,#sidebar-button,.sidebar-resizer{display:none !important;}nav.sub{display:none;}.src .sidebar{display:none;}.notable-traits{display:none;}:root,:root:not([data-theme]){--main-background-color:white;--main-color:black;--settings-input-color:#2196f3;--settings-input-border-color:#717171;--settings-button-color:#000;--settings-button-border-focus:#717171;--sidebar-background-color:#f5f5f5;--sidebar-background-color-hover:#e0e0e0;--code-block-background-color:#f5f5f5;--scrollbar-track-background-color:#dcdcdc;--scrollbar-thumb-background-color:rgba(36,37,39,0.6);--scrollbar-color:rgba(36,37,39,0.6) #d9d9d9;--headings-border-bottom-color:#ddd;--border-color:#e0e0e0;--button-background-color:#fff;--right-side-color:grey;--code-attribute-color:#999;--toggles-color:#999;--toggle-filter:none;--mobile-sidebar-menu-filter:none;--search-input-focused-border-color:#66afe9;--copy-path-button-color:#999;--copy-path-img-filter:invert(50%);--copy-path-img-hover-filter:invert(35%);--codeblock-error-hover-color:rgb(255,0,0);--codeblock-error-color:rgba(255,0,0,.5);--codeblock-ignore-hover-color:rgb(255,142,0);--codeblock-ignore-color:rgba(255,142,0,.6);--warning-border-color:#ff8e00;--type-link-color:#ad378a;--trait-link-color:#6e4fc9;--assoc-item-link-color:#3873ad;--function-link-color:#ad7c37;--macro-link-color:#068000;--keyword-link-color:#3873ad;--mod-link-color:#3873ad;--link-color:#3873ad;--sidebar-link-color:#356da4;--sidebar-current-link-background-color:#fff;--search-result-link-focus-background-color:#ccc;--search-result-border-color:#aaa3;--search-color:#000;--search-error-code-background-color:#d0cccc;--search-results-alias-color:#000;--search-results-grey-color:#999;--search-tab-title-count-color:#888;--search-tab-button-not-selected-border-top-color:#e6e6e6;--search-tab-button-not-selected-background:#e6e6e6;--search-tab-button-selected-border-top-color:#0089ff;--search-tab-button-selected-background:#fff;--settings-menu-filter:none;--stab-background-color:#fff5d6;--stab-code-color:#000;--code-highlight-kw-color:#8959a8;--code-highlight-kw-2-color:#4271ae;--code-highlight-lifetime-color:#b76514;--code-highlight-prelude-color:#4271ae;--code-highlight-prelude-val-color:#c82829;--code-highlight-number-color:#718c00;--code-highlight-string-color:#718c00;--code-highlight-literal-color:#c82829;--code-highlight-attribute-color:#c82829;--code-highlight-self-color:#c82829;--code-highlight-macro-color:#3e999f;--code-highlight-question-mark-color:#ff9011;--code-highlight-comment-color:#8e908c;--code-highlight-doc-comment-color:#4d4d4c;--src-line-numbers-span-color:#c67e2d;--src-line-number-highlighted-background-color:#fdffd3;--test-arrow-color:#f5f5f5;--test-arrow-background-color:rgba(78,139,202,0.2);--test-arrow-hover-color:#f5f5f5;--test-arrow-hover-background-color:rgb(78,139,202);--target-background-color:#fdffd3;--target-border-color:#ad7c37;--kbd-color:#000;--kbd-background:#fafbfc;--kbd-box-shadow-color:#c6cbd1;--rust-logo-filter:initial;--crate-search-div-filter:invert(100%) sepia(0%) saturate(4223%) hue-rotate(289deg) brightness(114%) contrast(76%);--crate-search-div-hover-filter:invert(44%) sepia(18%) saturate(23%) hue-rotate(317deg) brightness(96%) contrast(93%);--crate-search-hover-border:#717171;--src-sidebar-background-selected:#fff;--src-sidebar-background-hover:#e0e0e0;--table-alt-row-background-color:#f5f5f5;--codeblock-link-background:#eee;--scrape-example-toggle-line-background:#ccc;--scrape-example-toggle-line-hover-background:#999;--scrape-example-code-line-highlight:#fcffd6;--scrape-example-code-line-highlight-focus:#f6fdb0;--scrape-example-help-border-color:#555;--scrape-example-help-color:#333;--scrape-example-help-hover-border-color:#000;--scrape-example-help-hover-color:#000;--scrape-example-code-wrapper-background-start:rgba(255,255,255,1);--scrape-example-code-wrapper-background-end:rgba(255,255,255,0);--sidebar-resizer-hover:hsl(207,90%,66%);--sidebar-resizer-active:hsl(207,90%,54%);}@media (prefers-color-scheme:dark){:root,:root:not([data-theme]){--main-background-color:#353535;--main-color:#ddd;--settings-input-color:#2196f3;--settings-input-border-color:#999;--settings-button-color:#000;--settings-button-border-focus:#ffb900;--sidebar-background-color:#505050;--sidebar-background-color-hover:#676767;--code-block-background-color:#2A2A2A;--scrollbar-track-background-color:#717171;--scrollbar-thumb-background-color:rgba(32,34,37,.6);--scrollbar-color:rgba(32,34,37,.6) #5a5a5a;--headings-border-bottom-color:#d2d2d2;--border-color:#e0e0e0;--button-background-color:#f0f0f0;--right-side-color:grey;--code-attribute-color:#999;--toggles-color:#999;--toggle-filter:invert(100%);--mobile-sidebar-menu-filter:invert(100%);--search-input-focused-border-color:#008dfd;--copy-path-button-color:#999;--copy-path-img-filter:invert(50%);--copy-path-img-hover-filter:invert(65%);--codeblock-error-hover-color:rgb(255,0,0);--codeblock-error-color:rgba(255,0,0,.5);--codeblock-ignore-hover-color:rgb(255,142,0);--codeblock-ignore-color:rgba(255,142,0,.6);--warning-border-color:#ff8e00;--type-link-color:#2dbfb8;--trait-link-color:#b78cf2;--assoc-item-link-color:#d2991d;--function-link-color:#2bab63;--macro-link-color:#09bd00;--keyword-link-color:#d2991d;--mod-link-color:#d2991d;--link-color:#d2991d;--sidebar-link-color:#fdbf35;--sidebar-current-link-background-color:#444;--search-result-link-focus-background-color:#616161;--search-result-border-color:#aaa3;--search-color:#111;--search-error-code-background-color:#484848;--search-results-alias-color:#fff;--search-results-grey-color:#ccc;--search-tab-title-count-color:#888;--search-tab-button-not-selected-border-top-color:#252525;--search-tab-button-not-selected-background:#252525;--search-tab-button-selected-border-top-color:#0089ff;--search-tab-button-selected-background:#353535;--stab-background-color:#314559;--stab-code-color:#e6e1cf;--code-highlight-kw-color:#ab8ac1;--code-highlight-kw-2-color:#769acb;--code-highlight-lifetime-color:#d97f26;--code-highlight-prelude-color:#769acb;--code-highlight-prelude-val-color:#ee6868;--code-highlight-number-color:#83a300;--code-highlight-string-color:#83a300;--code-highlight-literal-color:#ee6868;--code-highlight-attribute-color:#ee6868;--code-highlight-self-color:#ee6868;--code-highlight-macro-color:#3e999f;--code-highlight-question-mark-color:#ff9011;--code-highlight-comment-color:#8d8d8b;--code-highlight-doc-comment-color:#8ca375;--src-line-numbers-span-color:#3b91e2;--src-line-number-highlighted-background-color:#0a042f;--test-arrow-color:#dedede;--test-arrow-background-color:rgba(78,139,202,0.2);--test-arrow-hover-color:#dedede;--test-arrow-hover-background-color:#4e8bca;--target-background-color:#494a3d;--target-border-color:#bb7410;--kbd-color:#000;--kbd-background:#fafbfc;--kbd-box-shadow-color:#c6cbd1;--rust-logo-filter:drop-shadow(1px 0 0px #fff) drop-shadow(0 1px 0 #fff) drop-shadow(-1px 0 0 #fff) drop-shadow(0 -1px 0 #fff);--crate-search-div-filter:invert(94%) sepia(0%) saturate(721%) hue-rotate(255deg) brightness(90%) contrast(90%);--crate-search-div-hover-filter:invert(69%) sepia(60%) saturate(6613%) hue-rotate(184deg) brightness(100%) contrast(91%);--crate-search-hover-border:#2196f3;--src-sidebar-background-selected:#333;--src-sidebar-background-hover:#444;--table-alt-row-background-color:#2a2a2a;--codeblock-link-background:#333;--scrape-example-toggle-line-background:#999;--scrape-example-toggle-line-hover-background:#c5c5c5;--scrape-example-code-line-highlight:#5b3b01;--scrape-example-code-line-highlight-focus:#7c4b0f;--scrape-example-help-border-color:#aaa;--scrape-example-help-color:#eee;--scrape-example-help-hover-border-color:#fff;--scrape-example-help-hover-color:#fff;--scrape-example-code-wrapper-background-start:rgba(53,53,53,1);--scrape-example-code-wrapper-background-end:rgba(53,53,53,0);--sidebar-resizer-hover:hsl(207,30%,54%);--sidebar-resizer-active:hsl(207,90%,54%);}} \ No newline at end of file diff --git a/static.files/rust-logo-151179464ae7ed46.svg b/static.files/rust-logo-151179464ae7ed46.svg new file mode 100644 index 00000000..62424d8f --- /dev/null +++ b/static.files/rust-logo-151179464ae7ed46.svg @@ -0,0 +1,61 @@ + + + diff --git a/static.files/rustdoc-c5d6553a23f1e5a6.css b/static.files/rustdoc-c5d6553a23f1e5a6.css new file mode 100644 index 00000000..9f64990b --- /dev/null +++ b/static.files/rustdoc-c5d6553a23f1e5a6.css @@ -0,0 +1,46 @@ + :root{--nav-sub-mobile-padding:8px;--search-typename-width:6.75rem;--desktop-sidebar-width:200px;--src-sidebar-width:300px;--desktop-sidebar-z-index:100;--sidebar-elems-left-padding:24px;}@font-face {font-family:'Fira Sans';font-style:normal;font-weight:400;src:local('Fira Sans'),url("FiraSans-Regular-018c141bf0843ffd.woff2") format("woff2");font-display:swap;}@font-face {font-family:'Fira Sans';font-style:normal;font-weight:500;src:local('Fira Sans Medium'),url("FiraSans-Medium-8f9a781e4970d388.woff2") format("woff2");font-display:swap;}@font-face {font-family:'Source Serif 4';font-style:normal;font-weight:400;src:local('Source Serif 4'),url("SourceSerif4-Regular-46f98efaafac5295.ttf.woff2") format("woff2");font-display:swap;}@font-face {font-family:'Source Serif 4';font-style:italic;font-weight:400;src:local('Source Serif 4 Italic'),url("SourceSerif4-It-acdfaf1a8af734b1.ttf.woff2") format("woff2");font-display:swap;}@font-face {font-family:'Source Serif 4';font-style:normal;font-weight:700;src:local('Source Serif 4 Bold'),url("SourceSerif4-Bold-a2c9cd1067f8b328.ttf.woff2") format("woff2");font-display:swap;}@font-face {font-family:'Source Code Pro';font-style:normal;font-weight:400;src:url("SourceCodePro-Regular-562dcc5011b6de7d.ttf.woff2") format("woff2");font-display:swap;}@font-face {font-family:'Source Code Pro';font-style:italic;font-weight:400;src:url("SourceCodePro-It-1cc31594bf4f1f79.ttf.woff2") format("woff2");font-display:swap;}@font-face {font-family:'Source Code Pro';font-style:normal;font-weight:600;src:url("SourceCodePro-Semibold-d899c5a5c4aeb14a.ttf.woff2") format("woff2");font-display:swap;}@font-face {font-family:'NanumBarunGothic';src:url("NanumBarunGothic-0f09457c7a19b7c6.ttf.woff2") format("woff2");font-display:swap;unicode-range:U+AC00-D7AF,U+1100-11FF,U+3130-318F,U+A960-A97F,U+D7B0-D7FF;}*{box-sizing:border-box;}body{font:1rem/1.5 "Source Serif 4",NanumBarunGothic,serif;margin:0;position:relative;overflow-wrap:break-word;overflow-wrap:anywhere;font-feature-settings:"kern","liga";background-color:var(--main-background-color);color:var(--main-color);}h1{font-size:1.5rem;}h2{font-size:1.375rem;}h3{font-size:1.25rem;}h1,h2,h3,h4,h5,h6{font-weight:500;}h1,h2,h3,h4{margin:25px 0 15px 0;padding-bottom:6px;}.docblock h3,.docblock h4,h5,h6{margin:15px 0 5px 0;}.docblock>h2:first-child,.docblock>h3:first-child,.docblock>h4:first-child,.docblock>h5:first-child,.docblock>h6:first-child{margin-top:0;}.main-heading h1{margin:0;padding:0;flex-grow:1;overflow-wrap:break-word;overflow-wrap:anywhere;}.main-heading{display:flex;flex-wrap:wrap;padding-bottom:6px;margin-bottom:15px;}.content h2,.top-doc .docblock>h3,.top-doc .docblock>h4{border-bottom:1px solid var(--headings-border-bottom-color);}h1,h2{line-height:1.25;padding-top:3px;padding-bottom:9px;}h3.code-header{font-size:1.125rem;}h4.code-header{font-size:1rem;}.code-header{font-weight:600;margin:0;padding:0;white-space:pre-wrap;}#crate-search,h1,h2,h3,h4,h5,h6,.sidebar,.mobile-topbar,.search-input,.search-results .result-name,.item-name>a,.out-of-band,span.since,a.src,#help-button>a,summary.hideme,.scraped-example-list,ul.all-items{font-family:"Fira Sans",Arial,NanumBarunGothic,sans-serif;}#toggle-all-docs,a.anchor,.section-header a,#src-sidebar a,.rust a,.sidebar h2 a,.sidebar h3 a,.mobile-topbar h2 a,h1 a,.search-results a,.stab,.result-name i{color:var(--main-color);}span.enum,a.enum,span.struct,a.struct,span.union,a.union,span.primitive,a.primitive,span.type,a.type,span.foreigntype,a.foreigntype{color:var(--type-link-color);}span.trait,a.trait,span.traitalias,a.traitalias{color:var(--trait-link-color);}span.associatedtype,a.associatedtype,span.constant,a.constant,span.static,a.static{color:var(--assoc-item-link-color);}span.fn,a.fn,span.method,a.method,span.tymethod,a.tymethod{color:var(--function-link-color);}span.attr,a.attr,span.derive,a.derive,span.macro,a.macro{color:var(--macro-link-color);}span.mod,a.mod{color:var(--mod-link-color);}span.keyword,a.keyword{color:var(--keyword-link-color);}a{color:var(--link-color);text-decoration:none;}ol,ul{padding-left:24px;}ul ul,ol ul,ul ol,ol ol{margin-bottom:.625em;}p,.docblock>.warning{margin:0 0 .75em 0;}p:last-child,.docblock>.warning:last-child{margin:0;}button{padding:1px 6px;cursor:pointer;}button#toggle-all-docs{padding:0;background:none;border:none;-webkit-appearance:none;opacity:1;}.rustdoc{display:flex;flex-direction:row;flex-wrap:nowrap;}main{position:relative;flex-grow:1;padding:10px 15px 40px 45px;min-width:0;}.src main{padding:15px;}.width-limiter{max-width:960px;margin-right:auto;}details:not(.toggle) summary{margin-bottom:.6em;}code,pre,a.test-arrow,.code-header{font-family:"Source Code Pro",monospace;}.docblock code,.docblock-short code{border-radius:3px;padding:0 0.125em;}.docblock pre code,.docblock-short pre code{padding:0;}pre{padding:14px;line-height:1.5;}pre.item-decl{overflow-x:auto;}.item-decl .type-contents-toggle{contain:initial;}.src .content pre{padding:20px;}.rustdoc.src .example-wrap pre.src-line-numbers{padding:20px 0 20px 4px;}img{max-width:100%;}.logo-container{line-height:0;display:block;}.rust-logo{filter:var(--rust-logo-filter);}.sidebar{font-size:0.875rem;flex:0 0 var(--desktop-sidebar-width);width:var(--desktop-sidebar-width);overflow-y:scroll;overscroll-behavior:contain;position:sticky;height:100vh;top:0;left:0;z-index:var(--desktop-sidebar-z-index);}.rustdoc.src .sidebar{flex-basis:50px;width:50px;border-right:1px solid;overflow-x:hidden;overflow-y:hidden;}.hide-sidebar .sidebar,.hide-sidebar .sidebar-resizer{display:none;}.sidebar-resizer{touch-action:none;width:9px;cursor:col-resize;z-index:calc(var(--desktop-sidebar-z-index) + 1);position:fixed;height:100%;left:calc(var(--desktop-sidebar-width) + 1px);}.rustdoc.src .sidebar-resizer{left:49px;}.src-sidebar-expanded .src .sidebar-resizer{left:var(--src-sidebar-width);}.sidebar-resizing{-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none;}.sidebar-resizing*{cursor:col-resize !important;}.sidebar-resizing .sidebar{position:fixed;}.sidebar-resizing>body{padding-left:var(--resizing-sidebar-width);}.sidebar-resizer:hover,.sidebar-resizer:active,.sidebar-resizer:focus,.sidebar-resizer.active{width:10px;margin:0;left:var(--desktop-sidebar-width);border-left:solid 1px var(--sidebar-resizer-hover);}.src-sidebar-expanded .rustdoc.src .sidebar-resizer:hover,.src-sidebar-expanded .rustdoc.src .sidebar-resizer:active,.src-sidebar-expanded .rustdoc.src .sidebar-resizer:focus,.src-sidebar-expanded .rustdoc.src .sidebar-resizer.active{left:calc(var(--src-sidebar-width) - 1px);}@media (pointer:coarse){.sidebar-resizer{display:none !important;}}.sidebar-resizer.active{padding:0 140px;width:2px;margin-left:-140px;border-left:none;}.sidebar-resizer.active:before{border-left:solid 2px var(--sidebar-resizer-active);display:block;height:100%;content:"";}.sidebar,.mobile-topbar,.sidebar-menu-toggle,#src-sidebar{background-color:var(--sidebar-background-color);}.src .sidebar>*{visibility:hidden;}.src-sidebar-expanded .src .sidebar{overflow-y:auto;flex-basis:var(--src-sidebar-width);width:var(--src-sidebar-width);}.src-sidebar-expanded .src .sidebar>*{visibility:visible;}#all-types{margin-top:1em;}*{scrollbar-width:initial;scrollbar-color:var(--scrollbar-color);}.sidebar{scrollbar-width:thin;scrollbar-color:var(--scrollbar-color);}::-webkit-scrollbar{width:12px;}.sidebar::-webkit-scrollbar{width:8px;}::-webkit-scrollbar-track{-webkit-box-shadow:inset 0;background-color:var(--scrollbar-track-background-color);}.sidebar::-webkit-scrollbar-track{background-color:var(--scrollbar-track-background-color);}::-webkit-scrollbar-thumb,.sidebar::-webkit-scrollbar-thumb{background-color:var(--scrollbar-thumb-background-color);}.hidden{display:none !important;}.logo-container>img{height:48px;width:48px;}ul.block,.block li{padding:0;margin:0;list-style:none;}.sidebar-elems a,.sidebar>h2 a{display:block;padding:0.25rem;margin-right:0.25rem;border-left:solid var(--sidebar-elems-left-padding) transparent;margin-left:calc(-0.25rem - var(--sidebar-elems-left-padding));background-clip:border-box;}.sidebar h2{overflow-wrap:anywhere;padding:0;margin:0.7rem 0;}.sidebar h3{font-size:1.125rem;padding:0;margin:0;}.sidebar-elems,.sidebar>.version,.sidebar>h2{padding-left:var(--sidebar-elems-left-padding);}.sidebar a{color:var(--sidebar-link-color);}.sidebar .current,.sidebar .current a,.sidebar-crate a.logo-container:hover+h2 a,.sidebar a:hover:not(.logo-container){background-color:var(--sidebar-current-link-background-color);}.sidebar-elems .block{margin-bottom:2em;}.sidebar-elems .block li a{white-space:nowrap;text-overflow:ellipsis;overflow:hidden;}.sidebar-crate{display:flex;align-items:center;justify-content:center;margin:14px 32px 1rem;row-gap:10px;column-gap:32px;flex-wrap:wrap;}.sidebar-crate h2{flex-grow:1;margin:0 -8px;align-self:start;}.sidebar-crate .logo-container{margin:0 calc(-16px - var(--sidebar-elems-left-padding));padding:0 var(--sidebar-elems-left-padding);text-align:center;}.sidebar-crate .logo-container img{margin-top:-16px;border-top:solid 16px transparent;box-sizing:content-box;position:relative;background-clip:border-box;z-index:1;}.sidebar-crate h2 a{display:block;border-left:solid var(--sidebar-elems-left-padding) transparent;background-clip:border-box;margin:0 calc(-24px + 0.25rem) 0 calc(-0.2rem - var(--sidebar-elems-left-padding));padding:calc((16px - 0.57rem ) / 2 ) 0.25rem;padding-left:0.2rem;}.sidebar-crate h2 .version{display:block;font-weight:normal;font-size:1rem;overflow-wrap:break-word;}.sidebar-crate+.version{margin-top:-1rem;margin-bottom:1rem;}.mobile-topbar{display:none;}.rustdoc .example-wrap{display:flex;position:relative;margin-bottom:10px;}.rustdoc .example-wrap:last-child{margin-bottom:0px;}.rustdoc .example-wrap pre{margin:0;flex-grow:1;}.rustdoc:not(.src) .example-wrap pre{overflow:auto hidden;}.rustdoc .example-wrap pre.example-line-numbers,.rustdoc .example-wrap pre.src-line-numbers{flex-grow:0;min-width:fit-content;overflow:initial;text-align:right;-webkit-user-select:none;user-select:none;padding:14px 8px;color:var(--src-line-numbers-span-color);}.rustdoc .example-wrap pre.src-line-numbers{padding:14px 0;}.src-line-numbers a,.src-line-numbers span{color:var(--src-line-numbers-span-color);padding:0 8px;}.src-line-numbers :target{background-color:transparent;border-right:none;padding:0 8px;}.src-line-numbers .line-highlighted{background-color:var(--src-line-number-highlighted-background-color);}.search-loading{text-align:center;}.docblock-short{overflow-wrap:break-word;overflow-wrap:anywhere;}.docblock :not(pre)>code,.docblock-short code{white-space:pre-wrap;}.top-doc .docblock h2{font-size:1.375rem;}.top-doc .docblock h3{font-size:1.25rem;}.top-doc .docblock h4,.top-doc .docblock h5{font-size:1.125rem;}.top-doc .docblock h6{font-size:1rem;}.docblock h5{font-size:1rem;}.docblock h6{font-size:0.875rem;}.docblock{margin-left:24px;position:relative;}.docblock>:not(.more-examples-toggle):not(.example-wrap){max-width:100%;overflow-x:auto;}.out-of-band{flex-grow:0;font-size:1.125rem;}.docblock code,.docblock-short code,pre,.rustdoc.src .example-wrap{background-color:var(--code-block-background-color);}#main-content{position:relative;}.docblock table{margin:.5em 0;border-collapse:collapse;}.docblock table td,.docblock table th{padding:.5em;border:1px solid var(--border-color);}.docblock table tbody tr:nth-child(2n){background:var(--table-alt-row-background-color);}div.where{white-space:pre-wrap;font-size:0.875rem;}.item-info{display:block;margin-left:24px;}.item-info code{font-size:0.875rem;}#main-content>.item-info{margin-left:0;}nav.sub{flex-grow:1;flex-flow:row nowrap;margin:4px 0 25px 0;display:flex;align-items:center;}.search-form{position:relative;display:flex;height:34px;flex-grow:1;}.src nav.sub{margin:0 0 15px 0;}.section-header{display:block;position:relative;}.section-header:hover>.anchor,.impl:hover>.anchor,.trait-impl:hover>.anchor,.variant:hover>.anchor{display:initial;}.anchor{display:none;position:absolute;left:-0.5em;background:none !important;}.anchor.field{left:-5px;}.section-header>.anchor{left:-15px;padding-right:8px;}h2.section-header>.anchor{padding-right:6px;}a.doc-anchor{color:var(--main-color);display:none;position:absolute;left:-17px;padding-right:5px;padding-left:3px;}*:hover>.doc-anchor{display:block;}.top-doc>.docblock>*:first-child>.doc-anchor{display:none !important;}.main-heading a:hover,.example-wrap .rust a:hover,.all-items a:hover,.docblock a:not(.test-arrow):not(.scrape-help):not(.tooltip):hover:not(.doc-anchor),.docblock-short a:not(.test-arrow):not(.scrape-help):not(.tooltip):hover,.item-info a{text-decoration:underline;}.crate.block li.current a{font-weight:500;}table,.item-table{overflow-wrap:break-word;}.item-table{display:table;padding:0;margin:0;}.item-table>li{display:table-row;}.item-table>li>div{display:table-cell;}.item-table>li>.item-name{padding-right:1.25rem;}.search-results-title{margin-top:0;white-space:nowrap;display:flex;align-items:baseline;}#crate-search-div{position:relative;min-width:5em;}#crate-search{min-width:115px;padding:0 23px 0 4px;max-width:100%;text-overflow:ellipsis;border:1px solid var(--border-color);border-radius:4px;outline:none;cursor:pointer;-moz-appearance:none;-webkit-appearance:none;text-indent:0.01px;background-color:var(--main-background-color);color:inherit;line-height:1.5;font-weight:500;}#crate-search:hover,#crate-search:focus{border-color:var(--crate-search-hover-border);}#crate-search-div::after{pointer-events:none;width:100%;height:100%;position:absolute;top:0;left:0;content:"";background-repeat:no-repeat;background-size:20px;background-position:calc(100% - 2px) 56%;background-image:url('data:image/svg+xml, \ + ');filter:var(--crate-search-div-filter);}#crate-search-div:hover::after,#crate-search-div:focus-within::after{filter:var(--crate-search-div-hover-filter);}#crate-search>option{font-size:1rem;}.search-input{-webkit-appearance:none;outline:none;border:1px solid var(--border-color);border-radius:2px;padding:8px;font-size:1rem;flex-grow:1;background-color:var(--button-background-color);color:var(--search-color);}.search-input:focus{border-color:var(--search-input-focused-border-color);}.search-results{display:none;}.search-results.active{display:block;}.search-results>a{display:flex;margin-left:2px;margin-right:2px;border-bottom:1px solid var(--search-result-border-color);gap:1em;}.search-results>a>div.desc{white-space:nowrap;text-overflow:ellipsis;overflow:hidden;flex:2;}.search-results a:hover,.search-results a:focus{background-color:var(--search-result-link-focus-background-color);}.search-results .result-name{display:flex;align-items:center;justify-content:start;flex:3;}.search-results .result-name .alias{color:var(--search-results-alias-color);}.search-results .result-name .grey{color:var(--search-results-grey-color);}.search-results .result-name .typename{color:var(--search-results-grey-color);font-size:0.875rem;width:var(--search-typename-width);}.search-results .result-name .path{word-break:break-all;max-width:calc(100% - var(--search-typename-width));display:inline-block;}.search-results .result-name .path>*{display:inline;}.popover{position:absolute;top:100%;right:0;z-index:calc(var(--desktop-sidebar-z-index) + 1);margin-top:7px;border-radius:3px;border:1px solid var(--border-color);background-color:var(--main-background-color);color:var(--main-color);--popover-arrow-offset:11px;}.popover::before{content:'';position:absolute;right:var(--popover-arrow-offset);border:solid var(--border-color);border-width:1px 1px 0 0;background-color:var(--main-background-color);padding:4px;transform:rotate(-45deg);top:-5px;}.setting-line{margin:1.2em 0.6em;}.setting-radio input,.setting-check input{margin-right:0.3em;height:1.2rem;width:1.2rem;border:2px solid var(--settings-input-border-color);outline:none;-webkit-appearance:none;cursor:pointer;}.setting-radio input{border-radius:50%;}.setting-radio span,.setting-check span{padding-bottom:1px;}.setting-radio{margin-top:0.1em;margin-bottom:0.1em;min-width:3.8em;padding:0.3em;display:inline-flex;align-items:center;cursor:pointer;}.setting-radio+.setting-radio{margin-left:0.5em;}.setting-check{margin-right:20px;display:flex;align-items:center;cursor:pointer;}.setting-radio input:checked{box-shadow:inset 0 0 0 3px var(--main-background-color);background-color:var(--settings-input-color);}.setting-check input:checked{background-color:var(--settings-input-color);border-width:1px;content:url('data:image/svg+xml,\ + \ + ');}.setting-radio input:focus,.setting-check input:focus{box-shadow:0 0 1px 1px var(--settings-input-color);}.setting-radio input:checked:focus{box-shadow:inset 0 0 0 3px var(--main-background-color),0 0 2px 2px var(--settings-input-color);}.setting-radio input:hover,.setting-check input:hover{border-color:var(--settings-input-color) !important;}#help.popover{max-width:600px;--popover-arrow-offset:48px;}#help dt{float:left;clear:left;margin-right:0.5rem;}#help span.top,#help span.bottom{text-align:center;display:block;font-size:1.125rem;}#help span.top{margin:10px 0;border-bottom:1px solid var(--border-color);padding-bottom:4px;margin-bottom:6px;}#help span.bottom{clear:both;border-top:1px solid var(--border-color);}.side-by-side>div{width:50%;float:left;padding:0 20px 20px 17px;}.item-info .stab{display:block;padding:3px;margin-bottom:5px;}.item-name .stab{margin-left:0.3125em;}.stab{padding:0 2px;font-size:0.875rem;font-weight:normal;color:var(--main-color);background-color:var(--stab-background-color);width:fit-content;white-space:pre-wrap;border-radius:3px;display:inline;vertical-align:baseline;}.stab.portability>code{background:none;color:var(--stab-code-color);}.stab .emoji,.item-info .stab::before{font-size:1.25rem;}.stab .emoji{margin-right:0.3rem;}.item-info .stab::before{content:"\0";width:0;display:inline-block;color:transparent;}.emoji{text-shadow:1px 0 0 black,-1px 0 0 black,0 1px 0 black,0 -1px 0 black;}.since{font-weight:normal;font-size:initial;}.rightside{padding-left:12px;float:right;}.rightside:not(a),.out-of-band{color:var(--right-side-color);}pre.rust{tab-size:4;-moz-tab-size:4;}pre.rust .kw{color:var(--code-highlight-kw-color);}pre.rust .kw-2{color:var(--code-highlight-kw-2-color);}pre.rust .lifetime{color:var(--code-highlight-lifetime-color);}pre.rust .prelude-ty{color:var(--code-highlight-prelude-color);}pre.rust .prelude-val{color:var(--code-highlight-prelude-val-color);}pre.rust .string{color:var(--code-highlight-string-color);}pre.rust .number{color:var(--code-highlight-number-color);}pre.rust .bool-val{color:var(--code-highlight-literal-color);}pre.rust .self{color:var(--code-highlight-self-color);}pre.rust .attr{color:var(--code-highlight-attribute-color);}pre.rust .macro,pre.rust .macro-nonterminal{color:var(--code-highlight-macro-color);}pre.rust .question-mark{font-weight:bold;color:var(--code-highlight-question-mark-color);}pre.rust .comment{color:var(--code-highlight-comment-color);}pre.rust .doccomment{color:var(--code-highlight-doc-comment-color);}.rustdoc.src .example-wrap pre.rust a{background:var(--codeblock-link-background);}.example-wrap.compile_fail,.example-wrap.should_panic{border-left:2px solid var(--codeblock-error-color);}.ignore.example-wrap{border-left:2px solid var(--codeblock-ignore-color);}.example-wrap.compile_fail:hover,.example-wrap.should_panic:hover{border-left:2px solid var(--codeblock-error-hover-color);}.example-wrap.ignore:hover{border-left:2px solid var(--codeblock-ignore-hover-color);}.example-wrap.compile_fail .tooltip,.example-wrap.should_panic .tooltip{color:var(--codeblock-error-color);}.example-wrap.ignore .tooltip{color:var(--codeblock-ignore-color);}.example-wrap.compile_fail:hover .tooltip,.example-wrap.should_panic:hover .tooltip{color:var(--codeblock-error-hover-color);}.example-wrap.ignore:hover .tooltip{color:var(--codeblock-ignore-hover-color);}.example-wrap .tooltip{position:absolute;display:block;left:-25px;top:5px;margin:0;line-height:1;}.example-wrap.compile_fail .tooltip,.example-wrap.should_panic .tooltip,.example-wrap.ignore .tooltip{font-weight:bold;font-size:1.25rem;}.content .docblock .warning{border-left:2px solid var(--warning-border-color);padding:14px;position:relative;overflow-x:visible !important;}.content .docblock .warning::before{color:var(--warning-border-color);content:"ⓘ";position:absolute;left:-25px;top:5px;font-weight:bold;font-size:1.25rem;}.top-doc>.docblock>.warning:first-child::before{top:20px;}a.test-arrow{visibility:hidden;position:absolute;padding:5px 10px 5px 10px;border-radius:5px;font-size:1.375rem;top:5px;right:5px;z-index:1;color:var(--test-arrow-color);background-color:var(--test-arrow-background-color);}a.test-arrow:hover{color:var(--test-arrow-hover-color);background-color:var(--test-arrow-hover-background-color);}.example-wrap:hover .test-arrow{visibility:visible;}.code-attribute{font-weight:300;color:var(--code-attribute-color);}.item-spacer{width:100%;height:12px;display:block;}.out-of-band>span.since{font-size:1.25rem;}.sub-variant h4{font-size:1rem;font-weight:400;margin-top:0;margin-bottom:0;}.sub-variant{margin-left:24px;margin-bottom:40px;}.sub-variant>.sub-variant-field{margin-left:24px;}:target{padding-right:3px;background-color:var(--target-background-color);border-right:3px solid var(--target-border-color);}.code-header a.tooltip{color:inherit;margin-right:15px;position:relative;}.code-header a.tooltip:hover{color:var(--link-color);}a.tooltip:hover::after{position:absolute;top:calc(100% - 10px);left:-15px;right:-15px;height:20px;content:"\00a0";}.fade-out{opacity:0;transition:opacity 0.45s cubic-bezier(0,0,0.1,1.0);}.popover.tooltip .content{margin:0.25em 0.5em;}.popover.tooltip .content pre,.popover.tooltip .content code{background:transparent;margin:0;padding:0;font-size:1.25rem;white-space:pre-wrap;}.popover.tooltip .content>h3:first-child{margin:0 0 5px 0;}.search-failed{text-align:center;margin-top:20px;display:none;}.search-failed.active{display:block;}.search-failed>ul{text-align:left;max-width:570px;margin-left:auto;margin-right:auto;}#search-tabs{display:flex;flex-direction:row;gap:1px;margin-bottom:4px;}#search-tabs button{text-align:center;font-size:1.125rem;border:0;border-top:2px solid;flex:1;line-height:1.5;color:inherit;}#search-tabs button:not(.selected){background-color:var(--search-tab-button-not-selected-background);border-top-color:var(--search-tab-button-not-selected-border-top-color);}#search-tabs button:hover,#search-tabs button.selected{background-color:var(--search-tab-button-selected-background);border-top-color:var(--search-tab-button-selected-border-top-color);}#search-tabs .count{font-size:1rem;font-variant-numeric:tabular-nums;color:var(--search-tab-title-count-color);}#search .error code{border-radius:3px;background-color:var(--search-error-code-background-color);}.search-corrections{font-weight:normal;}#src-sidebar{width:100%;overflow:auto;}#src-sidebar div.files>a:hover,details.dir-entry summary:hover,#src-sidebar div.files>a:focus,details.dir-entry summary:focus{background-color:var(--src-sidebar-background-hover);}#src-sidebar div.files>a.selected{background-color:var(--src-sidebar-background-selected);}.src-sidebar-title{position:sticky;top:0;display:flex;padding:8px 8px 0 48px;margin-bottom:7px;background:var(--sidebar-background-color);border-bottom:1px solid var(--border-color);}#settings-menu,#help-button{margin-left:4px;display:flex;}#sidebar-button{display:none;line-height:0;}.hide-sidebar #sidebar-button,.src #sidebar-button{display:flex;margin-right:4px;position:fixed;left:6px;height:34px;width:34px;background-color:var(--main-background-color);z-index:1;}.src #sidebar-button{left:8px;z-index:calc(var(--desktop-sidebar-z-index) + 1);}.hide-sidebar .src #sidebar-button{position:static;}#settings-menu>a,#help-button>a,#sidebar-button>a{display:flex;align-items:center;justify-content:center;background-color:var(--button-background-color);border:1px solid var(--border-color);border-radius:2px;color:var(--settings-button-color);font-size:20px;width:33px;}#settings-menu>a:hover,#settings-menu>a:focus,#help-button>a:hover,#help-button>a:focus,#sidebar-button>a:hover,#sidebar-button>a:focus{border-color:var(--settings-button-border-focus);}#settings-menu>a{line-height:0;font-size:0;}#settings-menu>a:before{content:url('data:image/svg+xml,\ + ');width:22px;height:22px;filter:var(--settings-menu-filter);}#sidebar-button>a:before{content:url('data:image/svg+xml,\ + \ + \ + ');width:22px;height:22px;}#copy-path{color:var(--copy-path-button-color);background:var(--main-background-color);height:34px;width:33px;margin-left:10px;padding:0;padding-left:2px;border:0;font-size:0;}#copy-path::before{filter:var(--copy-path-img-filter);content:url('data:image/svg+xml,\ +\ +\ +');width:19px;height:18px;}#copy-path:hover::before{filter:var(--copy-path-img-hover-filter);}#copy-path.clicked::before{content:url('data:image/svg+xml,\ + \ + ');}@keyframes rotating{from{transform:rotate(0deg);}to{transform:rotate(360deg);}}#settings-menu.rotate>a img{animation:rotating 2s linear infinite;}kbd{display:inline-block;padding:3px 5px;font:15px monospace;line-height:10px;vertical-align:middle;border:solid 1px var(--border-color);border-radius:3px;color:var(--kbd-color);background-color:var(--kbd-background);box-shadow:inset 0 -1px 0 var(--kbd-box-shadow-color);}ul.all-items>li{list-style:none;}details.dir-entry{padding-left:4px;}details.dir-entry>summary{margin:0 0 0 -4px;padding:0 0 0 4px;cursor:pointer;}details.dir-entry div.folders,details.dir-entry div.files{padding-left:23px;}details.dir-entry a{display:block;}details.toggle{contain:layout;position:relative;}details.toggle>summary.hideme{cursor:pointer;font-size:1rem;}details.toggle>summary{list-style:none;outline:none;}details.toggle>summary::-webkit-details-marker,details.toggle>summary::marker{display:none;}details.toggle>summary.hideme>span{margin-left:9px;}details.toggle>summary::before{background:url('data:image/svg+xml,') no-repeat top left;content:"";cursor:pointer;width:16px;height:16px;display:inline-block;vertical-align:middle;opacity:.5;filter:var(--toggle-filter);}details.toggle>summary.hideme>span,.more-examples-toggle summary,.more-examples-toggle .hide-more{color:var(--toggles-color);}details.toggle>summary::after{content:"Expand";overflow:hidden;width:0;height:0;position:absolute;}details.toggle>summary.hideme::after{content:"";}details.toggle>summary:focus::before,details.toggle>summary:hover::before{opacity:1;}details.toggle>summary:focus-visible::before{outline:1px dotted #000;outline-offset:1px;}details.non-exhaustive{margin-bottom:8px;}details.toggle>summary.hideme::before{position:relative;}details.toggle>summary:not(.hideme)::before{position:absolute;left:-24px;top:4px;}.impl-items>details.toggle>summary:not(.hideme)::before{position:absolute;left:-24px;}details.toggle[open] >summary.hideme{position:absolute;}details.toggle[open] >summary.hideme>span{display:none;}details.toggle[open] >summary::before{background:url('data:image/svg+xml,') no-repeat top left;}details.toggle[open] >summary::after{content:"Collapse";}.docblock summary>*{display:inline-block;}.docblock>.example-wrap:first-child .tooltip{margin-top:16px;}.src #sidebar-button>a:before,.sidebar-menu-toggle:before{content:url('data:image/svg+xml,\ + ');opacity:0.75;}.sidebar-menu-toggle:hover:before,.sidebar-menu-toggle:active:before,.sidebar-menu-toggle:focus:before{opacity:1;}.src #sidebar-button>a:before{content:url('data:image/svg+xml,\ + \ + \ + ');opacity:0.75;}@media (max-width:850px){#search-tabs .count{display:block;}}@media (max-width:700px){*[id]{scroll-margin-top:45px;}.rustdoc{display:block;}main{padding-left:15px;padding-top:0px;}.main-heading{flex-direction:column;}.out-of-band{text-align:left;margin-left:initial;padding:initial;}.out-of-band .since::before{content:"Since ";}.sidebar .logo-container,.sidebar .location,.sidebar-resizer{display:none;}.sidebar{position:fixed;top:45px;left:-1000px;z-index:11;height:calc(100vh - 45px);width:200px;}.src main,.rustdoc.src .sidebar{top:0;padding:0;height:100vh;border:0;}.src .search-form{margin-left:40px;}.hide-sidebar .search-form{margin-left:32px;}.hide-sidebar .src .search-form{margin-left:0;}.sidebar.shown,.src-sidebar-expanded .src .sidebar,.rustdoc:not(.src) .sidebar:focus-within{left:0;}.mobile-topbar h2{padding-bottom:0;margin:auto 0.5em auto auto;overflow:hidden;font-size:24px;white-space:nowrap;text-overflow:ellipsis;}.mobile-topbar .logo-container>img{max-width:35px;max-height:35px;margin:5px 0 5px 20px;}.mobile-topbar{display:flex;flex-direction:row;position:sticky;z-index:10;font-size:2rem;height:45px;width:100%;left:0;top:0;}.hide-sidebar .mobile-topbar{display:none;}.sidebar-menu-toggle{width:45px;border:none;line-height:0;}.hide-sidebar .sidebar-menu-toggle{display:none;}.sidebar-elems{margin-top:1em;}.anchor{display:none !important;}#main-content>details.toggle>summary::before,#main-content>div>details.toggle>summary::before{left:-11px;}#copy-path,#help-button{display:none;}#sidebar-button>a:before{content:url('data:image/svg+xml,\ + \ + \ + ');width:22px;height:22px;}.sidebar-menu-toggle:before{filter:var(--mobile-sidebar-menu-filter);}.sidebar-menu-toggle:hover{background:var(--main-background-color);}.item-table,.item-row,.item-table>li,.item-table>li>div,.search-results>a,.search-results>a>div{display:block;}.search-results>a{padding:5px 0px;}.search-results>a>div.desc,.item-table>li>div.desc{padding-left:2em;}.search-results .result-name{display:block;}.search-results .result-name .typename{width:initial;margin-right:0;}.search-results .result-name .typename,.search-results .result-name .path{display:inline;}.src-sidebar-expanded .src .sidebar{position:fixed;max-width:100vw;width:100vw;}.src .src-sidebar-title{padding-top:0;}details.toggle:not(.top-doc)>summary{margin-left:10px;}.impl-items>details.toggle>summary:not(.hideme)::before,#main-content>details.toggle:not(.top-doc)>summary::before,#main-content>div>details.toggle>summary::before{left:-11px;}.impl-items>.item-info{margin-left:34px;}.src nav.sub{margin:0;padding:var(--nav-sub-mobile-padding);}}@media (min-width:701px){.scraped-example-title{position:absolute;z-index:10;background:var(--main-background-color);bottom:8px;right:5px;padding:2px 4px;box-shadow:0 0 4px var(--main-background-color);}.item-table>li>.item-name{width:33%;}.item-table>li>div{padding-bottom:5px;word-break:break-all;}}@media print{nav.sidebar,nav.sub,.out-of-band,a.src,#copy-path,details.toggle[open] >summary::before,details.toggle>summary::before,details.toggle.top-doc>summary{display:none;}.docblock{margin-left:0;}main{padding:10px;}}@media (max-width:464px){.docblock{margin-left:12px;}.docblock code{overflow-wrap:break-word;overflow-wrap:anywhere;}nav.sub{flex-direction:column;}.search-form{align-self:stretch;}}.variant,.implementors-toggle>summary,.impl,#implementors-list>.docblock,.impl-items>section,.impl-items>.toggle>summary,.methods>section,.methods>.toggle>summary{margin-bottom:0.75em;}.variants>.docblock,.implementors-toggle>.docblock,.impl-items>.toggle[open]:not(:last-child),.methods>.toggle[open]:not(:last-child),.implementors-toggle[open]:not(:last-child){margin-bottom:2em;}#trait-implementations-list .impl-items>.toggle:not(:last-child),#synthetic-implementations-list .impl-items>.toggle:not(:last-child),#blanket-implementations-list .impl-items>.toggle:not(:last-child){margin-bottom:1em;}.scraped-example-list .scrape-help{margin-left:10px;padding:0 4px;font-weight:normal;font-size:12px;position:relative;bottom:1px;border:1px solid var(--scrape-example-help-border-color);border-radius:50px;color:var(--scrape-example-help-color);}.scraped-example-list .scrape-help:hover{border-color:var(--scrape-example-help-hover-border-color);color:var(--scrape-example-help-hover-color);}.scraped-example{position:relative;}.scraped-example .code-wrapper{position:relative;display:flex;flex-direction:row;flex-wrap:wrap;width:100%;}.scraped-example:not(.expanded) .code-wrapper{max-height:calc(1.5em * 5 + 10px);}.scraped-example:not(.expanded) .code-wrapper pre{overflow-y:hidden;padding-bottom:0;max-height:calc(1.5em * 5 + 10px);}.more-scraped-examples .scraped-example:not(.expanded) .code-wrapper,.more-scraped-examples .scraped-example:not(.expanded) .code-wrapper pre{max-height:calc(1.5em * 10 + 10px);}.scraped-example .code-wrapper .next,.scraped-example .code-wrapper .prev,.scraped-example .code-wrapper .expand{color:var(--main-color);position:absolute;top:0.25em;z-index:1;padding:0;background:none;border:none;-webkit-appearance:none;opacity:1;}.scraped-example .code-wrapper .prev{right:2.25em;}.scraped-example .code-wrapper .next{right:1.25em;}.scraped-example .code-wrapper .expand{right:0.25em;}.scraped-example:not(.expanded) .code-wrapper::before,.scraped-example:not(.expanded) .code-wrapper::after{content:" ";width:100%;height:5px;position:absolute;z-index:1;}.scraped-example:not(.expanded) .code-wrapper::before{top:0;background:linear-gradient(to bottom,var(--scrape-example-code-wrapper-background-start),var(--scrape-example-code-wrapper-background-end));}.scraped-example:not(.expanded) .code-wrapper::after{bottom:0;background:linear-gradient(to top,var(--scrape-example-code-wrapper-background-start),var(--scrape-example-code-wrapper-background-end));}.scraped-example .code-wrapper .example-wrap{width:100%;overflow-y:hidden;margin-bottom:0;}.scraped-example:not(.expanded) .code-wrapper .example-wrap{overflow-x:hidden;}.scraped-example .example-wrap .rust span.highlight{background:var(--scrape-example-code-line-highlight);}.scraped-example .example-wrap .rust span.highlight.focus{background:var(--scrape-example-code-line-highlight-focus);}.more-examples-toggle{max-width:calc(100% + 25px);margin-top:10px;margin-left:-25px;}.more-examples-toggle .hide-more{margin-left:25px;cursor:pointer;}.more-scraped-examples{margin-left:25px;position:relative;}.toggle-line{position:absolute;top:5px;bottom:0;right:calc(100% + 10px);padding:0 4px;cursor:pointer;}.toggle-line-inner{min-width:2px;height:100%;background:var(--scrape-example-toggle-line-background);}.toggle-line:hover .toggle-line-inner{background:var(--scrape-example-toggle-line-hover-background);}.more-scraped-examples .scraped-example,.example-links{margin-top:20px;}.more-scraped-examples .scraped-example:first-child{margin-top:5px;}.example-links ul{margin-bottom:0;}:root[data-theme="light"],:root:not([data-theme]){--main-background-color:white;--main-color:black;--settings-input-color:#2196f3;--settings-input-border-color:#717171;--settings-button-color:#000;--settings-button-border-focus:#717171;--sidebar-background-color:#f5f5f5;--sidebar-background-color-hover:#e0e0e0;--code-block-background-color:#f5f5f5;--scrollbar-track-background-color:#dcdcdc;--scrollbar-thumb-background-color:rgba(36,37,39,0.6);--scrollbar-color:rgba(36,37,39,0.6) #d9d9d9;--headings-border-bottom-color:#ddd;--border-color:#e0e0e0;--button-background-color:#fff;--right-side-color:grey;--code-attribute-color:#999;--toggles-color:#999;--toggle-filter:none;--mobile-sidebar-menu-filter:none;--search-input-focused-border-color:#66afe9;--copy-path-button-color:#999;--copy-path-img-filter:invert(50%);--copy-path-img-hover-filter:invert(35%);--codeblock-error-hover-color:rgb(255,0,0);--codeblock-error-color:rgba(255,0,0,.5);--codeblock-ignore-hover-color:rgb(255,142,0);--codeblock-ignore-color:rgba(255,142,0,.6);--warning-border-color:#ff8e00;--type-link-color:#ad378a;--trait-link-color:#6e4fc9;--assoc-item-link-color:#3873ad;--function-link-color:#ad7c37;--macro-link-color:#068000;--keyword-link-color:#3873ad;--mod-link-color:#3873ad;--link-color:#3873ad;--sidebar-link-color:#356da4;--sidebar-current-link-background-color:#fff;--search-result-link-focus-background-color:#ccc;--search-result-border-color:#aaa3;--search-color:#000;--search-error-code-background-color:#d0cccc;--search-results-alias-color:#000;--search-results-grey-color:#999;--search-tab-title-count-color:#888;--search-tab-button-not-selected-border-top-color:#e6e6e6;--search-tab-button-not-selected-background:#e6e6e6;--search-tab-button-selected-border-top-color:#0089ff;--search-tab-button-selected-background:#fff;--settings-menu-filter:none;--stab-background-color:#fff5d6;--stab-code-color:#000;--code-highlight-kw-color:#8959a8;--code-highlight-kw-2-color:#4271ae;--code-highlight-lifetime-color:#b76514;--code-highlight-prelude-color:#4271ae;--code-highlight-prelude-val-color:#c82829;--code-highlight-number-color:#718c00;--code-highlight-string-color:#718c00;--code-highlight-literal-color:#c82829;--code-highlight-attribute-color:#c82829;--code-highlight-self-color:#c82829;--code-highlight-macro-color:#3e999f;--code-highlight-question-mark-color:#ff9011;--code-highlight-comment-color:#8e908c;--code-highlight-doc-comment-color:#4d4d4c;--src-line-numbers-span-color:#c67e2d;--src-line-number-highlighted-background-color:#fdffd3;--test-arrow-color:#f5f5f5;--test-arrow-background-color:rgba(78,139,202,0.2);--test-arrow-hover-color:#f5f5f5;--test-arrow-hover-background-color:rgb(78,139,202);--target-background-color:#fdffd3;--target-border-color:#ad7c37;--kbd-color:#000;--kbd-background:#fafbfc;--kbd-box-shadow-color:#c6cbd1;--rust-logo-filter:initial;--crate-search-div-filter:invert(100%) sepia(0%) saturate(4223%) hue-rotate(289deg) brightness(114%) contrast(76%);--crate-search-div-hover-filter:invert(44%) sepia(18%) saturate(23%) hue-rotate(317deg) brightness(96%) contrast(93%);--crate-search-hover-border:#717171;--src-sidebar-background-selected:#fff;--src-sidebar-background-hover:#e0e0e0;--table-alt-row-background-color:#f5f5f5;--codeblock-link-background:#eee;--scrape-example-toggle-line-background:#ccc;--scrape-example-toggle-line-hover-background:#999;--scrape-example-code-line-highlight:#fcffd6;--scrape-example-code-line-highlight-focus:#f6fdb0;--scrape-example-help-border-color:#555;--scrape-example-help-color:#333;--scrape-example-help-hover-border-color:#000;--scrape-example-help-hover-color:#000;--scrape-example-code-wrapper-background-start:rgba(255,255,255,1);--scrape-example-code-wrapper-background-end:rgba(255,255,255,0);--sidebar-resizer-hover:hsl(207,90%,66%);--sidebar-resizer-active:hsl(207,90%,54%);}:root[data-theme="dark"]{--main-background-color:#353535;--main-color:#ddd;--settings-input-color:#2196f3;--settings-input-border-color:#999;--settings-button-color:#000;--settings-button-border-focus:#ffb900;--sidebar-background-color:#505050;--sidebar-background-color-hover:#676767;--code-block-background-color:#2A2A2A;--scrollbar-track-background-color:#717171;--scrollbar-thumb-background-color:rgba(32,34,37,.6);--scrollbar-color:rgba(32,34,37,.6) #5a5a5a;--headings-border-bottom-color:#d2d2d2;--border-color:#e0e0e0;--button-background-color:#f0f0f0;--right-side-color:grey;--code-attribute-color:#999;--toggles-color:#999;--toggle-filter:invert(100%);--mobile-sidebar-menu-filter:invert(100%);--search-input-focused-border-color:#008dfd;--copy-path-button-color:#999;--copy-path-img-filter:invert(50%);--copy-path-img-hover-filter:invert(65%);--codeblock-error-hover-color:rgb(255,0,0);--codeblock-error-color:rgba(255,0,0,.5);--codeblock-ignore-hover-color:rgb(255,142,0);--codeblock-ignore-color:rgba(255,142,0,.6);--warning-border-color:#ff8e00;--type-link-color:#2dbfb8;--trait-link-color:#b78cf2;--assoc-item-link-color:#d2991d;--function-link-color:#2bab63;--macro-link-color:#09bd00;--keyword-link-color:#d2991d;--mod-link-color:#d2991d;--link-color:#d2991d;--sidebar-link-color:#fdbf35;--sidebar-current-link-background-color:#444;--search-result-link-focus-background-color:#616161;--search-result-border-color:#aaa3;--search-color:#111;--search-error-code-background-color:#484848;--search-results-alias-color:#fff;--search-results-grey-color:#ccc;--search-tab-title-count-color:#888;--search-tab-button-not-selected-border-top-color:#252525;--search-tab-button-not-selected-background:#252525;--search-tab-button-selected-border-top-color:#0089ff;--search-tab-button-selected-background:#353535;--settings-menu-filter:none;--stab-background-color:#314559;--stab-code-color:#e6e1cf;--code-highlight-kw-color:#ab8ac1;--code-highlight-kw-2-color:#769acb;--code-highlight-lifetime-color:#d97f26;--code-highlight-prelude-color:#769acb;--code-highlight-prelude-val-color:#ee6868;--code-highlight-number-color:#83a300;--code-highlight-string-color:#83a300;--code-highlight-literal-color:#ee6868;--code-highlight-attribute-color:#ee6868;--code-highlight-self-color:#ee6868;--code-highlight-macro-color:#3e999f;--code-highlight-question-mark-color:#ff9011;--code-highlight-comment-color:#8d8d8b;--code-highlight-doc-comment-color:#8ca375;--src-line-numbers-span-color:#3b91e2;--src-line-number-highlighted-background-color:#0a042f;--test-arrow-color:#dedede;--test-arrow-background-color:rgba(78,139,202,0.2);--test-arrow-hover-color:#dedede;--test-arrow-hover-background-color:#4e8bca;--target-background-color:#494a3d;--target-border-color:#bb7410;--kbd-color:#000;--kbd-background:#fafbfc;--kbd-box-shadow-color:#c6cbd1;--rust-logo-filter:drop-shadow(1px 0 0px #fff) drop-shadow(0 1px 0 #fff) drop-shadow(-1px 0 0 #fff) drop-shadow(0 -1px 0 #fff);--crate-search-div-filter:invert(94%) sepia(0%) saturate(721%) hue-rotate(255deg) brightness(90%) contrast(90%);--crate-search-div-hover-filter:invert(69%) sepia(60%) saturate(6613%) hue-rotate(184deg) brightness(100%) contrast(91%);--crate-search-hover-border:#2196f3;--src-sidebar-background-selected:#333;--src-sidebar-background-hover:#444;--table-alt-row-background-color:#2a2a2a;--codeblock-link-background:#333;--scrape-example-toggle-line-background:#999;--scrape-example-toggle-line-hover-background:#c5c5c5;--scrape-example-code-line-highlight:#5b3b01;--scrape-example-code-line-highlight-focus:#7c4b0f;--scrape-example-help-border-color:#aaa;--scrape-example-help-color:#eee;--scrape-example-help-hover-border-color:#fff;--scrape-example-help-hover-color:#fff;--scrape-example-code-wrapper-background-start:rgba(53,53,53,1);--scrape-example-code-wrapper-background-end:rgba(53,53,53,0);--sidebar-resizer-hover:hsl(207,30%,54%);--sidebar-resizer-active:hsl(207,90%,54%);}:root[data-theme="ayu"]{--main-background-color:#0f1419;--main-color:#c5c5c5;--settings-input-color:#ffb454;--settings-input-border-color:#999;--settings-button-color:#fff;--settings-button-border-focus:#e0e0e0;--sidebar-background-color:#14191f;--sidebar-background-color-hover:rgba(70,70,70,0.33);--code-block-background-color:#191f26;--scrollbar-track-background-color:transparent;--scrollbar-thumb-background-color:#5c6773;--scrollbar-color:#5c6773 #24292f;--headings-border-bottom-color:#5c6773;--border-color:#5c6773;--button-background-color:#141920;--right-side-color:grey;--code-attribute-color:#999;--toggles-color:#999;--toggle-filter:invert(100%);--mobile-sidebar-menu-filter:invert(100%);--search-input-focused-border-color:#5c6773;--copy-path-button-color:#fff;--copy-path-img-filter:invert(70%);--copy-path-img-hover-filter:invert(100%);--codeblock-error-hover-color:rgb(255,0,0);--codeblock-error-color:rgba(255,0,0,.5);--codeblock-ignore-hover-color:rgb(255,142,0);--codeblock-ignore-color:rgba(255,142,0,.6);--warning-border-color:#ff8e00;--type-link-color:#ffa0a5;--trait-link-color:#39afd7;--assoc-item-link-color:#39afd7;--function-link-color:#fdd687;--macro-link-color:#a37acc;--keyword-link-color:#39afd7;--mod-link-color:#39afd7;--link-color:#39afd7;--sidebar-link-color:#53b1db;--sidebar-current-link-background-color:transparent;--search-result-link-focus-background-color:#3c3c3c;--search-result-border-color:#aaa3;--search-color:#fff;--search-error-code-background-color:#4f4c4c;--search-results-alias-color:#c5c5c5;--search-results-grey-color:#999;--search-tab-title-count-color:#888;--search-tab-button-not-selected-border-top-color:none;--search-tab-button-not-selected-background:transparent !important;--search-tab-button-selected-border-top-color:none;--search-tab-button-selected-background:#141920 !important;--settings-menu-filter:invert(100%);--stab-background-color:#314559;--stab-code-color:#e6e1cf;--code-highlight-kw-color:#ff7733;--code-highlight-kw-2-color:#ff7733;--code-highlight-lifetime-color:#ff7733;--code-highlight-prelude-color:#69f2df;--code-highlight-prelude-val-color:#ff7733;--code-highlight-number-color:#b8cc52;--code-highlight-string-color:#b8cc52;--code-highlight-literal-color:#ff7733;--code-highlight-attribute-color:#e6e1cf;--code-highlight-self-color:#36a3d9;--code-highlight-macro-color:#a37acc;--code-highlight-question-mark-color:#ff9011;--code-highlight-comment-color:#788797;--code-highlight-doc-comment-color:#a1ac88;--src-line-numbers-span-color:#5c6773;--src-line-number-highlighted-background-color:rgba(255,236,164,0.06);--test-arrow-color:#788797;--test-arrow-background-color:rgba(57,175,215,0.09);--test-arrow-hover-color:#c5c5c5;--test-arrow-hover-background-color:rgba(57,175,215,0.368);--target-background-color:rgba(255,236,164,0.06);--target-border-color:rgba(255,180,76,0.85);--kbd-color:#c5c5c5;--kbd-background:#314559;--kbd-box-shadow-color:#5c6773;--rust-logo-filter:drop-shadow(1px 0 0px #fff) drop-shadow(0 1px 0 #fff) drop-shadow(-1px 0 0 #fff) drop-shadow(0 -1px 0 #fff);--crate-search-div-filter:invert(41%) sepia(12%) saturate(487%) hue-rotate(171deg) brightness(94%) contrast(94%);--crate-search-div-hover-filter:invert(98%) sepia(12%) saturate(81%) hue-rotate(343deg) brightness(113%) contrast(76%);--crate-search-hover-border:#e0e0e0;--src-sidebar-background-selected:#14191f;--src-sidebar-background-hover:#14191f;--table-alt-row-background-color:#191f26;--codeblock-link-background:#333;--scrape-example-toggle-line-background:#999;--scrape-example-toggle-line-hover-background:#c5c5c5;--scrape-example-code-line-highlight:#5b3b01;--scrape-example-code-line-highlight-focus:#7c4b0f;--scrape-example-help-border-color:#aaa;--scrape-example-help-color:#eee;--scrape-example-help-hover-border-color:#fff;--scrape-example-help-hover-color:#fff;--scrape-example-code-wrapper-background-start:rgba(15,20,25,1);--scrape-example-code-wrapper-background-end:rgba(15,20,25,0);--sidebar-resizer-hover:hsl(34,50%,33%);--sidebar-resizer-active:hsl(34,100%,66%);}:root[data-theme="ayu"] h1,:root[data-theme="ayu"] h2,:root[data-theme="ayu"] h3,:root[data-theme="ayu"] h4,:where(:root[data-theme="ayu"]) h1 a,:root[data-theme="ayu"] .sidebar h2 a,:root[data-theme="ayu"] .sidebar h3 a{color:#fff;}:root[data-theme="ayu"] .docblock code{color:#ffb454;}:root[data-theme="ayu"] .docblock a>code{color:#39AFD7 !important;}:root[data-theme="ayu"] .code-header,:root[data-theme="ayu"] .docblock pre>code,:root[data-theme="ayu"] pre,:root[data-theme="ayu"] pre>code,:root[data-theme="ayu"] .item-info code,:root[data-theme="ayu"] .rustdoc.source .example-wrap{color:#e6e1cf;}:root[data-theme="ayu"] .sidebar .current,:root[data-theme="ayu"] .sidebar .current a,:root[data-theme="ayu"] .sidebar a:hover,:root[data-theme="ayu"] #src-sidebar div.files>a:hover,:root[data-theme="ayu"] details.dir-entry summary:hover,:root[data-theme="ayu"] #src-sidebar div.files>a:focus,:root[data-theme="ayu"] details.dir-entry summary:focus,:root[data-theme="ayu"] #src-sidebar div.files>a.selected{color:#ffb44c;}:root[data-theme="ayu"] .sidebar-elems .location{color:#ff7733;}:root[data-theme="ayu"] .src-line-numbers .line-highlighted{color:#708090;padding-right:7px;border-right:1px solid #ffb44c;}:root[data-theme="ayu"] .search-results a:hover,:root[data-theme="ayu"] .search-results a:focus{color:#fff !important;background-color:#3c3c3c;}:root[data-theme="ayu"] .search-results a{color:#0096cf;}:root[data-theme="ayu"] .search-results a div.desc{color:#c5c5c5;}:root[data-theme="ayu"] .result-name .primitive>i,:root[data-theme="ayu"] .result-name .keyword>i{color:#788797;}:root[data-theme="ayu"] #search-tabs>button.selected{border-bottom:1px solid #ffb44c !important;border-top:none;}:root[data-theme="ayu"] #search-tabs>button:not(.selected){border:none;background-color:transparent !important;}:root[data-theme="ayu"] #search-tabs>button:hover{border-bottom:1px solid rgba(242,151,24,0.3);}:root[data-theme="ayu"] #settings-menu>a img,:root[data-theme="ayu"] #sidebar-button>a:before{filter:invert(100);} \ No newline at end of file diff --git a/static.files/scrape-examples-ef1e698c1d417c0c.js b/static.files/scrape-examples-ef1e698c1d417c0c.js new file mode 100644 index 00000000..ba830e37 --- /dev/null +++ b/static.files/scrape-examples-ef1e698c1d417c0c.js @@ -0,0 +1 @@ +"use strict";(function(){const DEFAULT_MAX_LINES=5;const HIDDEN_MAX_LINES=10;function scrollToLoc(elt,loc,isHidden){const lines=elt.querySelector(".src-line-numbers");let scrollOffset;const maxLines=isHidden?HIDDEN_MAX_LINES:DEFAULT_MAX_LINES;if(loc[1]-loc[0]>maxLines){const line=Math.max(0,loc[0]-1);scrollOffset=lines.children[line].offsetTop}else{const wrapper=elt.querySelector(".code-wrapper");const halfHeight=wrapper.offsetHeight/2;const offsetTop=lines.children[loc[0]].offsetTop;const lastLine=lines.children[loc[1]];const offsetBot=lastLine.offsetTop+lastLine.offsetHeight;const offsetMid=(offsetTop+offsetBot)/2;scrollOffset=offsetMid-halfHeight}lines.scrollTo(0,scrollOffset);elt.querySelector(".rust").scrollTo(0,scrollOffset)}function updateScrapedExample(example,isHidden){const locs=JSON.parse(example.attributes.getNamedItem("data-locs").textContent);let locIndex=0;const highlights=Array.prototype.slice.call(example.querySelectorAll(".highlight"));const link=example.querySelector(".scraped-example-title a");if(locs.length>1){const onChangeLoc=changeIndex=>{removeClass(highlights[locIndex],"focus");changeIndex();scrollToLoc(example,locs[locIndex][0],isHidden);addClass(highlights[locIndex],"focus");const url=locs[locIndex][1];const title=locs[locIndex][2];link.href=url;link.innerHTML=title};example.querySelector(".prev").addEventListener("click",()=>{onChangeLoc(()=>{locIndex=(locIndex-1+locs.length)%locs.length})});example.querySelector(".next").addEventListener("click",()=>{onChangeLoc(()=>{locIndex=(locIndex+1)%locs.length})})}const expandButton=example.querySelector(".expand");if(expandButton){expandButton.addEventListener("click",()=>{if(hasClass(example,"expanded")){removeClass(example,"expanded");scrollToLoc(example,locs[0][0],isHidden)}else{addClass(example,"expanded")}})}scrollToLoc(example,locs[0][0],isHidden)}const firstExamples=document.querySelectorAll(".scraped-example-list > .scraped-example");onEachLazy(firstExamples,el=>updateScrapedExample(el,false));onEachLazy(document.querySelectorAll(".more-examples-toggle"),toggle=>{onEachLazy(toggle.querySelectorAll(".toggle-line, .hide-more"),button=>{button.addEventListener("click",()=>{toggle.open=false})});const moreExamples=toggle.querySelectorAll(".scraped-example");toggle.querySelector("summary").addEventListener("click",()=>{setTimeout(()=>{onEachLazy(moreExamples,el=>updateScrapedExample(el,true))})},{once:true})})})() \ No newline at end of file diff --git a/static.files/search-d234aafac6c221dd.js b/static.files/search-d234aafac6c221dd.js new file mode 100644 index 00000000..3f587f65 --- /dev/null +++ b/static.files/search-d234aafac6c221dd.js @@ -0,0 +1,5 @@ +"use strict";if(!Array.prototype.toSpliced){Array.prototype.toSpliced=function(){const me=this.slice();Array.prototype.splice.apply(me,arguments);return me}}(function(){const itemTypes=["keyword","primitive","mod","externcrate","import","struct","enum","fn","type","static","trait","impl","tymethod","method","structfield","variant","macro","associatedtype","constant","associatedconstant","union","foreigntype","existential","attr","derive","traitalias","generic",];const longItemTypes=["keyword","primitive type","module","extern crate","re-export","struct","enum","function","type alias","static","trait","","trait method","method","struct field","enum variant","macro","assoc type","constant","assoc const","union","foreign type","existential type","attribute macro","derive macro","trait alias",];const TY_GENERIC=itemTypes.indexOf("generic");const TY_IMPORT=itemTypes.indexOf("import");const ROOT_PATH=typeof window!=="undefined"?window.rootPath:"../";const UNBOXING_LIMIT=5;const REGEX_IDENT=/\p{ID_Start}\p{ID_Continue}*|_\p{ID_Continue}+/uy;const REGEX_INVALID_TYPE_FILTER=/[^a-z]/ui;function printTab(nb){let iter=0;let foundCurrentTab=false;let foundCurrentResultSet=false;onEachLazy(document.getElementById("search-tabs").childNodes,elem=>{if(nb===iter){addClass(elem,"selected");foundCurrentTab=true}else{removeClass(elem,"selected")}iter+=1});const isTypeSearch=(nb>0||iter===1);iter=0;onEachLazy(document.getElementById("results").childNodes,elem=>{if(nb===iter){addClass(elem,"active");foundCurrentResultSet=true}else{removeClass(elem,"active")}iter+=1});if(foundCurrentTab&&foundCurrentResultSet){searchState.currentTab=nb;const correctionsElem=document.getElementsByClassName("search-corrections");if(isTypeSearch){removeClass(correctionsElem[0],"hidden")}else{addClass(correctionsElem[0],"hidden")}}else if(nb!==0){printTab(0)}}const editDistanceState={current:[],prev:[],prevPrev:[],calculate:function calculate(a,b,limit){if(a.lengthlimit){return limit+1}while(b.length>0&&b[0]===a[0]){a=a.substring(1);b=b.substring(1)}while(b.length>0&&b[b.length-1]===a[a.length-1]){a=a.substring(0,a.length-1);b=b.substring(0,b.length-1)}if(b.length===0){return minDist}const aLength=a.length;const bLength=b.length;for(let i=0;i<=bLength;++i){this.current[i]=0;this.prev[i]=i;this.prevPrev[i]=Number.MAX_VALUE}for(let i=1;i<=aLength;++i){this.current[0]=i;const aIdx=i-1;for(let j=1;j<=bLength;++j){const bIdx=j-1;const substitutionCost=a[aIdx]===b[bIdx]?0:1;this.current[j]=Math.min(this.prev[j]+1,this.current[j-1]+1,this.prev[j-1]+substitutionCost,);if((i>1)&&(j>1)&&(a[aIdx]===b[bIdx-1])&&(a[aIdx-1]===b[bIdx])){this.current[j]=Math.min(this.current[j],this.prevPrev[j-2]+1,)}}const prevPrevTmp=this.prevPrev;this.prevPrev=this.prev;this.prev=this.current;this.current=prevPrevTmp}const distance=this.prev[bLength];return distance<=limit?distance:(limit+1)},};function editDistance(a,b,limit){return editDistanceState.calculate(a,b,limit)}function initSearch(rawSearchIndex){const MAX_RESULTS=200;const NO_TYPE_FILTER=-1;let searchIndex;let searchIndexDeprecated;let searchIndexEmptyDesc;let functionTypeFingerprint;let currentResults;const typeNameIdMap=new Map();const ALIASES=new Map();const typeNameIdOfArray=buildTypeMapIndex("array");const typeNameIdOfSlice=buildTypeMapIndex("slice");const typeNameIdOfArrayOrSlice=buildTypeMapIndex("[]");const typeNameIdOfTuple=buildTypeMapIndex("tuple");const typeNameIdOfUnit=buildTypeMapIndex("unit");const typeNameIdOfTupleOrUnit=buildTypeMapIndex("()");const typeNameIdOfFn=buildTypeMapIndex("fn");const typeNameIdOfFnMut=buildTypeMapIndex("fnmut");const typeNameIdOfFnOnce=buildTypeMapIndex("fnonce");const typeNameIdOfHof=buildTypeMapIndex("->");function buildTypeMapIndex(name,isAssocType){if(name===""||name===null){return null}if(typeNameIdMap.has(name)){const obj=typeNameIdMap.get(name);obj.assocOnly=isAssocType&&obj.assocOnly;return obj.id}else{const id=typeNameIdMap.size;typeNameIdMap.set(name,{id,assocOnly:isAssocType});return id}}function isSpecialStartCharacter(c){return"<\"".indexOf(c)!==-1}function isEndCharacter(c){return"=,>-])".indexOf(c)!==-1}function itemTypeFromName(typename){const index=itemTypes.findIndex(i=>i===typename);if(index<0){throw["Unknown type filter ",typename]}return index}function getStringElem(query,parserState,isInGenerics){if(isInGenerics){throw["Unexpected ","\""," in generics"]}else if(query.literalSearch){throw["Cannot have more than one literal search element"]}else if(parserState.totalElems-parserState.genericsElems>0){throw["Cannot use literal search when there is more than one element"]}parserState.pos+=1;const start=parserState.pos;const end=getIdentEndPosition(parserState);if(parserState.pos>=parserState.length){throw["Unclosed ","\""]}else if(parserState.userQuery[end]!=="\""){throw["Unexpected ",parserState.userQuery[end]," in a string element"]}else if(start===end){throw["Cannot have empty string element"]}parserState.pos+=1;query.literalSearch=true}function isPathStart(parserState){return parserState.userQuery.slice(parserState.pos,parserState.pos+2)==="::"}function isReturnArrow(parserState){return parserState.userQuery.slice(parserState.pos,parserState.pos+2)==="->"}function consumeIdent(parserState){REGEX_IDENT.lastIndex=parserState.pos;const match=parserState.userQuery.match(REGEX_IDENT);if(match){parserState.pos+=match[0].length;return true}return false}function isSeparatorCharacter(c){return c===","||c==="="}function isPathSeparator(c){return c===":"||c===" "}function prevIs(parserState,lookingFor){let pos=parserState.pos;while(pos>0){const c=parserState.userQuery[pos-1];if(c===lookingFor){return true}else if(c!==" "){break}pos-=1}return false}function isLastElemGeneric(elems,parserState){return(elems.length>0&&elems[elems.length-1].generics.length>0)||prevIs(parserState,">")}function skipWhitespace(parserState){while(parserState.pos0){throw["Cannot have more than one element if you use quotes"]}const typeFilter=parserState.typeFilter;parserState.typeFilter=null;if(name==="!"){if(typeFilter!==null&&typeFilter!=="primitive"){throw["Invalid search type: primitive never type ","!"," and ",typeFilter," both specified",]}if(generics.length!==0){throw["Never type ","!"," does not accept generic parameters",]}const bindingName=parserState.isInBinding;parserState.isInBinding=null;return makePrimitiveElement("never",{bindingName})}const quadcolon=/::\s*::/.exec(path);if(path.startsWith("::")){throw["Paths cannot start with ","::"]}else if(path.endsWith("::")){throw["Paths cannot end with ","::"]}else if(quadcolon!==null){throw["Unexpected ",quadcolon[0]]}const pathSegments=path.split(/(?:::\s*)|(?:\s+(?:::\s*)?)/);if(pathSegments.length===0||(pathSegments.length===1&&pathSegments[0]==="")){if(generics.length>0||prevIs(parserState,">")){throw["Found generics without a path"]}else{throw["Unexpected ",parserState.userQuery[parserState.pos]]}}for(const[i,pathSegment]of pathSegments.entries()){if(pathSegment==="!"){if(i!==0){throw["Never type ","!"," is not associated item"]}pathSegments[i]="never"}}parserState.totalElems+=1;if(isInGenerics){parserState.genericsElems+=1}const bindingName=parserState.isInBinding;parserState.isInBinding=null;const bindings=new Map();const pathLast=pathSegments[pathSegments.length-1];return{name:name.trim(),id:null,fullPath:pathSegments,pathWithoutLast:pathSegments.slice(0,pathSegments.length-1),pathLast,normalizedPathLast:pathLast.replace(/_/g,""),generics:generics.filter(gen=>{if(gen.bindingName!==null){if(gen.name!==null){gen.bindingName.generics.unshift(gen)}bindings.set(gen.bindingName.name,gen.bindingName.generics);return false}return true}),bindings,typeFilter,bindingName,}}function getIdentEndPosition(parserState){let afterIdent=consumeIdent(parserState);let end=parserState.pos;let macroExclamation=-1;while(parserState.pos0){throw["Unexpected ",c," after ",parserState.userQuery[parserState.pos-1]," (not a valid identifier)"]}else{throw["Unexpected ",c," (not a valid identifier)"]}parserState.pos+=1;afterIdent=consumeIdent(parserState);end=parserState.pos}if(macroExclamation!==-1){if(parserState.typeFilter===null){parserState.typeFilter="macro"}else if(parserState.typeFilter!=="macro"){throw["Invalid search type: macro ","!"," and ",parserState.typeFilter," both specified",]}end=macroExclamation}return end}function getFilteredNextElem(query,parserState,elems,isInGenerics){const start=parserState.pos;if(parserState.userQuery[parserState.pos]===":"&&!isPathStart(parserState)){throw["Expected type filter before ",":"]}getNextElem(query,parserState,elems,isInGenerics);if(parserState.userQuery[parserState.pos]===":"&&!isPathStart(parserState)){if(parserState.typeFilter!==null){throw["Unexpected ",":"," (expected path after type filter ",parserState.typeFilter+":",")",]}if(elems.length===0){throw["Expected type filter before ",":"]}else if(query.literalSearch){throw["Cannot use quotes on type filter"]}const typeFilterElem=elems.pop();checkExtraTypeFilterCharacters(start,parserState);parserState.typeFilter=typeFilterElem.name;parserState.pos+=1;parserState.totalElems-=1;query.literalSearch=false;getNextElem(query,parserState,elems,isInGenerics)}}function getNextElem(query,parserState,elems,isInGenerics){const generics=[];skipWhitespace(parserState);let start=parserState.pos;let end;if("[(".indexOf(parserState.userQuery[parserState.pos])!==-1){let endChar=")";let name="()";let friendlyName="tuple";if(parserState.userQuery[parserState.pos]==="["){endChar="]";name="[]";friendlyName="slice"}parserState.pos+=1;const{foundSeparator}=getItemsBefore(query,parserState,generics,endChar);const typeFilter=parserState.typeFilter;const bindingName=parserState.isInBinding;parserState.typeFilter=null;parserState.isInBinding=null;for(const gen of generics){if(gen.bindingName!==null){throw["Type parameter ","=",` cannot be within ${friendlyName} `,name]}}if(name==="()"&&!foundSeparator&&generics.length===1&&typeFilter===null){elems.push(generics[0])}else if(name==="()"&&generics.length===1&&generics[0].name==="->"){generics[0].typeFilter=typeFilter;elems.push(generics[0])}else{if(typeFilter!==null&&typeFilter!=="primitive"){throw["Invalid search type: primitive ",name," and ",typeFilter," both specified",]}parserState.totalElems+=1;if(isInGenerics){parserState.genericsElems+=1}elems.push(makePrimitiveElement(name,{bindingName,generics}))}}else if(parserState.userQuery[parserState.pos]==="&"){if(parserState.typeFilter!==null&&parserState.typeFilter!=="primitive"){throw["Invalid search type: primitive ","&"," and ",parserState.typeFilter," both specified",]}parserState.typeFilter=null;parserState.pos+=1;let c=parserState.userQuery[parserState.pos];while(c===" "&&parserState.pos=end){throw["Found generics without a path"]}parserState.pos+=1;getItemsBefore(query,parserState,generics,">")}else if(parserState.pos=end){throw["Found generics without a path"]}if(parserState.isInBinding){throw["Unexpected ","("," after ","="]}parserState.pos+=1;const typeFilter=parserState.typeFilter;parserState.typeFilter=null;getItemsBefore(query,parserState,generics,")");skipWhitespace(parserState);if(isReturnArrow(parserState)){parserState.pos+=2;skipWhitespace(parserState);getFilteredNextElem(query,parserState,generics,isInGenerics);generics[generics.length-1].bindingName=makePrimitiveElement("output")}else{generics.push(makePrimitiveElement(null,{bindingName:makePrimitiveElement("output"),typeFilter:null,}))}parserState.typeFilter=typeFilter}if(isStringElem){skipWhitespace(parserState)}if(start>=end&&generics.length===0){return}if(parserState.userQuery[parserState.pos]==="="){if(parserState.isInBinding){throw["Cannot write ","="," twice in a binding"]}if(!isInGenerics){throw["Type parameter ","="," must be within generics list"]}const name=parserState.userQuery.slice(start,end).trim();if(name==="!"){throw["Type parameter ","="," key cannot be ","!"," never type"]}if(name.includes("!")){throw["Type parameter ","="," key cannot be ","!"," macro"]}if(name.includes("::")){throw["Type parameter ","="," key cannot contain ","::"," path"]}if(name.includes(":")){throw["Type parameter ","="," key cannot contain ",":"," type"]}parserState.isInBinding={name,generics}}else{elems.push(createQueryElement(query,parserState,parserState.userQuery.slice(start,end),generics,isInGenerics,),)}}}function getItemsBefore(query,parserState,elems,endChar){let foundStopChar=true;let foundSeparator=false;const oldTypeFilter=parserState.typeFilter;parserState.typeFilter=null;const oldIsInBinding=parserState.isInBinding;parserState.isInBinding=null;let hofParameters=null;let extra="";if(endChar===">"){extra="<"}else if(endChar==="]"){extra="["}else if(endChar===")"){extra="("}else if(endChar===""){extra="->"}else{extra=endChar}while(parserState.pos"," after ","="]}hofParameters=[...elems];elems.length=0;parserState.pos+=2;foundStopChar=true;foundSeparator=false;continue}else if(c===" "){parserState.pos+=1;continue}else if(isSeparatorCharacter(c)){parserState.pos+=1;foundStopChar=true;foundSeparator=true;continue}else if(c===":"&&isPathStart(parserState)){throw["Unexpected ","::",": paths cannot start with ","::"]}else if(isEndCharacter(c)){throw["Unexpected ",c," after ",extra]}if(!foundStopChar){let extra=[];if(isLastElemGeneric(query.elems,parserState)){extra=[" after ",">"]}else if(prevIs(parserState,"\"")){throw["Cannot have more than one element if you use quotes"]}if(endChar!==""){throw["Expected ",",",", ","=",", or ",endChar,...extra,", found ",c,]}throw["Expected ",","," or ","=",...extra,", found ",c,]}const posBefore=parserState.pos;getFilteredNextElem(query,parserState,elems,endChar!=="");if(endChar!==""&&parserState.pos>=parserState.length){throw["Unclosed ",extra]}if(posBefore===parserState.pos){parserState.pos+=1}foundStopChar=false}if(parserState.pos>=parserState.length&&endChar!==""){throw["Unclosed ",extra]}parserState.pos+=1;if(hofParameters){foundSeparator=false;if([...elems,...hofParameters].some(x=>x.bindingName)||parserState.isInBinding){throw["Unexpected ","="," within ","->"]}const hofElem=makePrimitiveElement("->",{generics:hofParameters,bindings:new Map([["output",[...elems]]]),typeFilter:null,});elems.length=0;elems[0]=hofElem}parserState.typeFilter=oldTypeFilter;parserState.isInBinding=oldIsInBinding;return{foundSeparator}}function checkExtraTypeFilterCharacters(start,parserState){const query=parserState.userQuery.slice(start,parserState.pos).trim();const match=query.match(REGEX_INVALID_TYPE_FILTER);if(match){throw["Unexpected ",match[0]," in type filter (before ",":",")",]}}function parseInput(query,parserState){let foundStopChar=true;while(parserState.pos"){if(isReturnArrow(parserState)){break}throw["Unexpected ",c," (did you mean ","->","?)"]}else if(parserState.pos>0){throw["Unexpected ",c," after ",parserState.userQuery[parserState.pos-1]]}throw["Unexpected ",c]}else if(c===" "){skipWhitespace(parserState);continue}if(!foundStopChar){let extra="";if(isLastElemGeneric(query.elems,parserState)){extra=[" after ",">"]}else if(prevIs(parserState,"\"")){throw["Cannot have more than one element if you use quotes"]}if(parserState.typeFilter!==null){throw["Expected ",","," or ","->",...extra,", found ",c,]}throw["Expected ",",",", ",":"," or ","->",...extra,", found ",c,]}const before=query.elems.length;getFilteredNextElem(query,parserState,query.elems,false);if(query.elems.length===before){parserState.pos+=1}foundStopChar=false}if(parserState.typeFilter!==null){throw["Unexpected ",":"," (expected path after type filter ",parserState.typeFilter+":",")",]}while(parserState.pos"]}break}else{parserState.pos+=1}}}function newParsedQuery(userQuery){return{original:userQuery,userQuery:userQuery.toLowerCase(),elems:[],returned:[],foundElems:0,totalElems:0,literalSearch:false,error:null,correction:null,proposeCorrectionFrom:null,proposeCorrectionTo:null,typeFingerprint:new Uint32Array(4),}}function buildUrl(search,filterCrates){let extra="?search="+encodeURIComponent(search);if(filterCrates!==null){extra+="&filter-crate="+encodeURIComponent(filterCrates)}return getNakedUrl()+extra+window.location.hash}function getFilterCrates(){const elem=document.getElementById("crate-search");if(elem&&elem.value!=="all crates"&&rawSearchIndex.has(elem.value)){return elem.value}return null}function parseQuery(userQuery){function convertTypeFilterOnElem(elem){if(elem.typeFilter!==null){let typeFilter=elem.typeFilter;if(typeFilter==="const"){typeFilter="constant"}elem.typeFilter=itemTypeFromName(typeFilter)}else{elem.typeFilter=NO_TYPE_FILTER}for(const elem2 of elem.generics){convertTypeFilterOnElem(elem2)}for(const constraints of elem.bindings.values()){for(const constraint of constraints){convertTypeFilterOnElem(constraint)}}}userQuery=userQuery.trim().replace(/\r|\n|\t/g," ");const parserState={length:userQuery.length,pos:0,totalElems:0,genericsElems:0,typeFilter:null,isInBinding:null,userQuery:userQuery.toLowerCase(),};let query=newParsedQuery(userQuery);try{parseInput(query,parserState);for(const elem of query.elems){convertTypeFilterOnElem(elem)}for(const elem of query.returned){convertTypeFilterOnElem(elem)}}catch(err){query=newParsedQuery(userQuery);query.error=err;return query}if(!query.literalSearch){query.literalSearch=parserState.totalElems>1}query.foundElems=query.elems.length+query.returned.length;query.totalElems=parserState.totalElems;return query}function createQueryResults(results_in_args,results_returned,results_others,parsedQuery){return{"in_args":results_in_args,"returned":results_returned,"others":results_others,"query":parsedQuery,}}async function execQuery(parsedQuery,filterCrates,currentCrate){const results_others=new Map(),results_in_args=new Map(),results_returned=new Map();function transformResults(results){const duplicates=new Set();const out=[];for(const result of results){if(result.id!==-1){const obj=searchIndex[result.id];obj.dist=result.dist;const res=buildHrefAndPath(obj);obj.displayPath=pathSplitter(res[0]);obj.fullPath=res[2]+"|"+obj.ty;if(duplicates.has(obj.fullPath)){continue}if(obj.ty===TY_IMPORT&&duplicates.has(res[2])){continue}if(duplicates.has(res[2]+"|"+TY_IMPORT)){continue}duplicates.add(obj.fullPath);duplicates.add(res[2]);obj.href=res[1];out.push(obj);if(out.length>=MAX_RESULTS){break}}}return out}async function sortResults(results,isType,preferredCrate){const userQuery=parsedQuery.userQuery;const result_list=[];for(const result of results.values()){result.item=searchIndex[result.id];result.word=searchIndex[result.id].word;result_list.push(result)}result_list.sort((aaa,bbb)=>{let a,b;a=(aaa.word!==userQuery);b=(bbb.word!==userQuery);if(a!==b){return a-b}a=(aaa.index<0);b=(bbb.index<0);if(a!==b){return a-b}a=aaa.path_dist;b=bbb.path_dist;if(a!==b){return a-b}a=aaa.index;b=bbb.index;if(a!==b){return a-b}a=(aaa.dist);b=(bbb.dist);if(a!==b){return a-b}a=searchIndexDeprecated.get(aaa.item.crate).contains(aaa.item.bitIndex);b=searchIndexDeprecated.get(bbb.item.crate).contains(bbb.item.bitIndex);if(a!==b){return a-b}a=(aaa.item.crate!==preferredCrate);b=(bbb.item.crate!==preferredCrate);if(a!==b){return a-b}a=aaa.word.length;b=bbb.word.length;if(a!==b){return a-b}a=aaa.word;b=bbb.word;if(a!==b){return(a>b?+1:-1)}a=searchIndexEmptyDesc.get(aaa.item.crate).contains(aaa.item.bitIndex);b=searchIndexEmptyDesc.get(bbb.item.crate).contains(bbb.item.bitIndex);if(a!==b){return a-b}a=aaa.item.ty;b=bbb.item.ty;if(a!==b){return a-b}a=aaa.item.path;b=bbb.item.path;if(a!==b){return(a>b?+1:-1)}return 0});return transformResults(result_list)}function unifyFunctionTypes(fnTypesIn,queryElems,whereClause,mgensIn,solutionCb,unboxingDepth,){if(unboxingDepth>=UNBOXING_LIMIT){return false}const mgens=mgensIn===null?null:new Map(mgensIn);if(queryElems.length===0){return!solutionCb||solutionCb(mgens)}if(!fnTypesIn||fnTypesIn.length===0){return false}const ql=queryElems.length;const fl=fnTypesIn.length;if(ql===1&&queryElems[0].generics.length===0&&queryElems[0].bindings.size===0){const queryElem=queryElems[0];for(const fnType of fnTypesIn){if(!unifyFunctionTypeIsMatchCandidate(fnType,queryElem,mgens)){continue}if(fnType.id<0&&queryElem.id<0){if(mgens&&mgens.has(fnType.id)&&mgens.get(fnType.id)!==queryElem.id){continue}const mgensScratch=new Map(mgens);mgensScratch.set(fnType.id,queryElem.id);if(!solutionCb||solutionCb(mgensScratch)){return true}}else if(!solutionCb||solutionCb(mgens?new Map(mgens):null)){return true}}for(const fnType of fnTypesIn){if(!unifyFunctionTypeIsUnboxCandidate(fnType,queryElem,whereClause,mgens,unboxingDepth+1,)){continue}if(fnType.id<0){if(mgens&&mgens.has(fnType.id)&&mgens.get(fnType.id)!==0){continue}const mgensScratch=new Map(mgens);mgensScratch.set(fnType.id,0);if(unifyFunctionTypes(whereClause[(-fnType.id)-1],queryElems,whereClause,mgensScratch,solutionCb,unboxingDepth+1,)){return true}}else if(unifyFunctionTypes([...fnType.generics,...Array.from(fnType.bindings.values()).flat()],queryElems,whereClause,mgens?new Map(mgens):null,solutionCb,unboxingDepth+1,)){return true}}return false}const fnTypes=fnTypesIn.slice();const flast=fl-1;const qlast=ql-1;const queryElem=queryElems[qlast];let queryElemsTmp=null;for(let i=flast;i>=0;i-=1){const fnType=fnTypes[i];if(!unifyFunctionTypeIsMatchCandidate(fnType,queryElem,mgens)){continue}let mgensScratch;if(fnType.id<0){mgensScratch=new Map(mgens);if(mgensScratch.has(fnType.id)&&mgensScratch.get(fnType.id)!==queryElem.id){continue}mgensScratch.set(fnType.id,queryElem.id)}else{mgensScratch=mgens}fnTypes[i]=fnTypes[flast];fnTypes.length=flast;if(!queryElemsTmp){queryElemsTmp=queryElems.slice(0,qlast)}const passesUnification=unifyFunctionTypes(fnTypes,queryElemsTmp,whereClause,mgensScratch,mgensScratch=>{if(fnType.generics.length===0&&queryElem.generics.length===0&&fnType.bindings.size===0&&queryElem.bindings.size===0){return!solutionCb||solutionCb(mgensScratch)}const solution=unifyFunctionTypeCheckBindings(fnType,queryElem,whereClause,mgensScratch,unboxingDepth,);if(!solution){return false}const simplifiedGenerics=solution.simplifiedGenerics;for(const simplifiedMgens of solution.mgens){const passesUnification=unifyFunctionTypes(simplifiedGenerics,queryElem.generics,whereClause,simplifiedMgens,solutionCb,unboxingDepth,);if(passesUnification){return true}}return false},unboxingDepth,);if(passesUnification){return true}fnTypes[flast]=fnTypes[i];fnTypes[i]=fnType;fnTypes.length=fl}for(let i=flast;i>=0;i-=1){const fnType=fnTypes[i];if(!unifyFunctionTypeIsUnboxCandidate(fnType,queryElem,whereClause,mgens,unboxingDepth+1,)){continue}let mgensScratch;if(fnType.id<0){mgensScratch=new Map(mgens);if(mgensScratch.has(fnType.id)&&mgensScratch.get(fnType.id)!==0){continue}mgensScratch.set(fnType.id,0)}else{mgensScratch=mgens}const generics=fnType.id<0?whereClause[(-fnType.id)-1]:fnType.generics;const bindings=fnType.bindings?Array.from(fnType.bindings.values()).flat():[];const passesUnification=unifyFunctionTypes(fnTypes.toSpliced(i,1,...generics,...bindings),queryElems,whereClause,mgensScratch,solutionCb,unboxingDepth+1,);if(passesUnification){return true}}return false}function unifyFunctionTypeIsMatchCandidate(fnType,queryElem,mgensIn){if(!typePassesFilter(queryElem.typeFilter,fnType.ty)){return false}if(fnType.id<0&&queryElem.id<0){if(mgensIn){if(mgensIn.has(fnType.id)&&mgensIn.get(fnType.id)!==queryElem.id){return false}for(const[fid,qid]of mgensIn.entries()){if(fnType.id!==fid&&queryElem.id===qid){return false}if(fnType.id===fid&&queryElem.id!==qid){return false}}}return true}else{if(queryElem.id===typeNameIdOfArrayOrSlice&&(fnType.id===typeNameIdOfSlice||fnType.id===typeNameIdOfArray)){}else if(queryElem.id===typeNameIdOfTupleOrUnit&&(fnType.id===typeNameIdOfTuple||fnType.id===typeNameIdOfUnit)){}else if(queryElem.id===typeNameIdOfHof&&(fnType.id===typeNameIdOfFn||fnType.id===typeNameIdOfFnMut||fnType.id===typeNameIdOfFnOnce)){}else if(fnType.id!==queryElem.id||queryElem.id===null){return false}if((fnType.generics.length+fnType.bindings.size)===0&&queryElem.generics.length!==0){return false}if(fnType.bindings.size0){const fnTypePath=fnType.path!==undefined&&fnType.path!==null?fnType.path.split("::"):[];if(queryElemPathLength>fnTypePath.length){return false}let i=0;for(const path of fnTypePath){if(path===queryElem.pathWithoutLast[i]){i+=1;if(i>=queryElemPathLength){break}}}if(i0){let mgensSolutionSet=[mgensIn];for(const[name,constraints]of queryElem.bindings.entries()){if(mgensSolutionSet.length===0){return false}if(!fnType.bindings.has(name)){return false}const fnTypeBindings=fnType.bindings.get(name);mgensSolutionSet=mgensSolutionSet.flatMap(mgens=>{const newSolutions=[];unifyFunctionTypes(fnTypeBindings,constraints,whereClause,mgens,newMgens=>{newSolutions.push(newMgens);return false},unboxingDepth,);return newSolutions})}if(mgensSolutionSet.length===0){return false}const binds=Array.from(fnType.bindings.entries()).flatMap(entry=>{const[name,constraints]=entry;if(queryElem.bindings.has(name)){return[]}else{return constraints}});if(simplifiedGenerics.length>0){simplifiedGenerics=[...simplifiedGenerics,...binds]}else{simplifiedGenerics=binds}return{simplifiedGenerics,mgens:mgensSolutionSet}}return{simplifiedGenerics,mgens:[mgensIn]}}function unifyFunctionTypeIsUnboxCandidate(fnType,queryElem,whereClause,mgens,unboxingDepth,){if(unboxingDepth>=UNBOXING_LIMIT){return false}if(fnType.id<0&&queryElem.id>=0){if(!whereClause){return false}if(mgens&&mgens.has(fnType.id)&&mgens.get(fnType.id)!==0){return false}const mgensTmp=new Map(mgens);mgensTmp.set(fnType.id,null);return checkIfInList(whereClause[(-fnType.id)-1],queryElem,whereClause,mgensTmp,unboxingDepth,)}else if(fnType.generics.length>0||fnType.bindings.size>0){const simplifiedGenerics=[...fnType.generics,...Array.from(fnType.bindings.values()).flat(),];return checkIfInList(simplifiedGenerics,queryElem,whereClause,mgens,unboxingDepth,)}return false}function checkIfInList(list,elem,whereClause,mgens,unboxingDepth){for(const entry of list){if(checkType(entry,elem,whereClause,mgens,unboxingDepth)){return true}}return false}function checkType(row,elem,whereClause,mgens,unboxingDepth){if(unboxingDepth>=UNBOXING_LIMIT){return false}if(row.bindings.size===0&&elem.bindings.size===0){if(elem.id<0&&mgens===null){return row.id<0||checkIfInList(row.generics,elem,whereClause,mgens,unboxingDepth+1,)}if(row.id>0&&elem.id>0&&elem.pathWithoutLast.length===0&&typePassesFilter(elem.typeFilter,row.ty)&&elem.generics.length===0&&elem.id!==typeNameIdOfArrayOrSlice&&elem.id!==typeNameIdOfTupleOrUnit&&elem.id!==typeNameIdOfHof){return row.id===elem.id||checkIfInList(row.generics,elem,whereClause,mgens,unboxingDepth,)}}return unifyFunctionTypes([row],[elem],whereClause,mgens,null,unboxingDepth)}function checkPath(contains,ty){if(contains.length===0){return 0}const maxPathEditDistance=Math.floor(contains.reduce((acc,next)=>acc+next.length,0)/3,);let ret_dist=maxPathEditDistance+1;const path=ty.path.split("::");if(ty.parent&&ty.parent.name){path.push(ty.parent.name.toLowerCase())}const length=path.length;const clength=contains.length;pathiter:for(let i=length-clength;i>=0;i-=1){let dist_total=0;for(let x=0;xmaxPathEditDistance){continue pathiter}dist_total+=dist}}ret_dist=Math.min(ret_dist,Math.round(dist_total/clength))}return ret_dist>maxPathEditDistance?null:ret_dist}function typePassesFilter(filter,type){if(filter<=NO_TYPE_FILTER||filter===type)return true;const name=itemTypes[type];switch(itemTypes[filter]){case"constant":return name==="associatedconstant";case"fn":return name==="method"||name==="tymethod";case"type":return name==="primitive"||name==="associatedtype";case"trait":return name==="traitalias"}return false}function createAliasFromItem(item){return{crate:item.crate,name:item.name,path:item.path,descShard:item.descShard,descIndex:item.descIndex,exactPath:item.exactPath,ty:item.ty,parent:item.parent,type:item.type,is_alias:true,bitIndex:item.bitIndex,implDisambiguator:item.implDisambiguator,}}async function handleAliases(ret,query,filterCrates,currentCrate){const lowerQuery=query.toLowerCase();const aliases=[];const crateAliases=[];if(filterCrates!==null){if(ALIASES.has(filterCrates)&&ALIASES.get(filterCrates).has(lowerQuery)){const query_aliases=ALIASES.get(filterCrates).get(lowerQuery);for(const alias of query_aliases){aliases.push(createAliasFromItem(searchIndex[alias]))}}}else{for(const[crate,crateAliasesIndex]of ALIASES){if(crateAliasesIndex.has(lowerQuery)){const pushTo=crate===currentCrate?crateAliases:aliases;const query_aliases=crateAliasesIndex.get(lowerQuery);for(const alias of query_aliases){pushTo.push(createAliasFromItem(searchIndex[alias]))}}}}const sortFunc=(aaa,bbb)=>{if(aaa.path{return searchIndexEmptyDesc.get(alias.crate).contains(alias.bitIndex)?"":searchState.loadDesc(alias)};const[crateDescs,descs]=await Promise.all([Promise.all(crateAliases.map(fetchDesc)),Promise.all(aliases.map(fetchDesc)),]);const pushFunc=alias=>{alias.alias=query;const res=buildHrefAndPath(alias);alias.displayPath=pathSplitter(res[0]);alias.fullPath=alias.displayPath+alias.name;alias.href=res[1];ret.others.unshift(alias);if(ret.others.length>MAX_RESULTS){ret.others.pop()}};aliases.forEach((alias,i)=>{alias.desc=descs[i]});aliases.forEach(pushFunc);crateAliases.forEach((alias,i)=>{alias.desc=crateDescs[i]});crateAliases.forEach(pushFunc)}function addIntoResults(results,fullId,id,index,dist,path_dist,maxEditDistance){if(dist<=maxEditDistance||index!==-1){if(results.has(fullId)){const result=results.get(fullId);if(result.dontValidate||result.dist<=dist){return}}results.set(fullId,{id:id,index:index,dontValidate:parsedQuery.literalSearch,dist:dist,path_dist:path_dist,})}}function handleSingleArg(row,pos,elem,results_others,results_in_args,results_returned,maxEditDistance,){if(!row||(filterCrates!==null&&row.crate!==filterCrates)){return}let path_dist=0;const fullId=row.id;const tfpDist=compareTypeFingerprints(fullId,parsedQuery.typeFingerprint,);if(tfpDist!==null){const in_args=row.type&&row.type.inputs&&checkIfInList(row.type.inputs,elem,row.type.where_clause,null,0);const returned=row.type&&row.type.output&&checkIfInList(row.type.output,elem,row.type.where_clause,null,0);if(in_args){results_in_args.max_dist=Math.max(results_in_args.max_dist||0,tfpDist);const maxDist=results_in_args.sizenormalizedIndex&&normalizedIndex!==-1)){index=normalizedIndex}if(elem.fullPath.length>1){path_dist=checkPath(elem.pathWithoutLast,row);if(path_dist===null){return}}if(parsedQuery.literalSearch){if(row.word===elem.pathLast){addIntoResults(results_others,fullId,pos,index,0,path_dist)}return}const dist=editDistance(row.normalizedName,elem.normalizedPathLast,maxEditDistance);if(index===-1&&dist>maxEditDistance){return}addIntoResults(results_others,fullId,pos,index,dist,path_dist,maxEditDistance)}function handleArgs(row,pos,results){if(!row||(filterCrates!==null&&row.crate!==filterCrates)||!row.type){return}const tfpDist=compareTypeFingerprints(row.id,parsedQuery.typeFingerprint,);if(tfpDist===null){return}if(results.size>=MAX_RESULTS&&tfpDist>results.max_dist){return}if(!unifyFunctionTypes(row.type.inputs,parsedQuery.elems,row.type.where_clause,null,mgens=>{return unifyFunctionTypes(row.type.output,parsedQuery.returned,row.type.where_clause,mgens,null,0,)},0,)){return}results.max_dist=Math.max(results.max_dist||0,tfpDist);addIntoResults(results,row.id,pos,0,tfpDist,0,Number.MAX_VALUE)}function innerRunQuery(){const queryLen=parsedQuery.elems.reduce((acc,next)=>acc+next.pathLast.length,0)+parsedQuery.returned.reduce((acc,next)=>acc+next.pathLast.length,0);const maxEditDistance=Math.floor(queryLen/3);const genericSymbols=new Map();function convertNameToId(elem,isAssocType){const loweredName=elem.pathLast.toLowerCase();if(typeNameIdMap.has(loweredName)&&(isAssocType||!typeNameIdMap.get(loweredName).assocOnly)){elem.id=typeNameIdMap.get(loweredName).id}else if(!parsedQuery.literalSearch){let match=null;let matchDist=maxEditDistance+1;let matchName="";for(const[name,{id,assocOnly}]of typeNameIdMap){const dist=Math.min(editDistance(name,loweredName,maxEditDistance),editDistance(name,elem.normalizedPathLast,maxEditDistance),);if(dist<=matchDist&&dist<=maxEditDistance&&(isAssocType||!assocOnly)){if(dist===matchDist&&matchName>name){continue}match=id;matchDist=dist;matchName=name}}if(match!==null){parsedQuery.correction=matchName}elem.id=match}if((elem.id===null&&parsedQuery.totalElems>1&&elem.typeFilter===-1&&elem.generics.length===0&&elem.bindings.size===0)||elem.typeFilter===TY_GENERIC){if(genericSymbols.has(elem.name)){elem.id=genericSymbols.get(elem.name)}else{elem.id=-(genericSymbols.size+1);genericSymbols.set(elem.name,elem.id)}if(elem.typeFilter===-1&&elem.name.length>=3){const maxPartDistance=Math.floor(elem.name.length/3);let matchDist=maxPartDistance+1;let matchName="";for(const name of typeNameIdMap.keys()){const dist=editDistance(name,elem.name,maxPartDistance);if(dist<=matchDist&&dist<=maxPartDistance){if(dist===matchDist&&matchName>name){continue}matchDist=dist;matchName=name}}if(matchName!==""){parsedQuery.proposeCorrectionFrom=elem.name;parsedQuery.proposeCorrectionTo=matchName}}elem.typeFilter=TY_GENERIC}if(elem.generics.length>0&&elem.typeFilter===TY_GENERIC){parsedQuery.error=["Generic type parameter ",elem.name," does not accept generic parameters",]}for(const elem2 of elem.generics){convertNameToId(elem2)}elem.bindings=new Map(Array.from(elem.bindings.entries()).map(entry=>{const[name,constraints]=entry;if(!typeNameIdMap.has(name)){parsedQuery.error=["Type parameter ",name," does not exist",];return[null,[]]}for(const elem2 of constraints){convertNameToId(elem2)}return[typeNameIdMap.get(name).id,constraints]}),)}const fps=new Set();for(const elem of parsedQuery.elems){convertNameToId(elem);buildFunctionTypeFingerprint(elem,parsedQuery.typeFingerprint,fps)}for(const elem of parsedQuery.returned){convertNameToId(elem);buildFunctionTypeFingerprint(elem,parsedQuery.typeFingerprint,fps)}if(parsedQuery.foundElems===1&&parsedQuery.returned.length===0){if(parsedQuery.elems.length===1){const elem=parsedQuery.elems[0];for(let i=0,nSearchIndex=searchIndex.length;i0){const sortQ=(a,b)=>{const ag=a.generics.length===0&&a.bindings.size===0;const bg=b.generics.length===0&&b.bindings.size===0;if(ag!==bg){return ag-bg}const ai=a.id>0;const bi=b.id>0;return ai-bi};parsedQuery.elems.sort(sortQ);parsedQuery.returned.sort(sortQ);for(let i=0,nSearchIndex=searchIndex.length;i{const descs=await Promise.all(list.map(result=>{return searchIndexEmptyDesc.get(result.crate).contains(result.bitIndex)?"":searchState.loadDesc(result)}));for(const[i,result]of list.entries()){result.desc=descs[i]}}));if(parsedQuery.error!==null&&ret.others.length!==0){ret.query.error=null}return ret}function nextTab(direction){const next=(searchState.currentTab+direction+3)%searchState.focusedByTab.length;searchState.focusedByTab[searchState.currentTab]=document.activeElement;printTab(next);focusSearchResult()}function focusSearchResult(){const target=searchState.focusedByTab[searchState.currentTab]||document.querySelectorAll(".search-results.active a").item(0)||document.querySelectorAll("#search-tabs button").item(searchState.currentTab);searchState.focusedByTab[searchState.currentTab]=null;if(target){target.focus()}}function buildHrefAndPath(item){let displayPath;let href;const type=itemTypes[item.ty];const name=item.name;let path=item.path;let exactPath=item.exactPath;if(type==="mod"){displayPath=path+"::";href=ROOT_PATH+path.replace(/::/g,"/")+"/"+name+"/index.html"}else if(type==="import"){displayPath=item.path+"::";href=ROOT_PATH+item.path.replace(/::/g,"/")+"/index.html#reexport."+name}else if(type==="primitive"||type==="keyword"){displayPath="";href=ROOT_PATH+path.replace(/::/g,"/")+"/"+type+"."+name+".html"}else if(type==="externcrate"){displayPath="";href=ROOT_PATH+name+"/index.html"}else if(item.parent!==undefined){const myparent=item.parent;let anchor=type+"."+name;const parentType=itemTypes[myparent.ty];let pageType=parentType;let pageName=myparent.name;exactPath=`${myparent.exactPath}::${myparent.name}`;if(parentType==="primitive"){displayPath=myparent.name+"::"}else if(type==="structfield"&&parentType==="variant"){const enumNameIdx=item.path.lastIndexOf("::");const enumName=item.path.substr(enumNameIdx+2);path=item.path.substr(0,enumNameIdx);displayPath=path+"::"+enumName+"::"+myparent.name+"::";anchor="variant."+myparent.name+".field."+name;pageType="enum";pageName=enumName}else{displayPath=path+"::"+myparent.name+"::"}if(item.implDisambiguator!==null){anchor=item.implDisambiguator+"/"+anchor}href=ROOT_PATH+path.replace(/::/g,"/")+"/"+pageType+"."+pageName+".html#"+anchor}else{displayPath=item.path+"::";href=ROOT_PATH+item.path.replace(/::/g,"/")+"/"+type+"."+name+".html"}return[displayPath,href,`${exactPath}::${name}`]}function pathSplitter(path){const tmp=""+path.replace(/::/g,"::");if(tmp.endsWith("")){return tmp.slice(0,tmp.length-6)}return tmp}async function addTab(array,query,display){const extraClass=display?" active":"";const output=document.createElement("div");if(array.length>0){output.className="search-results "+extraClass;for(const item of array){const name=item.name;const type=itemTypes[item.ty];const longType=longItemTypes[item.ty];const typeName=longType.length!==0?`${longType}`:"?";const link=document.createElement("a");link.className="result-"+type;link.href=item.href;const resultName=document.createElement("div");resultName.className="result-name";resultName.insertAdjacentHTML("beforeend",`${typeName}`);link.appendChild(resultName);let alias=" ";if(item.is_alias){alias=`
\ +${item.alias} - see \ +
`}resultName.insertAdjacentHTML("beforeend",`
${alias}\ +${item.displayPath}${name}\ +
`);const description=document.createElement("div");description.className="desc";description.insertAdjacentHTML("beforeend",item.desc);link.appendChild(description);output.appendChild(link)}}else if(query.error===null){output.className="search-failed"+extraClass;output.innerHTML="No results :(
"+"Try on DuckDuckGo?

"+"Or try looking in one of these:"}return[output,array.length]}function makeTabHeader(tabNb,text,nbElems){const fmtNbElems=nbElems<10?`\u{2007}(${nbElems})\u{2007}\u{2007}`:nbElems<100?`\u{2007}(${nbElems})\u{2007}`:`\u{2007}(${nbElems})`;if(searchState.currentTab===tabNb){return""}return""}async function showResults(results,go_to_first,filterCrates){const search=searchState.outputElement();if(go_to_first||(results.others.length===1&&getSettingValue("go-to-only-result")==="true")){window.onunload=()=>{};searchState.removeQueryParameters();const elem=document.createElement("a");elem.href=results.others[0].href;removeClass(elem,"active");document.body.appendChild(elem);elem.click();return}if(results.query===undefined){results.query=parseQuery(searchState.input.value)}currentResults=results.query.userQuery;const[ret_others,ret_in_args,ret_returned]=await Promise.all([addTab(results.others,results.query,true),addTab(results.in_args,results.query,false),addTab(results.returned,results.query,false),]);let currentTab=searchState.currentTab;if((currentTab===0&&ret_others[1]===0)||(currentTab===1&&ret_in_args[1]===0)||(currentTab===2&&ret_returned[1]===0)){if(ret_others[1]!==0){currentTab=0}else if(ret_in_args[1]!==0){currentTab=1}else if(ret_returned[1]!==0){currentTab=2}}let crates="";if(rawSearchIndex.size>1){crates=" in 
"}let output=`

Results${crates}

`;if(results.query.error!==null){const error=results.query.error;error.forEach((value,index)=>{value=value.split("<").join("<").split(">").join(">");if(index%2!==0){error[index]=`${value.replaceAll(" ", " ")}`}else{error[index]=value}});output+=`

Query parser error: "${error.join("")}".

`;output+="
"+makeTabHeader(0,"In Names",ret_others[1])+"
";currentTab=0}else if(results.query.foundElems<=1&&results.query.returned.length===0){output+="
"+makeTabHeader(0,"In Names",ret_others[1])+makeTabHeader(1,"In Parameters",ret_in_args[1])+makeTabHeader(2,"In Return Types",ret_returned[1])+"
"}else{const signatureTabTitle=results.query.elems.length===0?"In Function Return Types":results.query.returned.length===0?"In Function Parameters":"In Function Signatures";output+="
"+makeTabHeader(0,signatureTabTitle,ret_others[1])+"
";currentTab=0}if(results.query.correction!==null){const orig=results.query.returned.length>0?results.query.returned[0].name:results.query.elems[0].name;output+="

"+`Type "${orig}" not found. `+"Showing results for closest type name "+`"${results.query.correction}" instead.

`}if(results.query.proposeCorrectionFrom!==null){const orig=results.query.proposeCorrectionFrom;const targ=results.query.proposeCorrectionTo;output+="

"+`Type "${orig}" not found and used as generic parameter. `+`Consider searching for "${targ}" instead.

`}const resultsElem=document.createElement("div");resultsElem.id="results";resultsElem.appendChild(ret_others[0]);resultsElem.appendChild(ret_in_args[0]);resultsElem.appendChild(ret_returned[0]);search.innerHTML=output;const crateSearch=document.getElementById("crate-search");if(crateSearch){crateSearch.addEventListener("input",updateCrate)}search.appendChild(resultsElem);searchState.showResults(search);const elems=document.getElementById("search-tabs").childNodes;searchState.focusedByTab=[];let i=0;for(const elem of elems){const j=i;elem.onclick=()=>printTab(j);searchState.focusedByTab.push(null);i+=1}printTab(currentTab)}function updateSearchHistory(url){if(!browserSupportsHistoryApi()){return}const params=searchState.getQueryStringParams();if(!history.state&&!params.search){history.pushState(null,"",url)}else{history.replaceState(null,"",url)}}async function search(forced){const query=parseQuery(searchState.input.value.trim());let filterCrates=getFilterCrates();if(!forced&&query.userQuery===currentResults){if(query.userQuery.length>0){putBackSearch()}return}searchState.setLoadingSearch();const params=searchState.getQueryStringParams();if(filterCrates===null&¶ms["filter-crate"]!==undefined){filterCrates=params["filter-crate"]}searchState.title="Results for "+query.original+" - Rust";updateSearchHistory(buildUrl(query.original,filterCrates));await showResults(await execQuery(query,filterCrates,window.currentCrate),params.go_to_first,filterCrates)}function buildItemSearchTypeAll(types,lowercasePaths){return types.length>0?types.map(type=>buildItemSearchType(type,lowercasePaths)):EMPTY_GENERICS_ARRAY}const EMPTY_BINDINGS_MAP=new Map();const EMPTY_GENERICS_ARRAY=[];let TYPES_POOL=new Map();function buildItemSearchType(type,lowercasePaths,isAssocType){const PATH_INDEX_DATA=0;const GENERICS_DATA=1;const BINDINGS_DATA=2;let pathIndex,generics,bindings;if(typeof type==="number"){pathIndex=type;generics=EMPTY_GENERICS_ARRAY;bindings=EMPTY_BINDINGS_MAP}else{pathIndex=type[PATH_INDEX_DATA];generics=buildItemSearchTypeAll(type[GENERICS_DATA],lowercasePaths,);if(type.length>BINDINGS_DATA&&type[BINDINGS_DATA].length>0){bindings=new Map(type[BINDINGS_DATA].map(binding=>{const[assocType,constraints]=binding;return[buildItemSearchType(assocType,lowercasePaths,true).id,buildItemSearchTypeAll(constraints,lowercasePaths),]}))}else{bindings=EMPTY_BINDINGS_MAP}}let result;if(pathIndex<0){result={id:pathIndex,ty:TY_GENERIC,path:null,exactPath:null,generics,bindings,}}else if(pathIndex===0){result={id:null,ty:null,path:null,exactPath:null,generics,bindings,}}else{const item=lowercasePaths[pathIndex-1];result={id:buildTypeMapIndex(item.name,isAssocType),ty:item.ty,path:item.path,exactPath:item.exactPath,generics,bindings,}}const cr=TYPES_POOL.get(result.id);if(cr){if(cr.generics.length===result.generics.length&&cr.generics!==result.generics&&cr.generics.every((x,i)=>result.generics[i]===x)){result.generics=cr.generics}if(cr.bindings.size===result.bindings.size&&cr.bindings!==result.bindings){let ok=true;for(const[k,v]of cr.bindings.entries()){const v2=result.bindings.get(v);if(!v2){ok=false;break}if(v!==v2&&v.length===v2.length&&v.every((x,i)=>v2[i]===x)){result.bindings.set(k,v)}else if(v!==v2){ok=false;break}}if(ok){result.bindings=cr.bindings}}if(cr.ty===result.ty&&cr.path===result.path&&cr.bindings===result.bindings&&cr.generics===result.generics&&cr.ty===result.ty){return cr}}TYPES_POOL.set(result.id,result);return result}function buildFunctionSearchTypeCallback(lowercasePaths){return functionSearchType=>{if(functionSearchType===0){return null}const INPUTS_DATA=0;const OUTPUT_DATA=1;let inputs,output;if(typeof functionSearchType[INPUTS_DATA]==="number"){inputs=[buildItemSearchType(functionSearchType[INPUTS_DATA],lowercasePaths)]}else{inputs=buildItemSearchTypeAll(functionSearchType[INPUTS_DATA],lowercasePaths,)}if(functionSearchType.length>1){if(typeof functionSearchType[OUTPUT_DATA]==="number"){output=[buildItemSearchType(functionSearchType[OUTPUT_DATA],lowercasePaths)]}else{output=buildItemSearchTypeAll(functionSearchType[OUTPUT_DATA],lowercasePaths,)}}else{output=[]}const where_clause=[];const l=functionSearchType.length;for(let i=2;i{k=(~~k+0x7ed55d16)+(k<<12);k=(k ^ 0xc761c23c)^(k>>>19);k=(~~k+0x165667b1)+(k<<5);k=(~~k+0xd3a2646c)^(k<<9);k=(~~k+0xfd7046c5)+(k<<3);return(k ^ 0xb55a4f09)^(k>>>16)};const hashint2=k=>{k=~k+(k<<15);k ^=k>>>12;k+=k<<2;k ^=k>>>4;k=Math.imul(k,2057);return k ^(k>>16)};if(input!==null){const h0a=hashint1(input);const h0b=hashint2(input);const h1a=~~(h0a+Math.imul(h0b,2));const h1b=~~(h0a+Math.imul(h0b,3));const h2a=~~(h0a+Math.imul(h0b,4));const h2b=~~(h0a+Math.imul(h0b,5));output[0]|=(1<<(h0a%32))|(1<<(h1b%32));output[1]|=(1<<(h1a%32))|(1<<(h2b%32));output[2]|=(1<<(h2a%32))|(1<<(h0b%32));fps.add(input)}for(const g of type.generics){buildFunctionTypeFingerprint(g,output,fps)}const fb={id:null,ty:0,generics:EMPTY_GENERICS_ARRAY,bindings:EMPTY_BINDINGS_MAP,};for(const[k,v]of type.bindings.entries()){fb.id=k;fb.generics=v;buildFunctionTypeFingerprint(fb,output,fps)}output[3]=fps.size}function compareTypeFingerprints(fullId,queryFingerprint){const fh0=functionTypeFingerprint[fullId*4];const fh1=functionTypeFingerprint[(fullId*4)+1];const fh2=functionTypeFingerprint[(fullId*4)+2];const[qh0,qh1,qh2]=queryFingerprint;const[in0,in1,in2]=[fh0&qh0,fh1&qh1,fh2&qh2];if((in0 ^ qh0)||(in1 ^ qh1)||(in2 ^ qh2)){return null}return functionTypeFingerprint[(fullId*4)+3]}class VlqHexDecoder{constructor(string,cons){this.string=string;this.cons=cons;this.offset=0;this.backrefQueue=[]}decodeList(){let c=this.string.charCodeAt(this.offset);const ret=[];while(c!==125){ret.push(this.decode());c=this.string.charCodeAt(this.offset)}this.offset+=1;return ret}decode(){let n=0;let c=this.string.charCodeAt(this.offset);if(c===123){this.offset+=1;return this.decodeList()}while(c<96){n=(n<<4)|(c&0xF);this.offset+=1;c=this.string.charCodeAt(this.offset)}n=(n<<4)|(c&0xF);const[sign,value]=[n&1,n>>1];this.offset+=1;return sign?-value:value}next(){const c=this.string.charCodeAt(this.offset);if(c>=48&&c<64){this.offset+=1;return this.backrefQueue[c-48]}if(c===96){this.offset+=1;return this.cons(0)}const result=this.cons(this.decode());this.backrefQueue.unshift(result);if(this.backrefQueue.length>16){this.backrefQueue.pop()}return result}}class RoaringBitmap{constructor(str){const strdecoded=atob(str);const u8array=new Uint8Array(strdecoded.length);for(let j=0;j=4){offsets=[];for(let j=0;j>3]&(1<<(j&0x7))){const runcount=(u8array[i]|(u8array[i+1]<<8));i+=2;this.containers.push(new RoaringBitmapRun(runcount,u8array.slice(i,i+(runcount*4)),));i+=runcount*4}else if(this.cardinalities[j]>=4096){this.containers.push(new RoaringBitmapBits(u8array.slice(i,i+8192)));i+=8192}else{const end=this.cardinalities[j]*2;this.containers.push(new RoaringBitmapArray(this.cardinalities[j],u8array.slice(i,i+end),));i+=end}}}contains(keyvalue){const key=keyvalue>>16;const value=keyvalue&0xFFFF;for(let i=0;i=start&&value<=(start+lenm1)){return true}}return false}}class RoaringBitmapArray{constructor(cardinality,array){this.cardinality=cardinality;this.array=array}contains(value){const l=this.cardinality*2;for(let i=0;i>3]&(1<<(value&7)))}}function buildIndex(rawSearchIndex){searchIndex=[];searchIndexDeprecated=new Map();searchIndexEmptyDesc=new Map();let currentIndex=0;let id=0;for(const crate of rawSearchIndex.values()){id+=crate.t.length+1}functionTypeFingerprint=new Uint32Array((id+1)*4);id=0;for(const[crate,crateCorpus]of rawSearchIndex){const itemDescShardDecoder=new VlqHexDecoder(crateCorpus.D,noop=>noop);let descShard={crate,shard:0,start:0,len:itemDescShardDecoder.next(),promise:null,resolve:null,};const descShardList=[descShard];searchIndexDeprecated.set(crate,new RoaringBitmap(crateCorpus.c));searchIndexEmptyDesc.set(crate,new RoaringBitmap(crateCorpus.e));let descIndex=0;const crateRow={crate,ty:3,name:crate,path:"",descShard,descIndex,exactPath:"",desc:crateCorpus.doc,parent:undefined,type:null,id,word:crate,normalizedName:crate.indexOf("_")===-1?crate:crate.replace(/_/g,""),bitIndex:0,implDisambiguator:null,};id+=1;searchIndex.push(crateRow);currentIndex+=1;if(!searchIndexEmptyDesc.get(crate).contains(0)){descIndex+=1}const itemTypes=crateCorpus.t;const itemNames=crateCorpus.n;const itemPaths=new Map(crateCorpus.q);const itemReexports=new Map(crateCorpus.r);const itemParentIdxs=crateCorpus.i;const implDisambiguator=new Map(crateCorpus.b);const paths=crateCorpus.p;const aliases=crateCorpus.a;const lowercasePaths=[];const itemFunctionDecoder=new VlqHexDecoder(crateCorpus.f,buildFunctionSearchTypeCallback(lowercasePaths),);let len=paths.length;let lastPath=itemPaths.get(0);for(let i=0;i2){path=itemPaths.has(elem[2])?itemPaths.get(elem[2]):lastPath;lastPath=path}const exactPath=elem.length>3?itemPaths.get(elem[3]):path;lowercasePaths.push({ty,name:name.toLowerCase(),path,exactPath});paths[i]={ty,name,path,exactPath}}lastPath="";len=itemTypes.length;for(let i=0;i=descShard.len&&!searchIndexEmptyDesc.get(crate).contains(bitIndex)){descShard={crate,shard:descShard.shard+1,start:descShard.start+descShard.len,len:itemDescShardDecoder.next(),promise:null,resolve:null,};descIndex=0;descShardList.push(descShard)}let word="";if(typeof itemNames[i]==="string"){word=itemNames[i].toLowerCase()}const path=itemPaths.has(i)?itemPaths.get(i):lastPath;const type=itemFunctionDecoder.next();if(type!==null){if(type){const fp=functionTypeFingerprint.subarray(id*4,(id+1)*4);const fps=new Set();for(const t of type.inputs){buildFunctionTypeFingerprint(t,fp,fps)}for(const t of type.output){buildFunctionTypeFingerprint(t,fp,fps)}for(const w of type.where_clause){for(const t of w){buildFunctionTypeFingerprint(t,fp,fps)}}}}const row={crate,ty:itemTypes.charCodeAt(i)-65,name:itemNames[i],path,descShard,descIndex,exactPath:itemReexports.has(i)?itemPaths.get(itemReexports.get(i)):path,parent:itemParentIdxs[i]>0?paths[itemParentIdxs[i]-1]:undefined,type,id,word,normalizedName:word.indexOf("_")===-1?word:word.replace(/_/g,""),bitIndex,implDisambiguator:implDisambiguator.has(i)?implDisambiguator.get(i):null,};id+=1;searchIndex.push(row);lastPath=row.path;if(!searchIndexEmptyDesc.get(crate).contains(bitIndex)){descIndex+=1}}if(aliases){const currentCrateAliases=new Map();ALIASES.set(crate,currentCrateAliases);for(const alias_name in aliases){if(!Object.prototype.hasOwnProperty.call(aliases,alias_name)){continue}let currentNameAliases;if(currentCrateAliases.has(alias_name)){currentNameAliases=currentCrateAliases.get(alias_name)}else{currentNameAliases=[];currentCrateAliases.set(alias_name,currentNameAliases)}for(const local_alias of aliases[alias_name]){currentNameAliases.push(local_alias+currentIndex)}}}currentIndex+=itemTypes.length;searchState.descShards.set(crate,descShardList)}TYPES_POOL=new Map()}function onSearchSubmit(e){e.preventDefault();searchState.clearInputTimeout();search()}function putBackSearch(){const search_input=searchState.input;if(!searchState.input){return}if(search_input.value!==""&&!searchState.isDisplayed()){searchState.showResults();if(browserSupportsHistoryApi()){history.replaceState(null,"",buildUrl(search_input.value,getFilterCrates()))}document.title=searchState.title}}function registerSearchEvents(){const params=searchState.getQueryStringParams();if(searchState.input.value===""){searchState.input.value=params.search||""}const searchAfter500ms=()=>{searchState.clearInputTimeout();if(searchState.input.value.length===0){searchState.hideResults()}else{searchState.timeout=setTimeout(search,500)}};searchState.input.onkeyup=searchAfter500ms;searchState.input.oninput=searchAfter500ms;document.getElementsByClassName("search-form")[0].onsubmit=onSearchSubmit;searchState.input.onchange=e=>{if(e.target!==document.activeElement){return}searchState.clearInputTimeout();setTimeout(search,0)};searchState.input.onpaste=searchState.input.onchange;searchState.outputElement().addEventListener("keydown",e=>{if(e.altKey||e.ctrlKey||e.shiftKey||e.metaKey){return}if(e.which===38){const previous=document.activeElement.previousElementSibling;if(previous){previous.focus()}else{searchState.focus()}e.preventDefault()}else if(e.which===40){const next=document.activeElement.nextElementSibling;if(next){next.focus()}const rect=document.activeElement.getBoundingClientRect();if(window.innerHeight-rect.bottom{if(e.which===40){focusSearchResult();e.preventDefault()}});searchState.input.addEventListener("focus",()=>{putBackSearch()});searchState.input.addEventListener("blur",()=>{searchState.input.placeholder=searchState.input.origPlaceholder});if(browserSupportsHistoryApi()){const previousTitle=document.title;window.addEventListener("popstate",e=>{const params=searchState.getQueryStringParams();document.title=previousTitle;currentResults=null;if(params.search&¶ms.search.length>0){searchState.input.value=params.search;e.preventDefault();search()}else{searchState.input.value="";searchState.hideResults()}})}window.onpageshow=()=>{const qSearch=searchState.getQueryStringParams().search;if(searchState.input.value===""&&qSearch){searchState.input.value=qSearch}search()}}function updateCrate(ev){if(ev.target.value==="all crates"){const query=searchState.input.value.trim();updateSearchHistory(buildUrl(query,null))}currentResults=null;search(true)}buildIndex(rawSearchIndex);if(typeof window!=="undefined"){registerSearchEvents();if(window.searchState.getQueryStringParams().search){search()}}if(typeof exports!=="undefined"){exports.initSearch=initSearch;exports.execQuery=execQuery;exports.parseQuery=parseQuery}}if(typeof window!=="undefined"){window.initSearch=initSearch;if(window.searchIndex!==undefined){initSearch(window.searchIndex)}}else{initSearch(new Map())}})() \ No newline at end of file diff --git a/static.files/settings-4313503d2e1961c2.js b/static.files/settings-4313503d2e1961c2.js new file mode 100644 index 00000000..ab425fe4 --- /dev/null +++ b/static.files/settings-4313503d2e1961c2.js @@ -0,0 +1,17 @@ +"use strict";(function(){const isSettingsPage=window.location.pathname.endsWith("/settings.html");function changeSetting(settingName,value){if(settingName==="theme"){const useSystem=value==="system preference"?"true":"false";updateLocalStorage("use-system-theme",useSystem)}updateLocalStorage(settingName,value);switch(settingName){case"theme":case"preferred-dark-theme":case"preferred-light-theme":updateTheme();updateLightAndDark();break;case"line-numbers":if(value===true){window.rustdoc_add_line_numbers_to_examples()}else{window.rustdoc_remove_line_numbers_from_examples()}break;case"hide-sidebar":if(value===true){addClass(document.documentElement,"hide-sidebar")}else{removeClass(document.documentElement,"hide-sidebar")}break}}function showLightAndDark(){removeClass(document.getElementById("preferred-light-theme"),"hidden");removeClass(document.getElementById("preferred-dark-theme"),"hidden")}function hideLightAndDark(){addClass(document.getElementById("preferred-light-theme"),"hidden");addClass(document.getElementById("preferred-dark-theme"),"hidden")}function updateLightAndDark(){const useSystem=getSettingValue("use-system-theme");if(useSystem==="true"||(useSystem===null&&getSettingValue("theme")===null)){showLightAndDark()}else{hideLightAndDark()}}function setEvents(settingsElement){updateLightAndDark();onEachLazy(settingsElement.querySelectorAll("input[type=\"checkbox\"]"),toggle=>{const settingId=toggle.id;const settingValue=getSettingValue(settingId);if(settingValue!==null){toggle.checked=settingValue==="true"}toggle.onchange=()=>{changeSetting(toggle.id,toggle.checked)}});onEachLazy(settingsElement.querySelectorAll("input[type=\"radio\"]"),elem=>{const settingId=elem.name;let settingValue=getSettingValue(settingId);if(settingId==="theme"){const useSystem=getSettingValue("use-system-theme");if(useSystem==="true"||settingValue===null){settingValue=useSystem==="false"?"light":"system preference"}}if(settingValue!==null&&settingValue!=="null"){elem.checked=settingValue===elem.value}elem.addEventListener("change",ev=>{changeSetting(ev.target.name,ev.target.value)})})}function buildSettingsPageSections(settings){let output="";for(const setting of settings){const js_data_name=setting["js_name"];const setting_name=setting["name"];if(setting["options"]!==undefined){output+=`\ +
+
${setting_name}
+
`;onEach(setting["options"],option=>{const checked=option===setting["default"]?" checked":"";const full=`${js_data_name}-${option.replace(/ /g,"-")}`;output+=`\ + `});output+=`\ +
+
`}else{const checked=setting["default"]===true?" checked":"";output+=`\ +
\ + \ +
`}}return output}function buildSettingsPage(){const theme_names=getVar("themes").split(",").filter(t=>t);theme_names.push("light","dark","ayu");const settings=[{"name":"Theme","js_name":"theme","default":"system preference","options":theme_names.concat("system preference"),},{"name":"Preferred light theme","js_name":"preferred-light-theme","default":"light","options":theme_names,},{"name":"Preferred dark theme","js_name":"preferred-dark-theme","default":"dark","options":theme_names,},{"name":"Auto-hide item contents for large items","js_name":"auto-hide-large-items","default":true,},{"name":"Auto-hide item methods' documentation","js_name":"auto-hide-method-docs","default":false,},{"name":"Auto-hide trait implementation documentation","js_name":"auto-hide-trait-implementations","default":false,},{"name":"Directly go to item in search if there is only one result","js_name":"go-to-only-result","default":false,},{"name":"Show line numbers on code examples","js_name":"line-numbers","default":false,},{"name":"Hide persistent navigation bar","js_name":"hide-sidebar","default":false,},{"name":"Disable keyboard shortcuts","js_name":"disable-shortcuts","default":false,},];const elementKind=isSettingsPage?"section":"div";const innerHTML=`
${buildSettingsPageSections(settings)}
`;const el=document.createElement(elementKind);el.id="settings";if(!isSettingsPage){el.className="popover"}el.innerHTML=innerHTML;if(isSettingsPage){document.getElementById(MAIN_ID).appendChild(el)}else{el.setAttribute("tabindex","-1");getSettingsButton().appendChild(el)}return el}const settingsMenu=buildSettingsPage();function displaySettings(){settingsMenu.style.display="";onEachLazy(settingsMenu.querySelectorAll("input[type='checkbox']"),el=>{const val=getSettingValue(el.id);const checked=val==="true";if(checked!==el.checked&&val!==null){el.checked=checked}})}function settingsBlurHandler(event){blurHandler(event,getSettingsButton(),window.hidePopoverMenus)}if(isSettingsPage){getSettingsButton().onclick=event=>{event.preventDefault()}}else{const settingsButton=getSettingsButton();const settingsMenu=document.getElementById("settings");settingsButton.onclick=event=>{if(settingsMenu.contains(event.target)){return}event.preventDefault();const shouldDisplaySettings=settingsMenu.style.display==="none";window.hideAllModals();if(shouldDisplaySettings){displaySettings()}};settingsButton.onblur=settingsBlurHandler;settingsButton.querySelector("a").onblur=settingsBlurHandler;onEachLazy(settingsMenu.querySelectorAll("input"),el=>{el.onblur=settingsBlurHandler});settingsMenu.onblur=settingsBlurHandler}setTimeout(()=>{setEvents(settingsMenu);if(!isSettingsPage){displaySettings()}removeClass(getSettingsButton(),"rotate")},0)})() \ No newline at end of file diff --git a/static.files/src-script-e66d777a5a92e9b2.js b/static.files/src-script-e66d777a5a92e9b2.js new file mode 100644 index 00000000..d0aebb85 --- /dev/null +++ b/static.files/src-script-e66d777a5a92e9b2.js @@ -0,0 +1 @@ +"use strict";(function(){const rootPath=getVar("root-path");const NAME_OFFSET=0;const DIRS_OFFSET=1;const FILES_OFFSET=2;const RUSTDOC_MOBILE_BREAKPOINT=700;function closeSidebarIfMobile(){if(window.innerWidth{removeClass(document.documentElement,"src-sidebar-expanded");updateLocalStorage("source-sidebar-show","false")};window.rustdocShowSourceSidebar=()=>{addClass(document.documentElement,"src-sidebar-expanded");updateLocalStorage("source-sidebar-show","true")};window.rustdocToggleSrcSidebar=()=>{if(document.documentElement.classList.contains("src-sidebar-expanded")){window.rustdocCloseSourceSidebar()}else{window.rustdocShowSourceSidebar()}};function createSrcSidebar(){const container=document.querySelector("nav.sidebar");const sidebar=document.createElement("div");sidebar.id="src-sidebar";let hasFoundFile=false;for(const[key,source]of srcIndex){source[NAME_OFFSET]=key;hasFoundFile=createDirEntry(source,sidebar,"",hasFoundFile)}container.appendChild(sidebar);const selected_elem=sidebar.getElementsByClassName("selected")[0];if(typeof selected_elem!=="undefined"){selected_elem.focus()}}function highlightSrcLines(){const match=window.location.hash.match(/^#?(\d+)(?:-(\d+))?$/);if(!match){return}let from=parseInt(match[1],10);let to=from;if(typeof match[2]!=="undefined"){to=parseInt(match[2],10)}if(to{onEachLazy(e.getElementsByTagName("a"),i_e=>{removeClass(i_e,"line-highlighted")})});for(let i=from;i<=to;++i){elem=document.getElementById(i);if(!elem){break}addClass(elem,"line-highlighted")}}const handleSrcHighlight=(function(){let prev_line_id=0;const set_fragment=name=>{const x=window.scrollX,y=window.scrollY;if(browserSupportsHistoryApi()){history.replaceState(null,null,"#"+name);highlightSrcLines()}else{location.replace("#"+name)}window.scrollTo(x,y)};return ev=>{let cur_line_id=parseInt(ev.target.id,10);if(isNaN(cur_line_id)||ev.ctrlKey||ev.altKey||ev.metaKey){return}ev.preventDefault();if(ev.shiftKey&&prev_line_id){if(prev_line_id>cur_line_id){const tmp=prev_line_id;prev_line_id=cur_line_id;cur_line_id=tmp}set_fragment(prev_line_id+"-"+cur_line_id)}else{prev_line_id=cur_line_id;set_fragment(cur_line_id)}}}());window.addEventListener("hashchange",highlightSrcLines);onEachLazy(document.getElementsByClassName("src-line-numbers"),el=>{el.addEventListener("click",handleSrcHighlight)});highlightSrcLines();window.createSrcSidebar=createSrcSidebar})() \ No newline at end of file diff --git a/static.files/storage-118b08c4c78b968e.js b/static.files/storage-118b08c4c78b968e.js new file mode 100644 index 00000000..98189467 --- /dev/null +++ b/static.files/storage-118b08c4c78b968e.js @@ -0,0 +1,24 @@ +"use strict";const builtinThemes=["light","dark","ayu"];const darkThemes=["dark","ayu"];window.currentTheme=document.getElementById("themeStyle");const settingsDataset=(function(){const settingsElement=document.getElementById("default-settings");return settingsElement&&settingsElement.dataset?settingsElement.dataset:null})();function getSettingValue(settingName){const current=getCurrentValue(settingName);if(current===null&&settingsDataset!==null){const def=settingsDataset[settingName.replace(/-/g,"_")];if(def!==undefined){return def}}return current}const localStoredTheme=getSettingValue("theme");function hasClass(elem,className){return elem&&elem.classList&&elem.classList.contains(className)}function addClass(elem,className){if(elem&&elem.classList){elem.classList.add(className)}}function removeClass(elem,className){if(elem&&elem.classList){elem.classList.remove(className)}}function onEach(arr,func){for(const elem of arr){if(func(elem)){return true}}return false}function onEachLazy(lazyArray,func){return onEach(Array.prototype.slice.call(lazyArray),func)}function updateLocalStorage(name,value){try{window.localStorage.setItem("rustdoc-"+name,value)}catch(e){}}function getCurrentValue(name){try{return window.localStorage.getItem("rustdoc-"+name)}catch(e){return null}}const getVar=(function getVar(name){const el=document.querySelector("head > meta[name='rustdoc-vars']");return el?el.attributes["data-"+name].value:null});function switchTheme(newThemeName,saveTheme){const themeNames=getVar("themes").split(",").filter(t=>t);themeNames.push(...builtinThemes);if(themeNames.indexOf(newThemeName)===-1){return}if(saveTheme){updateLocalStorage("theme",newThemeName)}document.documentElement.setAttribute("data-theme",newThemeName);if(builtinThemes.indexOf(newThemeName)!==-1){if(window.currentTheme){window.currentTheme.parentNode.removeChild(window.currentTheme);window.currentTheme=null}}else{const newHref=getVar("root-path")+encodeURIComponent(newThemeName)+getVar("resource-suffix")+".css";if(!window.currentTheme){if(document.readyState==="loading"){document.write(``);window.currentTheme=document.getElementById("themeStyle")}else{window.currentTheme=document.createElement("link");window.currentTheme.rel="stylesheet";window.currentTheme.id="themeStyle";window.currentTheme.href=newHref;document.documentElement.appendChild(window.currentTheme)}}else if(newHref!==window.currentTheme.href){window.currentTheme.href=newHref}}}const updateTheme=(function(){const mql=window.matchMedia("(prefers-color-scheme: dark)");function updateTheme(){if(getSettingValue("use-system-theme")!=="false"){const lightTheme=getSettingValue("preferred-light-theme")||"light";const darkTheme=getSettingValue("preferred-dark-theme")||"dark";updateLocalStorage("use-system-theme","true");switchTheme(mql.matches?darkTheme:lightTheme,true)}else{switchTheme(getSettingValue("theme"),false)}}mql.addEventListener("change",updateTheme);return updateTheme})();if(getSettingValue("use-system-theme")!=="false"&&window.matchMedia){if(getSettingValue("use-system-theme")===null&&getSettingValue("preferred-dark-theme")===null&&darkThemes.indexOf(localStoredTheme)>=0){updateLocalStorage("preferred-dark-theme",localStoredTheme)}}updateTheme();if(getSettingValue("source-sidebar-show")==="true"){addClass(document.documentElement,"src-sidebar-expanded")}if(getSettingValue("hide-sidebar")==="true"){addClass(document.documentElement,"hide-sidebar")}function updateSidebarWidth(){const desktopSidebarWidth=getSettingValue("desktop-sidebar-width");if(desktopSidebarWidth&&desktopSidebarWidth!=="null"){document.documentElement.style.setProperty("--desktop-sidebar-width",desktopSidebarWidth+"px",)}const srcSidebarWidth=getSettingValue("src-sidebar-width");if(srcSidebarWidth&&srcSidebarWidth!=="null"){document.documentElement.style.setProperty("--src-sidebar-width",srcSidebarWidth+"px",)}}updateSidebarWidth();window.addEventListener("pageshow",ev=>{if(ev.persisted){setTimeout(updateTheme,0);setTimeout(updateSidebarWidth,0)}});class RustdocSearchElement extends HTMLElement{constructor(){super()}connectedCallback(){const rootPath=getVar("root-path");const currentCrate=getVar("current-crate");this.innerHTML=``}}window.customElements.define("rustdoc-search",RustdocSearchElement) \ No newline at end of file diff --git a/trait.impl/air/trace/run/runner/trait.AirRunner.js b/trait.impl/air/trace/run/runner/trait.AirRunner.js new file mode 100644 index 00000000..e2885569 --- /dev/null +++ b/trait.impl/air/trace/run/runner/trait.AirRunner.js @@ -0,0 +1,3 @@ +(function() {var implementors = { +"air":[] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/trait.impl/air/trace/run/runner/trait.DataToHumanReadable.js b/trait.impl/air/trace/run/runner/trait.DataToHumanReadable.js new file mode 100644 index 00000000..e2885569 --- /dev/null +++ b/trait.impl/air/trace/run/runner/trait.DataToHumanReadable.js @@ -0,0 +1,3 @@ +(function() {var implementors = { +"air":[] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/trait.impl/air/utils/to_error_code/trait.ToErrorCode.js b/trait.impl/air/utils/to_error_code/trait.ToErrorCode.js new file mode 100644 index 00000000..e2885569 --- /dev/null +++ b/trait.impl/air/utils/to_error_code/trait.ToErrorCode.js @@ -0,0 +1,3 @@ +(function() {var implementors = { +"air":[] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/trait.impl/air_interpreter_sede/format/trait.Format.js b/trait.impl/air_interpreter_sede/format/trait.Format.js new file mode 100644 index 00000000..92eb4716 --- /dev/null +++ b/trait.impl/air_interpreter_sede/format/trait.Format.js @@ -0,0 +1,3 @@ +(function() {var implementors = { +"air_interpreter_sede":[] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/trait.impl/air_interpreter_sede/representation/trait.FromSerialized.js b/trait.impl/air_interpreter_sede/representation/trait.FromSerialized.js new file mode 100644 index 00000000..36d6e4fd --- /dev/null +++ b/trait.impl/air_interpreter_sede/representation/trait.FromSerialized.js @@ -0,0 +1,4 @@ +(function() {var implementors = { +"air_interpreter_data":[["impl FromSerialized<Versions> for InterpreterDataEnvelopeRepr"]], +"air_interpreter_interface":[["impl FromSerialized<Vec<Value>> for CallArgumentsRepr"],["impl FromSerialized<Vec<Vec<Rc<SecurityTetraplet>>>> for TetrapletsRepr"],["impl FromSerialized<Vec<Vec<SecurityTetraplet>>> for TetrapletsRepr"],["impl FromSerialized<Vec<JValue>> for CallArgumentsRepr"],["impl FromSerialized<HashMap<u32, CallRequestParams>> for CallRequestsRepr"],["impl FromSerialized<HashMap<String, CallServiceResult>> for CallResultsRepr"]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/trait.impl/air_interpreter_sede/representation/trait.Representation.js b/trait.impl/air_interpreter_sede/representation/trait.Representation.js new file mode 100644 index 00000000..2ff3b074 --- /dev/null +++ b/trait.impl/air_interpreter_sede/representation/trait.Representation.js @@ -0,0 +1,4 @@ +(function() {var implementors = { +"air_interpreter_data":[["impl Representation for InterpreterDataEnvelopeRepr"]], +"air_interpreter_interface":[["impl Representation for CallArgumentsRepr"],["impl Representation for CallRequestsRepr"],["impl Representation for CallResultsRepr"],["impl Representation for TetrapletsRepr"]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/trait.impl/air_interpreter_sede/representation/trait.ToSerialized.js b/trait.impl/air_interpreter_sede/representation/trait.ToSerialized.js new file mode 100644 index 00000000..f5d86ffc --- /dev/null +++ b/trait.impl/air_interpreter_sede/representation/trait.ToSerialized.js @@ -0,0 +1,3 @@ +(function() {var implementors = { +"air_interpreter_interface":[["impl ToSerialized<Vec<Vec<Rc<SecurityTetraplet>>>> for TetrapletsRepr"],["impl ToSerialized<Vec<JValue>> for CallArgumentsRepr"],["impl ToSerialized<HashMap<u32, CallRequestParams>> for CallRequestsRepr"],["impl ToSerialized<HashMap<String, CallServiceResult>> for CallResultsRepr"]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/trait.impl/air_interpreter_sede/representation/trait.ToWriter.js b/trait.impl/air_interpreter_sede/representation/trait.ToWriter.js new file mode 100644 index 00000000..fc8337ae --- /dev/null +++ b/trait.impl/air_interpreter_sede/representation/trait.ToWriter.js @@ -0,0 +1,3 @@ +(function() {var implementors = { +"air_interpreter_interface":[["impl ToWriter<Vec<Vec<Rc<SecurityTetraplet>>>> for TetrapletsRepr"],["impl ToWriter<Vec<JValue>> for CallArgumentsRepr"],["impl ToWriter<HashMap<u32, CallRequestParams>> for CallRequestsRepr"],["impl ToWriter<HashMap<String, CallServiceResult>> for CallResultsRepr"]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/trait.impl/air_parser/ast/instructions/trait.PeerIDErrorLogable.js b/trait.impl/air_parser/ast/instructions/trait.PeerIDErrorLogable.js new file mode 100644 index 00000000..af7878d9 --- /dev/null +++ b/trait.impl/air_parser/ast/instructions/trait.PeerIDErrorLogable.js @@ -0,0 +1,3 @@ +(function() {var implementors = { +"air_parser":[] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/trait.impl/air_test_framework/services/trait.MarineService.js b/trait.impl/air_test_framework/services/trait.MarineService.js new file mode 100644 index 00000000..2fee0857 --- /dev/null +++ b/trait.impl/air_test_framework/services/trait.MarineService.js @@ -0,0 +1,3 @@ +(function() {var implementors = { +"air_test_framework":[] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/trait.impl/air_test_utils/test_runner/trait.AirRunner.js b/trait.impl/air_test_utils/test_runner/trait.AirRunner.js new file mode 100644 index 00000000..0b84ba13 --- /dev/null +++ b/trait.impl/air_test_utils/test_runner/trait.AirRunner.js @@ -0,0 +1,3 @@ +(function() {var implementors = { +"air_test_utils":[] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/trait.impl/alloc/string/trait.ToString.js b/trait.impl/alloc/string/trait.ToString.js new file mode 100644 index 00000000..a9a5dce6 --- /dev/null +++ b/trait.impl/alloc/string/trait.ToString.js @@ -0,0 +1,3 @@ +(function() {var implementors = { +"air_interpreter_signatures":[["impl ToString for PublicKey"]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/trait.impl/bytecheck/trait.CheckBytes.js b/trait.impl/bytecheck/trait.CheckBytes.js new file mode 100644 index 00000000..17688800 --- /dev/null +++ b/trait.impl/bytecheck/trait.CheckBytes.js @@ -0,0 +1,5 @@ +(function() {var implementors = { +"air_interpreter_cid":[["impl<__C: ?Sized, T: ?Sized> CheckBytes<__C> for ArchivedCID<T>
where\n Rc<CidRef>: Archive,\n With<PhantomData<*const T>, Skip>: Archive,\n Archived<Rc<CidRef>>: CheckBytes<__C>,\n Archived<With<PhantomData<*const T>, Skip>>: CheckBytes<__C>,
"]], +"air_interpreter_data":[["impl<__C: ?Sized> CheckBytes<__C> for ArchivedCallResult
where\n Sender: Archive,\n ValueRef: Archive,\n CID<ServiceResultCidAggregate>: Archive,\n Archived<Sender>: CheckBytes<__C>,\n Archived<ValueRef>: CheckBytes<__C>,\n Archived<CID<ServiceResultCidAggregate>>: CheckBytes<__C>,
"],["impl<__C: ?Sized> CheckBytes<__C> for ArchivedCanonResult
where\n Rc<String>: Archive,\n CID<CanonResultCidAggregate>: Archive,\n Archived<Rc<String>>: CheckBytes<__C>,\n Archived<CID<CanonResultCidAggregate>>: CheckBytes<__C>,
"],["impl<__C: ?Sized> CheckBytes<__C> for ArchivedExecutedState
where\n ParResult: Archive,\n CallResult: Archive,\n FoldResult: Archive,\n ApResult: Archive,\n CanonResult: Archive,\n Archived<ParResult>: CheckBytes<__C>,\n Archived<CallResult>: CheckBytes<__C>,\n Archived<FoldResult>: CheckBytes<__C>,\n Archived<ApResult>: CheckBytes<__C>,\n Archived<CanonResult>: CheckBytes<__C>,
"],["impl<__C: ?Sized> CheckBytes<__C> for ArchivedProvenance
where\n CID<ServiceResultCidAggregate>: Archive,\n CID<CanonResultCidAggregate>: Archive,\n Archived<CID<ServiceResultCidAggregate>>: CheckBytes<__C>,\n Archived<CID<CanonResultCidAggregate>>: CheckBytes<__C>,
"],["impl<__C: ?Sized> CheckBytes<__C> for ArchivedSender
where\n Rc<String>: Archive,\n u32: Archive,\n Archived<Rc<String>>: CheckBytes<__C>,\n Archived<u32>: CheckBytes<__C>,
"],["impl<__C: ?Sized> CheckBytes<__C> for ArchivedValueRef
where\n CID<ServiceResultCidAggregate>: Archive,\n GenerationIdx: Archive,\n CID<JValue>: Archive,\n Archived<CID<ServiceResultCidAggregate>>: CheckBytes<__C>,\n Archived<GenerationIdx>: CheckBytes<__C>,\n Archived<CID<JValue>>: CheckBytes<__C>,
"],["impl<__C: ?Sized> CheckBytes<__C> for ArchivedApResult
where\n Vec<GenerationIdx>: Archive,\n Archived<Vec<GenerationIdx>>: CheckBytes<__C>,
"],["impl<__C: ?Sized> CheckBytes<__C> for ArchivedCallServiceFailed
where\n i32: Archive,\n Rc<String>: Archive,\n Archived<i32>: CheckBytes<__C>,\n Archived<Rc<String>>: CheckBytes<__C>,
"],["impl<__C: ?Sized> CheckBytes<__C> for ArchivedCanonCidAggregate
where\n CID<RawValue>: Archive,\n CID<SecurityTetraplet>: Archive,\n Provenance: Archive,\n Archived<CID<RawValue>>: CheckBytes<__C>,\n Archived<CID<SecurityTetraplet>>: CheckBytes<__C>,\n Archived<Provenance>: CheckBytes<__C>,
"],["impl<__C: ?Sized> CheckBytes<__C> for ArchivedCanonResultCidAggregate
where\n CID<SecurityTetraplet>: Archive,\n Vec<CID<CanonCidAggregate>>: Archive,\n Archived<CID<SecurityTetraplet>>: CheckBytes<__C>,\n Archived<Vec<CID<CanonCidAggregate>>>: CheckBytes<__C>,
"],["impl<__C: ?Sized> CheckBytes<__C> for ArchivedCidInfo
where\n CidStore<RawValue>: Archive,\n CidStore<SecurityTetraplet>: Archive,\n CidStore<CanonCidAggregate>: Archive,\n CidStore<CanonResultCidAggregate>: Archive,\n CidStore<ServiceResultCidAggregate>: Archive,\n Archived<CidStore<RawValue>>: CheckBytes<__C>,\n Archived<CidStore<SecurityTetraplet>>: CheckBytes<__C>,\n Archived<CidStore<CanonCidAggregate>>: CheckBytes<__C>,\n Archived<CidStore<CanonResultCidAggregate>>: CheckBytes<__C>,\n Archived<CidStore<ServiceResultCidAggregate>>: CheckBytes<__C>,
"],["impl<__C: ?Sized> CheckBytes<__C> for ArchivedExecutionTrace
where\n Vec<ExecutedState>: Archive,\n Archived<Vec<ExecutedState>>: CheckBytes<__C>,
"],["impl<__C: ?Sized> CheckBytes<__C> for ArchivedFoldResult
where\n FoldLore: Archive,\n Archived<FoldLore>: CheckBytes<__C>,
"],["impl<__C: ?Sized> CheckBytes<__C> for ArchivedFoldSubTraceLore
where\n TracePos: Archive,\n Vec<SubTraceDesc>: Archive,\n Archived<TracePos>: CheckBytes<__C>,\n Archived<Vec<SubTraceDesc>>: CheckBytes<__C>,
"],["impl<__C: ?Sized> CheckBytes<__C> for ArchivedGenerationIdx
where\n u32: Archive,\n Archived<u32>: CheckBytes<__C>,
"],["impl<__C: ?Sized> CheckBytes<__C> for ArchivedInterpreterData
where\n ExecutionTrace: Archive,\n u32: Archive,\n CidInfo: Archive,\n SignatureStore: Archive,\n Archived<ExecutionTrace>: CheckBytes<__C>,\n Archived<u32>: CheckBytes<__C>,\n Archived<CidInfo>: CheckBytes<__C>,\n Archived<SignatureStore>: CheckBytes<__C>,
"],["impl<__C: ?Sized> CheckBytes<__C> for ArchivedParResult
where\n u32: Archive,\n Archived<u32>: CheckBytes<__C>,
"],["impl<__C: ?Sized> CheckBytes<__C> for ArchivedRawValue
where\n Box<str>: Archive,\n With<RefCell<Option<JValue>>, Skip>: Archive,\n Archived<Box<str>>: CheckBytes<__C>,\n Archived<With<RefCell<Option<JValue>>, Skip>>: CheckBytes<__C>,
"],["impl<__C: ?Sized> CheckBytes<__C> for ArchivedServiceResultCidAggregate
where\n CID<RawValue>: Archive,\n Rc<str>: Archive,\n CID<SecurityTetraplet>: Archive,\n Archived<CID<RawValue>>: CheckBytes<__C>,\n Archived<Rc<str>>: CheckBytes<__C>,\n Archived<CID<SecurityTetraplet>>: CheckBytes<__C>,
"],["impl<__C: ?Sized> CheckBytes<__C> for ArchivedSubTraceDesc
where\n TracePos: Archive,\n u32: Archive,\n Archived<TracePos>: CheckBytes<__C>,\n Archived<u32>: CheckBytes<__C>,
"],["impl<__C: ?Sized> CheckBytes<__C> for ArchivedTracePos
where\n PosType: Archive,\n Archived<PosType>: CheckBytes<__C>,
"],["impl<__C: ?Sized, Val> CheckBytes<__C> for ArchivedCidStore<Val>
where\n With<HashMap<CID<Val>, Rc<Val>>, AsVec>: Archive,\n Archived<With<HashMap<CID<Val>, Rc<Val>>, AsVec>>: CheckBytes<__C>,
"]], +"air_interpreter_signatures":[["impl<__C: ?Sized> CheckBytes<__C> for ArchivedPublicKey
where\n Box<[u8]>: Archive,\n Archived<Box<[u8]>>: CheckBytes<__C>,
"],["impl<__C: ?Sized> CheckBytes<__C> for ArchivedSignature
where\n Box<[u8]>: Archive,\n Archived<Box<[u8]>>: CheckBytes<__C>,
"],["impl<__C: ?Sized, Key: Hash + Eq, Sign> CheckBytes<__C> for ArchivedSignatureStore<Key, Sign>
where\n With<HashMap<Key, Sign>, AsVec>: Archive,\n Archived<With<HashMap<Key, Sign>, AsVec>>: CheckBytes<__C>,
"]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/trait.impl/clap_builder/derive/trait.Args.js b/trait.impl/clap_builder/derive/trait.Args.js new file mode 100644 index 00000000..7040fee8 --- /dev/null +++ b/trait.impl/clap_builder/derive/trait.Args.js @@ -0,0 +1,3 @@ +(function() {var implementors = { +"air":[["impl Args for Args"],["impl Args for Args"],["impl Args for ModeArgs"],["impl Args for Cli"],["impl Args for AnomalyDataArgs"],["impl Args for PlainDataArgs"],["impl Args for Args"],["impl Args for Keys"],["impl Args for ModeArgs"],["impl Args for Args"]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/trait.impl/clap_builder/derive/trait.CommandFactory.js b/trait.impl/clap_builder/derive/trait.CommandFactory.js new file mode 100644 index 00000000..3d3c652a --- /dev/null +++ b/trait.impl/clap_builder/derive/trait.CommandFactory.js @@ -0,0 +1,3 @@ +(function() {var implementors = { +"air":[["impl CommandFactory for Args"],["impl CommandFactory for Args"],["impl CommandFactory for Cli"],["impl CommandFactory for AnomalyDataArgs"],["impl CommandFactory for Args"],["impl CommandFactory for Args"]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/trait.impl/clap_builder/derive/trait.FromArgMatches.js b/trait.impl/clap_builder/derive/trait.FromArgMatches.js new file mode 100644 index 00000000..8c8e5525 --- /dev/null +++ b/trait.impl/clap_builder/derive/trait.FromArgMatches.js @@ -0,0 +1,3 @@ +(function() {var implementors = { +"air":[["impl FromArgMatches for Subcommand"],["impl FromArgMatches for Source"],["impl FromArgMatches for Args"],["impl FromArgMatches for Args"],["impl FromArgMatches for ModeArgs"],["impl FromArgMatches for Cli"],["impl FromArgMatches for AnomalyDataArgs"],["impl FromArgMatches for PlainDataArgs"],["impl FromArgMatches for Args"],["impl FromArgMatches for Keys"],["impl FromArgMatches for ModeArgs"],["impl FromArgMatches for Args"]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/trait.impl/clap_builder/derive/trait.Parser.js b/trait.impl/clap_builder/derive/trait.Parser.js new file mode 100644 index 00000000..c8d20630 --- /dev/null +++ b/trait.impl/clap_builder/derive/trait.Parser.js @@ -0,0 +1,3 @@ +(function() {var implementors = { +"air":[["impl Parser for Args"],["impl Parser for Args"],["impl Parser for Cli"],["impl Parser for AnomalyDataArgs"],["impl Parser for Args"],["impl Parser for Args"]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/trait.impl/clap_builder/derive/trait.Subcommand.js b/trait.impl/clap_builder/derive/trait.Subcommand.js new file mode 100644 index 00000000..c18c56e7 --- /dev/null +++ b/trait.impl/clap_builder/derive/trait.Subcommand.js @@ -0,0 +1,3 @@ +(function() {var implementors = { +"air":[["impl Subcommand for Subcommand"],["impl Subcommand for Source"]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/trait.impl/core/borrow/trait.Borrow.js b/trait.impl/core/borrow/trait.Borrow.js new file mode 100644 index 00000000..597be0a9 --- /dev/null +++ b/trait.impl/core/borrow/trait.Borrow.js @@ -0,0 +1,4 @@ +(function() {var implementors = { +"air_interpreter_cid":[["impl<T: ?Sized> Borrow<str> for CID<T>"]], +"air_test_framework":[["impl Borrow<str> for PeerId"]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/trait.impl/core/clone/trait.Clone.js b/trait.impl/core/clone/trait.Clone.js new file mode 100644 index 00000000..88528bfe --- /dev/null +++ b/trait.impl/core/clone/trait.Clone.js @@ -0,0 +1,19 @@ +(function() {var implementors = { +"air":[["impl Clone for ModeArgs"],["impl Clone for TestInitParameters"],["impl Clone for ModeArgs"]], +"air_interpreter_cid":[["impl<T: ?Sized> Clone for CID<T>"]], +"air_interpreter_data":[["impl Clone for CallResult"],["impl Clone for CanonResult"],["impl Clone for ExecutedState"],["impl Clone for Provenance"],["impl Clone for Sender"],["impl Clone for ValueRef"],["impl Clone for ApResult"],["impl Clone for CallServiceFailed"],["impl Clone for CanonCidAggregate"],["impl Clone for CanonResultCidAggregate"],["impl Clone for CidInfo"],["impl Clone for ExecutionTrace"],["impl Clone for FoldResult"],["impl Clone for FoldSubTraceLore"],["impl Clone for GenerationIdx"],["impl Clone for InterpreterData"],["impl Clone for ParResult"],["impl Clone for RawValue"],["impl Clone for ServiceResultCidAggregate"],["impl Clone for SubTraceDesc"],["impl Clone for TracePos"],["impl Clone for Versions"],["impl<'a> Clone for InterpreterDataEnvelope<'a>"],["impl<Val: Clone> Clone for CidStore<Val>"],["impl<Val: Clone> Clone for CidTracker<Val>"]], +"air_interpreter_interface":[["impl Clone for CallRequestParams"],["impl Clone for CallServiceResult"],["impl Clone for InterpreterOutcome"],["impl Clone for RunParameters"],["impl Clone for SerializedCallArguments"],["impl Clone for SerializedCallRequests"],["impl Clone for SerializedCallResults"],["impl Clone for SerializedTetraplets"],["impl Clone for SoftLimitsTriggering"]], +"air_interpreter_sede":[["impl Clone for RmpSerdeFormat"],["impl Clone for RmpSerdeMultiformat"]], +"air_interpreter_signatures":[["impl Clone for KeyPair"],["impl Clone for PublicKey"],["impl Clone for Signature"],["impl<Key: Clone + Hash + Eq, Sign: Clone> Clone for SignatureStore<Key, Sign>"]], +"air_interpreter_value":[["impl Clone for JValue"]], +"air_lambda_ast":[["impl Clone for Functor"],["impl<'input> Clone for LambdaAST<'input>"],["impl<'input> Clone for ValueAccessor<'input>"]], +"air_lambda_parser":[["impl Clone for LexerError"],["impl<'input> Clone for LambdaParserError<'input>"]], +"air_parser":[["impl Clone for Number"],["impl Clone for Span"],["impl Clone for AirPos"],["impl<'i> Clone for ApArgument<'i>"],["impl<'i> Clone for ApResult<'i>"],["impl<'i> Clone for CallOutputValue<'i>"],["impl<'i> Clone for FoldScalarIterable<'i>"],["impl<'i> Clone for ImmutableValue<'i>"],["impl<'i> Clone for ImmutableVariable<'i>"],["impl<'i> Clone for ImmutableVariableWithLambda<'i>"],["impl<'i> Clone for NewArgument<'i>"],["impl<'i> Clone for ResolvableToPeerIdVariable<'i>"],["impl<'i> Clone for ResolvableToStringVariable<'i>"],["impl<'i> Clone for StreamMapKeyClause<'i>"],["impl<'i> Clone for CanonStream<'i>"],["impl<'i> Clone for CanonStreamMap<'i>"],["impl<'i> Clone for CanonStreamMapWithLambda<'i>"],["impl<'i> Clone for CanonStreamWithLambda<'i>"],["impl<'i> Clone for Scalar<'i>"],["impl<'i> Clone for ScalarWithLambda<'i>"],["impl<'i> Clone for Stream<'i>"],["impl<'i> Clone for StreamMap<'i>"],["impl<'i> Clone for Triplet<'i>"],["impl<'i> Clone for VariableValidator<'i>"],["impl<'lens> Clone for InstructionErrorAST<'lens>"]], +"air_test_framework":[["impl Clone for ServiceDefinition"],["impl Clone for ServiceTagName"],["impl Clone for AlterState"],["impl Clone for PeerId"],["impl Clone for MarineServiceHandle"],["impl<R: Clone> Clone for TransformedAirScript<R>"]], +"air_test_utils":[["impl Clone for TestInitParameters"],["impl Clone for TestRunParameters"]], +"air_trace_handler":[["impl Clone for SubgraphType"],["impl Clone for DataType"],["impl Clone for MergeCtxType"],["impl Clone for MergerApResult"],["impl Clone for MergerCallResult"],["impl Clone for MergerCanonResult"],["impl Clone for PreparationScheme"],["impl Clone for ValueSource"],["impl Clone for MergerFoldResult"],["impl Clone for MergerParResult"],["impl Clone for MetApResult"],["impl Clone for MetCallResult"],["impl Clone for ResolvedFold"],["impl Clone for ResolvedSubTraceDescs"]], +"avm_data_store":[["impl<'data> Clone for AnomalyData<'data>"]], +"avm_interface":[["impl Clone for RawAVMOutcome"],["impl Clone for AVMOutcome"],["impl Clone for CallRequestParams"],["impl Clone for CallServiceResult"],["impl Clone for ErrorAVMOutcome"],["impl<'ctx> Clone for ParticleParameters<'ctx>"]], +"avm_server":[["impl Clone for AquaVMRuntimeLimits"]], +"polyplets":[["impl Clone for ResolvedTriplet"]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/trait.impl/core/cmp/trait.Eq.js b/trait.impl/core/cmp/trait.Eq.js new file mode 100644 index 00000000..a1ca61d4 --- /dev/null +++ b/trait.impl/core/cmp/trait.Eq.js @@ -0,0 +1,17 @@ +(function() {var implementors = { +"air":[["impl Eq for LogKey"]], +"air_execution_info_collector":[["impl Eq for ApTracker"],["impl Eq for CallTracker"],["impl Eq for FoldTracker"],["impl Eq for InstructionTracker"],["impl Eq for NewTracker"],["impl Eq for ParTracker"]], +"air_interpreter_cid":[["impl<Val> Eq for CID<Val>"]], +"air_interpreter_data":[["impl Eq for CallResult"],["impl Eq for CanonResult"],["impl Eq for ExecutedState"],["impl Eq for Provenance"],["impl Eq for Sender"],["impl Eq for ValueRef"],["impl Eq for ApResult"],["impl Eq for CallServiceFailed"],["impl Eq for CanonCidAggregate"],["impl Eq for CanonResultCidAggregate"],["impl Eq for CidInfo"],["impl Eq for ExecutionTrace"],["impl Eq for FoldResult"],["impl Eq for FoldSubTraceLore"],["impl Eq for GenerationIdx"],["impl Eq for ParResult"],["impl Eq for RawValue"],["impl Eq for ServiceResultCidAggregate"],["impl Eq for SubTraceDesc"],["impl Eq for TracePos"],["impl<Val: Eq> Eq for CidStore<Val>"]], +"air_interpreter_interface":[["impl Eq for CallRequestParams"],["impl Eq for InterpreterOutcome"],["impl Eq for RunParameters"],["impl Eq for SerializedCallArguments"],["impl Eq for SerializedCallRequests"],["impl Eq for SerializedCallResults"],["impl Eq for SerializedTetraplets"],["impl Eq for SoftLimitsTriggering"]], +"air_interpreter_signatures":[["impl Eq for ArchivedPublicKey
where\n Box<[u8]>: Archive,
"],["impl Eq for PublicKey"],["impl Eq for Signature"]], +"air_interpreter_value":[["impl Eq for JValue"]], +"air_lambda_ast":[["impl Eq for Functor"],["impl<'input> Eq for LambdaAST<'input>"],["impl<'input> Eq for ValueAccessor<'input>"]], +"air_lambda_parser":[["impl Eq for LexerError"],["impl<'input> Eq for LambdaParserError<'input>"]], +"air_parser":[["impl Eq for Never"],["impl Eq for Null"],["impl Eq for Span"],["impl Eq for AirPos"],["impl<'i> Eq for ApResult<'i>"],["impl<'i> Eq for CallOutputValue<'i>"],["impl<'i> Eq for Fail<'i>"],["impl<'i> Eq for FoldScalarIterable<'i>"],["impl<'i> Eq for ImmutableVariable<'i>"],["impl<'i> Eq for ImmutableVariableWithLambda<'i>"],["impl<'i> Eq for NewArgument<'i>"],["impl<'i> Eq for ResolvableToPeerIdVariable<'i>"],["impl<'i> Eq for ResolvableToStringVariable<'i>"],["impl<'i> Eq for Canon<'i>"],["impl<'i> Eq for CanonMap<'i>"],["impl<'i> Eq for CanonStream<'i>"],["impl<'i> Eq for CanonStreamMap<'i>"],["impl<'i> Eq for CanonStreamMapScalar<'i>"],["impl<'i> Eq for CanonStreamMapWithLambda<'i>"],["impl<'i> Eq for CanonStreamWithLambda<'i>"],["impl<'i> Eq for Next<'i>"],["impl<'i> Eq for Scalar<'i>"],["impl<'i> Eq for ScalarWithLambda<'i>"],["impl<'i> Eq for Stream<'i>"],["impl<'i> Eq for StreamMap<'i>"],["impl<'i> Eq for Triplet<'i>"],["impl<'lens> Eq for InstructionErrorAST<'lens>"]], +"air_test_framework":[["impl Eq for ServiceDefinition"],["impl Eq for ServiceTagName"],["impl Eq for AlterState"],["impl Eq for PeerId"]], +"air_trace_handler":[["impl Eq for KeeperError"],["impl Eq for SubgraphType"],["impl Eq for ResolvedFold"],["impl Eq for ResolvedSubTraceDescs"]], +"avm_data_store":[["impl<'data> Eq for AnomalyData<'data>"]], +"avm_interface":[["impl Eq for RawAVMOutcome"],["impl Eq for AVMOutcome"],["impl Eq for CallRequestParams"],["impl Eq for CallServiceResult"],["impl Eq for ErrorAVMOutcome"]], +"polyplets":[["impl Eq for ResolvedTriplet"]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/trait.impl/core/cmp/trait.Ord.js b/trait.impl/core/cmp/trait.Ord.js new file mode 100644 index 00000000..26fff057 --- /dev/null +++ b/trait.impl/core/cmp/trait.Ord.js @@ -0,0 +1,5 @@ +(function() {var implementors = { +"air":[["impl Ord for LogKey"]], +"air_interpreter_data":[["impl Ord for GenerationIdx"],["impl Ord for TracePos"]], +"air_parser":[["impl Ord for Span"],["impl Ord for AirPos"]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/trait.impl/core/cmp/trait.PartialEq.js b/trait.impl/core/cmp/trait.PartialEq.js new file mode 100644 index 00000000..a8363503 --- /dev/null +++ b/trait.impl/core/cmp/trait.PartialEq.js @@ -0,0 +1,17 @@ +(function() {var implementors = { +"air":[["impl PartialEq for LogKey"]], +"air_execution_info_collector":[["impl PartialEq for ApTracker"],["impl PartialEq for CallTracker"],["impl PartialEq for FoldTracker"],["impl PartialEq for InstructionTracker"],["impl PartialEq for NewTracker"],["impl PartialEq for ParTracker"]], +"air_interpreter_cid":[["impl<Val> PartialEq for CID<Val>"]], +"air_interpreter_data":[["impl PartialEq for CallResult"],["impl PartialEq for CanonResult"],["impl PartialEq for ExecutedState"],["impl PartialEq for Provenance"],["impl PartialEq for Sender"],["impl PartialEq for ValueRef"],["impl PartialEq for ApResult"],["impl PartialEq for CallServiceFailed"],["impl PartialEq for CanonCidAggregate"],["impl PartialEq for CanonResultCidAggregate"],["impl PartialEq for CidInfo"],["impl PartialEq for ExecutionTrace"],["impl PartialEq for FoldResult"],["impl PartialEq for FoldSubTraceLore"],["impl PartialEq for GenerationIdx"],["impl PartialEq for ParResult"],["impl PartialEq for RawValue"],["impl PartialEq for ServiceResultCidAggregate"],["impl PartialEq for SubTraceDesc"],["impl PartialEq for TracePos"],["impl PartialEq<usize> for GenerationIdx"],["impl PartialEq<Vec<ExecutedState>> for ExecutionTrace"],["impl<Val: PartialEq> PartialEq for CidStore<Val>"]], +"air_interpreter_interface":[["impl PartialEq for CallRequestParams"],["impl PartialEq for InterpreterOutcome"],["impl PartialEq for RunParameters"],["impl PartialEq for SerializedCallArguments"],["impl PartialEq for SerializedCallRequests"],["impl PartialEq for SerializedCallResults"],["impl PartialEq for SerializedTetraplets"],["impl PartialEq for SoftLimitsTriggering"]], +"air_interpreter_signatures":[["impl PartialEq for ArchivedPublicKey
where\n Box<[u8]>: Archive,
"],["impl PartialEq for PublicKey"],["impl PartialEq for Signature"]], +"air_interpreter_value":[["impl PartialEq for JValue"],["impl PartialEq<&str> for JValue"],["impl PartialEq<JValue> for &str"],["impl PartialEq<JValue> for bool"],["impl PartialEq<JValue> for f32"],["impl PartialEq<JValue> for f64"],["impl PartialEq<JValue> for i16"],["impl PartialEq<JValue> for i32"],["impl PartialEq<JValue> for i64"],["impl PartialEq<JValue> for i8"],["impl PartialEq<JValue> for isize"],["impl PartialEq<JValue> for str"],["impl PartialEq<JValue> for u16"],["impl PartialEq<JValue> for u32"],["impl PartialEq<JValue> for u64"],["impl PartialEq<JValue> for u8"],["impl PartialEq<JValue> for usize"],["impl PartialEq<JValue> for String"],["impl PartialEq<bool> for JValue"],["impl PartialEq<f32> for JValue"],["impl PartialEq<f64> for JValue"],["impl PartialEq<i16> for JValue"],["impl PartialEq<i32> for JValue"],["impl PartialEq<i64> for JValue"],["impl PartialEq<i8> for JValue"],["impl PartialEq<isize> for JValue"],["impl PartialEq<str> for JValue"],["impl PartialEq<u16> for JValue"],["impl PartialEq<u32> for JValue"],["impl PartialEq<u64> for JValue"],["impl PartialEq<u8> for JValue"],["impl PartialEq<usize> for JValue"],["impl PartialEq<String> for JValue"],["impl<'a> PartialEq<bool> for &'a JValue"],["impl<'a> PartialEq<f32> for &'a JValue"],["impl<'a> PartialEq<f64> for &'a JValue"],["impl<'a> PartialEq<i16> for &'a JValue"],["impl<'a> PartialEq<i32> for &'a JValue"],["impl<'a> PartialEq<i64> for &'a JValue"],["impl<'a> PartialEq<i8> for &'a JValue"],["impl<'a> PartialEq<isize> for &'a JValue"],["impl<'a> PartialEq<u16> for &'a JValue"],["impl<'a> PartialEq<u32> for &'a JValue"],["impl<'a> PartialEq<u64> for &'a JValue"],["impl<'a> PartialEq<u8> for &'a JValue"],["impl<'a> PartialEq<usize> for &'a JValue"]], +"air_lambda_ast":[["impl PartialEq for Functor"],["impl<'input> PartialEq for LambdaAST<'input>"],["impl<'input> PartialEq for ValueAccessor<'input>"]], +"air_lambda_parser":[["impl PartialEq for LexerError"],["impl<'input> PartialEq for LambdaParserError<'input>"]], +"air_parser":[["impl PartialEq for Number"],["impl PartialEq for Never"],["impl PartialEq for Null"],["impl PartialEq for Span"],["impl PartialEq for AirPos"],["impl PartialEq<usize> for AirPos"],["impl<'i> PartialEq for ApArgument<'i>"],["impl<'i> PartialEq for ApResult<'i>"],["impl<'i> PartialEq for CallOutputValue<'i>"],["impl<'i> PartialEq for Fail<'i>"],["impl<'i> PartialEq for FoldScalarIterable<'i>"],["impl<'i> PartialEq for ImmutableValue<'i>"],["impl<'i> PartialEq for ImmutableVariable<'i>"],["impl<'i> PartialEq for ImmutableVariableWithLambda<'i>"],["impl<'i> PartialEq for Instruction<'i>"],["impl<'i> PartialEq for NewArgument<'i>"],["impl<'i> PartialEq for ResolvableToPeerIdVariable<'i>"],["impl<'i> PartialEq for ResolvableToStringVariable<'i>"],["impl<'i> PartialEq for StreamMapKeyClause<'i>"],["impl<'i> PartialEq for Ap<'i>"],["impl<'i> PartialEq for ApMap<'i>"],["impl<'i> PartialEq for Call<'i>"],["impl<'i> PartialEq for Canon<'i>"],["impl<'i> PartialEq for CanonMap<'i>"],["impl<'i> PartialEq for CanonStream<'i>"],["impl<'i> PartialEq for CanonStreamMap<'i>"],["impl<'i> PartialEq for CanonStreamMapScalar<'i>"],["impl<'i> PartialEq for CanonStreamMapWithLambda<'i>"],["impl<'i> PartialEq for CanonStreamWithLambda<'i>"],["impl<'i> PartialEq for FoldScalar<'i>"],["impl<'i> PartialEq for FoldStream<'i>"],["impl<'i> PartialEq for FoldStreamMap<'i>"],["impl<'i> PartialEq for Match<'i>"],["impl<'i> PartialEq for MisMatch<'i>"],["impl<'i> PartialEq for New<'i>"],["impl<'i> PartialEq for Next<'i>"],["impl<'i> PartialEq for Par<'i>"],["impl<'i> PartialEq for Scalar<'i>"],["impl<'i> PartialEq for ScalarWithLambda<'i>"],["impl<'i> PartialEq for Seq<'i>"],["impl<'i> PartialEq for Stream<'i>"],["impl<'i> PartialEq for StreamMap<'i>"],["impl<'i> PartialEq for Triplet<'i>"],["impl<'i> PartialEq for Xor<'i>"],["impl<'lens> PartialEq for InstructionErrorAST<'lens>"]], +"air_test_framework":[["impl PartialEq for ServiceDefinition"],["impl PartialEq for ServiceTagName"],["impl PartialEq for AlterState"],["impl PartialEq for PeerId"]], +"air_trace_handler":[["impl PartialEq for KeeperError"],["impl PartialEq for SubgraphType"],["impl PartialEq for ResolvedFold"],["impl PartialEq for ResolvedSubTraceDescs"]], +"avm_data_store":[["impl<'data> PartialEq for AnomalyData<'data>"]], +"avm_interface":[["impl PartialEq for RawAVMOutcome"],["impl PartialEq for AVMOutcome"],["impl PartialEq for CallRequestParams"],["impl PartialEq for CallServiceResult"],["impl PartialEq for ErrorAVMOutcome"]], +"polyplets":[["impl PartialEq for ResolvedTriplet"]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/trait.impl/core/cmp/trait.PartialOrd.js b/trait.impl/core/cmp/trait.PartialOrd.js new file mode 100644 index 00000000..bbf525ad --- /dev/null +++ b/trait.impl/core/cmp/trait.PartialOrd.js @@ -0,0 +1,5 @@ +(function() {var implementors = { +"air":[["impl PartialOrd for LogKey"]], +"air_interpreter_data":[["impl PartialOrd for GenerationIdx"],["impl PartialOrd for TracePos"],["impl PartialOrd<usize> for GenerationIdx"]], +"air_parser":[["impl PartialOrd for Span"],["impl PartialOrd for AirPos"]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/trait.impl/core/convert/trait.AsRef.js b/trait.impl/core/convert/trait.AsRef.js new file mode 100644 index 00000000..0cef6c9d --- /dev/null +++ b/trait.impl/core/convert/trait.AsRef.js @@ -0,0 +1,4 @@ +(function() {var implementors = { +"air_interpreter_cid":[["impl<T: ?Sized> AsRef<str> for CID<T>"]], +"air_test_framework":[["impl AsRef<str> for ServiceTagName"]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/trait.impl/core/convert/trait.From.js b/trait.impl/core/convert/trait.From.js new file mode 100644 index 00000000..479e8a14 --- /dev/null +++ b/trait.impl/core/convert/trait.From.js @@ -0,0 +1,17 @@ +(function() {var implementors = { +"air":[["impl From<ModeArgs> for Option<Mode>"],["impl From<TestInitParameters> for AVMRuntimeLimits"],["impl From<TestInitParameters> for AquaVMRuntimeLimits"],["impl From<ModeArgs> for Option<Mode>"]], +"air_beautifier":[["impl From<Error> for BeautifyError"]], +"air_interpreter_cid":[["impl From<Error> for CidCalculationError"],["impl From<Error> for CidVerificationError"],["impl From<Error> for CidVerificationError"]], +"air_interpreter_data":[["impl From<CidVerificationError> for CidStoreVerificationError"],["impl From<JValue> for RawValue"],["impl From<u32> for TracePos"],["impl From<usize> for GenerationIdx"],["impl From<GenerationIdx> for usize"],["impl From<TracePos> for usize"],["impl From<TracePos> for PosType"],["impl From<Vec<ExecutedState>> for ExecutionTrace"],["impl<Val> From<CidTracker<Val>> for CidStore<Val>"]], +"air_interpreter_interface":[["impl From<SerializedCallArguments> for Vec<u8>"],["impl From<SerializedCallRequests> for Vec<u8>"],["impl From<SerializedCallResults> for Vec<u8>"],["impl From<SerializedTetraplets> for Vec<u8>"],["impl From<Vec<u8>> for SerializedCallArguments"],["impl From<Vec<u8>> for SerializedCallRequests"],["impl From<Vec<u8>> for SerializedCallResults"],["impl From<Vec<u8>> for SerializedTetraplets"]], +"air_interpreter_sede":[["impl<FormatError> From<Error> for EncodeError<FormatError>"],["impl<FormatError> From<Error> for DecodeError<FormatError>"]], +"air_interpreter_signatures":[["impl From<KeyPair> for KeyPair"],["impl From<DecodingError> for KeyError"],["impl From<Signature> for Signature"],["impl From<VerificationError> for VerificationError"]], +"air_interpreter_value":[["impl From<&Value> for JValue"],["impl From<&str> for JValue"],["impl From<Value> for JValue"],["impl From<bool> for JValue"],["impl From<f32> for JValue"],["impl From<f64> for JValue"],["impl From<i16> for JValue"],["impl From<i32> for JValue"],["impl From<i64> for JValue"],["impl From<i8> for JValue"],["impl From<isize> for JValue"],["impl From<u16> for JValue"],["impl From<u32> for JValue"],["impl From<u64> for JValue"],["impl From<u8> for JValue"],["impl From<()> for JValue"],["impl From<usize> for JValue"],["impl From<BTreeMap<Rc<str>, JValue>> for JValue"],["impl From<Rc<str>> for JValue"],["impl From<String> for JValue"],["impl From<Number> for JValue"],["impl<'a> From<Cow<'a, str>> for JValue"],["impl<K: Into<JsonString>, V: Into<JValue>> From<HashMap<K, V>> for JValue"],["impl<T> From<Option<T>> for JValue
where\n T: Into<JValue>,
"],["impl<T: Clone + Into<JValue>> From<&[T]> for JValue"],["impl<T: Into<JValue>> From<Vec<T>> for JValue"]], +"air_lambda_parser":[["impl<'input> From<LexerError> for LambdaParserError<'input>"],["impl<'input> From<Vec<ErrorRecovery<usize, Token<'input>, LexerError>>> for LambdaParserError<'input>"],["impl<'input> From<ParseError<usize, Token<'input>, LexerError>> for LambdaParserError<'input>"]], +"air_parser":[["impl From<&Number> for Value"],["impl From<&Number> for JValue"],["impl From<Number> for Value"],["impl From<usize> for AirPos"],["impl From<AirPos> for usize"],["impl From<Range<AirPos>> for Span"]], +"air_test_framework":[["impl From<&str> for PeerId"],["impl From<&PeerId> for PeerId"],["impl From<ServiceDefinition> for ServiceTagName"],["impl From<String> for PeerId"],["impl<'_enum> From<&'_enum ServiceDefinition> for ServiceTagName"]], +"air_test_utils":[["impl From<TestInitParameters> for AVMRuntimeLimits"],["impl From<TestInitParameters> for AquaVMRuntimeLimits"]], +"air_trace_handler":[["impl From<KeeperError> for StateFSMError"],["impl From<KeeperError> for TraceHandlerError"],["impl From<KeeperError> for MergeError"],["impl From<StateFSMError> for TraceHandlerError"],["impl From<ApResultError> for MergeError"],["impl From<CallResultError> for MergeError"],["impl From<CanonResultError> for MergeError"],["impl From<FoldResultError> for MergeError"],["impl From<MergeError> for TraceHandlerError"],["impl From<PreparationScheme> for ValueSource"]], +"avm_server":[["impl From<CallSeDeErrors> for RunnerError"],["impl From<AVMRuntimeLimits> for AquaVMRuntimeLimits"],["impl From<MarineError> for RunnerError"],["impl<E> From<E> for AVMError<E>"]], +"polyplets":[["impl From<ResolvedTriplet> for SecurityTetraplet"]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/trait.impl/core/convert/trait.TryFrom.js b/trait.impl/core/convert/trait.TryFrom.js new file mode 100644 index 00000000..1074183a --- /dev/null +++ b/trait.impl/core/convert/trait.TryFrom.js @@ -0,0 +1,6 @@ +(function() {var implementors = { +"air_interpreter_cid":[["impl<T: ?Sized> TryFrom<&CID<T>> for Cid"]], +"air_interpreter_data":[["impl TryFrom<usize> for TracePos"]], +"air_interpreter_signatures":[["impl TryFrom<KeyPair> for KeyPair"]], +"air_test_framework":[["impl TryFrom<&str> for ServiceTagName"]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/trait.impl/core/default/trait.Default.js b/trait.impl/core/default/trait.Default.js new file mode 100644 index 00000000..127dfeea --- /dev/null +++ b/trait.impl/core/default/trait.Default.js @@ -0,0 +1,15 @@ +(function() {var implementors = { +"air":[["impl Default for TestInitParameters"],["impl Default for StatsReport"]], +"air_execution_info_collector":[["impl Default for ApTracker"],["impl Default for CallTracker"],["impl Default for FoldTracker"],["impl Default for InstructionTracker"],["impl Default for NewTracker"],["impl Default for ParTracker"]], +"air_interpreter_data":[["impl Default for ApResult"],["impl Default for CidInfo"],["impl Default for ExecutionTrace"],["impl Default for FoldResult"],["impl Default for FoldSubTraceLore"],["impl Default for GenerationIdx"],["impl Default for InterpreterData"],["impl Default for InterpreterDataEnvelopeRepr"],["impl Default for ParResult"],["impl Default for SubTraceDesc"],["impl Default for TracePos"],["impl<Val> Default for CidStore<Val>"],["impl<Val> Default for CidTracker<Val>"]], +"air_interpreter_interface":[["impl Default for CallArgumentsRepr"],["impl Default for CallRequestsRepr"],["impl Default for CallResultsRepr"],["impl Default for CallServiceResult"],["impl Default for SerializedCallArguments"],["impl Default for SerializedCallRequests"],["impl Default for SerializedCallResults"],["impl Default for SerializedTetraplets"],["impl Default for SoftLimitsTriggering"],["impl Default for TetrapletsRepr"]], +"air_interpreter_sede":[["impl Default for RmpSerdeFormat"],["impl Default for RmpSerdeMultiformat"]], +"air_interpreter_signatures":[["impl<Key: Hash + Eq, Sign> Default for SignatureStore<Key, Sign>"]], +"air_interpreter_value":[["impl Default for JValue"]], +"air_parser":[["impl Default for AirPos"],["impl<'i> Default for VariableValidator<'i>"]], +"air_test_utils":[["impl Default for TestInitParameters"],["impl Default for TestRunParameters"]], +"air_trace_handler":[["impl Default for MergerFoldResult"],["impl Default for MergerParResult"],["impl Default for ResolvedFold"],["impl Default for TraceHandler"]], +"avm_interface":[["impl Default for CallServiceResult"]], +"avm_server":[["impl Default for AVMRuntimeLimits"]], +"polyplets":[["impl Default for ResolvedTriplet"]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/trait.impl/core/error/trait.Error.js b/trait.impl/core/error/trait.Error.js new file mode 100644 index 00000000..9b9d73f3 --- /dev/null +++ b/trait.impl/core/error/trait.Error.js @@ -0,0 +1,12 @@ +(function() {var implementors = { +"air":[["impl Error for CanonStreamMapError"],["impl Error for CatchableError"],["impl Error for ErrorObjectError"],["impl Error for ExecutionError"],["impl Error for FarewellError"],["impl Error for LambdaError"],["impl Error for PreparationError"],["impl Error for StreamMapError"],["impl Error for StreamMapKeyError"],["impl Error for UncatchableError"]], +"air_beautifier":[["impl Error for BeautifyError"]], +"air_interpreter_cid":[["impl Error for CidCalculationError"],["impl Error for CidVerificationError"]], +"air_interpreter_data":[["impl Error for CidStoreVerificationError"],["impl Error for DataDeserializationError"],["impl Error for DataVerifierError"]], +"air_interpreter_sede":[["impl<FormatError> Error for DecodeError<FormatError>
where\n FormatError: Error,\n Self: Debug + Display,
"],["impl<FormatError> Error for EncodeError<FormatError>
where\n FormatError: Error,\n Self: Debug + Display,
"]], +"air_interpreter_signatures":[["impl Error for KeyError"],["impl Error for VerificationError"]], +"air_lambda_parser":[["impl Error for LexerError"],["impl<'input> Error for LambdaParserError<'input>"]], +"air_trace_handler":[["impl Error for GenerationCompactificationError"],["impl Error for IntConversionError"],["impl Error for KeeperError"],["impl Error for StateFSMError"],["impl Error for TraceHandlerError"],["impl Error for ApResultError"],["impl Error for CallResultError"],["impl Error for CanonResultError"],["impl Error for FoldResultError"],["impl Error for MergeError"]], +"avm_interface":[["impl Error for CallSeDeErrors"]], +"avm_server":[["impl Error for RunnerError"],["impl<E> Error for AVMError<E>
where\n E: Error,\n Self: Debug + Display,
"]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/trait.impl/core/fmt/trait.Debug.js b/trait.impl/core/fmt/trait.Debug.js new file mode 100644 index 00000000..3b2dd300 --- /dev/null +++ b/trait.impl/core/fmt/trait.Debug.js @@ -0,0 +1,21 @@ +(function() {var implementors = { +"air":[["impl Debug for Source"],["impl Debug for Message"],["impl Debug for ModeArgs"],["impl Debug for AnomalyDataArgs"],["impl Debug for PlainDataArgs"],["impl Debug for TestInitParameters"],["impl Debug for Args"],["impl Debug for Keys"],["impl Debug for ModeArgs"],["impl Debug for CloseMessage"],["impl Debug for Span"]], +"air_beautifier":[["impl Debug for BeautifyError"]], +"air_execution_info_collector":[["impl Debug for ApTracker"],["impl Debug for CallTracker"],["impl Debug for FoldTracker"],["impl Debug for InstructionTracker"],["impl Debug for NewTracker"],["impl Debug for ParTracker"]], +"air_interpreter_cid":[["impl Debug for CidCalculationError"],["impl Debug for CidVerificationError"],["impl<T: ?Sized> Debug for CID<T>"]], +"air_interpreter_data":[["impl Debug for CallResult"],["impl Debug for CanonResult"],["impl Debug for CidStoreVerificationError"],["impl Debug for DataDeserializationError"],["impl Debug for ExecutedState"],["impl Debug for Provenance"],["impl Debug for Sender"],["impl Debug for ValueRef"],["impl Debug for DataVerifierError"],["impl Debug for ApResult"],["impl Debug for CallServiceFailed"],["impl Debug for CanonCidAggregate"],["impl Debug for CanonResultCidAggregate"],["impl Debug for CidInfo"],["impl Debug for ExecutionTrace"],["impl Debug for FoldResult"],["impl Debug for FoldSubTraceLore"],["impl Debug for GenerationIdx"],["impl Debug for InterpreterData"],["impl Debug for InterpreterDataEnvelopeRepr"],["impl Debug for ParResult"],["impl Debug for RawValue"],["impl Debug for ServiceResultCidAggregate"],["impl Debug for SubTraceDesc"],["impl Debug for TracePos"],["impl Debug for Versions"],["impl<'a> Debug for InterpreterDataEnvelope<'a>"],["impl<Val: Debug> Debug for CidStore<Val>"],["impl<Val: Debug> Debug for CidTracker<Val>"]], +"air_interpreter_interface":[["impl Debug for CallRequestParams"],["impl Debug for CallServiceResult"],["impl Debug for InterpreterOutcome"],["impl Debug for RunParameters"],["impl Debug for SerializedCallArguments"],["impl Debug for SerializedCallRequests"],["impl Debug for SerializedCallResults"],["impl Debug for SerializedTetraplets"],["impl Debug for SoftLimitsTriggering"]], +"air_interpreter_sede":[["impl<FormatError: Debug> Debug for DecodeError<FormatError>"],["impl<FormatError: Debug> Debug for EncodeError<FormatError>"]], +"air_interpreter_signatures":[["impl Debug for KeyError"],["impl Debug for VerificationError"],["impl Debug for PeerCidTracker"],["impl Debug for PublicKey"],["impl Debug for Signature"],["impl<Key: Debug + Hash + Eq, Sign: Debug> Debug for SignatureStore<Key, Sign>"]], +"air_interpreter_value":[["impl Debug for JValue"]], +"air_lambda_ast":[["impl Debug for Functor"],["impl<'input> Debug for LambdaAST<'input>"],["impl<'input> Debug for ValueAccessor<'input>"]], +"air_lambda_parser":[["impl Debug for LexerError"],["impl<'input> Debug for LambdaParserError<'input>"]], +"air_parser":[["impl Debug for Number"],["impl Debug for Never"],["impl Debug for Null"],["impl Debug for Span"],["impl Debug for AirPos"],["impl<'i> Debug for ApArgument<'i>"],["impl<'i> Debug for ApResult<'i>"],["impl<'i> Debug for CallOutputValue<'i>"],["impl<'i> Debug for Fail<'i>"],["impl<'i> Debug for FoldScalarIterable<'i>"],["impl<'i> Debug for ImmutableValue<'i>"],["impl<'i> Debug for ImmutableVariable<'i>"],["impl<'i> Debug for ImmutableVariableWithLambda<'i>"],["impl<'i> Debug for Instruction<'i>"],["impl<'i> Debug for NewArgument<'i>"],["impl<'i> Debug for ResolvableToPeerIdVariable<'i>"],["impl<'i> Debug for ResolvableToStringVariable<'i>"],["impl<'i> Debug for StreamMapKeyClause<'i>"],["impl<'i> Debug for Ap<'i>"],["impl<'i> Debug for ApMap<'i>"],["impl<'i> Debug for Call<'i>"],["impl<'i> Debug for Canon<'i>"],["impl<'i> Debug for CanonMap<'i>"],["impl<'i> Debug for CanonStream<'i>"],["impl<'i> Debug for CanonStreamMap<'i>"],["impl<'i> Debug for CanonStreamMapScalar<'i>"],["impl<'i> Debug for CanonStreamMapWithLambda<'i>"],["impl<'i> Debug for CanonStreamWithLambda<'i>"],["impl<'i> Debug for FoldScalar<'i>"],["impl<'i> Debug for FoldStream<'i>"],["impl<'i> Debug for FoldStreamMap<'i>"],["impl<'i> Debug for Match<'i>"],["impl<'i> Debug for MisMatch<'i>"],["impl<'i> Debug for New<'i>"],["impl<'i> Debug for Next<'i>"],["impl<'i> Debug for Par<'i>"],["impl<'i> Debug for Scalar<'i>"],["impl<'i> Debug for ScalarWithLambda<'i>"],["impl<'i> Debug for Seq<'i>"],["impl<'i> Debug for Stream<'i>"],["impl<'i> Debug for StreamMap<'i>"],["impl<'i> Debug for Triplet<'i>"],["impl<'i> Debug for Xor<'i>"],["impl<'i> Debug for VariableValidator<'i>"],["impl<'lens> Debug for InstructionErrorAST<'lens>"]], +"air_test_framework":[["impl Debug for ServiceDefinition"],["impl Debug for ServiceTagName"],["impl Debug for AlterState"],["impl Debug for FunctionOutcome"],["impl Debug for PeerId"],["impl<R: AirRunner> Debug for Peer<R>"]], +"air_test_utils":[["impl Debug for CanonResultAlike"],["impl Debug for ValueAggregateAlike"],["impl Debug for TestInitParameters"],["impl Debug for TestRunParameters"]], +"air_trace_handler":[["impl Debug for GenerationCompactificationError"],["impl Debug for IntConversionError"],["impl Debug for KeeperError"],["impl Debug for StateFSMError"],["impl Debug for SubgraphType"],["impl Debug for TraceHandlerError"],["impl Debug for ApResultError"],["impl Debug for CallResultError"],["impl Debug for CanonResultError"],["impl Debug for DataType"],["impl Debug for FoldResultError"],["impl Debug for MergeCtxType"],["impl Debug for MergeError"],["impl Debug for MergerApResult"],["impl Debug for MergerCallResult"],["impl Debug for MergerCanonResult"],["impl Debug for PreparationScheme"],["impl Debug for ValueSource"],["impl Debug for MergerFoldResult"],["impl Debug for MergerParResult"],["impl Debug for MetApResult"],["impl Debug for MetCallResult"],["impl Debug for ResolvedFold"],["impl Debug for ResolvedSubTraceDescs"],["impl Debug for TraceHandler"]], +"avm_data_store":[["impl<'data> Debug for AnomalyData<'data>"]], +"avm_interface":[["impl Debug for CallSeDeErrors"],["impl Debug for RawAVMOutcome"],["impl Debug for AVMOutcome"],["impl Debug for CallRequestParams"],["impl Debug for CallServiceResult"],["impl Debug for ErrorAVMOutcome"],["impl<'ctx> Debug for ParticleParameters<'ctx>"]], +"avm_server":[["impl Debug for RunnerError"],["impl Debug for AquaVMRuntimeLimits"],["impl<E: Debug> Debug for AVMError<E>"]], +"polyplets":[["impl Debug for ResolvedTriplet"]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/trait.impl/core/fmt/trait.Display.js b/trait.impl/core/fmt/trait.Display.js new file mode 100644 index 00000000..05700e57 --- /dev/null +++ b/trait.impl/core/fmt/trait.Display.js @@ -0,0 +1,16 @@ +(function() {var implementors = { +"air":[["impl Display for Message"],["impl Display for CloseMessage"],["impl Display for Span"]], +"air_beautifier":[["impl Display for BeautifyError"]], +"air_interpreter_cid":[["impl Display for CidCalculationError"],["impl Display for CidVerificationError"]], +"air_interpreter_data":[["impl Display for CidStoreVerificationError"],["impl Display for DataDeserializationError"],["impl Display for ExecutedState"],["impl Display for Sender"],["impl Display for ValueRef"],["impl Display for DataVerifierError"],["impl Display for GenerationIdx"],["impl Display for TracePos"]], +"air_interpreter_interface":[["impl Display for CallServiceResult"]], +"air_interpreter_sede":[["impl<FormatError> Display for DecodeError<FormatError>
where\n FormatError: Display,
"],["impl<FormatError> Display for EncodeError<FormatError>
where\n FormatError: Display,
"]], +"air_interpreter_signatures":[["impl Display for KeyError"],["impl Display for VerificationError"]], +"air_interpreter_value":[["impl Display for JValue"]], +"air_lambda_ast":[["impl Display for Functor"],["impl Display for LambdaAST<'_>"],["impl Display for ValueAccessor<'_>"]], +"air_lambda_parser":[["impl Display for LexerError"],["impl<'input> Display for LambdaParserError<'input>"]], +"air_parser":[["impl Display for ApArgument<'_>"],["impl Display for ApResult<'_>"],["impl Display for CallOutputValue<'_>"],["impl Display for Fail<'_>"],["impl Display for FoldScalarIterable<'_>"],["impl Display for ImmutableValue<'_>"],["impl Display for ImmutableVariable<'_>"],["impl Display for ImmutableVariableWithLambda<'_>"],["impl Display for Instruction<'_>"],["impl Display for NewArgument<'_>"],["impl Display for Number"],["impl Display for ResolvableToPeerIdVariable<'_>"],["impl Display for ResolvableToStringVariable<'_>"],["impl Display for StreamMapKeyClause<'_>"],["impl Display for Ap<'_>"],["impl Display for ApMap<'_>"],["impl Display for Call<'_>"],["impl Display for Canon<'_>"],["impl Display for CanonMap<'_>"],["impl Display for CanonStream<'_>"],["impl Display for CanonStreamMap<'_>"],["impl Display for CanonStreamMapScalar<'_>"],["impl Display for CanonStreamMapWithLambda<'_>"],["impl Display for CanonStreamWithLambda<'_>"],["impl Display for FoldScalar<'_>"],["impl Display for FoldStream<'_>"],["impl Display for FoldStreamMap<'_>"],["impl Display for Match<'_>"],["impl Display for MisMatch<'_>"],["impl Display for Never"],["impl Display for New<'_>"],["impl Display for Next<'_>"],["impl Display for Null"],["impl Display for Par<'_>"],["impl Display for Scalar<'_>"],["impl Display for ScalarWithLambda<'_>"],["impl Display for Seq<'_>"],["impl Display for Stream<'_>"],["impl Display for StreamMap<'_>"],["impl Display for Triplet<'_>"],["impl Display for Xor<'_>"],["impl Display for AirPos"]], +"air_trace_handler":[["impl Display for GenerationCompactificationError"],["impl Display for IntConversionError"],["impl Display for KeeperError"],["impl Display for StateFSMError"],["impl Display for SubgraphType"],["impl Display for TraceHandlerError"],["impl Display for ApResultError"],["impl Display for CallResultError"],["impl Display for CanonResultError"],["impl Display for DataType"],["impl Display for FoldResultError"],["impl Display for MergeCtxType"],["impl Display for MergeError"]], +"avm_interface":[["impl Display for CallSeDeErrors"],["impl Display for CallServiceResult"]], +"avm_server":[["impl Display for RunnerError"],["impl<E> Display for AVMError<E>
where\n E: Display,
"]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/trait.impl/core/hash/trait.Hash.js b/trait.impl/core/hash/trait.Hash.js new file mode 100644 index 00000000..6ab3f4b7 --- /dev/null +++ b/trait.impl/core/hash/trait.Hash.js @@ -0,0 +1,10 @@ +(function() {var implementors = { +"air":[["impl Hash for LogKey"]], +"air_interpreter_cid":[["impl<Val> Hash for CID<Val>"]], +"air_interpreter_data":[["impl Hash for GenerationIdx"],["impl Hash for TracePos"]], +"air_interpreter_interface":[["impl Hash for SerializedCallArguments"],["impl Hash for SerializedCallRequests"],["impl Hash for SerializedCallResults"],["impl Hash for SerializedTetraplets"]], +"air_interpreter_signatures":[["impl Hash for ArchivedPublicKey
where\n Box<[u8]>: Archive,
"],["impl Hash for PublicKey"]], +"air_parser":[["impl Hash for Span"],["impl Hash for AirPos"]], +"air_test_framework":[["impl Hash for PeerId"]], +"polyplets":[["impl Hash for ResolvedTriplet"]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/trait.impl/core/iter/traits/collect/trait.FromIterator.js b/trait.impl/core/iter/traits/collect/trait.FromIterator.js new file mode 100644 index 00000000..e9b02454 --- /dev/null +++ b/trait.impl/core/iter/traits/collect/trait.FromIterator.js @@ -0,0 +1,3 @@ +(function() {var implementors = { +"air_interpreter_value":[["impl<K: Into<JsonString>, V: Into<JValue>> FromIterator<(K, V)> for JValue"],["impl<T: Into<JValue>> FromIterator<T> for JValue"]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/trait.impl/core/iter/traits/collect/trait.IntoIterator.js b/trait.impl/core/iter/traits/collect/trait.IntoIterator.js new file mode 100644 index 00000000..d57794cb --- /dev/null +++ b/trait.impl/core/iter/traits/collect/trait.IntoIterator.js @@ -0,0 +1,4 @@ +(function() {var implementors = { +"air_interpreter_data":[["impl<'trace> IntoIterator for &'trace ExecutionTrace"],["impl<Val> IntoIterator for CidStore<Val>"]], +"air_test_framework":[["impl<'a, R: AirRunner> IntoIterator for &'a PeerEnv<R>"],["impl<R: AirRunner> IntoIterator for &Neighborhood<R>"]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/trait.impl/core/iter/traits/iterator/trait.Iterator.js b/trait.impl/core/iter/traits/iterator/trait.Iterator.js new file mode 100644 index 00000000..50ef09fb --- /dev/null +++ b/trait.impl/core/iter/traits/iterator/trait.Iterator.js @@ -0,0 +1,4 @@ +(function() {var implementors = { +"air_lambda_parser":[["impl<'input> Iterator for LambdaASTLexer<'input>"]], +"air_parser":[["impl<'input> Iterator for AIRLexer<'input>"]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/trait.impl/core/marker/trait.Copy.js b/trait.impl/core/marker/trait.Copy.js new file mode 100644 index 00000000..8708ac4c --- /dev/null +++ b/trait.impl/core/marker/trait.Copy.js @@ -0,0 +1,12 @@ +(function() {var implementors = { +"air":[["impl Copy for ModeArgs"],["impl Copy for ModeArgs"]], +"air_interpreter_data":[["impl Copy for GenerationIdx"],["impl Copy for ParResult"],["impl Copy for SubTraceDesc"],["impl Copy for TracePos"]], +"air_interpreter_interface":[["impl Copy for SoftLimitsTriggering"]], +"air_interpreter_sede":[["impl Copy for RmpSerdeFormat"],["impl Copy for RmpSerdeMultiformat"]], +"air_lambda_ast":[["impl Copy for Functor"],["impl<'input> Copy for ValueAccessor<'input>"]], +"air_parser":[["impl Copy for Span"],["impl Copy for AirPos"]], +"air_test_framework":[["impl Copy for ServiceTagName"],["impl Copy for AlterState"]], +"air_test_utils":[["impl Copy for TestInitParameters"]], +"air_trace_handler":[["impl Copy for SubgraphType"],["impl Copy for DataType"],["impl Copy for MergeCtxType"],["impl Copy for PreparationScheme"],["impl Copy for ValueSource"],["impl Copy for MergerParResult"]], +"avm_server":[["impl Copy for AquaVMRuntimeLimits"]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/trait.impl/core/marker/trait.Freeze.js b/trait.impl/core/marker/trait.Freeze.js new file mode 100644 index 00000000..f6491189 --- /dev/null +++ b/trait.impl/core/marker/trait.Freeze.js @@ -0,0 +1,21 @@ +(function() {var implementors = { +"air":[["impl !Freeze for WasmAvmRunner",1,["air::trace::run::wasm::WasmAvmRunner"]],["impl Freeze for Mode",1,["air::data::Mode"]],["impl Freeze for Subcommand",1,["air::Subcommand"]],["impl Freeze for Mode",1,["air::trace::run::Mode"]],["impl Freeze for Source",1,["air::trace::run::Source"]],["impl Freeze for Message",1,["air::trace::stats::log_data::Message"]],["impl Freeze for Args",1,["air::beautify::Args"]],["impl Freeze for Args",1,["air::data::Args"]],["impl Freeze for ModeArgs",1,["air::data::ModeArgs"]],["impl Freeze for Cli",1,["air::Cli"]],["impl Freeze for AnomalyDataArgs",1,["air::trace::run::data::anomaly::AnomalyDataArgs"]],["impl Freeze for PlainDataArgs",1,["air::trace::run::data::plain::PlainDataArgs"]],["impl Freeze for NativeAvmRunner",1,["air::trace::run::native::NativeAvmRunner"]],["impl Freeze for TestInitParameters",1,["air::trace::run::runner::TestInitParameters"]],["impl Freeze for Args",1,["air::trace::run::Args"]],["impl Freeze for Keys",1,["air::trace::run::Keys"]],["impl Freeze for ModeArgs",1,["air::trace::run::ModeArgs"]],["impl Freeze for CloseMessage",1,["air::trace::stats::log_data::CloseMessage"]],["impl Freeze for LogKey",1,["air::trace::stats::log_data::LogKey"]],["impl Freeze for LogRecord",1,["air::trace::stats::log_data::LogRecord"]],["impl Freeze for LogValue",1,["air::trace::stats::log_data::LogValue"]],["impl Freeze for Span",1,["air::trace::stats::log_data::Span"]],["impl Freeze for StatsReport",1,["air::trace::stats::report::StatsReport"]],["impl Freeze for Args",1,["air::trace::stats::Args"]],["impl<'ctx> Freeze for ExecutionData<'ctx>",1,["air::trace::run::data::ExecutionData"]]], +"air_beautifier":[["impl Freeze for BeautifyError",1,["air_beautifier::beautifier::BeautifyError"]],["impl<W> Freeze for Beautifier<W>
where\n W: Freeze,
",1,["air_beautifier::beautifier::Beautifier"]]], +"air_execution_info_collector":[["impl Freeze for ApTracker",1,["air_execution_info_collector::instructions_tracker::ApTracker"]],["impl Freeze for CallTracker",1,["air_execution_info_collector::instructions_tracker::CallTracker"]],["impl Freeze for FoldTracker",1,["air_execution_info_collector::instructions_tracker::FoldTracker"]],["impl Freeze for InstructionTracker",1,["air_execution_info_collector::instructions_tracker::InstructionTracker"]],["impl Freeze for NewTracker",1,["air_execution_info_collector::instructions_tracker::NewTracker"]],["impl Freeze for ParTracker",1,["air_execution_info_collector::instructions_tracker::ParTracker"]]], +"air_interpreter_cid":[["impl Freeze for CidCalculationError",1,["air_interpreter_cid::CidCalculationError"]],["impl Freeze for CidVerificationError",1,["air_interpreter_cid::verify::CidVerificationError"]],["impl<T> !Freeze for ArchivedCID<T>",1,["air_interpreter_cid::ArchivedCID"]],["impl<T> !Freeze for CIDResolver<T>",1,["air_interpreter_cid::CIDResolver"]],["impl<T> Freeze for CID<T>
where\n T: ?Sized,
",1,["air_interpreter_cid::CID"]]], +"air_interpreter_data":[["impl !Freeze for RawValue",1,["air_interpreter_data::raw_value::RawValue"]],["impl Freeze for ArchivedCallResult",1,["air_interpreter_data::executed_state::ArchivedCallResult"]],["impl Freeze for ArchivedCanonResult",1,["air_interpreter_data::executed_state::ArchivedCanonResult"]],["impl Freeze for ArchivedExecutedState",1,["air_interpreter_data::executed_state::ArchivedExecutedState"]],["impl Freeze for ArchivedProvenance",1,["air_interpreter_data::executed_state::ArchivedProvenance"]],["impl Freeze for ArchivedSender",1,["air_interpreter_data::executed_state::ArchivedSender"]],["impl Freeze for ArchivedValueRef",1,["air_interpreter_data::executed_state::ArchivedValueRef"]],["impl Freeze for CallResult",1,["air_interpreter_data::executed_state::CallResult"]],["impl Freeze for CallResultResolver",1,["air_interpreter_data::executed_state::CallResultResolver"]],["impl Freeze for CanonResult",1,["air_interpreter_data::executed_state::CanonResult"]],["impl Freeze for CanonResultResolver",1,["air_interpreter_data::executed_state::CanonResultResolver"]],["impl Freeze for CidStoreVerificationError",1,["air_interpreter_data::cid_store::CidStoreVerificationError"]],["impl Freeze for DataDeserializationError",1,["air_interpreter_data::interpreter_data::DataDeserializationError"]],["impl Freeze for ExecutedState",1,["air_interpreter_data::executed_state::ExecutedState"]],["impl Freeze for ExecutedStateResolver",1,["air_interpreter_data::executed_state::ExecutedStateResolver"]],["impl Freeze for Provenance",1,["air_interpreter_data::executed_state::Provenance"]],["impl Freeze for ProvenanceResolver",1,["air_interpreter_data::executed_state::ProvenanceResolver"]],["impl Freeze for Sender",1,["air_interpreter_data::executed_state::Sender"]],["impl Freeze for SenderResolver",1,["air_interpreter_data::executed_state::SenderResolver"]],["impl Freeze for ValueRef",1,["air_interpreter_data::executed_state::ValueRef"]],["impl Freeze for ValueRefResolver",1,["air_interpreter_data::executed_state::ValueRefResolver"]],["impl Freeze for DataVerifierError",1,["air_interpreter_data::interpreter_data::errors::DataVerifierError"]],["impl Freeze for ApResult",1,["air_interpreter_data::executed_state::ApResult"]],["impl Freeze for ApResultResolver",1,["air_interpreter_data::executed_state::ApResultResolver"]],["impl Freeze for ArchivedApResult",1,["air_interpreter_data::executed_state::ArchivedApResult"]],["impl Freeze for ArchivedCallServiceFailed",1,["air_interpreter_data::executed_state::ArchivedCallServiceFailed"]],["impl Freeze for ArchivedCanonCidAggregate",1,["air_interpreter_data::executed_state::ArchivedCanonCidAggregate"]],["impl Freeze for ArchivedCanonResultCidAggregate",1,["air_interpreter_data::executed_state::ArchivedCanonResultCidAggregate"]],["impl Freeze for ArchivedCidInfo",1,["air_interpreter_data::cid_info::ArchivedCidInfo"]],["impl Freeze for ArchivedExecutionTrace",1,["air_interpreter_data::trace::ArchivedExecutionTrace"]],["impl Freeze for ArchivedFoldResult",1,["air_interpreter_data::executed_state::ArchivedFoldResult"]],["impl Freeze for ArchivedFoldSubTraceLore",1,["air_interpreter_data::executed_state::ArchivedFoldSubTraceLore"]],["impl Freeze for ArchivedGenerationIdx",1,["air_interpreter_data::generation_idx::ArchivedGenerationIdx"]],["impl Freeze for ArchivedInterpreterData",1,["air_interpreter_data::interpreter_data::ArchivedInterpreterData"]],["impl Freeze for ArchivedParResult",1,["air_interpreter_data::executed_state::ArchivedParResult"]],["impl Freeze for ArchivedRawValue",1,["air_interpreter_data::raw_value::ArchivedRawValue"]],["impl Freeze for ArchivedServiceResultCidAggregate",1,["air_interpreter_data::executed_state::ArchivedServiceResultCidAggregate"]],["impl Freeze for ArchivedSubTraceDesc",1,["air_interpreter_data::executed_state::ArchivedSubTraceDesc"]],["impl Freeze for ArchivedTracePos",1,["air_interpreter_data::trace_pos::ArchivedTracePos"]],["impl Freeze for CallServiceFailed",1,["air_interpreter_data::executed_state::CallServiceFailed"]],["impl Freeze for CallServiceFailedResolver",1,["air_interpreter_data::executed_state::CallServiceFailedResolver"]],["impl Freeze for CanonCidAggregate",1,["air_interpreter_data::executed_state::CanonCidAggregate"]],["impl Freeze for CanonCidAggregateResolver",1,["air_interpreter_data::executed_state::CanonCidAggregateResolver"]],["impl Freeze for CanonResultCidAggregate",1,["air_interpreter_data::executed_state::CanonResultCidAggregate"]],["impl Freeze for CanonResultCidAggregateResolver",1,["air_interpreter_data::executed_state::CanonResultCidAggregateResolver"]],["impl Freeze for CidInfo",1,["air_interpreter_data::cid_info::CidInfo"]],["impl Freeze for CidInfoResolver",1,["air_interpreter_data::cid_info::CidInfoResolver"]],["impl Freeze for ExecutionTrace",1,["air_interpreter_data::trace::ExecutionTrace"]],["impl Freeze for ExecutionTraceResolver",1,["air_interpreter_data::trace::ExecutionTraceResolver"]],["impl Freeze for FoldResult",1,["air_interpreter_data::executed_state::FoldResult"]],["impl Freeze for FoldResultResolver",1,["air_interpreter_data::executed_state::FoldResultResolver"]],["impl Freeze for FoldSubTraceLore",1,["air_interpreter_data::executed_state::FoldSubTraceLore"]],["impl Freeze for FoldSubTraceLoreResolver",1,["air_interpreter_data::executed_state::FoldSubTraceLoreResolver"]],["impl Freeze for GenerationIdx",1,["air_interpreter_data::generation_idx::GenerationIdx"]],["impl Freeze for GenerationIdxResolver",1,["air_interpreter_data::generation_idx::GenerationIdxResolver"]],["impl Freeze for InterpreterData",1,["air_interpreter_data::interpreter_data::InterpreterData"]],["impl Freeze for InterpreterDataEnvelopeRepr",1,["air_interpreter_data::interpreter_data::repr::InterpreterDataEnvelopeRepr"]],["impl Freeze for InterpreterDataResolver",1,["air_interpreter_data::interpreter_data::InterpreterDataResolver"]],["impl Freeze for ParResult",1,["air_interpreter_data::executed_state::ParResult"]],["impl Freeze for ParResultResolver",1,["air_interpreter_data::executed_state::ParResultResolver"]],["impl Freeze for RawValueResolver",1,["air_interpreter_data::raw_value::RawValueResolver"]],["impl Freeze for ServiceResultCidAggregate",1,["air_interpreter_data::executed_state::ServiceResultCidAggregate"]],["impl Freeze for ServiceResultCidAggregateResolver",1,["air_interpreter_data::executed_state::ServiceResultCidAggregateResolver"]],["impl Freeze for SubTraceDesc",1,["air_interpreter_data::executed_state::SubTraceDesc"]],["impl Freeze for SubTraceDescResolver",1,["air_interpreter_data::executed_state::SubTraceDescResolver"]],["impl Freeze for TracePos",1,["air_interpreter_data::trace_pos::TracePos"]],["impl Freeze for TracePosResolver",1,["air_interpreter_data::trace_pos::TracePosResolver"]],["impl Freeze for Versions",1,["air_interpreter_data::interpreter_data::Versions"]],["impl<'a> Freeze for InterpreterDataEnvelope<'a>",1,["air_interpreter_data::interpreter_data::InterpreterDataEnvelope"]],["impl<'data> Freeze for DataVerifier<'data>",1,["air_interpreter_data::interpreter_data::verification::DataVerifier"]],["impl<Val> !Freeze for ArchivedCidStore<Val>",1,["air_interpreter_data::cid_store::ArchivedCidStore"]],["impl<Val> !Freeze for CidStoreResolver<Val>",1,["air_interpreter_data::cid_store::CidStoreResolver"]],["impl<Val> Freeze for CidStore<Val>",1,["air_interpreter_data::cid_store::CidStore"]],["impl<Val> Freeze for CidTracker<Val>",1,["air_interpreter_data::cid_store::CidTracker"]]], +"air_interpreter_interface":[["impl Freeze for CallArgumentsRepr",1,["air_interpreter_interface::call_request_parameters::CallArgumentsRepr"]],["impl Freeze for CallRequestParams",1,["air_interpreter_interface::call_request_parameters::CallRequestParams"]],["impl Freeze for CallRequestsRepr",1,["air_interpreter_interface::call_request_parameters::CallRequestsRepr"]],["impl Freeze for CallResultsRepr",1,["air_interpreter_interface::call_service_result::CallResultsRepr"]],["impl Freeze for CallServiceResult",1,["air_interpreter_interface::call_service_result::CallServiceResult"]],["impl Freeze for InterpreterOutcome",1,["air_interpreter_interface::interpreter_outcome::InterpreterOutcome"]],["impl Freeze for RunParameters",1,["air_interpreter_interface::run_parameters::RunParameters"]],["impl Freeze for SerializedCallArguments",1,["air_interpreter_interface::call_request_parameters::SerializedCallArguments"]],["impl Freeze for SerializedCallRequests",1,["air_interpreter_interface::call_request_parameters::SerializedCallRequests"]],["impl Freeze for SerializedCallResults",1,["air_interpreter_interface::call_service_result::SerializedCallResults"]],["impl Freeze for SerializedTetraplets",1,["air_interpreter_interface::call_request_parameters::SerializedTetraplets"]],["impl Freeze for SoftLimitsTriggering",1,["air_interpreter_interface::interpreter_outcome::SoftLimitsTriggering"]],["impl Freeze for TetrapletsRepr",1,["air_interpreter_interface::call_request_parameters::TetrapletsRepr"]]], +"air_interpreter_sede":[["impl Freeze for RmpSerdeFormat",1,["air_interpreter_sede::rmp_serde::RmpSerdeFormat"]],["impl Freeze for RmpSerdeMultiformat",1,["air_interpreter_sede::rmp_serde::RmpSerdeMultiformat"]],["impl<FormatError> Freeze for DecodeError<FormatError>
where\n FormatError: Freeze,
",1,["air_interpreter_sede::multiformat::DecodeError"]],["impl<FormatError> Freeze for EncodeError<FormatError>
where\n FormatError: Freeze,
",1,["air_interpreter_sede::multiformat::EncodeError"]]], +"air_interpreter_signatures":[["impl Freeze for KeyError",1,["air_interpreter_signatures::KeyError"]],["impl Freeze for VerificationError",1,["air_interpreter_signatures::VerificationError"]],["impl Freeze for ArchivedPublicKey",1,["air_interpreter_signatures::ArchivedPublicKey"]],["impl Freeze for ArchivedSignature",1,["air_interpreter_signatures::ArchivedSignature"]],["impl Freeze for KeyPair",1,["air_interpreter_signatures::KeyPair"]],["impl Freeze for PeerCidTracker",1,["air_interpreter_signatures::trackers::PeerCidTracker"]],["impl Freeze for PublicKey",1,["air_interpreter_signatures::PublicKey"]],["impl Freeze for PublicKeyResolver",1,["air_interpreter_signatures::PublicKeyResolver"]],["impl Freeze for Signature",1,["air_interpreter_signatures::Signature"]],["impl Freeze for SignatureResolver",1,["air_interpreter_signatures::SignatureResolver"]],["impl<Key = PublicKey, Sign = Signature> !Freeze for ArchivedSignatureStore<Key, Sign>",1,["air_interpreter_signatures::stores::ArchivedSignatureStore"]],["impl<Key = PublicKey, Sign = Signature> !Freeze for SignatureStoreResolver<Key, Sign>",1,["air_interpreter_signatures::stores::SignatureStoreResolver"]],["impl<Key, Sign> Freeze for SignatureStore<Key, Sign>",1,["air_interpreter_signatures::stores::SignatureStore"]]], +"air_interpreter_value":[["impl Freeze for JValue",1,["air_interpreter_value::value::JValue"]]], +"air_lambda_ast":[["impl Freeze for Functor",1,["air_lambda_ast::ast::Functor"]],["impl<'input> Freeze for LambdaAST<'input>",1,["air_lambda_ast::ast::LambdaAST"]],["impl<'input> Freeze for ValueAccessor<'input>",1,["air_lambda_ast::ast::ValueAccessor"]]], +"air_lambda_parser":[["impl Freeze for LexerError",1,["air_lambda_parser::parser::lexer::errors::LexerError"]],["impl<'input> Freeze for LambdaParserError<'input>",1,["air_lambda_parser::parser::errors::LambdaParserError"]],["impl<'input> Freeze for LambdaASTLexer<'input>",1,["air_lambda_parser::parser::lexer::lambda_ast_lexer::LambdaASTLexer"]]], +"air_parser":[["impl Freeze for Number",1,["air_parser::ast::instruction_arguments::Number"]],["impl Freeze for Never",1,["air_parser::ast::instructions::Never"]],["impl Freeze for Null",1,["air_parser::ast::instructions::Null"]],["impl Freeze for Span",1,["air_parser::parser::span::Span"]],["impl Freeze for AIRParser",1,["air_parser::parser::air::__parse__AIR::AIRParser"]],["impl Freeze for AirPos",1,["air_parser::parser::lexer::text_pos::AirPos"]],["impl<'i> Freeze for ApArgument<'i>",1,["air_parser::ast::instruction_arguments::ApArgument"]],["impl<'i> Freeze for ApResult<'i>",1,["air_parser::ast::instruction_arguments::ApResult"]],["impl<'i> Freeze for CallOutputValue<'i>",1,["air_parser::ast::instruction_arguments::CallOutputValue"]],["impl<'i> Freeze for Fail<'i>",1,["air_parser::ast::instructions::Fail"]],["impl<'i> Freeze for FoldScalarIterable<'i>",1,["air_parser::ast::instruction_arguments::FoldScalarIterable"]],["impl<'i> Freeze for ImmutableValue<'i>",1,["air_parser::ast::instruction_arguments::ImmutableValue"]],["impl<'i> Freeze for ImmutableVariable<'i>",1,["air_parser::ast::values::ImmutableVariable"]],["impl<'i> Freeze for ImmutableVariableWithLambda<'i>",1,["air_parser::ast::values::ImmutableVariableWithLambda"]],["impl<'i> Freeze for Instruction<'i>",1,["air_parser::ast::instructions::Instruction"]],["impl<'i> Freeze for NewArgument<'i>",1,["air_parser::ast::instruction_arguments::NewArgument"]],["impl<'i> Freeze for ResolvableToPeerIdVariable<'i>",1,["air_parser::ast::instruction_arguments::ResolvableToPeerIdVariable"]],["impl<'i> Freeze for ResolvableToStringVariable<'i>",1,["air_parser::ast::instruction_arguments::ResolvableToStringVariable"]],["impl<'i> Freeze for StreamMapKeyClause<'i>",1,["air_parser::ast::instruction_arguments::StreamMapKeyClause"]],["impl<'i> Freeze for Ap<'i>",1,["air_parser::ast::instructions::Ap"]],["impl<'i> Freeze for ApMap<'i>",1,["air_parser::ast::instructions::ApMap"]],["impl<'i> Freeze for Call<'i>",1,["air_parser::ast::instructions::Call"]],["impl<'i> Freeze for Canon<'i>",1,["air_parser::ast::instructions::Canon"]],["impl<'i> Freeze for CanonMap<'i>",1,["air_parser::ast::instructions::CanonMap"]],["impl<'i> Freeze for CanonStream<'i>",1,["air_parser::ast::values::CanonStream"]],["impl<'i> Freeze for CanonStreamMap<'i>",1,["air_parser::ast::values::CanonStreamMap"]],["impl<'i> Freeze for CanonStreamMapScalar<'i>",1,["air_parser::ast::instructions::CanonStreamMapScalar"]],["impl<'i> Freeze for CanonStreamMapWithLambda<'i>",1,["air_parser::ast::values::CanonStreamMapWithLambda"]],["impl<'i> Freeze for CanonStreamWithLambda<'i>",1,["air_parser::ast::values::CanonStreamWithLambda"]],["impl<'i> Freeze for FoldScalar<'i>",1,["air_parser::ast::instructions::FoldScalar"]],["impl<'i> Freeze for FoldStream<'i>",1,["air_parser::ast::instructions::FoldStream"]],["impl<'i> Freeze for FoldStreamMap<'i>",1,["air_parser::ast::instructions::FoldStreamMap"]],["impl<'i> Freeze for Match<'i>",1,["air_parser::ast::instructions::Match"]],["impl<'i> Freeze for MisMatch<'i>",1,["air_parser::ast::instructions::MisMatch"]],["impl<'i> Freeze for New<'i>",1,["air_parser::ast::instructions::New"]],["impl<'i> Freeze for Next<'i>",1,["air_parser::ast::instructions::Next"]],["impl<'i> Freeze for Par<'i>",1,["air_parser::ast::instructions::Par"]],["impl<'i> Freeze for Scalar<'i>",1,["air_parser::ast::values::Scalar"]],["impl<'i> Freeze for ScalarWithLambda<'i>",1,["air_parser::ast::values::ScalarWithLambda"]],["impl<'i> Freeze for Seq<'i>",1,["air_parser::ast::instructions::Seq"]],["impl<'i> Freeze for Stream<'i>",1,["air_parser::ast::values::Stream"]],["impl<'i> Freeze for StreamMap<'i>",1,["air_parser::ast::values::StreamMap"]],["impl<'i> Freeze for Triplet<'i>",1,["air_parser::ast::instruction_arguments::Triplet"]],["impl<'i> Freeze for Xor<'i>",1,["air_parser::ast::instructions::Xor"]],["impl<'i> Freeze for VariableValidator<'i>",1,["air_parser::parser::validator::VariableValidator"]],["impl<'input> Freeze for AIRLexer<'input>",1,["air_parser::parser::lexer::air_lexer::AIRLexer"]],["impl<'lens> Freeze for InstructionErrorAST<'lens>",1,["air_parser::ast::values::InstructionErrorAST"]]], +"air_test_framework":[["impl !Freeze for ServiceDefinition",1,["air_test_framework::asserts::ServiceDefinition"]],["impl Freeze for ServiceTagName",1,["air_test_framework::asserts::ServiceTagName"]],["impl Freeze for AlterState",1,["air_test_framework::ephemeral::neighborhood::AlterState"]],["impl Freeze for FunctionOutcome",1,["air_test_framework::services::FunctionOutcome"]],["impl Freeze for PeerId",1,["air_test_framework::ephemeral::PeerId"]],["impl Freeze for MarineServiceHandle",1,["air_test_framework::services::MarineServiceHandle"]],["impl<R = WasmAirRunner> !Freeze for Network<R>",1,["air_test_framework::ephemeral::Network"]],["impl<R> Freeze for Neighborhood<R>",1,["air_test_framework::ephemeral::neighborhood::Neighborhood"]],["impl<R> Freeze for PeerEnv<R>
where\n R: Freeze,
",1,["air_test_framework::ephemeral::neighborhood::PeerEnv"]],["impl<R> Freeze for Peer<R>
where\n R: Freeze,
",1,["air_test_framework::ephemeral::Peer"]],["impl<R> Freeze for AirScriptExecutor<R>",1,["air_test_framework::execution::AirScriptExecutor"]],["impl<R> Freeze for TransformedAirScript<R>",1,["air_test_framework::transform::walker::TransformedAirScript"]]], +"air_test_utils":[["impl !Freeze for ReleaseWasmAirRunner",1,["air_test_utils::wasm_test_runner::ReleaseWasmAirRunner"]],["impl !Freeze for WasmAirRunner",1,["air_test_utils::wasm_test_runner::WasmAirRunner"]],["impl Freeze for VariableOptionSource",1,["air_test_utils::call_services::VariableOptionSource"]],["impl Freeze for CanonResultAlike",1,["air_test_utils::executed_state::CanonResultAlike"]],["impl Freeze for ExecutedCallBuilder",1,["air_test_utils::executed_state::ExecutedCallBuilder"]],["impl Freeze for ValueAggregateAlike",1,["air_test_utils::executed_state::ValueAggregateAlike"]],["impl Freeze for NativeAirRunner",1,["air_test_utils::native_test_runner::NativeAirRunner"]],["impl Freeze for TestInitParameters",1,["air_test_utils::test_runner::TestInitParameters"]],["impl Freeze for TestRunParameters",1,["air_test_utils::test_runner::TestRunParameters"]],["impl<R> Freeze for TestRunner<R>
where\n R: Freeze,
",1,["air_test_utils::test_runner::TestRunner"]]], +"air_trace_handler":[["impl Freeze for GenerationCompactificationError",1,["air_trace_handler::errors::GenerationCompactificationError"]],["impl Freeze for IntConversionError",1,["air_trace_handler::errors::IntConversionError"]],["impl Freeze for KeeperError",1,["air_trace_handler::data_keeper::errors::KeeperError"]],["impl Freeze for StateFSMError",1,["air_trace_handler::state_automata::errors::StateFSMError"]],["impl Freeze for SubgraphType",1,["air_trace_handler::state_automata::par_fsm::SubgraphType"]],["impl Freeze for TraceHandlerError",1,["air_trace_handler::errors::TraceHandlerError"]],["impl Freeze for ApResultError",1,["air_trace_handler::merger::errors::ApResultError"]],["impl Freeze for CallResultError",1,["air_trace_handler::merger::errors::CallResultError"]],["impl Freeze for CanonResultError",1,["air_trace_handler::merger::errors::CanonResultError"]],["impl Freeze for DataType",1,["air_trace_handler::merger::errors::DataType"]],["impl Freeze for FoldResultError",1,["air_trace_handler::merger::errors::FoldResultError"]],["impl Freeze for MergeCtxType",1,["air_trace_handler::merger::MergeCtxType"]],["impl Freeze for MergeError",1,["air_trace_handler::merger::errors::MergeError"]],["impl Freeze for MergerApResult",1,["air_trace_handler::merger::ap_merger::MergerApResult"]],["impl Freeze for MergerCallResult",1,["air_trace_handler::merger::call_merger::MergerCallResult"]],["impl Freeze for MergerCanonResult",1,["air_trace_handler::merger::canon_merger::MergerCanonResult"]],["impl Freeze for PreparationScheme",1,["air_trace_handler::merger::position_mapping::PreparationScheme"]],["impl Freeze for ValueSource",1,["air_trace_handler::merger::ValueSource"]],["impl Freeze for MergerFoldResult",1,["air_trace_handler::merger::fold_merger::MergerFoldResult"]],["impl Freeze for MergerParResult",1,["air_trace_handler::merger::par_merger::MergerParResult"]],["impl Freeze for MetApResult",1,["air_trace_handler::merger::ap_merger::MetApResult"]],["impl Freeze for MetCallResult",1,["air_trace_handler::merger::call_merger::MetCallResult"]],["impl Freeze for ResolvedFold",1,["air_trace_handler::merger::fold_merger::fold_lore_resolver::ResolvedFold"]],["impl Freeze for ResolvedSubTraceDescs",1,["air_trace_handler::merger::fold_merger::fold_lore_resolver::ResolvedSubTraceDescs"]],["impl Freeze for TraceHandler",1,["air_trace_handler::handler::TraceHandler"]]], +"avm_data_store":[["impl<'data> Freeze for AnomalyData<'data>",1,["avm_data_store::AnomalyData"]]], +"avm_interface":[["impl Freeze for CallSeDeErrors",1,["avm_interface::CallSeDeErrors"]],["impl Freeze for RawAVMOutcome",1,["avm_interface::raw_outcome::RawAVMOutcome"]],["impl Freeze for AVMOutcome",1,["avm_interface::outcome::AVMOutcome"]],["impl Freeze for CallRequestParams",1,["avm_interface::call_request_parameters::CallRequestParams"]],["impl Freeze for CallServiceResult",1,["avm_interface::call_service_result::CallServiceResult"]],["impl Freeze for ErrorAVMOutcome",1,["avm_interface::outcome::ErrorAVMOutcome"]],["impl<'ctx> Freeze for ParticleParameters<'ctx>",1,["avm_interface::particle_parameters::ParticleParameters"]]], +"avm_server":[["impl Freeze for RunnerError",1,["avm_server::errors::RunnerError"]],["impl Freeze for AVMMemoryStats",1,["avm_server::runner::AVMMemoryStats"]],["impl Freeze for AVMRuntimeLimits",1,["avm_server::runner::AVMRuntimeLimits"]],["impl Freeze for AquaVMRuntimeLimits",1,["avm_server::runner::AquaVMRuntimeLimits"]],["impl<E> Freeze for AVMError<E>
where\n E: Freeze,
",1,["avm_server::errors::AVMError"]],["impl<E> Freeze for AVMConfig<E>",1,["avm_server::config::AVMConfig"]],["impl<E, WB> !Freeze for AVM<E, WB>",1,["avm_server::avm::AVM"]],["impl<WB> !Freeze for AVMRunner<WB>",1,["avm_server::runner::AVMRunner"]]], +"polyplets":[["impl Freeze for ResolvedTriplet",1,["polyplets::triplet::ResolvedTriplet"]]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/trait.impl/core/marker/trait.Send.js b/trait.impl/core/marker/trait.Send.js new file mode 100644 index 00000000..484ebc09 --- /dev/null +++ b/trait.impl/core/marker/trait.Send.js @@ -0,0 +1,21 @@ +(function() {var implementors = { +"air":[["impl Send for Mode",1,["air::data::Mode"]],["impl Send for Subcommand",1,["air::Subcommand"]],["impl Send for Mode",1,["air::trace::run::Mode"]],["impl Send for Source",1,["air::trace::run::Source"]],["impl Send for Message",1,["air::trace::stats::log_data::Message"]],["impl Send for Args",1,["air::beautify::Args"]],["impl Send for Args",1,["air::data::Args"]],["impl Send for ModeArgs",1,["air::data::ModeArgs"]],["impl Send for Cli",1,["air::Cli"]],["impl Send for AnomalyDataArgs",1,["air::trace::run::data::anomaly::AnomalyDataArgs"]],["impl Send for PlainDataArgs",1,["air::trace::run::data::plain::PlainDataArgs"]],["impl Send for NativeAvmRunner",1,["air::trace::run::native::NativeAvmRunner"]],["impl Send for TestInitParameters",1,["air::trace::run::runner::TestInitParameters"]],["impl Send for Args",1,["air::trace::run::Args"]],["impl Send for Keys",1,["air::trace::run::Keys"]],["impl Send for ModeArgs",1,["air::trace::run::ModeArgs"]],["impl Send for WasmAvmRunner",1,["air::trace::run::wasm::WasmAvmRunner"]],["impl Send for CloseMessage",1,["air::trace::stats::log_data::CloseMessage"]],["impl Send for LogKey",1,["air::trace::stats::log_data::LogKey"]],["impl Send for LogRecord",1,["air::trace::stats::log_data::LogRecord"]],["impl Send for LogValue",1,["air::trace::stats::log_data::LogValue"]],["impl Send for Span",1,["air::trace::stats::log_data::Span"]],["impl Send for StatsReport",1,["air::trace::stats::report::StatsReport"]],["impl Send for Args",1,["air::trace::stats::Args"]],["impl<'ctx> Send for ExecutionData<'ctx>",1,["air::trace::run::data::ExecutionData"]]], +"air_beautifier":[["impl Send for BeautifyError",1,["air_beautifier::beautifier::BeautifyError"]],["impl<W> Send for Beautifier<W>
where\n W: Send,
",1,["air_beautifier::beautifier::Beautifier"]]], +"air_execution_info_collector":[["impl Send for ApTracker",1,["air_execution_info_collector::instructions_tracker::ApTracker"]],["impl Send for CallTracker",1,["air_execution_info_collector::instructions_tracker::CallTracker"]],["impl Send for FoldTracker",1,["air_execution_info_collector::instructions_tracker::FoldTracker"]],["impl Send for InstructionTracker",1,["air_execution_info_collector::instructions_tracker::InstructionTracker"]],["impl Send for NewTracker",1,["air_execution_info_collector::instructions_tracker::NewTracker"]],["impl Send for ParTracker",1,["air_execution_info_collector::instructions_tracker::ParTracker"]]], +"air_interpreter_cid":[["impl !Send for CidVerificationError",1,["air_interpreter_cid::verify::CidVerificationError"]],["impl Send for CidCalculationError",1,["air_interpreter_cid::CidCalculationError"]],["impl<T> !Send for ArchivedCID<T>",1,["air_interpreter_cid::ArchivedCID"]],["impl<T> !Send for CID<T>",1,["air_interpreter_cid::CID"]],["impl<T> !Send for CIDResolver<T>",1,["air_interpreter_cid::CIDResolver"]]], +"air_interpreter_data":[["impl !Send for CallResult",1,["air_interpreter_data::executed_state::CallResult"]],["impl !Send for CanonResult",1,["air_interpreter_data::executed_state::CanonResult"]],["impl !Send for CidStoreVerificationError",1,["air_interpreter_data::cid_store::CidStoreVerificationError"]],["impl !Send for DataDeserializationError",1,["air_interpreter_data::interpreter_data::DataDeserializationError"]],["impl !Send for ExecutedState",1,["air_interpreter_data::executed_state::ExecutedState"]],["impl !Send for Provenance",1,["air_interpreter_data::executed_state::Provenance"]],["impl !Send for Sender",1,["air_interpreter_data::executed_state::Sender"]],["impl !Send for ValueRef",1,["air_interpreter_data::executed_state::ValueRef"]],["impl !Send for DataVerifierError",1,["air_interpreter_data::interpreter_data::errors::DataVerifierError"]],["impl !Send for CallServiceFailed",1,["air_interpreter_data::executed_state::CallServiceFailed"]],["impl !Send for CanonCidAggregate",1,["air_interpreter_data::executed_state::CanonCidAggregate"]],["impl !Send for CanonResultCidAggregate",1,["air_interpreter_data::executed_state::CanonResultCidAggregate"]],["impl !Send for CidInfo",1,["air_interpreter_data::cid_info::CidInfo"]],["impl !Send for ExecutionTrace",1,["air_interpreter_data::trace::ExecutionTrace"]],["impl !Send for InterpreterData",1,["air_interpreter_data::interpreter_data::InterpreterData"]],["impl !Send for RawValue",1,["air_interpreter_data::raw_value::RawValue"]],["impl !Send for ServiceResultCidAggregate",1,["air_interpreter_data::executed_state::ServiceResultCidAggregate"]],["impl Send for ArchivedCallResult",1,["air_interpreter_data::executed_state::ArchivedCallResult"]],["impl Send for ArchivedCanonResult",1,["air_interpreter_data::executed_state::ArchivedCanonResult"]],["impl Send for ArchivedExecutedState",1,["air_interpreter_data::executed_state::ArchivedExecutedState"]],["impl Send for ArchivedProvenance",1,["air_interpreter_data::executed_state::ArchivedProvenance"]],["impl Send for ArchivedSender",1,["air_interpreter_data::executed_state::ArchivedSender"]],["impl Send for ArchivedValueRef",1,["air_interpreter_data::executed_state::ArchivedValueRef"]],["impl Send for CallResultResolver",1,["air_interpreter_data::executed_state::CallResultResolver"]],["impl Send for CanonResultResolver",1,["air_interpreter_data::executed_state::CanonResultResolver"]],["impl Send for ExecutedStateResolver",1,["air_interpreter_data::executed_state::ExecutedStateResolver"]],["impl Send for ProvenanceResolver",1,["air_interpreter_data::executed_state::ProvenanceResolver"]],["impl Send for SenderResolver",1,["air_interpreter_data::executed_state::SenderResolver"]],["impl Send for ValueRefResolver",1,["air_interpreter_data::executed_state::ValueRefResolver"]],["impl Send for ApResult",1,["air_interpreter_data::executed_state::ApResult"]],["impl Send for ApResultResolver",1,["air_interpreter_data::executed_state::ApResultResolver"]],["impl Send for ArchivedApResult",1,["air_interpreter_data::executed_state::ArchivedApResult"]],["impl Send for ArchivedCallServiceFailed",1,["air_interpreter_data::executed_state::ArchivedCallServiceFailed"]],["impl Send for ArchivedCanonCidAggregate",1,["air_interpreter_data::executed_state::ArchivedCanonCidAggregate"]],["impl Send for ArchivedCanonResultCidAggregate",1,["air_interpreter_data::executed_state::ArchivedCanonResultCidAggregate"]],["impl Send for ArchivedCidInfo",1,["air_interpreter_data::cid_info::ArchivedCidInfo"]],["impl Send for ArchivedExecutionTrace",1,["air_interpreter_data::trace::ArchivedExecutionTrace"]],["impl Send for ArchivedFoldResult",1,["air_interpreter_data::executed_state::ArchivedFoldResult"]],["impl Send for ArchivedFoldSubTraceLore",1,["air_interpreter_data::executed_state::ArchivedFoldSubTraceLore"]],["impl Send for ArchivedGenerationIdx",1,["air_interpreter_data::generation_idx::ArchivedGenerationIdx"]],["impl Send for ArchivedInterpreterData",1,["air_interpreter_data::interpreter_data::ArchivedInterpreterData"]],["impl Send for ArchivedParResult",1,["air_interpreter_data::executed_state::ArchivedParResult"]],["impl Send for ArchivedRawValue",1,["air_interpreter_data::raw_value::ArchivedRawValue"]],["impl Send for ArchivedServiceResultCidAggregate",1,["air_interpreter_data::executed_state::ArchivedServiceResultCidAggregate"]],["impl Send for ArchivedSubTraceDesc",1,["air_interpreter_data::executed_state::ArchivedSubTraceDesc"]],["impl Send for ArchivedTracePos",1,["air_interpreter_data::trace_pos::ArchivedTracePos"]],["impl Send for CallServiceFailedResolver",1,["air_interpreter_data::executed_state::CallServiceFailedResolver"]],["impl Send for CanonCidAggregateResolver",1,["air_interpreter_data::executed_state::CanonCidAggregateResolver"]],["impl Send for CanonResultCidAggregateResolver",1,["air_interpreter_data::executed_state::CanonResultCidAggregateResolver"]],["impl Send for CidInfoResolver",1,["air_interpreter_data::cid_info::CidInfoResolver"]],["impl Send for ExecutionTraceResolver",1,["air_interpreter_data::trace::ExecutionTraceResolver"]],["impl Send for FoldResult",1,["air_interpreter_data::executed_state::FoldResult"]],["impl Send for FoldResultResolver",1,["air_interpreter_data::executed_state::FoldResultResolver"]],["impl Send for FoldSubTraceLore",1,["air_interpreter_data::executed_state::FoldSubTraceLore"]],["impl Send for FoldSubTraceLoreResolver",1,["air_interpreter_data::executed_state::FoldSubTraceLoreResolver"]],["impl Send for GenerationIdx",1,["air_interpreter_data::generation_idx::GenerationIdx"]],["impl Send for GenerationIdxResolver",1,["air_interpreter_data::generation_idx::GenerationIdxResolver"]],["impl Send for InterpreterDataEnvelopeRepr",1,["air_interpreter_data::interpreter_data::repr::InterpreterDataEnvelopeRepr"]],["impl Send for InterpreterDataResolver",1,["air_interpreter_data::interpreter_data::InterpreterDataResolver"]],["impl Send for ParResult",1,["air_interpreter_data::executed_state::ParResult"]],["impl Send for ParResultResolver",1,["air_interpreter_data::executed_state::ParResultResolver"]],["impl Send for RawValueResolver",1,["air_interpreter_data::raw_value::RawValueResolver"]],["impl Send for ServiceResultCidAggregateResolver",1,["air_interpreter_data::executed_state::ServiceResultCidAggregateResolver"]],["impl Send for SubTraceDesc",1,["air_interpreter_data::executed_state::SubTraceDesc"]],["impl Send for SubTraceDescResolver",1,["air_interpreter_data::executed_state::SubTraceDescResolver"]],["impl Send for TracePos",1,["air_interpreter_data::trace_pos::TracePos"]],["impl Send for TracePosResolver",1,["air_interpreter_data::trace_pos::TracePosResolver"]],["impl Send for Versions",1,["air_interpreter_data::interpreter_data::Versions"]],["impl<'a> Send for InterpreterDataEnvelope<'a>",1,["air_interpreter_data::interpreter_data::InterpreterDataEnvelope"]],["impl<'data> !Send for DataVerifier<'data>",1,["air_interpreter_data::interpreter_data::verification::DataVerifier"]],["impl<Val = JValue> !Send for CidTracker<Val>",1,["air_interpreter_data::cid_store::CidTracker"]],["impl<Val> !Send for ArchivedCidStore<Val>",1,["air_interpreter_data::cid_store::ArchivedCidStore"]],["impl<Val> !Send for CidStore<Val>",1,["air_interpreter_data::cid_store::CidStore"]],["impl<Val> !Send for CidStoreResolver<Val>",1,["air_interpreter_data::cid_store::CidStoreResolver"]]], +"air_interpreter_interface":[["impl Send for CallArgumentsRepr",1,["air_interpreter_interface::call_request_parameters::CallArgumentsRepr"]],["impl Send for CallRequestParams",1,["air_interpreter_interface::call_request_parameters::CallRequestParams"]],["impl Send for CallRequestsRepr",1,["air_interpreter_interface::call_request_parameters::CallRequestsRepr"]],["impl Send for CallResultsRepr",1,["air_interpreter_interface::call_service_result::CallResultsRepr"]],["impl Send for CallServiceResult",1,["air_interpreter_interface::call_service_result::CallServiceResult"]],["impl Send for InterpreterOutcome",1,["air_interpreter_interface::interpreter_outcome::InterpreterOutcome"]],["impl Send for RunParameters",1,["air_interpreter_interface::run_parameters::RunParameters"]],["impl Send for SerializedCallArguments",1,["air_interpreter_interface::call_request_parameters::SerializedCallArguments"]],["impl Send for SerializedCallRequests",1,["air_interpreter_interface::call_request_parameters::SerializedCallRequests"]],["impl Send for SerializedCallResults",1,["air_interpreter_interface::call_service_result::SerializedCallResults"]],["impl Send for SerializedTetraplets",1,["air_interpreter_interface::call_request_parameters::SerializedTetraplets"]],["impl Send for SoftLimitsTriggering",1,["air_interpreter_interface::interpreter_outcome::SoftLimitsTriggering"]],["impl Send for TetrapletsRepr",1,["air_interpreter_interface::call_request_parameters::TetrapletsRepr"]]], +"air_interpreter_sede":[["impl Send for RmpSerdeFormat",1,["air_interpreter_sede::rmp_serde::RmpSerdeFormat"]],["impl Send for RmpSerdeMultiformat",1,["air_interpreter_sede::rmp_serde::RmpSerdeMultiformat"]],["impl<FormatError> Send for DecodeError<FormatError>
where\n FormatError: Send,
",1,["air_interpreter_sede::multiformat::DecodeError"]],["impl<FormatError> Send for EncodeError<FormatError>
where\n FormatError: Send,
",1,["air_interpreter_sede::multiformat::EncodeError"]]], +"air_interpreter_signatures":[["impl !Send for PeerCidTracker",1,["air_interpreter_signatures::trackers::PeerCidTracker"]],["impl Send for KeyError",1,["air_interpreter_signatures::KeyError"]],["impl Send for VerificationError",1,["air_interpreter_signatures::VerificationError"]],["impl Send for ArchivedPublicKey",1,["air_interpreter_signatures::ArchivedPublicKey"]],["impl Send for ArchivedSignature",1,["air_interpreter_signatures::ArchivedSignature"]],["impl Send for KeyPair",1,["air_interpreter_signatures::KeyPair"]],["impl Send for PublicKey",1,["air_interpreter_signatures::PublicKey"]],["impl Send for PublicKeyResolver",1,["air_interpreter_signatures::PublicKeyResolver"]],["impl Send for Signature",1,["air_interpreter_signatures::Signature"]],["impl Send for SignatureResolver",1,["air_interpreter_signatures::SignatureResolver"]],["impl<Key = PublicKey, Sign = Signature> !Send for ArchivedSignatureStore<Key, Sign>",1,["air_interpreter_signatures::stores::ArchivedSignatureStore"]],["impl<Key = PublicKey, Sign = Signature> !Send for SignatureStoreResolver<Key, Sign>",1,["air_interpreter_signatures::stores::SignatureStoreResolver"]],["impl<Key, Sign> Send for SignatureStore<Key, Sign>
where\n Key: Send,\n Sign: Send,
",1,["air_interpreter_signatures::stores::SignatureStore"]]], +"air_interpreter_value":[["impl !Send for JValue",1,["air_interpreter_value::value::JValue"]]], +"air_lambda_ast":[["impl Send for Functor",1,["air_lambda_ast::ast::Functor"]],["impl<'input> Send for LambdaAST<'input>",1,["air_lambda_ast::ast::LambdaAST"]],["impl<'input> Send for ValueAccessor<'input>",1,["air_lambda_ast::ast::ValueAccessor"]]], +"air_lambda_parser":[["impl Send for LexerError",1,["air_lambda_parser::parser::lexer::errors::LexerError"]],["impl<'input> Send for LambdaParserError<'input>",1,["air_lambda_parser::parser::errors::LambdaParserError"]],["impl<'input> Send for LambdaASTLexer<'input>",1,["air_lambda_parser::parser::lexer::lambda_ast_lexer::LambdaASTLexer"]]], +"air_parser":[["impl Send for Number",1,["air_parser::ast::instruction_arguments::Number"]],["impl Send for Never",1,["air_parser::ast::instructions::Never"]],["impl Send for Null",1,["air_parser::ast::instructions::Null"]],["impl Send for Span",1,["air_parser::parser::span::Span"]],["impl Send for AIRParser",1,["air_parser::parser::air::__parse__AIR::AIRParser"]],["impl Send for AirPos",1,["air_parser::parser::lexer::text_pos::AirPos"]],["impl<'i> !Send for ApArgument<'i>",1,["air_parser::ast::instruction_arguments::ApArgument"]],["impl<'i> !Send for ImmutableValue<'i>",1,["air_parser::ast::instruction_arguments::ImmutableValue"]],["impl<'i> !Send for Instruction<'i>",1,["air_parser::ast::instructions::Instruction"]],["impl<'i> !Send for StreamMapKeyClause<'i>",1,["air_parser::ast::instruction_arguments::StreamMapKeyClause"]],["impl<'i> !Send for Ap<'i>",1,["air_parser::ast::instructions::Ap"]],["impl<'i> !Send for ApMap<'i>",1,["air_parser::ast::instructions::ApMap"]],["impl<'i> !Send for Call<'i>",1,["air_parser::ast::instructions::Call"]],["impl<'i> !Send for FoldScalar<'i>",1,["air_parser::ast::instructions::FoldScalar"]],["impl<'i> !Send for FoldStream<'i>",1,["air_parser::ast::instructions::FoldStream"]],["impl<'i> !Send for FoldStreamMap<'i>",1,["air_parser::ast::instructions::FoldStreamMap"]],["impl<'i> !Send for Match<'i>",1,["air_parser::ast::instructions::Match"]],["impl<'i> !Send for MisMatch<'i>",1,["air_parser::ast::instructions::MisMatch"]],["impl<'i> !Send for New<'i>",1,["air_parser::ast::instructions::New"]],["impl<'i> !Send for Par<'i>",1,["air_parser::ast::instructions::Par"]],["impl<'i> !Send for Seq<'i>",1,["air_parser::ast::instructions::Seq"]],["impl<'i> !Send for Xor<'i>",1,["air_parser::ast::instructions::Xor"]],["impl<'i> Send for ApResult<'i>",1,["air_parser::ast::instruction_arguments::ApResult"]],["impl<'i> Send for CallOutputValue<'i>",1,["air_parser::ast::instruction_arguments::CallOutputValue"]],["impl<'i> Send for Fail<'i>",1,["air_parser::ast::instructions::Fail"]],["impl<'i> Send for FoldScalarIterable<'i>",1,["air_parser::ast::instruction_arguments::FoldScalarIterable"]],["impl<'i> Send for ImmutableVariable<'i>",1,["air_parser::ast::values::ImmutableVariable"]],["impl<'i> Send for ImmutableVariableWithLambda<'i>",1,["air_parser::ast::values::ImmutableVariableWithLambda"]],["impl<'i> Send for NewArgument<'i>",1,["air_parser::ast::instruction_arguments::NewArgument"]],["impl<'i> Send for ResolvableToPeerIdVariable<'i>",1,["air_parser::ast::instruction_arguments::ResolvableToPeerIdVariable"]],["impl<'i> Send for ResolvableToStringVariable<'i>",1,["air_parser::ast::instruction_arguments::ResolvableToStringVariable"]],["impl<'i> Send for Canon<'i>",1,["air_parser::ast::instructions::Canon"]],["impl<'i> Send for CanonMap<'i>",1,["air_parser::ast::instructions::CanonMap"]],["impl<'i> Send for CanonStream<'i>",1,["air_parser::ast::values::CanonStream"]],["impl<'i> Send for CanonStreamMap<'i>",1,["air_parser::ast::values::CanonStreamMap"]],["impl<'i> Send for CanonStreamMapScalar<'i>",1,["air_parser::ast::instructions::CanonStreamMapScalar"]],["impl<'i> Send for CanonStreamMapWithLambda<'i>",1,["air_parser::ast::values::CanonStreamMapWithLambda"]],["impl<'i> Send for CanonStreamWithLambda<'i>",1,["air_parser::ast::values::CanonStreamWithLambda"]],["impl<'i> Send for Next<'i>",1,["air_parser::ast::instructions::Next"]],["impl<'i> Send for Scalar<'i>",1,["air_parser::ast::values::Scalar"]],["impl<'i> Send for ScalarWithLambda<'i>",1,["air_parser::ast::values::ScalarWithLambda"]],["impl<'i> Send for Stream<'i>",1,["air_parser::ast::values::Stream"]],["impl<'i> Send for StreamMap<'i>",1,["air_parser::ast::values::StreamMap"]],["impl<'i> Send for Triplet<'i>",1,["air_parser::ast::instruction_arguments::Triplet"]],["impl<'i> Send for VariableValidator<'i>",1,["air_parser::parser::validator::VariableValidator"]],["impl<'input> Send for AIRLexer<'input>",1,["air_parser::parser::lexer::air_lexer::AIRLexer"]],["impl<'lens> Send for InstructionErrorAST<'lens>",1,["air_parser::ast::values::InstructionErrorAST"]]], +"air_test_framework":[["impl !Send for PeerId",1,["air_test_framework::ephemeral::PeerId"]],["impl !Send for MarineServiceHandle",1,["air_test_framework::services::MarineServiceHandle"]],["impl Send for ServiceDefinition",1,["air_test_framework::asserts::ServiceDefinition"]],["impl Send for ServiceTagName",1,["air_test_framework::asserts::ServiceTagName"]],["impl Send for AlterState",1,["air_test_framework::ephemeral::neighborhood::AlterState"]],["impl Send for FunctionOutcome",1,["air_test_framework::services::FunctionOutcome"]],["impl<R = WasmAirRunner> !Send for Neighborhood<R>",1,["air_test_framework::ephemeral::neighborhood::Neighborhood"]],["impl<R = WasmAirRunner> !Send for Network<R>",1,["air_test_framework::ephemeral::Network"]],["impl<R = WasmAirRunner> !Send for AirScriptExecutor<R>",1,["air_test_framework::execution::AirScriptExecutor"]],["impl<R = WasmAirRunner> !Send for TransformedAirScript<R>",1,["air_test_framework::transform::walker::TransformedAirScript"]],["impl<R> !Send for PeerEnv<R>",1,["air_test_framework::ephemeral::neighborhood::PeerEnv"]],["impl<R> !Send for Peer<R>",1,["air_test_framework::ephemeral::Peer"]]], +"air_test_utils":[["impl !Send for CanonResultAlike",1,["air_test_utils::executed_state::CanonResultAlike"]],["impl !Send for ExecutedCallBuilder",1,["air_test_utils::executed_state::ExecutedCallBuilder"]],["impl !Send for ValueAggregateAlike",1,["air_test_utils::executed_state::ValueAggregateAlike"]],["impl Send for VariableOptionSource",1,["air_test_utils::call_services::VariableOptionSource"]],["impl Send for NativeAirRunner",1,["air_test_utils::native_test_runner::NativeAirRunner"]],["impl Send for TestInitParameters",1,["air_test_utils::test_runner::TestInitParameters"]],["impl Send for TestRunParameters",1,["air_test_utils::test_runner::TestRunParameters"]],["impl Send for ReleaseWasmAirRunner",1,["air_test_utils::wasm_test_runner::ReleaseWasmAirRunner"]],["impl Send for WasmAirRunner",1,["air_test_utils::wasm_test_runner::WasmAirRunner"]],["impl<R = WasmAirRunner> !Send for TestRunner<R>",1,["air_test_utils::test_runner::TestRunner"]]], +"air_trace_handler":[["impl !Send for GenerationCompactificationError",1,["air_trace_handler::errors::GenerationCompactificationError"]],["impl !Send for KeeperError",1,["air_trace_handler::data_keeper::errors::KeeperError"]],["impl !Send for StateFSMError",1,["air_trace_handler::state_automata::errors::StateFSMError"]],["impl !Send for TraceHandlerError",1,["air_trace_handler::errors::TraceHandlerError"]],["impl !Send for CallResultError",1,["air_trace_handler::merger::errors::CallResultError"]],["impl !Send for CanonResultError",1,["air_trace_handler::merger::errors::CanonResultError"]],["impl !Send for MergeError",1,["air_trace_handler::merger::errors::MergeError"]],["impl !Send for MergerCallResult",1,["air_trace_handler::merger::call_merger::MergerCallResult"]],["impl !Send for MergerCanonResult",1,["air_trace_handler::merger::canon_merger::MergerCanonResult"]],["impl !Send for MetCallResult",1,["air_trace_handler::merger::call_merger::MetCallResult"]],["impl !Send for TraceHandler",1,["air_trace_handler::handler::TraceHandler"]],["impl Send for IntConversionError",1,["air_trace_handler::errors::IntConversionError"]],["impl Send for SubgraphType",1,["air_trace_handler::state_automata::par_fsm::SubgraphType"]],["impl Send for ApResultError",1,["air_trace_handler::merger::errors::ApResultError"]],["impl Send for DataType",1,["air_trace_handler::merger::errors::DataType"]],["impl Send for FoldResultError",1,["air_trace_handler::merger::errors::FoldResultError"]],["impl Send for MergeCtxType",1,["air_trace_handler::merger::MergeCtxType"]],["impl Send for MergerApResult",1,["air_trace_handler::merger::ap_merger::MergerApResult"]],["impl Send for PreparationScheme",1,["air_trace_handler::merger::position_mapping::PreparationScheme"]],["impl Send for ValueSource",1,["air_trace_handler::merger::ValueSource"]],["impl Send for MergerFoldResult",1,["air_trace_handler::merger::fold_merger::MergerFoldResult"]],["impl Send for MergerParResult",1,["air_trace_handler::merger::par_merger::MergerParResult"]],["impl Send for MetApResult",1,["air_trace_handler::merger::ap_merger::MetApResult"]],["impl Send for ResolvedFold",1,["air_trace_handler::merger::fold_merger::fold_lore_resolver::ResolvedFold"]],["impl Send for ResolvedSubTraceDescs",1,["air_trace_handler::merger::fold_merger::fold_lore_resolver::ResolvedSubTraceDescs"]]], +"avm_data_store":[["impl<'data> Send for AnomalyData<'data>",1,["avm_data_store::AnomalyData"]]], +"avm_interface":[["impl Send for CallSeDeErrors",1,["avm_interface::CallSeDeErrors"]],["impl Send for RawAVMOutcome",1,["avm_interface::raw_outcome::RawAVMOutcome"]],["impl Send for AVMOutcome",1,["avm_interface::outcome::AVMOutcome"]],["impl Send for CallRequestParams",1,["avm_interface::call_request_parameters::CallRequestParams"]],["impl Send for CallServiceResult",1,["avm_interface::call_service_result::CallServiceResult"]],["impl Send for ErrorAVMOutcome",1,["avm_interface::outcome::ErrorAVMOutcome"]],["impl<'ctx> Send for ParticleParameters<'ctx>",1,["avm_interface::particle_parameters::ParticleParameters"]]], +"avm_server":[["impl Send for RunnerError",1,["avm_server::errors::RunnerError"]],["impl Send for AVMMemoryStats",1,["avm_server::runner::AVMMemoryStats"]],["impl Send for AVMRuntimeLimits",1,["avm_server::runner::AVMRuntimeLimits"]],["impl Send for AquaVMRuntimeLimits",1,["avm_server::runner::AquaVMRuntimeLimits"]],["impl<E> Send for AVMError<E>
where\n E: Send,
",1,["avm_server::errors::AVMError"]],["impl<E> Send for AVMConfig<E>",1,["avm_server::config::AVMConfig"]],["impl<E, WB> Send for AVM<E, WB>",1,["avm_server::avm::AVM"]],["impl<WB> Send for AVMRunner<WB>
where\n <WB as WasmBackend>::Instance: Send,
",1,["avm_server::runner::AVMRunner"]]], +"polyplets":[["impl Send for ResolvedTriplet",1,["polyplets::triplet::ResolvedTriplet"]]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/trait.impl/core/marker/trait.StructuralPartialEq.js b/trait.impl/core/marker/trait.StructuralPartialEq.js new file mode 100644 index 00000000..90570b43 --- /dev/null +++ b/trait.impl/core/marker/trait.StructuralPartialEq.js @@ -0,0 +1,16 @@ +(function() {var implementors = { +"air":[["impl StructuralPartialEq for LogKey"]], +"air_execution_info_collector":[["impl StructuralPartialEq for ApTracker"],["impl StructuralPartialEq for CallTracker"],["impl StructuralPartialEq for FoldTracker"],["impl StructuralPartialEq for InstructionTracker"],["impl StructuralPartialEq for NewTracker"],["impl StructuralPartialEq for ParTracker"]], +"air_interpreter_data":[["impl StructuralPartialEq for CallResult"],["impl StructuralPartialEq for CanonResult"],["impl StructuralPartialEq for ExecutedState"],["impl StructuralPartialEq for Provenance"],["impl StructuralPartialEq for Sender"],["impl StructuralPartialEq for ValueRef"],["impl StructuralPartialEq for ApResult"],["impl StructuralPartialEq for CallServiceFailed"],["impl StructuralPartialEq for CanonCidAggregate"],["impl StructuralPartialEq for CanonResultCidAggregate"],["impl StructuralPartialEq for CidInfo"],["impl StructuralPartialEq for ExecutionTrace"],["impl StructuralPartialEq for FoldResult"],["impl StructuralPartialEq for FoldSubTraceLore"],["impl StructuralPartialEq for GenerationIdx"],["impl StructuralPartialEq for ParResult"],["impl StructuralPartialEq for ServiceResultCidAggregate"],["impl StructuralPartialEq for SubTraceDesc"],["impl StructuralPartialEq for TracePos"],["impl<Val> StructuralPartialEq for CidStore<Val>"]], +"air_interpreter_interface":[["impl StructuralPartialEq for CallRequestParams"],["impl StructuralPartialEq for InterpreterOutcome"],["impl StructuralPartialEq for RunParameters"],["impl StructuralPartialEq for SerializedCallArguments"],["impl StructuralPartialEq for SerializedCallRequests"],["impl StructuralPartialEq for SerializedCallResults"],["impl StructuralPartialEq for SerializedTetraplets"],["impl StructuralPartialEq for SoftLimitsTriggering"]], +"air_interpreter_signatures":[["impl StructuralPartialEq for ArchivedPublicKey
where\n Box<[u8]>: Archive,
"],["impl StructuralPartialEq for PublicKey"],["impl StructuralPartialEq for Signature"]], +"air_interpreter_value":[["impl StructuralPartialEq for JValue"]], +"air_lambda_ast":[["impl StructuralPartialEq for Functor"],["impl<'input> StructuralPartialEq for LambdaAST<'input>"],["impl<'input> StructuralPartialEq for ValueAccessor<'input>"]], +"air_lambda_parser":[["impl StructuralPartialEq for LexerError"],["impl<'input> StructuralPartialEq for LambdaParserError<'input>"]], +"air_parser":[["impl StructuralPartialEq for Number"],["impl StructuralPartialEq for Never"],["impl StructuralPartialEq for Null"],["impl StructuralPartialEq for Span"],["impl StructuralPartialEq for AirPos"],["impl<'i> StructuralPartialEq for ApArgument<'i>"],["impl<'i> StructuralPartialEq for ApResult<'i>"],["impl<'i> StructuralPartialEq for CallOutputValue<'i>"],["impl<'i> StructuralPartialEq for Fail<'i>"],["impl<'i> StructuralPartialEq for FoldScalarIterable<'i>"],["impl<'i> StructuralPartialEq for ImmutableValue<'i>"],["impl<'i> StructuralPartialEq for ImmutableVariable<'i>"],["impl<'i> StructuralPartialEq for ImmutableVariableWithLambda<'i>"],["impl<'i> StructuralPartialEq for Instruction<'i>"],["impl<'i> StructuralPartialEq for NewArgument<'i>"],["impl<'i> StructuralPartialEq for ResolvableToPeerIdVariable<'i>"],["impl<'i> StructuralPartialEq for ResolvableToStringVariable<'i>"],["impl<'i> StructuralPartialEq for StreamMapKeyClause<'i>"],["impl<'i> StructuralPartialEq for Ap<'i>"],["impl<'i> StructuralPartialEq for ApMap<'i>"],["impl<'i> StructuralPartialEq for Call<'i>"],["impl<'i> StructuralPartialEq for Canon<'i>"],["impl<'i> StructuralPartialEq for CanonMap<'i>"],["impl<'i> StructuralPartialEq for CanonStream<'i>"],["impl<'i> StructuralPartialEq for CanonStreamMap<'i>"],["impl<'i> StructuralPartialEq for CanonStreamMapScalar<'i>"],["impl<'i> StructuralPartialEq for CanonStreamMapWithLambda<'i>"],["impl<'i> StructuralPartialEq for CanonStreamWithLambda<'i>"],["impl<'i> StructuralPartialEq for FoldScalar<'i>"],["impl<'i> StructuralPartialEq for FoldStream<'i>"],["impl<'i> StructuralPartialEq for FoldStreamMap<'i>"],["impl<'i> StructuralPartialEq for Match<'i>"],["impl<'i> StructuralPartialEq for MisMatch<'i>"],["impl<'i> StructuralPartialEq for New<'i>"],["impl<'i> StructuralPartialEq for Next<'i>"],["impl<'i> StructuralPartialEq for Par<'i>"],["impl<'i> StructuralPartialEq for Scalar<'i>"],["impl<'i> StructuralPartialEq for ScalarWithLambda<'i>"],["impl<'i> StructuralPartialEq for Seq<'i>"],["impl<'i> StructuralPartialEq for Stream<'i>"],["impl<'i> StructuralPartialEq for StreamMap<'i>"],["impl<'i> StructuralPartialEq for Triplet<'i>"],["impl<'i> StructuralPartialEq for Xor<'i>"],["impl<'lens> StructuralPartialEq for InstructionErrorAST<'lens>"]], +"air_test_framework":[["impl StructuralPartialEq for ServiceDefinition"],["impl StructuralPartialEq for ServiceTagName"],["impl StructuralPartialEq for AlterState"],["impl StructuralPartialEq for PeerId"]], +"air_trace_handler":[["impl StructuralPartialEq for KeeperError"],["impl StructuralPartialEq for SubgraphType"],["impl StructuralPartialEq for ResolvedFold"],["impl StructuralPartialEq for ResolvedSubTraceDescs"]], +"avm_data_store":[["impl<'data> StructuralPartialEq for AnomalyData<'data>"]], +"avm_interface":[["impl StructuralPartialEq for RawAVMOutcome"],["impl StructuralPartialEq for AVMOutcome"],["impl StructuralPartialEq for CallRequestParams"],["impl StructuralPartialEq for CallServiceResult"],["impl StructuralPartialEq for ErrorAVMOutcome"]], +"polyplets":[["impl StructuralPartialEq for ResolvedTriplet"]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/trait.impl/core/marker/trait.Sync.js b/trait.impl/core/marker/trait.Sync.js new file mode 100644 index 00000000..d0bc9631 --- /dev/null +++ b/trait.impl/core/marker/trait.Sync.js @@ -0,0 +1,21 @@ +(function() {var implementors = { +"air":[["impl !Sync for WasmAvmRunner",1,["air::trace::run::wasm::WasmAvmRunner"]],["impl Sync for Mode",1,["air::data::Mode"]],["impl Sync for Subcommand",1,["air::Subcommand"]],["impl Sync for Mode",1,["air::trace::run::Mode"]],["impl Sync for Source",1,["air::trace::run::Source"]],["impl Sync for Message",1,["air::trace::stats::log_data::Message"]],["impl Sync for Args",1,["air::beautify::Args"]],["impl Sync for Args",1,["air::data::Args"]],["impl Sync for ModeArgs",1,["air::data::ModeArgs"]],["impl Sync for Cli",1,["air::Cli"]],["impl Sync for AnomalyDataArgs",1,["air::trace::run::data::anomaly::AnomalyDataArgs"]],["impl Sync for PlainDataArgs",1,["air::trace::run::data::plain::PlainDataArgs"]],["impl Sync for NativeAvmRunner",1,["air::trace::run::native::NativeAvmRunner"]],["impl Sync for TestInitParameters",1,["air::trace::run::runner::TestInitParameters"]],["impl Sync for Args",1,["air::trace::run::Args"]],["impl Sync for Keys",1,["air::trace::run::Keys"]],["impl Sync for ModeArgs",1,["air::trace::run::ModeArgs"]],["impl Sync for CloseMessage",1,["air::trace::stats::log_data::CloseMessage"]],["impl Sync for LogKey",1,["air::trace::stats::log_data::LogKey"]],["impl Sync for LogRecord",1,["air::trace::stats::log_data::LogRecord"]],["impl Sync for LogValue",1,["air::trace::stats::log_data::LogValue"]],["impl Sync for Span",1,["air::trace::stats::log_data::Span"]],["impl Sync for StatsReport",1,["air::trace::stats::report::StatsReport"]],["impl Sync for Args",1,["air::trace::stats::Args"]],["impl<'ctx> Sync for ExecutionData<'ctx>",1,["air::trace::run::data::ExecutionData"]]], +"air_beautifier":[["impl Sync for BeautifyError",1,["air_beautifier::beautifier::BeautifyError"]],["impl<W> Sync for Beautifier<W>
where\n W: Sync,
",1,["air_beautifier::beautifier::Beautifier"]]], +"air_execution_info_collector":[["impl Sync for ApTracker",1,["air_execution_info_collector::instructions_tracker::ApTracker"]],["impl Sync for CallTracker",1,["air_execution_info_collector::instructions_tracker::CallTracker"]],["impl Sync for FoldTracker",1,["air_execution_info_collector::instructions_tracker::FoldTracker"]],["impl Sync for InstructionTracker",1,["air_execution_info_collector::instructions_tracker::InstructionTracker"]],["impl Sync for NewTracker",1,["air_execution_info_collector::instructions_tracker::NewTracker"]],["impl Sync for ParTracker",1,["air_execution_info_collector::instructions_tracker::ParTracker"]]], +"air_interpreter_cid":[["impl !Sync for CidVerificationError",1,["air_interpreter_cid::verify::CidVerificationError"]],["impl Sync for CidCalculationError",1,["air_interpreter_cid::CidCalculationError"]],["impl<T> !Sync for ArchivedCID<T>",1,["air_interpreter_cid::ArchivedCID"]],["impl<T> !Sync for CID<T>",1,["air_interpreter_cid::CID"]],["impl<T> !Sync for CIDResolver<T>",1,["air_interpreter_cid::CIDResolver"]]], +"air_interpreter_data":[["impl !Sync for CallResult",1,["air_interpreter_data::executed_state::CallResult"]],["impl !Sync for CanonResult",1,["air_interpreter_data::executed_state::CanonResult"]],["impl !Sync for CidStoreVerificationError",1,["air_interpreter_data::cid_store::CidStoreVerificationError"]],["impl !Sync for DataDeserializationError",1,["air_interpreter_data::interpreter_data::DataDeserializationError"]],["impl !Sync for ExecutedState",1,["air_interpreter_data::executed_state::ExecutedState"]],["impl !Sync for Provenance",1,["air_interpreter_data::executed_state::Provenance"]],["impl !Sync for Sender",1,["air_interpreter_data::executed_state::Sender"]],["impl !Sync for ValueRef",1,["air_interpreter_data::executed_state::ValueRef"]],["impl !Sync for DataVerifierError",1,["air_interpreter_data::interpreter_data::errors::DataVerifierError"]],["impl !Sync for CallServiceFailed",1,["air_interpreter_data::executed_state::CallServiceFailed"]],["impl !Sync for CanonCidAggregate",1,["air_interpreter_data::executed_state::CanonCidAggregate"]],["impl !Sync for CanonResultCidAggregate",1,["air_interpreter_data::executed_state::CanonResultCidAggregate"]],["impl !Sync for CidInfo",1,["air_interpreter_data::cid_info::CidInfo"]],["impl !Sync for ExecutionTrace",1,["air_interpreter_data::trace::ExecutionTrace"]],["impl !Sync for InterpreterData",1,["air_interpreter_data::interpreter_data::InterpreterData"]],["impl !Sync for RawValue",1,["air_interpreter_data::raw_value::RawValue"]],["impl !Sync for ServiceResultCidAggregate",1,["air_interpreter_data::executed_state::ServiceResultCidAggregate"]],["impl Sync for ArchivedCallResult",1,["air_interpreter_data::executed_state::ArchivedCallResult"]],["impl Sync for ArchivedCanonResult",1,["air_interpreter_data::executed_state::ArchivedCanonResult"]],["impl Sync for ArchivedExecutedState",1,["air_interpreter_data::executed_state::ArchivedExecutedState"]],["impl Sync for ArchivedProvenance",1,["air_interpreter_data::executed_state::ArchivedProvenance"]],["impl Sync for ArchivedSender",1,["air_interpreter_data::executed_state::ArchivedSender"]],["impl Sync for ArchivedValueRef",1,["air_interpreter_data::executed_state::ArchivedValueRef"]],["impl Sync for CallResultResolver",1,["air_interpreter_data::executed_state::CallResultResolver"]],["impl Sync for CanonResultResolver",1,["air_interpreter_data::executed_state::CanonResultResolver"]],["impl Sync for ExecutedStateResolver",1,["air_interpreter_data::executed_state::ExecutedStateResolver"]],["impl Sync for ProvenanceResolver",1,["air_interpreter_data::executed_state::ProvenanceResolver"]],["impl Sync for SenderResolver",1,["air_interpreter_data::executed_state::SenderResolver"]],["impl Sync for ValueRefResolver",1,["air_interpreter_data::executed_state::ValueRefResolver"]],["impl Sync for ApResult",1,["air_interpreter_data::executed_state::ApResult"]],["impl Sync for ApResultResolver",1,["air_interpreter_data::executed_state::ApResultResolver"]],["impl Sync for ArchivedApResult",1,["air_interpreter_data::executed_state::ArchivedApResult"]],["impl Sync for ArchivedCallServiceFailed",1,["air_interpreter_data::executed_state::ArchivedCallServiceFailed"]],["impl Sync for ArchivedCanonCidAggregate",1,["air_interpreter_data::executed_state::ArchivedCanonCidAggregate"]],["impl Sync for ArchivedCanonResultCidAggregate",1,["air_interpreter_data::executed_state::ArchivedCanonResultCidAggregate"]],["impl Sync for ArchivedCidInfo",1,["air_interpreter_data::cid_info::ArchivedCidInfo"]],["impl Sync for ArchivedExecutionTrace",1,["air_interpreter_data::trace::ArchivedExecutionTrace"]],["impl Sync for ArchivedFoldResult",1,["air_interpreter_data::executed_state::ArchivedFoldResult"]],["impl Sync for ArchivedFoldSubTraceLore",1,["air_interpreter_data::executed_state::ArchivedFoldSubTraceLore"]],["impl Sync for ArchivedGenerationIdx",1,["air_interpreter_data::generation_idx::ArchivedGenerationIdx"]],["impl Sync for ArchivedInterpreterData",1,["air_interpreter_data::interpreter_data::ArchivedInterpreterData"]],["impl Sync for ArchivedParResult",1,["air_interpreter_data::executed_state::ArchivedParResult"]],["impl Sync for ArchivedRawValue",1,["air_interpreter_data::raw_value::ArchivedRawValue"]],["impl Sync for ArchivedServiceResultCidAggregate",1,["air_interpreter_data::executed_state::ArchivedServiceResultCidAggregate"]],["impl Sync for ArchivedSubTraceDesc",1,["air_interpreter_data::executed_state::ArchivedSubTraceDesc"]],["impl Sync for ArchivedTracePos",1,["air_interpreter_data::trace_pos::ArchivedTracePos"]],["impl Sync for CallServiceFailedResolver",1,["air_interpreter_data::executed_state::CallServiceFailedResolver"]],["impl Sync for CanonCidAggregateResolver",1,["air_interpreter_data::executed_state::CanonCidAggregateResolver"]],["impl Sync for CanonResultCidAggregateResolver",1,["air_interpreter_data::executed_state::CanonResultCidAggregateResolver"]],["impl Sync for CidInfoResolver",1,["air_interpreter_data::cid_info::CidInfoResolver"]],["impl Sync for ExecutionTraceResolver",1,["air_interpreter_data::trace::ExecutionTraceResolver"]],["impl Sync for FoldResult",1,["air_interpreter_data::executed_state::FoldResult"]],["impl Sync for FoldResultResolver",1,["air_interpreter_data::executed_state::FoldResultResolver"]],["impl Sync for FoldSubTraceLore",1,["air_interpreter_data::executed_state::FoldSubTraceLore"]],["impl Sync for FoldSubTraceLoreResolver",1,["air_interpreter_data::executed_state::FoldSubTraceLoreResolver"]],["impl Sync for GenerationIdx",1,["air_interpreter_data::generation_idx::GenerationIdx"]],["impl Sync for GenerationIdxResolver",1,["air_interpreter_data::generation_idx::GenerationIdxResolver"]],["impl Sync for InterpreterDataEnvelopeRepr",1,["air_interpreter_data::interpreter_data::repr::InterpreterDataEnvelopeRepr"]],["impl Sync for InterpreterDataResolver",1,["air_interpreter_data::interpreter_data::InterpreterDataResolver"]],["impl Sync for ParResult",1,["air_interpreter_data::executed_state::ParResult"]],["impl Sync for ParResultResolver",1,["air_interpreter_data::executed_state::ParResultResolver"]],["impl Sync for RawValueResolver",1,["air_interpreter_data::raw_value::RawValueResolver"]],["impl Sync for ServiceResultCidAggregateResolver",1,["air_interpreter_data::executed_state::ServiceResultCidAggregateResolver"]],["impl Sync for SubTraceDesc",1,["air_interpreter_data::executed_state::SubTraceDesc"]],["impl Sync for SubTraceDescResolver",1,["air_interpreter_data::executed_state::SubTraceDescResolver"]],["impl Sync for TracePos",1,["air_interpreter_data::trace_pos::TracePos"]],["impl Sync for TracePosResolver",1,["air_interpreter_data::trace_pos::TracePosResolver"]],["impl Sync for Versions",1,["air_interpreter_data::interpreter_data::Versions"]],["impl<'a> Sync for InterpreterDataEnvelope<'a>",1,["air_interpreter_data::interpreter_data::InterpreterDataEnvelope"]],["impl<'data> !Sync for DataVerifier<'data>",1,["air_interpreter_data::interpreter_data::verification::DataVerifier"]],["impl<Val = JValue> !Sync for CidTracker<Val>",1,["air_interpreter_data::cid_store::CidTracker"]],["impl<Val> !Sync for ArchivedCidStore<Val>",1,["air_interpreter_data::cid_store::ArchivedCidStore"]],["impl<Val> !Sync for CidStore<Val>",1,["air_interpreter_data::cid_store::CidStore"]],["impl<Val> !Sync for CidStoreResolver<Val>",1,["air_interpreter_data::cid_store::CidStoreResolver"]]], +"air_interpreter_interface":[["impl Sync for CallArgumentsRepr",1,["air_interpreter_interface::call_request_parameters::CallArgumentsRepr"]],["impl Sync for CallRequestParams",1,["air_interpreter_interface::call_request_parameters::CallRequestParams"]],["impl Sync for CallRequestsRepr",1,["air_interpreter_interface::call_request_parameters::CallRequestsRepr"]],["impl Sync for CallResultsRepr",1,["air_interpreter_interface::call_service_result::CallResultsRepr"]],["impl Sync for CallServiceResult",1,["air_interpreter_interface::call_service_result::CallServiceResult"]],["impl Sync for InterpreterOutcome",1,["air_interpreter_interface::interpreter_outcome::InterpreterOutcome"]],["impl Sync for RunParameters",1,["air_interpreter_interface::run_parameters::RunParameters"]],["impl Sync for SerializedCallArguments",1,["air_interpreter_interface::call_request_parameters::SerializedCallArguments"]],["impl Sync for SerializedCallRequests",1,["air_interpreter_interface::call_request_parameters::SerializedCallRequests"]],["impl Sync for SerializedCallResults",1,["air_interpreter_interface::call_service_result::SerializedCallResults"]],["impl Sync for SerializedTetraplets",1,["air_interpreter_interface::call_request_parameters::SerializedTetraplets"]],["impl Sync for SoftLimitsTriggering",1,["air_interpreter_interface::interpreter_outcome::SoftLimitsTriggering"]],["impl Sync for TetrapletsRepr",1,["air_interpreter_interface::call_request_parameters::TetrapletsRepr"]]], +"air_interpreter_sede":[["impl Sync for RmpSerdeFormat",1,["air_interpreter_sede::rmp_serde::RmpSerdeFormat"]],["impl Sync for RmpSerdeMultiformat",1,["air_interpreter_sede::rmp_serde::RmpSerdeMultiformat"]],["impl<FormatError> Sync for DecodeError<FormatError>
where\n FormatError: Sync,
",1,["air_interpreter_sede::multiformat::DecodeError"]],["impl<FormatError> Sync for EncodeError<FormatError>
where\n FormatError: Sync,
",1,["air_interpreter_sede::multiformat::EncodeError"]]], +"air_interpreter_signatures":[["impl !Sync for PeerCidTracker",1,["air_interpreter_signatures::trackers::PeerCidTracker"]],["impl Sync for KeyError",1,["air_interpreter_signatures::KeyError"]],["impl Sync for VerificationError",1,["air_interpreter_signatures::VerificationError"]],["impl Sync for ArchivedPublicKey",1,["air_interpreter_signatures::ArchivedPublicKey"]],["impl Sync for ArchivedSignature",1,["air_interpreter_signatures::ArchivedSignature"]],["impl Sync for KeyPair",1,["air_interpreter_signatures::KeyPair"]],["impl Sync for PublicKey",1,["air_interpreter_signatures::PublicKey"]],["impl Sync for PublicKeyResolver",1,["air_interpreter_signatures::PublicKeyResolver"]],["impl Sync for Signature",1,["air_interpreter_signatures::Signature"]],["impl Sync for SignatureResolver",1,["air_interpreter_signatures::SignatureResolver"]],["impl<Key = PublicKey, Sign = Signature> !Sync for ArchivedSignatureStore<Key, Sign>",1,["air_interpreter_signatures::stores::ArchivedSignatureStore"]],["impl<Key = PublicKey, Sign = Signature> !Sync for SignatureStoreResolver<Key, Sign>",1,["air_interpreter_signatures::stores::SignatureStoreResolver"]],["impl<Key, Sign> Sync for SignatureStore<Key, Sign>
where\n Key: Sync,\n Sign: Sync,
",1,["air_interpreter_signatures::stores::SignatureStore"]]], +"air_interpreter_value":[["impl !Sync for JValue",1,["air_interpreter_value::value::JValue"]]], +"air_lambda_ast":[["impl Sync for Functor",1,["air_lambda_ast::ast::Functor"]],["impl<'input> Sync for LambdaAST<'input>",1,["air_lambda_ast::ast::LambdaAST"]],["impl<'input> Sync for ValueAccessor<'input>",1,["air_lambda_ast::ast::ValueAccessor"]]], +"air_lambda_parser":[["impl Sync for LexerError",1,["air_lambda_parser::parser::lexer::errors::LexerError"]],["impl<'input> Sync for LambdaParserError<'input>",1,["air_lambda_parser::parser::errors::LambdaParserError"]],["impl<'input> Sync for LambdaASTLexer<'input>",1,["air_lambda_parser::parser::lexer::lambda_ast_lexer::LambdaASTLexer"]]], +"air_parser":[["impl Sync for Number",1,["air_parser::ast::instruction_arguments::Number"]],["impl Sync for Never",1,["air_parser::ast::instructions::Never"]],["impl Sync for Null",1,["air_parser::ast::instructions::Null"]],["impl Sync for Span",1,["air_parser::parser::span::Span"]],["impl Sync for AIRParser",1,["air_parser::parser::air::__parse__AIR::AIRParser"]],["impl Sync for AirPos",1,["air_parser::parser::lexer::text_pos::AirPos"]],["impl<'i> !Sync for ApArgument<'i>",1,["air_parser::ast::instruction_arguments::ApArgument"]],["impl<'i> !Sync for ImmutableValue<'i>",1,["air_parser::ast::instruction_arguments::ImmutableValue"]],["impl<'i> !Sync for Instruction<'i>",1,["air_parser::ast::instructions::Instruction"]],["impl<'i> !Sync for StreamMapKeyClause<'i>",1,["air_parser::ast::instruction_arguments::StreamMapKeyClause"]],["impl<'i> !Sync for Ap<'i>",1,["air_parser::ast::instructions::Ap"]],["impl<'i> !Sync for ApMap<'i>",1,["air_parser::ast::instructions::ApMap"]],["impl<'i> !Sync for Call<'i>",1,["air_parser::ast::instructions::Call"]],["impl<'i> !Sync for FoldScalar<'i>",1,["air_parser::ast::instructions::FoldScalar"]],["impl<'i> !Sync for FoldStream<'i>",1,["air_parser::ast::instructions::FoldStream"]],["impl<'i> !Sync for FoldStreamMap<'i>",1,["air_parser::ast::instructions::FoldStreamMap"]],["impl<'i> !Sync for Match<'i>",1,["air_parser::ast::instructions::Match"]],["impl<'i> !Sync for MisMatch<'i>",1,["air_parser::ast::instructions::MisMatch"]],["impl<'i> !Sync for New<'i>",1,["air_parser::ast::instructions::New"]],["impl<'i> !Sync for Par<'i>",1,["air_parser::ast::instructions::Par"]],["impl<'i> !Sync for Seq<'i>",1,["air_parser::ast::instructions::Seq"]],["impl<'i> !Sync for Xor<'i>",1,["air_parser::ast::instructions::Xor"]],["impl<'i> Sync for ApResult<'i>",1,["air_parser::ast::instruction_arguments::ApResult"]],["impl<'i> Sync for CallOutputValue<'i>",1,["air_parser::ast::instruction_arguments::CallOutputValue"]],["impl<'i> Sync for Fail<'i>",1,["air_parser::ast::instructions::Fail"]],["impl<'i> Sync for FoldScalarIterable<'i>",1,["air_parser::ast::instruction_arguments::FoldScalarIterable"]],["impl<'i> Sync for ImmutableVariable<'i>",1,["air_parser::ast::values::ImmutableVariable"]],["impl<'i> Sync for ImmutableVariableWithLambda<'i>",1,["air_parser::ast::values::ImmutableVariableWithLambda"]],["impl<'i> Sync for NewArgument<'i>",1,["air_parser::ast::instruction_arguments::NewArgument"]],["impl<'i> Sync for ResolvableToPeerIdVariable<'i>",1,["air_parser::ast::instruction_arguments::ResolvableToPeerIdVariable"]],["impl<'i> Sync for ResolvableToStringVariable<'i>",1,["air_parser::ast::instruction_arguments::ResolvableToStringVariable"]],["impl<'i> Sync for Canon<'i>",1,["air_parser::ast::instructions::Canon"]],["impl<'i> Sync for CanonMap<'i>",1,["air_parser::ast::instructions::CanonMap"]],["impl<'i> Sync for CanonStream<'i>",1,["air_parser::ast::values::CanonStream"]],["impl<'i> Sync for CanonStreamMap<'i>",1,["air_parser::ast::values::CanonStreamMap"]],["impl<'i> Sync for CanonStreamMapScalar<'i>",1,["air_parser::ast::instructions::CanonStreamMapScalar"]],["impl<'i> Sync for CanonStreamMapWithLambda<'i>",1,["air_parser::ast::values::CanonStreamMapWithLambda"]],["impl<'i> Sync for CanonStreamWithLambda<'i>",1,["air_parser::ast::values::CanonStreamWithLambda"]],["impl<'i> Sync for Next<'i>",1,["air_parser::ast::instructions::Next"]],["impl<'i> Sync for Scalar<'i>",1,["air_parser::ast::values::Scalar"]],["impl<'i> Sync for ScalarWithLambda<'i>",1,["air_parser::ast::values::ScalarWithLambda"]],["impl<'i> Sync for Stream<'i>",1,["air_parser::ast::values::Stream"]],["impl<'i> Sync for StreamMap<'i>",1,["air_parser::ast::values::StreamMap"]],["impl<'i> Sync for Triplet<'i>",1,["air_parser::ast::instruction_arguments::Triplet"]],["impl<'i> Sync for VariableValidator<'i>",1,["air_parser::parser::validator::VariableValidator"]],["impl<'input> Sync for AIRLexer<'input>",1,["air_parser::parser::lexer::air_lexer::AIRLexer"]],["impl<'lens> Sync for InstructionErrorAST<'lens>",1,["air_parser::ast::values::InstructionErrorAST"]]], +"air_test_framework":[["impl !Sync for ServiceDefinition",1,["air_test_framework::asserts::ServiceDefinition"]],["impl !Sync for PeerId",1,["air_test_framework::ephemeral::PeerId"]],["impl !Sync for MarineServiceHandle",1,["air_test_framework::services::MarineServiceHandle"]],["impl Sync for ServiceTagName",1,["air_test_framework::asserts::ServiceTagName"]],["impl Sync for AlterState",1,["air_test_framework::ephemeral::neighborhood::AlterState"]],["impl Sync for FunctionOutcome",1,["air_test_framework::services::FunctionOutcome"]],["impl<R = WasmAirRunner> !Sync for Neighborhood<R>",1,["air_test_framework::ephemeral::neighborhood::Neighborhood"]],["impl<R = WasmAirRunner> !Sync for Network<R>",1,["air_test_framework::ephemeral::Network"]],["impl<R = WasmAirRunner> !Sync for AirScriptExecutor<R>",1,["air_test_framework::execution::AirScriptExecutor"]],["impl<R = WasmAirRunner> !Sync for TransformedAirScript<R>",1,["air_test_framework::transform::walker::TransformedAirScript"]],["impl<R> !Sync for PeerEnv<R>",1,["air_test_framework::ephemeral::neighborhood::PeerEnv"]],["impl<R> !Sync for Peer<R>",1,["air_test_framework::ephemeral::Peer"]]], +"air_test_utils":[["impl !Sync for CanonResultAlike",1,["air_test_utils::executed_state::CanonResultAlike"]],["impl !Sync for ExecutedCallBuilder",1,["air_test_utils::executed_state::ExecutedCallBuilder"]],["impl !Sync for ValueAggregateAlike",1,["air_test_utils::executed_state::ValueAggregateAlike"]],["impl !Sync for ReleaseWasmAirRunner",1,["air_test_utils::wasm_test_runner::ReleaseWasmAirRunner"]],["impl !Sync for WasmAirRunner",1,["air_test_utils::wasm_test_runner::WasmAirRunner"]],["impl Sync for VariableOptionSource",1,["air_test_utils::call_services::VariableOptionSource"]],["impl Sync for NativeAirRunner",1,["air_test_utils::native_test_runner::NativeAirRunner"]],["impl Sync for TestInitParameters",1,["air_test_utils::test_runner::TestInitParameters"]],["impl Sync for TestRunParameters",1,["air_test_utils::test_runner::TestRunParameters"]],["impl<R = WasmAirRunner> !Sync for TestRunner<R>",1,["air_test_utils::test_runner::TestRunner"]]], +"air_trace_handler":[["impl !Sync for GenerationCompactificationError",1,["air_trace_handler::errors::GenerationCompactificationError"]],["impl !Sync for KeeperError",1,["air_trace_handler::data_keeper::errors::KeeperError"]],["impl !Sync for StateFSMError",1,["air_trace_handler::state_automata::errors::StateFSMError"]],["impl !Sync for TraceHandlerError",1,["air_trace_handler::errors::TraceHandlerError"]],["impl !Sync for CallResultError",1,["air_trace_handler::merger::errors::CallResultError"]],["impl !Sync for CanonResultError",1,["air_trace_handler::merger::errors::CanonResultError"]],["impl !Sync for MergeError",1,["air_trace_handler::merger::errors::MergeError"]],["impl !Sync for MergerCallResult",1,["air_trace_handler::merger::call_merger::MergerCallResult"]],["impl !Sync for MergerCanonResult",1,["air_trace_handler::merger::canon_merger::MergerCanonResult"]],["impl !Sync for MetCallResult",1,["air_trace_handler::merger::call_merger::MetCallResult"]],["impl !Sync for TraceHandler",1,["air_trace_handler::handler::TraceHandler"]],["impl Sync for IntConversionError",1,["air_trace_handler::errors::IntConversionError"]],["impl Sync for SubgraphType",1,["air_trace_handler::state_automata::par_fsm::SubgraphType"]],["impl Sync for ApResultError",1,["air_trace_handler::merger::errors::ApResultError"]],["impl Sync for DataType",1,["air_trace_handler::merger::errors::DataType"]],["impl Sync for FoldResultError",1,["air_trace_handler::merger::errors::FoldResultError"]],["impl Sync for MergeCtxType",1,["air_trace_handler::merger::MergeCtxType"]],["impl Sync for MergerApResult",1,["air_trace_handler::merger::ap_merger::MergerApResult"]],["impl Sync for PreparationScheme",1,["air_trace_handler::merger::position_mapping::PreparationScheme"]],["impl Sync for ValueSource",1,["air_trace_handler::merger::ValueSource"]],["impl Sync for MergerFoldResult",1,["air_trace_handler::merger::fold_merger::MergerFoldResult"]],["impl Sync for MergerParResult",1,["air_trace_handler::merger::par_merger::MergerParResult"]],["impl Sync for MetApResult",1,["air_trace_handler::merger::ap_merger::MetApResult"]],["impl Sync for ResolvedFold",1,["air_trace_handler::merger::fold_merger::fold_lore_resolver::ResolvedFold"]],["impl Sync for ResolvedSubTraceDescs",1,["air_trace_handler::merger::fold_merger::fold_lore_resolver::ResolvedSubTraceDescs"]]], +"avm_data_store":[["impl<'data> Sync for AnomalyData<'data>",1,["avm_data_store::AnomalyData"]]], +"avm_interface":[["impl Sync for CallSeDeErrors",1,["avm_interface::CallSeDeErrors"]],["impl Sync for RawAVMOutcome",1,["avm_interface::raw_outcome::RawAVMOutcome"]],["impl Sync for AVMOutcome",1,["avm_interface::outcome::AVMOutcome"]],["impl Sync for CallRequestParams",1,["avm_interface::call_request_parameters::CallRequestParams"]],["impl Sync for CallServiceResult",1,["avm_interface::call_service_result::CallServiceResult"]],["impl Sync for ErrorAVMOutcome",1,["avm_interface::outcome::ErrorAVMOutcome"]],["impl<'ctx> Sync for ParticleParameters<'ctx>",1,["avm_interface::particle_parameters::ParticleParameters"]]], +"avm_server":[["impl Sync for RunnerError",1,["avm_server::errors::RunnerError"]],["impl Sync for AVMMemoryStats",1,["avm_server::runner::AVMMemoryStats"]],["impl Sync for AVMRuntimeLimits",1,["avm_server::runner::AVMRuntimeLimits"]],["impl Sync for AquaVMRuntimeLimits",1,["avm_server::runner::AquaVMRuntimeLimits"]],["impl<E> Sync for AVMError<E>
where\n E: Sync,
",1,["avm_server::errors::AVMError"]],["impl<E> Sync for AVMConfig<E>",1,["avm_server::config::AVMConfig"]],["impl<E, WB> !Sync for AVM<E, WB>",1,["avm_server::avm::AVM"]],["impl<WB> !Sync for AVMRunner<WB>",1,["avm_server::runner::AVMRunner"]]], +"polyplets":[["impl Sync for ResolvedTriplet",1,["polyplets::triplet::ResolvedTriplet"]]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/trait.impl/core/marker/trait.Unpin.js b/trait.impl/core/marker/trait.Unpin.js new file mode 100644 index 00000000..fbab89cf --- /dev/null +++ b/trait.impl/core/marker/trait.Unpin.js @@ -0,0 +1,21 @@ +(function() {var implementors = { +"air":[["impl Unpin for Mode",1,["air::data::Mode"]],["impl Unpin for Subcommand",1,["air::Subcommand"]],["impl Unpin for Mode",1,["air::trace::run::Mode"]],["impl Unpin for Source",1,["air::trace::run::Source"]],["impl Unpin for Message",1,["air::trace::stats::log_data::Message"]],["impl Unpin for Args",1,["air::beautify::Args"]],["impl Unpin for Args",1,["air::data::Args"]],["impl Unpin for ModeArgs",1,["air::data::ModeArgs"]],["impl Unpin for Cli",1,["air::Cli"]],["impl Unpin for AnomalyDataArgs",1,["air::trace::run::data::anomaly::AnomalyDataArgs"]],["impl Unpin for PlainDataArgs",1,["air::trace::run::data::plain::PlainDataArgs"]],["impl Unpin for NativeAvmRunner",1,["air::trace::run::native::NativeAvmRunner"]],["impl Unpin for TestInitParameters",1,["air::trace::run::runner::TestInitParameters"]],["impl Unpin for Args",1,["air::trace::run::Args"]],["impl Unpin for Keys",1,["air::trace::run::Keys"]],["impl Unpin for ModeArgs",1,["air::trace::run::ModeArgs"]],["impl Unpin for WasmAvmRunner",1,["air::trace::run::wasm::WasmAvmRunner"]],["impl Unpin for CloseMessage",1,["air::trace::stats::log_data::CloseMessage"]],["impl Unpin for LogKey",1,["air::trace::stats::log_data::LogKey"]],["impl Unpin for LogRecord",1,["air::trace::stats::log_data::LogRecord"]],["impl Unpin for LogValue",1,["air::trace::stats::log_data::LogValue"]],["impl Unpin for Span",1,["air::trace::stats::log_data::Span"]],["impl Unpin for StatsReport",1,["air::trace::stats::report::StatsReport"]],["impl Unpin for Args",1,["air::trace::stats::Args"]],["impl<'ctx> Unpin for ExecutionData<'ctx>",1,["air::trace::run::data::ExecutionData"]]], +"air_beautifier":[["impl Unpin for BeautifyError",1,["air_beautifier::beautifier::BeautifyError"]],["impl<W> Unpin for Beautifier<W>
where\n W: Unpin,
",1,["air_beautifier::beautifier::Beautifier"]]], +"air_execution_info_collector":[["impl Unpin for ApTracker",1,["air_execution_info_collector::instructions_tracker::ApTracker"]],["impl Unpin for CallTracker",1,["air_execution_info_collector::instructions_tracker::CallTracker"]],["impl Unpin for FoldTracker",1,["air_execution_info_collector::instructions_tracker::FoldTracker"]],["impl Unpin for InstructionTracker",1,["air_execution_info_collector::instructions_tracker::InstructionTracker"]],["impl Unpin for NewTracker",1,["air_execution_info_collector::instructions_tracker::NewTracker"]],["impl Unpin for ParTracker",1,["air_execution_info_collector::instructions_tracker::ParTracker"]]], +"air_interpreter_cid":[["impl Unpin for CidCalculationError",1,["air_interpreter_cid::CidCalculationError"]],["impl Unpin for CidVerificationError",1,["air_interpreter_cid::verify::CidVerificationError"]],["impl<T> !Unpin for ArchivedCID<T>",1,["air_interpreter_cid::ArchivedCID"]],["impl<T> !Unpin for CIDResolver<T>",1,["air_interpreter_cid::CIDResolver"]],["impl<T> Unpin for CID<T>
where\n T: ?Sized,
",1,["air_interpreter_cid::CID"]]], +"air_interpreter_data":[["impl !Unpin for ArchivedCallResult",1,["air_interpreter_data::executed_state::ArchivedCallResult"]],["impl !Unpin for ArchivedCanonResult",1,["air_interpreter_data::executed_state::ArchivedCanonResult"]],["impl !Unpin for ArchivedExecutedState",1,["air_interpreter_data::executed_state::ArchivedExecutedState"]],["impl !Unpin for ArchivedProvenance",1,["air_interpreter_data::executed_state::ArchivedProvenance"]],["impl !Unpin for ArchivedSender",1,["air_interpreter_data::executed_state::ArchivedSender"]],["impl !Unpin for ArchivedValueRef",1,["air_interpreter_data::executed_state::ArchivedValueRef"]],["impl !Unpin for ArchivedApResult",1,["air_interpreter_data::executed_state::ArchivedApResult"]],["impl !Unpin for ArchivedCallServiceFailed",1,["air_interpreter_data::executed_state::ArchivedCallServiceFailed"]],["impl !Unpin for ArchivedCanonCidAggregate",1,["air_interpreter_data::executed_state::ArchivedCanonCidAggregate"]],["impl !Unpin for ArchivedCanonResultCidAggregate",1,["air_interpreter_data::executed_state::ArchivedCanonResultCidAggregate"]],["impl !Unpin for ArchivedCidInfo",1,["air_interpreter_data::cid_info::ArchivedCidInfo"]],["impl !Unpin for ArchivedExecutionTrace",1,["air_interpreter_data::trace::ArchivedExecutionTrace"]],["impl !Unpin for ArchivedFoldResult",1,["air_interpreter_data::executed_state::ArchivedFoldResult"]],["impl !Unpin for ArchivedFoldSubTraceLore",1,["air_interpreter_data::executed_state::ArchivedFoldSubTraceLore"]],["impl !Unpin for ArchivedInterpreterData",1,["air_interpreter_data::interpreter_data::ArchivedInterpreterData"]],["impl !Unpin for ArchivedRawValue",1,["air_interpreter_data::raw_value::ArchivedRawValue"]],["impl !Unpin for ArchivedServiceResultCidAggregate",1,["air_interpreter_data::executed_state::ArchivedServiceResultCidAggregate"]],["impl Unpin for CallResult",1,["air_interpreter_data::executed_state::CallResult"]],["impl Unpin for CallResultResolver",1,["air_interpreter_data::executed_state::CallResultResolver"]],["impl Unpin for CanonResult",1,["air_interpreter_data::executed_state::CanonResult"]],["impl Unpin for CanonResultResolver",1,["air_interpreter_data::executed_state::CanonResultResolver"]],["impl Unpin for CidStoreVerificationError",1,["air_interpreter_data::cid_store::CidStoreVerificationError"]],["impl Unpin for DataDeserializationError",1,["air_interpreter_data::interpreter_data::DataDeserializationError"]],["impl Unpin for ExecutedState",1,["air_interpreter_data::executed_state::ExecutedState"]],["impl Unpin for ExecutedStateResolver",1,["air_interpreter_data::executed_state::ExecutedStateResolver"]],["impl Unpin for Provenance",1,["air_interpreter_data::executed_state::Provenance"]],["impl Unpin for ProvenanceResolver",1,["air_interpreter_data::executed_state::ProvenanceResolver"]],["impl Unpin for Sender",1,["air_interpreter_data::executed_state::Sender"]],["impl Unpin for SenderResolver",1,["air_interpreter_data::executed_state::SenderResolver"]],["impl Unpin for ValueRef",1,["air_interpreter_data::executed_state::ValueRef"]],["impl Unpin for ValueRefResolver",1,["air_interpreter_data::executed_state::ValueRefResolver"]],["impl Unpin for DataVerifierError",1,["air_interpreter_data::interpreter_data::errors::DataVerifierError"]],["impl Unpin for ApResult",1,["air_interpreter_data::executed_state::ApResult"]],["impl Unpin for ApResultResolver",1,["air_interpreter_data::executed_state::ApResultResolver"]],["impl Unpin for ArchivedGenerationIdx",1,["air_interpreter_data::generation_idx::ArchivedGenerationIdx"]],["impl Unpin for ArchivedParResult",1,["air_interpreter_data::executed_state::ArchivedParResult"]],["impl Unpin for ArchivedSubTraceDesc",1,["air_interpreter_data::executed_state::ArchivedSubTraceDesc"]],["impl Unpin for ArchivedTracePos",1,["air_interpreter_data::trace_pos::ArchivedTracePos"]],["impl Unpin for CallServiceFailed",1,["air_interpreter_data::executed_state::CallServiceFailed"]],["impl Unpin for CallServiceFailedResolver",1,["air_interpreter_data::executed_state::CallServiceFailedResolver"]],["impl Unpin for CanonCidAggregate",1,["air_interpreter_data::executed_state::CanonCidAggregate"]],["impl Unpin for CanonCidAggregateResolver",1,["air_interpreter_data::executed_state::CanonCidAggregateResolver"]],["impl Unpin for CanonResultCidAggregate",1,["air_interpreter_data::executed_state::CanonResultCidAggregate"]],["impl Unpin for CanonResultCidAggregateResolver",1,["air_interpreter_data::executed_state::CanonResultCidAggregateResolver"]],["impl Unpin for CidInfo",1,["air_interpreter_data::cid_info::CidInfo"]],["impl Unpin for CidInfoResolver",1,["air_interpreter_data::cid_info::CidInfoResolver"]],["impl Unpin for ExecutionTrace",1,["air_interpreter_data::trace::ExecutionTrace"]],["impl Unpin for ExecutionTraceResolver",1,["air_interpreter_data::trace::ExecutionTraceResolver"]],["impl Unpin for FoldResult",1,["air_interpreter_data::executed_state::FoldResult"]],["impl Unpin for FoldResultResolver",1,["air_interpreter_data::executed_state::FoldResultResolver"]],["impl Unpin for FoldSubTraceLore",1,["air_interpreter_data::executed_state::FoldSubTraceLore"]],["impl Unpin for FoldSubTraceLoreResolver",1,["air_interpreter_data::executed_state::FoldSubTraceLoreResolver"]],["impl Unpin for GenerationIdx",1,["air_interpreter_data::generation_idx::GenerationIdx"]],["impl Unpin for GenerationIdxResolver",1,["air_interpreter_data::generation_idx::GenerationIdxResolver"]],["impl Unpin for InterpreterData",1,["air_interpreter_data::interpreter_data::InterpreterData"]],["impl Unpin for InterpreterDataEnvelopeRepr",1,["air_interpreter_data::interpreter_data::repr::InterpreterDataEnvelopeRepr"]],["impl Unpin for InterpreterDataResolver",1,["air_interpreter_data::interpreter_data::InterpreterDataResolver"]],["impl Unpin for ParResult",1,["air_interpreter_data::executed_state::ParResult"]],["impl Unpin for ParResultResolver",1,["air_interpreter_data::executed_state::ParResultResolver"]],["impl Unpin for RawValue",1,["air_interpreter_data::raw_value::RawValue"]],["impl Unpin for RawValueResolver",1,["air_interpreter_data::raw_value::RawValueResolver"]],["impl Unpin for ServiceResultCidAggregate",1,["air_interpreter_data::executed_state::ServiceResultCidAggregate"]],["impl Unpin for ServiceResultCidAggregateResolver",1,["air_interpreter_data::executed_state::ServiceResultCidAggregateResolver"]],["impl Unpin for SubTraceDesc",1,["air_interpreter_data::executed_state::SubTraceDesc"]],["impl Unpin for SubTraceDescResolver",1,["air_interpreter_data::executed_state::SubTraceDescResolver"]],["impl Unpin for TracePos",1,["air_interpreter_data::trace_pos::TracePos"]],["impl Unpin for TracePosResolver",1,["air_interpreter_data::trace_pos::TracePosResolver"]],["impl Unpin for Versions",1,["air_interpreter_data::interpreter_data::Versions"]],["impl<'a> Unpin for InterpreterDataEnvelope<'a>",1,["air_interpreter_data::interpreter_data::InterpreterDataEnvelope"]],["impl<'data> Unpin for DataVerifier<'data>",1,["air_interpreter_data::interpreter_data::verification::DataVerifier"]],["impl<Val> !Unpin for ArchivedCidStore<Val>",1,["air_interpreter_data::cid_store::ArchivedCidStore"]],["impl<Val> !Unpin for CidStoreResolver<Val>",1,["air_interpreter_data::cid_store::CidStoreResolver"]],["impl<Val> Unpin for CidStore<Val>",1,["air_interpreter_data::cid_store::CidStore"]],["impl<Val> Unpin for CidTracker<Val>",1,["air_interpreter_data::cid_store::CidTracker"]]], +"air_interpreter_interface":[["impl Unpin for CallArgumentsRepr",1,["air_interpreter_interface::call_request_parameters::CallArgumentsRepr"]],["impl Unpin for CallRequestParams",1,["air_interpreter_interface::call_request_parameters::CallRequestParams"]],["impl Unpin for CallRequestsRepr",1,["air_interpreter_interface::call_request_parameters::CallRequestsRepr"]],["impl Unpin for CallResultsRepr",1,["air_interpreter_interface::call_service_result::CallResultsRepr"]],["impl Unpin for CallServiceResult",1,["air_interpreter_interface::call_service_result::CallServiceResult"]],["impl Unpin for InterpreterOutcome",1,["air_interpreter_interface::interpreter_outcome::InterpreterOutcome"]],["impl Unpin for RunParameters",1,["air_interpreter_interface::run_parameters::RunParameters"]],["impl Unpin for SerializedCallArguments",1,["air_interpreter_interface::call_request_parameters::SerializedCallArguments"]],["impl Unpin for SerializedCallRequests",1,["air_interpreter_interface::call_request_parameters::SerializedCallRequests"]],["impl Unpin for SerializedCallResults",1,["air_interpreter_interface::call_service_result::SerializedCallResults"]],["impl Unpin for SerializedTetraplets",1,["air_interpreter_interface::call_request_parameters::SerializedTetraplets"]],["impl Unpin for SoftLimitsTriggering",1,["air_interpreter_interface::interpreter_outcome::SoftLimitsTriggering"]],["impl Unpin for TetrapletsRepr",1,["air_interpreter_interface::call_request_parameters::TetrapletsRepr"]]], +"air_interpreter_sede":[["impl Unpin for RmpSerdeFormat",1,["air_interpreter_sede::rmp_serde::RmpSerdeFormat"]],["impl Unpin for RmpSerdeMultiformat",1,["air_interpreter_sede::rmp_serde::RmpSerdeMultiformat"]],["impl<FormatError> Unpin for DecodeError<FormatError>
where\n FormatError: Unpin,
",1,["air_interpreter_sede::multiformat::DecodeError"]],["impl<FormatError> Unpin for EncodeError<FormatError>
where\n FormatError: Unpin,
",1,["air_interpreter_sede::multiformat::EncodeError"]]], +"air_interpreter_signatures":[["impl !Unpin for ArchivedPublicKey",1,["air_interpreter_signatures::ArchivedPublicKey"]],["impl !Unpin for ArchivedSignature",1,["air_interpreter_signatures::ArchivedSignature"]],["impl Unpin for KeyError",1,["air_interpreter_signatures::KeyError"]],["impl Unpin for VerificationError",1,["air_interpreter_signatures::VerificationError"]],["impl Unpin for KeyPair",1,["air_interpreter_signatures::KeyPair"]],["impl Unpin for PeerCidTracker",1,["air_interpreter_signatures::trackers::PeerCidTracker"]],["impl Unpin for PublicKey",1,["air_interpreter_signatures::PublicKey"]],["impl Unpin for PublicKeyResolver",1,["air_interpreter_signatures::PublicKeyResolver"]],["impl Unpin for Signature",1,["air_interpreter_signatures::Signature"]],["impl Unpin for SignatureResolver",1,["air_interpreter_signatures::SignatureResolver"]],["impl<Key = PublicKey, Sign = Signature> !Unpin for ArchivedSignatureStore<Key, Sign>",1,["air_interpreter_signatures::stores::ArchivedSignatureStore"]],["impl<Key = PublicKey, Sign = Signature> !Unpin for SignatureStoreResolver<Key, Sign>",1,["air_interpreter_signatures::stores::SignatureStoreResolver"]],["impl<Key, Sign> Unpin for SignatureStore<Key, Sign>
where\n Key: Unpin,\n Sign: Unpin,
",1,["air_interpreter_signatures::stores::SignatureStore"]]], +"air_interpreter_value":[["impl Unpin for JValue",1,["air_interpreter_value::value::JValue"]]], +"air_lambda_ast":[["impl Unpin for Functor",1,["air_lambda_ast::ast::Functor"]],["impl<'input> Unpin for LambdaAST<'input>",1,["air_lambda_ast::ast::LambdaAST"]],["impl<'input> Unpin for ValueAccessor<'input>",1,["air_lambda_ast::ast::ValueAccessor"]]], +"air_lambda_parser":[["impl Unpin for LexerError",1,["air_lambda_parser::parser::lexer::errors::LexerError"]],["impl<'input> Unpin for LambdaParserError<'input>",1,["air_lambda_parser::parser::errors::LambdaParserError"]],["impl<'input> Unpin for LambdaASTLexer<'input>",1,["air_lambda_parser::parser::lexer::lambda_ast_lexer::LambdaASTLexer"]]], +"air_parser":[["impl Unpin for Number",1,["air_parser::ast::instruction_arguments::Number"]],["impl Unpin for Never",1,["air_parser::ast::instructions::Never"]],["impl Unpin for Null",1,["air_parser::ast::instructions::Null"]],["impl Unpin for Span",1,["air_parser::parser::span::Span"]],["impl Unpin for AIRParser",1,["air_parser::parser::air::__parse__AIR::AIRParser"]],["impl Unpin for AirPos",1,["air_parser::parser::lexer::text_pos::AirPos"]],["impl<'i> Unpin for ApArgument<'i>",1,["air_parser::ast::instruction_arguments::ApArgument"]],["impl<'i> Unpin for ApResult<'i>",1,["air_parser::ast::instruction_arguments::ApResult"]],["impl<'i> Unpin for CallOutputValue<'i>",1,["air_parser::ast::instruction_arguments::CallOutputValue"]],["impl<'i> Unpin for Fail<'i>",1,["air_parser::ast::instructions::Fail"]],["impl<'i> Unpin for FoldScalarIterable<'i>",1,["air_parser::ast::instruction_arguments::FoldScalarIterable"]],["impl<'i> Unpin for ImmutableValue<'i>",1,["air_parser::ast::instruction_arguments::ImmutableValue"]],["impl<'i> Unpin for ImmutableVariable<'i>",1,["air_parser::ast::values::ImmutableVariable"]],["impl<'i> Unpin for ImmutableVariableWithLambda<'i>",1,["air_parser::ast::values::ImmutableVariableWithLambda"]],["impl<'i> Unpin for Instruction<'i>",1,["air_parser::ast::instructions::Instruction"]],["impl<'i> Unpin for NewArgument<'i>",1,["air_parser::ast::instruction_arguments::NewArgument"]],["impl<'i> Unpin for ResolvableToPeerIdVariable<'i>",1,["air_parser::ast::instruction_arguments::ResolvableToPeerIdVariable"]],["impl<'i> Unpin for ResolvableToStringVariable<'i>",1,["air_parser::ast::instruction_arguments::ResolvableToStringVariable"]],["impl<'i> Unpin for StreamMapKeyClause<'i>",1,["air_parser::ast::instruction_arguments::StreamMapKeyClause"]],["impl<'i> Unpin for Ap<'i>",1,["air_parser::ast::instructions::Ap"]],["impl<'i> Unpin for ApMap<'i>",1,["air_parser::ast::instructions::ApMap"]],["impl<'i> Unpin for Call<'i>",1,["air_parser::ast::instructions::Call"]],["impl<'i> Unpin for Canon<'i>",1,["air_parser::ast::instructions::Canon"]],["impl<'i> Unpin for CanonMap<'i>",1,["air_parser::ast::instructions::CanonMap"]],["impl<'i> Unpin for CanonStream<'i>",1,["air_parser::ast::values::CanonStream"]],["impl<'i> Unpin for CanonStreamMap<'i>",1,["air_parser::ast::values::CanonStreamMap"]],["impl<'i> Unpin for CanonStreamMapScalar<'i>",1,["air_parser::ast::instructions::CanonStreamMapScalar"]],["impl<'i> Unpin for CanonStreamMapWithLambda<'i>",1,["air_parser::ast::values::CanonStreamMapWithLambda"]],["impl<'i> Unpin for CanonStreamWithLambda<'i>",1,["air_parser::ast::values::CanonStreamWithLambda"]],["impl<'i> Unpin for FoldScalar<'i>",1,["air_parser::ast::instructions::FoldScalar"]],["impl<'i> Unpin for FoldStream<'i>",1,["air_parser::ast::instructions::FoldStream"]],["impl<'i> Unpin for FoldStreamMap<'i>",1,["air_parser::ast::instructions::FoldStreamMap"]],["impl<'i> Unpin for Match<'i>",1,["air_parser::ast::instructions::Match"]],["impl<'i> Unpin for MisMatch<'i>",1,["air_parser::ast::instructions::MisMatch"]],["impl<'i> Unpin for New<'i>",1,["air_parser::ast::instructions::New"]],["impl<'i> Unpin for Next<'i>",1,["air_parser::ast::instructions::Next"]],["impl<'i> Unpin for Par<'i>",1,["air_parser::ast::instructions::Par"]],["impl<'i> Unpin for Scalar<'i>",1,["air_parser::ast::values::Scalar"]],["impl<'i> Unpin for ScalarWithLambda<'i>",1,["air_parser::ast::values::ScalarWithLambda"]],["impl<'i> Unpin for Seq<'i>",1,["air_parser::ast::instructions::Seq"]],["impl<'i> Unpin for Stream<'i>",1,["air_parser::ast::values::Stream"]],["impl<'i> Unpin for StreamMap<'i>",1,["air_parser::ast::values::StreamMap"]],["impl<'i> Unpin for Triplet<'i>",1,["air_parser::ast::instruction_arguments::Triplet"]],["impl<'i> Unpin for Xor<'i>",1,["air_parser::ast::instructions::Xor"]],["impl<'i> Unpin for VariableValidator<'i>",1,["air_parser::parser::validator::VariableValidator"]],["impl<'input> Unpin for AIRLexer<'input>",1,["air_parser::parser::lexer::air_lexer::AIRLexer"]],["impl<'lens> Unpin for InstructionErrorAST<'lens>",1,["air_parser::ast::values::InstructionErrorAST"]]], +"air_test_framework":[["impl Unpin for ServiceDefinition",1,["air_test_framework::asserts::ServiceDefinition"]],["impl Unpin for ServiceTagName",1,["air_test_framework::asserts::ServiceTagName"]],["impl Unpin for AlterState",1,["air_test_framework::ephemeral::neighborhood::AlterState"]],["impl Unpin for FunctionOutcome",1,["air_test_framework::services::FunctionOutcome"]],["impl Unpin for PeerId",1,["air_test_framework::ephemeral::PeerId"]],["impl Unpin for MarineServiceHandle",1,["air_test_framework::services::MarineServiceHandle"]],["impl<R> Unpin for Neighborhood<R>",1,["air_test_framework::ephemeral::neighborhood::Neighborhood"]],["impl<R> Unpin for PeerEnv<R>
where\n R: Unpin,
",1,["air_test_framework::ephemeral::neighborhood::PeerEnv"]],["impl<R> Unpin for Network<R>",1,["air_test_framework::ephemeral::Network"]],["impl<R> Unpin for Peer<R>
where\n R: Unpin,
",1,["air_test_framework::ephemeral::Peer"]],["impl<R> Unpin for AirScriptExecutor<R>",1,["air_test_framework::execution::AirScriptExecutor"]],["impl<R> Unpin for TransformedAirScript<R>",1,["air_test_framework::transform::walker::TransformedAirScript"]]], +"air_test_utils":[["impl Unpin for VariableOptionSource",1,["air_test_utils::call_services::VariableOptionSource"]],["impl Unpin for CanonResultAlike",1,["air_test_utils::executed_state::CanonResultAlike"]],["impl Unpin for ExecutedCallBuilder",1,["air_test_utils::executed_state::ExecutedCallBuilder"]],["impl Unpin for ValueAggregateAlike",1,["air_test_utils::executed_state::ValueAggregateAlike"]],["impl Unpin for NativeAirRunner",1,["air_test_utils::native_test_runner::NativeAirRunner"]],["impl Unpin for TestInitParameters",1,["air_test_utils::test_runner::TestInitParameters"]],["impl Unpin for TestRunParameters",1,["air_test_utils::test_runner::TestRunParameters"]],["impl Unpin for ReleaseWasmAirRunner",1,["air_test_utils::wasm_test_runner::ReleaseWasmAirRunner"]],["impl Unpin for WasmAirRunner",1,["air_test_utils::wasm_test_runner::WasmAirRunner"]],["impl<R> Unpin for TestRunner<R>
where\n R: Unpin,
",1,["air_test_utils::test_runner::TestRunner"]]], +"air_trace_handler":[["impl Unpin for GenerationCompactificationError",1,["air_trace_handler::errors::GenerationCompactificationError"]],["impl Unpin for IntConversionError",1,["air_trace_handler::errors::IntConversionError"]],["impl Unpin for KeeperError",1,["air_trace_handler::data_keeper::errors::KeeperError"]],["impl Unpin for StateFSMError",1,["air_trace_handler::state_automata::errors::StateFSMError"]],["impl Unpin for SubgraphType",1,["air_trace_handler::state_automata::par_fsm::SubgraphType"]],["impl Unpin for TraceHandlerError",1,["air_trace_handler::errors::TraceHandlerError"]],["impl Unpin for ApResultError",1,["air_trace_handler::merger::errors::ApResultError"]],["impl Unpin for CallResultError",1,["air_trace_handler::merger::errors::CallResultError"]],["impl Unpin for CanonResultError",1,["air_trace_handler::merger::errors::CanonResultError"]],["impl Unpin for DataType",1,["air_trace_handler::merger::errors::DataType"]],["impl Unpin for FoldResultError",1,["air_trace_handler::merger::errors::FoldResultError"]],["impl Unpin for MergeCtxType",1,["air_trace_handler::merger::MergeCtxType"]],["impl Unpin for MergeError",1,["air_trace_handler::merger::errors::MergeError"]],["impl Unpin for MergerApResult",1,["air_trace_handler::merger::ap_merger::MergerApResult"]],["impl Unpin for MergerCallResult",1,["air_trace_handler::merger::call_merger::MergerCallResult"]],["impl Unpin for MergerCanonResult",1,["air_trace_handler::merger::canon_merger::MergerCanonResult"]],["impl Unpin for PreparationScheme",1,["air_trace_handler::merger::position_mapping::PreparationScheme"]],["impl Unpin for ValueSource",1,["air_trace_handler::merger::ValueSource"]],["impl Unpin for MergerFoldResult",1,["air_trace_handler::merger::fold_merger::MergerFoldResult"]],["impl Unpin for MergerParResult",1,["air_trace_handler::merger::par_merger::MergerParResult"]],["impl Unpin for MetApResult",1,["air_trace_handler::merger::ap_merger::MetApResult"]],["impl Unpin for MetCallResult",1,["air_trace_handler::merger::call_merger::MetCallResult"]],["impl Unpin for ResolvedFold",1,["air_trace_handler::merger::fold_merger::fold_lore_resolver::ResolvedFold"]],["impl Unpin for ResolvedSubTraceDescs",1,["air_trace_handler::merger::fold_merger::fold_lore_resolver::ResolvedSubTraceDescs"]],["impl Unpin for TraceHandler",1,["air_trace_handler::handler::TraceHandler"]]], +"avm_data_store":[["impl<'data> Unpin for AnomalyData<'data>",1,["avm_data_store::AnomalyData"]]], +"avm_interface":[["impl Unpin for CallSeDeErrors",1,["avm_interface::CallSeDeErrors"]],["impl Unpin for RawAVMOutcome",1,["avm_interface::raw_outcome::RawAVMOutcome"]],["impl Unpin for AVMOutcome",1,["avm_interface::outcome::AVMOutcome"]],["impl Unpin for CallRequestParams",1,["avm_interface::call_request_parameters::CallRequestParams"]],["impl Unpin for CallServiceResult",1,["avm_interface::call_service_result::CallServiceResult"]],["impl Unpin for ErrorAVMOutcome",1,["avm_interface::outcome::ErrorAVMOutcome"]],["impl<'ctx> Unpin for ParticleParameters<'ctx>",1,["avm_interface::particle_parameters::ParticleParameters"]]], +"avm_server":[["impl Unpin for RunnerError",1,["avm_server::errors::RunnerError"]],["impl Unpin for AVMMemoryStats",1,["avm_server::runner::AVMMemoryStats"]],["impl Unpin for AVMRuntimeLimits",1,["avm_server::runner::AVMRuntimeLimits"]],["impl Unpin for AquaVMRuntimeLimits",1,["avm_server::runner::AquaVMRuntimeLimits"]],["impl<E> Unpin for AVMError<E>
where\n E: Unpin,
",1,["avm_server::errors::AVMError"]],["impl<E> Unpin for AVMConfig<E>",1,["avm_server::config::AVMConfig"]],["impl<E, WB> Unpin for AVM<E, WB>
where\n WB: Unpin,\n <WB as WasmBackend>::Store: Unpin,
",1,["avm_server::avm::AVM"]],["impl<WB> Unpin for AVMRunner<WB>
where\n WB: Unpin,\n <WB as WasmBackend>::Store: Unpin,
",1,["avm_server::runner::AVMRunner"]]], +"polyplets":[["impl Unpin for ResolvedTriplet",1,["polyplets::triplet::ResolvedTriplet"]]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/trait.impl/core/ops/arith/trait.Add.js b/trait.impl/core/ops/arith/trait.Add.js new file mode 100644 index 00000000..5de92e93 --- /dev/null +++ b/trait.impl/core/ops/arith/trait.Add.js @@ -0,0 +1,4 @@ +(function() {var implementors = { +"air_interpreter_data":[["impl Add for TracePos"],["impl Add<u32> for TracePos"]], +"air_parser":[["impl Add<usize> for AirPos"]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/trait.impl/core/ops/arith/trait.AddAssign.js b/trait.impl/core/ops/arith/trait.AddAssign.js new file mode 100644 index 00000000..65901ec2 --- /dev/null +++ b/trait.impl/core/ops/arith/trait.AddAssign.js @@ -0,0 +1,3 @@ +(function() {var implementors = { +"air_interpreter_data":[["impl AddAssign for TracePos"],["impl AddAssign<u32> for TracePos"]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/trait.impl/core/ops/arith/trait.Sub.js b/trait.impl/core/ops/arith/trait.Sub.js new file mode 100644 index 00000000..c4de0c99 --- /dev/null +++ b/trait.impl/core/ops/arith/trait.Sub.js @@ -0,0 +1,4 @@ +(function() {var implementors = { +"air_interpreter_data":[["impl Sub for TracePos"],["impl Sub<u32> for TracePos"]], +"air_parser":[["impl Sub for AirPos"],["impl Sub<usize> for AirPos"]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/trait.impl/core/ops/deref/trait.Deref.js b/trait.impl/core/ops/deref/trait.Deref.js new file mode 100644 index 00000000..a8c78509 --- /dev/null +++ b/trait.impl/core/ops/deref/trait.Deref.js @@ -0,0 +1,5 @@ +(function() {var implementors = { +"air_interpreter_data":[["impl Deref for ExecutionTrace"]], +"air_interpreter_interface":[["impl Deref for SerializedCallArguments"],["impl Deref for SerializedCallRequests"],["impl Deref for SerializedCallResults"],["impl Deref for SerializedTetraplets"]], +"air_test_framework":[["impl Deref for PeerId"],["impl<R> Deref for TransformedAirScript<R>"]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/trait.impl/core/ops/index/trait.Index.js b/trait.impl/core/ops/index/trait.Index.js new file mode 100644 index 00000000..42f02c4b --- /dev/null +++ b/trait.impl/core/ops/index/trait.Index.js @@ -0,0 +1,4 @@ +(function() {var implementors = { +"air_interpreter_data":[["impl Index<TracePos> for ExecutionTrace"]], +"air_interpreter_value":[["impl<I> Index<I> for JValue
where\n I: Index,
"]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/trait.impl/core/ops/index/trait.IndexMut.js b/trait.impl/core/ops/index/trait.IndexMut.js new file mode 100644 index 00000000..f9abcdcd --- /dev/null +++ b/trait.impl/core/ops/index/trait.IndexMut.js @@ -0,0 +1,3 @@ +(function() {var implementors = { +"air_interpreter_data":[["impl IndexMut<TracePos> for ExecutionTrace"]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/trait.impl/core/panic/unwind_safe/trait.RefUnwindSafe.js b/trait.impl/core/panic/unwind_safe/trait.RefUnwindSafe.js new file mode 100644 index 00000000..c2f08e61 --- /dev/null +++ b/trait.impl/core/panic/unwind_safe/trait.RefUnwindSafe.js @@ -0,0 +1,21 @@ +(function() {var implementors = { +"air":[["impl !RefUnwindSafe for WasmAvmRunner",1,["air::trace::run::wasm::WasmAvmRunner"]],["impl RefUnwindSafe for Mode",1,["air::data::Mode"]],["impl RefUnwindSafe for Subcommand",1,["air::Subcommand"]],["impl RefUnwindSafe for Mode",1,["air::trace::run::Mode"]],["impl RefUnwindSafe for Source",1,["air::trace::run::Source"]],["impl RefUnwindSafe for Message",1,["air::trace::stats::log_data::Message"]],["impl RefUnwindSafe for Args",1,["air::beautify::Args"]],["impl RefUnwindSafe for Args",1,["air::data::Args"]],["impl RefUnwindSafe for ModeArgs",1,["air::data::ModeArgs"]],["impl RefUnwindSafe for Cli",1,["air::Cli"]],["impl RefUnwindSafe for AnomalyDataArgs",1,["air::trace::run::data::anomaly::AnomalyDataArgs"]],["impl RefUnwindSafe for PlainDataArgs",1,["air::trace::run::data::plain::PlainDataArgs"]],["impl RefUnwindSafe for NativeAvmRunner",1,["air::trace::run::native::NativeAvmRunner"]],["impl RefUnwindSafe for TestInitParameters",1,["air::trace::run::runner::TestInitParameters"]],["impl RefUnwindSafe for Args",1,["air::trace::run::Args"]],["impl RefUnwindSafe for Keys",1,["air::trace::run::Keys"]],["impl RefUnwindSafe for ModeArgs",1,["air::trace::run::ModeArgs"]],["impl RefUnwindSafe for CloseMessage",1,["air::trace::stats::log_data::CloseMessage"]],["impl RefUnwindSafe for LogKey",1,["air::trace::stats::log_data::LogKey"]],["impl RefUnwindSafe for LogRecord",1,["air::trace::stats::log_data::LogRecord"]],["impl RefUnwindSafe for LogValue",1,["air::trace::stats::log_data::LogValue"]],["impl RefUnwindSafe for Span",1,["air::trace::stats::log_data::Span"]],["impl RefUnwindSafe for StatsReport",1,["air::trace::stats::report::StatsReport"]],["impl RefUnwindSafe for Args",1,["air::trace::stats::Args"]],["impl<'ctx> RefUnwindSafe for ExecutionData<'ctx>",1,["air::trace::run::data::ExecutionData"]]], +"air_beautifier":[["impl !RefUnwindSafe for BeautifyError",1,["air_beautifier::beautifier::BeautifyError"]],["impl<W> RefUnwindSafe for Beautifier<W>
where\n W: RefUnwindSafe,
",1,["air_beautifier::beautifier::Beautifier"]]], +"air_execution_info_collector":[["impl RefUnwindSafe for ApTracker",1,["air_execution_info_collector::instructions_tracker::ApTracker"]],["impl RefUnwindSafe for CallTracker",1,["air_execution_info_collector::instructions_tracker::CallTracker"]],["impl RefUnwindSafe for FoldTracker",1,["air_execution_info_collector::instructions_tracker::FoldTracker"]],["impl RefUnwindSafe for InstructionTracker",1,["air_execution_info_collector::instructions_tracker::InstructionTracker"]],["impl RefUnwindSafe for NewTracker",1,["air_execution_info_collector::instructions_tracker::NewTracker"]],["impl RefUnwindSafe for ParTracker",1,["air_execution_info_collector::instructions_tracker::ParTracker"]]], +"air_interpreter_cid":[["impl !RefUnwindSafe for CidCalculationError",1,["air_interpreter_cid::CidCalculationError"]],["impl !RefUnwindSafe for CidVerificationError",1,["air_interpreter_cid::verify::CidVerificationError"]],["impl<T> !RefUnwindSafe for ArchivedCID<T>",1,["air_interpreter_cid::ArchivedCID"]],["impl<T> !RefUnwindSafe for CIDResolver<T>",1,["air_interpreter_cid::CIDResolver"]],["impl<T> RefUnwindSafe for CID<T>
where\n T: RefUnwindSafe + ?Sized,
",1,["air_interpreter_cid::CID"]]], +"air_interpreter_data":[["impl !RefUnwindSafe for CallResult",1,["air_interpreter_data::executed_state::CallResult"]],["impl !RefUnwindSafe for CanonResult",1,["air_interpreter_data::executed_state::CanonResult"]],["impl !RefUnwindSafe for CidStoreVerificationError",1,["air_interpreter_data::cid_store::CidStoreVerificationError"]],["impl !RefUnwindSafe for DataDeserializationError",1,["air_interpreter_data::interpreter_data::DataDeserializationError"]],["impl !RefUnwindSafe for ExecutedState",1,["air_interpreter_data::executed_state::ExecutedState"]],["impl !RefUnwindSafe for Provenance",1,["air_interpreter_data::executed_state::Provenance"]],["impl !RefUnwindSafe for ValueRef",1,["air_interpreter_data::executed_state::ValueRef"]],["impl !RefUnwindSafe for DataVerifierError",1,["air_interpreter_data::interpreter_data::errors::DataVerifierError"]],["impl !RefUnwindSafe for CanonCidAggregate",1,["air_interpreter_data::executed_state::CanonCidAggregate"]],["impl !RefUnwindSafe for CanonResultCidAggregate",1,["air_interpreter_data::executed_state::CanonResultCidAggregate"]],["impl !RefUnwindSafe for CidInfo",1,["air_interpreter_data::cid_info::CidInfo"]],["impl !RefUnwindSafe for ExecutionTrace",1,["air_interpreter_data::trace::ExecutionTrace"]],["impl !RefUnwindSafe for InterpreterData",1,["air_interpreter_data::interpreter_data::InterpreterData"]],["impl !RefUnwindSafe for RawValue",1,["air_interpreter_data::raw_value::RawValue"]],["impl !RefUnwindSafe for ServiceResultCidAggregate",1,["air_interpreter_data::executed_state::ServiceResultCidAggregate"]],["impl RefUnwindSafe for ArchivedCallResult",1,["air_interpreter_data::executed_state::ArchivedCallResult"]],["impl RefUnwindSafe for ArchivedCanonResult",1,["air_interpreter_data::executed_state::ArchivedCanonResult"]],["impl RefUnwindSafe for ArchivedExecutedState",1,["air_interpreter_data::executed_state::ArchivedExecutedState"]],["impl RefUnwindSafe for ArchivedProvenance",1,["air_interpreter_data::executed_state::ArchivedProvenance"]],["impl RefUnwindSafe for ArchivedSender",1,["air_interpreter_data::executed_state::ArchivedSender"]],["impl RefUnwindSafe for ArchivedValueRef",1,["air_interpreter_data::executed_state::ArchivedValueRef"]],["impl RefUnwindSafe for CallResultResolver",1,["air_interpreter_data::executed_state::CallResultResolver"]],["impl RefUnwindSafe for CanonResultResolver",1,["air_interpreter_data::executed_state::CanonResultResolver"]],["impl RefUnwindSafe for ExecutedStateResolver",1,["air_interpreter_data::executed_state::ExecutedStateResolver"]],["impl RefUnwindSafe for ProvenanceResolver",1,["air_interpreter_data::executed_state::ProvenanceResolver"]],["impl RefUnwindSafe for Sender",1,["air_interpreter_data::executed_state::Sender"]],["impl RefUnwindSafe for SenderResolver",1,["air_interpreter_data::executed_state::SenderResolver"]],["impl RefUnwindSafe for ValueRefResolver",1,["air_interpreter_data::executed_state::ValueRefResolver"]],["impl RefUnwindSafe for ApResult",1,["air_interpreter_data::executed_state::ApResult"]],["impl RefUnwindSafe for ApResultResolver",1,["air_interpreter_data::executed_state::ApResultResolver"]],["impl RefUnwindSafe for ArchivedApResult",1,["air_interpreter_data::executed_state::ArchivedApResult"]],["impl RefUnwindSafe for ArchivedCallServiceFailed",1,["air_interpreter_data::executed_state::ArchivedCallServiceFailed"]],["impl RefUnwindSafe for ArchivedCanonCidAggregate",1,["air_interpreter_data::executed_state::ArchivedCanonCidAggregate"]],["impl RefUnwindSafe for ArchivedCanonResultCidAggregate",1,["air_interpreter_data::executed_state::ArchivedCanonResultCidAggregate"]],["impl RefUnwindSafe for ArchivedCidInfo",1,["air_interpreter_data::cid_info::ArchivedCidInfo"]],["impl RefUnwindSafe for ArchivedExecutionTrace",1,["air_interpreter_data::trace::ArchivedExecutionTrace"]],["impl RefUnwindSafe for ArchivedFoldResult",1,["air_interpreter_data::executed_state::ArchivedFoldResult"]],["impl RefUnwindSafe for ArchivedFoldSubTraceLore",1,["air_interpreter_data::executed_state::ArchivedFoldSubTraceLore"]],["impl RefUnwindSafe for ArchivedGenerationIdx",1,["air_interpreter_data::generation_idx::ArchivedGenerationIdx"]],["impl RefUnwindSafe for ArchivedInterpreterData",1,["air_interpreter_data::interpreter_data::ArchivedInterpreterData"]],["impl RefUnwindSafe for ArchivedParResult",1,["air_interpreter_data::executed_state::ArchivedParResult"]],["impl RefUnwindSafe for ArchivedRawValue",1,["air_interpreter_data::raw_value::ArchivedRawValue"]],["impl RefUnwindSafe for ArchivedServiceResultCidAggregate",1,["air_interpreter_data::executed_state::ArchivedServiceResultCidAggregate"]],["impl RefUnwindSafe for ArchivedSubTraceDesc",1,["air_interpreter_data::executed_state::ArchivedSubTraceDesc"]],["impl RefUnwindSafe for ArchivedTracePos",1,["air_interpreter_data::trace_pos::ArchivedTracePos"]],["impl RefUnwindSafe for CallServiceFailed",1,["air_interpreter_data::executed_state::CallServiceFailed"]],["impl RefUnwindSafe for CallServiceFailedResolver",1,["air_interpreter_data::executed_state::CallServiceFailedResolver"]],["impl RefUnwindSafe for CanonCidAggregateResolver",1,["air_interpreter_data::executed_state::CanonCidAggregateResolver"]],["impl RefUnwindSafe for CanonResultCidAggregateResolver",1,["air_interpreter_data::executed_state::CanonResultCidAggregateResolver"]],["impl RefUnwindSafe for CidInfoResolver",1,["air_interpreter_data::cid_info::CidInfoResolver"]],["impl RefUnwindSafe for ExecutionTraceResolver",1,["air_interpreter_data::trace::ExecutionTraceResolver"]],["impl RefUnwindSafe for FoldResult",1,["air_interpreter_data::executed_state::FoldResult"]],["impl RefUnwindSafe for FoldResultResolver",1,["air_interpreter_data::executed_state::FoldResultResolver"]],["impl RefUnwindSafe for FoldSubTraceLore",1,["air_interpreter_data::executed_state::FoldSubTraceLore"]],["impl RefUnwindSafe for FoldSubTraceLoreResolver",1,["air_interpreter_data::executed_state::FoldSubTraceLoreResolver"]],["impl RefUnwindSafe for GenerationIdx",1,["air_interpreter_data::generation_idx::GenerationIdx"]],["impl RefUnwindSafe for GenerationIdxResolver",1,["air_interpreter_data::generation_idx::GenerationIdxResolver"]],["impl RefUnwindSafe for InterpreterDataEnvelopeRepr",1,["air_interpreter_data::interpreter_data::repr::InterpreterDataEnvelopeRepr"]],["impl RefUnwindSafe for InterpreterDataResolver",1,["air_interpreter_data::interpreter_data::InterpreterDataResolver"]],["impl RefUnwindSafe for ParResult",1,["air_interpreter_data::executed_state::ParResult"]],["impl RefUnwindSafe for ParResultResolver",1,["air_interpreter_data::executed_state::ParResultResolver"]],["impl RefUnwindSafe for RawValueResolver",1,["air_interpreter_data::raw_value::RawValueResolver"]],["impl RefUnwindSafe for ServiceResultCidAggregateResolver",1,["air_interpreter_data::executed_state::ServiceResultCidAggregateResolver"]],["impl RefUnwindSafe for SubTraceDesc",1,["air_interpreter_data::executed_state::SubTraceDesc"]],["impl RefUnwindSafe for SubTraceDescResolver",1,["air_interpreter_data::executed_state::SubTraceDescResolver"]],["impl RefUnwindSafe for TracePos",1,["air_interpreter_data::trace_pos::TracePos"]],["impl RefUnwindSafe for TracePosResolver",1,["air_interpreter_data::trace_pos::TracePosResolver"]],["impl RefUnwindSafe for Versions",1,["air_interpreter_data::interpreter_data::Versions"]],["impl<'a> RefUnwindSafe for InterpreterDataEnvelope<'a>",1,["air_interpreter_data::interpreter_data::InterpreterDataEnvelope"]],["impl<'data> RefUnwindSafe for DataVerifier<'data>",1,["air_interpreter_data::interpreter_data::verification::DataVerifier"]],["impl<Val> !RefUnwindSafe for ArchivedCidStore<Val>",1,["air_interpreter_data::cid_store::ArchivedCidStore"]],["impl<Val> !RefUnwindSafe for CidStoreResolver<Val>",1,["air_interpreter_data::cid_store::CidStoreResolver"]],["impl<Val> RefUnwindSafe for CidStore<Val>
where\n Val: RefUnwindSafe,
",1,["air_interpreter_data::cid_store::CidStore"]],["impl<Val> RefUnwindSafe for CidTracker<Val>
where\n Val: RefUnwindSafe,
",1,["air_interpreter_data::cid_store::CidTracker"]]], +"air_interpreter_interface":[["impl RefUnwindSafe for CallArgumentsRepr",1,["air_interpreter_interface::call_request_parameters::CallArgumentsRepr"]],["impl RefUnwindSafe for CallRequestParams",1,["air_interpreter_interface::call_request_parameters::CallRequestParams"]],["impl RefUnwindSafe for CallRequestsRepr",1,["air_interpreter_interface::call_request_parameters::CallRequestsRepr"]],["impl RefUnwindSafe for CallResultsRepr",1,["air_interpreter_interface::call_service_result::CallResultsRepr"]],["impl RefUnwindSafe for CallServiceResult",1,["air_interpreter_interface::call_service_result::CallServiceResult"]],["impl RefUnwindSafe for InterpreterOutcome",1,["air_interpreter_interface::interpreter_outcome::InterpreterOutcome"]],["impl RefUnwindSafe for RunParameters",1,["air_interpreter_interface::run_parameters::RunParameters"]],["impl RefUnwindSafe for SerializedCallArguments",1,["air_interpreter_interface::call_request_parameters::SerializedCallArguments"]],["impl RefUnwindSafe for SerializedCallRequests",1,["air_interpreter_interface::call_request_parameters::SerializedCallRequests"]],["impl RefUnwindSafe for SerializedCallResults",1,["air_interpreter_interface::call_service_result::SerializedCallResults"]],["impl RefUnwindSafe for SerializedTetraplets",1,["air_interpreter_interface::call_request_parameters::SerializedTetraplets"]],["impl RefUnwindSafe for SoftLimitsTriggering",1,["air_interpreter_interface::interpreter_outcome::SoftLimitsTriggering"]],["impl RefUnwindSafe for TetrapletsRepr",1,["air_interpreter_interface::call_request_parameters::TetrapletsRepr"]]], +"air_interpreter_sede":[["impl RefUnwindSafe for RmpSerdeFormat",1,["air_interpreter_sede::rmp_serde::RmpSerdeFormat"]],["impl RefUnwindSafe for RmpSerdeMultiformat",1,["air_interpreter_sede::rmp_serde::RmpSerdeMultiformat"]],["impl<FormatError> !RefUnwindSafe for EncodeError<FormatError>",1,["air_interpreter_sede::multiformat::EncodeError"]],["impl<FormatError> RefUnwindSafe for DecodeError<FormatError>
where\n FormatError: RefUnwindSafe,
",1,["air_interpreter_sede::multiformat::DecodeError"]]], +"air_interpreter_signatures":[["impl !RefUnwindSafe for KeyError",1,["air_interpreter_signatures::KeyError"]],["impl !RefUnwindSafe for VerificationError",1,["air_interpreter_signatures::VerificationError"]],["impl RefUnwindSafe for ArchivedPublicKey",1,["air_interpreter_signatures::ArchivedPublicKey"]],["impl RefUnwindSafe for ArchivedSignature",1,["air_interpreter_signatures::ArchivedSignature"]],["impl RefUnwindSafe for KeyPair",1,["air_interpreter_signatures::KeyPair"]],["impl RefUnwindSafe for PeerCidTracker",1,["air_interpreter_signatures::trackers::PeerCidTracker"]],["impl RefUnwindSafe for PublicKey",1,["air_interpreter_signatures::PublicKey"]],["impl RefUnwindSafe for PublicKeyResolver",1,["air_interpreter_signatures::PublicKeyResolver"]],["impl RefUnwindSafe for Signature",1,["air_interpreter_signatures::Signature"]],["impl RefUnwindSafe for SignatureResolver",1,["air_interpreter_signatures::SignatureResolver"]],["impl<Key = PublicKey, Sign = Signature> !RefUnwindSafe for ArchivedSignatureStore<Key, Sign>",1,["air_interpreter_signatures::stores::ArchivedSignatureStore"]],["impl<Key = PublicKey, Sign = Signature> !RefUnwindSafe for SignatureStoreResolver<Key, Sign>",1,["air_interpreter_signatures::stores::SignatureStoreResolver"]],["impl<Key, Sign> RefUnwindSafe for SignatureStore<Key, Sign>
where\n Key: RefUnwindSafe,\n Sign: RefUnwindSafe,
",1,["air_interpreter_signatures::stores::SignatureStore"]]], +"air_interpreter_value":[["impl RefUnwindSafe for JValue",1,["air_interpreter_value::value::JValue"]]], +"air_lambda_ast":[["impl RefUnwindSafe for Functor",1,["air_lambda_ast::ast::Functor"]],["impl<'input> RefUnwindSafe for LambdaAST<'input>",1,["air_lambda_ast::ast::LambdaAST"]],["impl<'input> RefUnwindSafe for ValueAccessor<'input>",1,["air_lambda_ast::ast::ValueAccessor"]]], +"air_lambda_parser":[["impl RefUnwindSafe for LexerError",1,["air_lambda_parser::parser::lexer::errors::LexerError"]],["impl<'input> RefUnwindSafe for LambdaParserError<'input>",1,["air_lambda_parser::parser::errors::LambdaParserError"]],["impl<'input> RefUnwindSafe for LambdaASTLexer<'input>",1,["air_lambda_parser::parser::lexer::lambda_ast_lexer::LambdaASTLexer"]]], +"air_parser":[["impl RefUnwindSafe for Number",1,["air_parser::ast::instruction_arguments::Number"]],["impl RefUnwindSafe for Never",1,["air_parser::ast::instructions::Never"]],["impl RefUnwindSafe for Null",1,["air_parser::ast::instructions::Null"]],["impl RefUnwindSafe for Span",1,["air_parser::parser::span::Span"]],["impl RefUnwindSafe for AIRParser",1,["air_parser::parser::air::__parse__AIR::AIRParser"]],["impl RefUnwindSafe for AirPos",1,["air_parser::parser::lexer::text_pos::AirPos"]],["impl<'i> RefUnwindSafe for ApArgument<'i>",1,["air_parser::ast::instruction_arguments::ApArgument"]],["impl<'i> RefUnwindSafe for ApResult<'i>",1,["air_parser::ast::instruction_arguments::ApResult"]],["impl<'i> RefUnwindSafe for CallOutputValue<'i>",1,["air_parser::ast::instruction_arguments::CallOutputValue"]],["impl<'i> RefUnwindSafe for Fail<'i>",1,["air_parser::ast::instructions::Fail"]],["impl<'i> RefUnwindSafe for FoldScalarIterable<'i>",1,["air_parser::ast::instruction_arguments::FoldScalarIterable"]],["impl<'i> RefUnwindSafe for ImmutableValue<'i>",1,["air_parser::ast::instruction_arguments::ImmutableValue"]],["impl<'i> RefUnwindSafe for ImmutableVariable<'i>",1,["air_parser::ast::values::ImmutableVariable"]],["impl<'i> RefUnwindSafe for ImmutableVariableWithLambda<'i>",1,["air_parser::ast::values::ImmutableVariableWithLambda"]],["impl<'i> RefUnwindSafe for Instruction<'i>",1,["air_parser::ast::instructions::Instruction"]],["impl<'i> RefUnwindSafe for NewArgument<'i>",1,["air_parser::ast::instruction_arguments::NewArgument"]],["impl<'i> RefUnwindSafe for ResolvableToPeerIdVariable<'i>",1,["air_parser::ast::instruction_arguments::ResolvableToPeerIdVariable"]],["impl<'i> RefUnwindSafe for ResolvableToStringVariable<'i>",1,["air_parser::ast::instruction_arguments::ResolvableToStringVariable"]],["impl<'i> RefUnwindSafe for StreamMapKeyClause<'i>",1,["air_parser::ast::instruction_arguments::StreamMapKeyClause"]],["impl<'i> RefUnwindSafe for Ap<'i>",1,["air_parser::ast::instructions::Ap"]],["impl<'i> RefUnwindSafe for ApMap<'i>",1,["air_parser::ast::instructions::ApMap"]],["impl<'i> RefUnwindSafe for Call<'i>",1,["air_parser::ast::instructions::Call"]],["impl<'i> RefUnwindSafe for Canon<'i>",1,["air_parser::ast::instructions::Canon"]],["impl<'i> RefUnwindSafe for CanonMap<'i>",1,["air_parser::ast::instructions::CanonMap"]],["impl<'i> RefUnwindSafe for CanonStream<'i>",1,["air_parser::ast::values::CanonStream"]],["impl<'i> RefUnwindSafe for CanonStreamMap<'i>",1,["air_parser::ast::values::CanonStreamMap"]],["impl<'i> RefUnwindSafe for CanonStreamMapScalar<'i>",1,["air_parser::ast::instructions::CanonStreamMapScalar"]],["impl<'i> RefUnwindSafe for CanonStreamMapWithLambda<'i>",1,["air_parser::ast::values::CanonStreamMapWithLambda"]],["impl<'i> RefUnwindSafe for CanonStreamWithLambda<'i>",1,["air_parser::ast::values::CanonStreamWithLambda"]],["impl<'i> RefUnwindSafe for FoldScalar<'i>",1,["air_parser::ast::instructions::FoldScalar"]],["impl<'i> RefUnwindSafe for FoldStream<'i>",1,["air_parser::ast::instructions::FoldStream"]],["impl<'i> RefUnwindSafe for FoldStreamMap<'i>",1,["air_parser::ast::instructions::FoldStreamMap"]],["impl<'i> RefUnwindSafe for Match<'i>",1,["air_parser::ast::instructions::Match"]],["impl<'i> RefUnwindSafe for MisMatch<'i>",1,["air_parser::ast::instructions::MisMatch"]],["impl<'i> RefUnwindSafe for New<'i>",1,["air_parser::ast::instructions::New"]],["impl<'i> RefUnwindSafe for Next<'i>",1,["air_parser::ast::instructions::Next"]],["impl<'i> RefUnwindSafe for Par<'i>",1,["air_parser::ast::instructions::Par"]],["impl<'i> RefUnwindSafe for Scalar<'i>",1,["air_parser::ast::values::Scalar"]],["impl<'i> RefUnwindSafe for ScalarWithLambda<'i>",1,["air_parser::ast::values::ScalarWithLambda"]],["impl<'i> RefUnwindSafe for Seq<'i>",1,["air_parser::ast::instructions::Seq"]],["impl<'i> RefUnwindSafe for Stream<'i>",1,["air_parser::ast::values::Stream"]],["impl<'i> RefUnwindSafe for StreamMap<'i>",1,["air_parser::ast::values::StreamMap"]],["impl<'i> RefUnwindSafe for Triplet<'i>",1,["air_parser::ast::instruction_arguments::Triplet"]],["impl<'i> RefUnwindSafe for Xor<'i>",1,["air_parser::ast::instructions::Xor"]],["impl<'i> RefUnwindSafe for VariableValidator<'i>",1,["air_parser::parser::validator::VariableValidator"]],["impl<'input> RefUnwindSafe for AIRLexer<'input>",1,["air_parser::parser::lexer::air_lexer::AIRLexer"]],["impl<'lens> RefUnwindSafe for InstructionErrorAST<'lens>",1,["air_parser::ast::values::InstructionErrorAST"]]], +"air_test_framework":[["impl !RefUnwindSafe for ServiceDefinition",1,["air_test_framework::asserts::ServiceDefinition"]],["impl !RefUnwindSafe for MarineServiceHandle",1,["air_test_framework::services::MarineServiceHandle"]],["impl RefUnwindSafe for ServiceTagName",1,["air_test_framework::asserts::ServiceTagName"]],["impl RefUnwindSafe for AlterState",1,["air_test_framework::ephemeral::neighborhood::AlterState"]],["impl RefUnwindSafe for FunctionOutcome",1,["air_test_framework::services::FunctionOutcome"]],["impl RefUnwindSafe for PeerId",1,["air_test_framework::ephemeral::PeerId"]],["impl<R = WasmAirRunner> !RefUnwindSafe for Neighborhood<R>",1,["air_test_framework::ephemeral::neighborhood::Neighborhood"]],["impl<R = WasmAirRunner> !RefUnwindSafe for Network<R>",1,["air_test_framework::ephemeral::Network"]],["impl<R = WasmAirRunner> !RefUnwindSafe for AirScriptExecutor<R>",1,["air_test_framework::execution::AirScriptExecutor"]],["impl<R = WasmAirRunner> !RefUnwindSafe for TransformedAirScript<R>",1,["air_test_framework::transform::walker::TransformedAirScript"]],["impl<R> !RefUnwindSafe for PeerEnv<R>",1,["air_test_framework::ephemeral::neighborhood::PeerEnv"]],["impl<R> !RefUnwindSafe for Peer<R>",1,["air_test_framework::ephemeral::Peer"]]], +"air_test_utils":[["impl !RefUnwindSafe for CanonResultAlike",1,["air_test_utils::executed_state::CanonResultAlike"]],["impl !RefUnwindSafe for ValueAggregateAlike",1,["air_test_utils::executed_state::ValueAggregateAlike"]],["impl !RefUnwindSafe for ReleaseWasmAirRunner",1,["air_test_utils::wasm_test_runner::ReleaseWasmAirRunner"]],["impl !RefUnwindSafe for WasmAirRunner",1,["air_test_utils::wasm_test_runner::WasmAirRunner"]],["impl RefUnwindSafe for VariableOptionSource",1,["air_test_utils::call_services::VariableOptionSource"]],["impl RefUnwindSafe for ExecutedCallBuilder",1,["air_test_utils::executed_state::ExecutedCallBuilder"]],["impl RefUnwindSafe for NativeAirRunner",1,["air_test_utils::native_test_runner::NativeAirRunner"]],["impl RefUnwindSafe for TestInitParameters",1,["air_test_utils::test_runner::TestInitParameters"]],["impl RefUnwindSafe for TestRunParameters",1,["air_test_utils::test_runner::TestRunParameters"]],["impl<R = WasmAirRunner> !RefUnwindSafe for TestRunner<R>",1,["air_test_utils::test_runner::TestRunner"]]], +"air_trace_handler":[["impl !RefUnwindSafe for GenerationCompactificationError",1,["air_trace_handler::errors::GenerationCompactificationError"]],["impl !RefUnwindSafe for KeeperError",1,["air_trace_handler::data_keeper::errors::KeeperError"]],["impl !RefUnwindSafe for StateFSMError",1,["air_trace_handler::state_automata::errors::StateFSMError"]],["impl !RefUnwindSafe for TraceHandlerError",1,["air_trace_handler::errors::TraceHandlerError"]],["impl !RefUnwindSafe for CallResultError",1,["air_trace_handler::merger::errors::CallResultError"]],["impl !RefUnwindSafe for CanonResultError",1,["air_trace_handler::merger::errors::CanonResultError"]],["impl !RefUnwindSafe for MergeError",1,["air_trace_handler::merger::errors::MergeError"]],["impl !RefUnwindSafe for MergerCallResult",1,["air_trace_handler::merger::call_merger::MergerCallResult"]],["impl !RefUnwindSafe for MergerCanonResult",1,["air_trace_handler::merger::canon_merger::MergerCanonResult"]],["impl !RefUnwindSafe for MetCallResult",1,["air_trace_handler::merger::call_merger::MetCallResult"]],["impl !RefUnwindSafe for TraceHandler",1,["air_trace_handler::handler::TraceHandler"]],["impl RefUnwindSafe for IntConversionError",1,["air_trace_handler::errors::IntConversionError"]],["impl RefUnwindSafe for SubgraphType",1,["air_trace_handler::state_automata::par_fsm::SubgraphType"]],["impl RefUnwindSafe for ApResultError",1,["air_trace_handler::merger::errors::ApResultError"]],["impl RefUnwindSafe for DataType",1,["air_trace_handler::merger::errors::DataType"]],["impl RefUnwindSafe for FoldResultError",1,["air_trace_handler::merger::errors::FoldResultError"]],["impl RefUnwindSafe for MergeCtxType",1,["air_trace_handler::merger::MergeCtxType"]],["impl RefUnwindSafe for MergerApResult",1,["air_trace_handler::merger::ap_merger::MergerApResult"]],["impl RefUnwindSafe for PreparationScheme",1,["air_trace_handler::merger::position_mapping::PreparationScheme"]],["impl RefUnwindSafe for ValueSource",1,["air_trace_handler::merger::ValueSource"]],["impl RefUnwindSafe for MergerFoldResult",1,["air_trace_handler::merger::fold_merger::MergerFoldResult"]],["impl RefUnwindSafe for MergerParResult",1,["air_trace_handler::merger::par_merger::MergerParResult"]],["impl RefUnwindSafe for MetApResult",1,["air_trace_handler::merger::ap_merger::MetApResult"]],["impl RefUnwindSafe for ResolvedFold",1,["air_trace_handler::merger::fold_merger::fold_lore_resolver::ResolvedFold"]],["impl RefUnwindSafe for ResolvedSubTraceDescs",1,["air_trace_handler::merger::fold_merger::fold_lore_resolver::ResolvedSubTraceDescs"]]], +"avm_data_store":[["impl<'data> RefUnwindSafe for AnomalyData<'data>",1,["avm_data_store::AnomalyData"]]], +"avm_interface":[["impl !RefUnwindSafe for CallSeDeErrors",1,["avm_interface::CallSeDeErrors"]],["impl RefUnwindSafe for RawAVMOutcome",1,["avm_interface::raw_outcome::RawAVMOutcome"]],["impl RefUnwindSafe for AVMOutcome",1,["avm_interface::outcome::AVMOutcome"]],["impl RefUnwindSafe for CallRequestParams",1,["avm_interface::call_request_parameters::CallRequestParams"]],["impl RefUnwindSafe for CallServiceResult",1,["avm_interface::call_service_result::CallServiceResult"]],["impl RefUnwindSafe for ErrorAVMOutcome",1,["avm_interface::outcome::ErrorAVMOutcome"]],["impl<'ctx> RefUnwindSafe for ParticleParameters<'ctx>",1,["avm_interface::particle_parameters::ParticleParameters"]]], +"avm_server":[["impl !RefUnwindSafe for RunnerError",1,["avm_server::errors::RunnerError"]],["impl RefUnwindSafe for AVMMemoryStats",1,["avm_server::runner::AVMMemoryStats"]],["impl RefUnwindSafe for AVMRuntimeLimits",1,["avm_server::runner::AVMRuntimeLimits"]],["impl RefUnwindSafe for AquaVMRuntimeLimits",1,["avm_server::runner::AquaVMRuntimeLimits"]],["impl<E> !RefUnwindSafe for AVMError<E>",1,["avm_server::errors::AVMError"]],["impl<E> !RefUnwindSafe for AVMConfig<E>",1,["avm_server::config::AVMConfig"]],["impl<E, WB> !RefUnwindSafe for AVM<E, WB>",1,["avm_server::avm::AVM"]],["impl<WB> !RefUnwindSafe for AVMRunner<WB>",1,["avm_server::runner::AVMRunner"]]], +"polyplets":[["impl RefUnwindSafe for ResolvedTriplet",1,["polyplets::triplet::ResolvedTriplet"]]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/trait.impl/core/panic/unwind_safe/trait.UnwindSafe.js b/trait.impl/core/panic/unwind_safe/trait.UnwindSafe.js new file mode 100644 index 00000000..11549348 --- /dev/null +++ b/trait.impl/core/panic/unwind_safe/trait.UnwindSafe.js @@ -0,0 +1,21 @@ +(function() {var implementors = { +"air":[["impl !UnwindSafe for WasmAvmRunner",1,["air::trace::run::wasm::WasmAvmRunner"]],["impl UnwindSafe for Mode",1,["air::data::Mode"]],["impl UnwindSafe for Subcommand",1,["air::Subcommand"]],["impl UnwindSafe for Mode",1,["air::trace::run::Mode"]],["impl UnwindSafe for Source",1,["air::trace::run::Source"]],["impl UnwindSafe for Message",1,["air::trace::stats::log_data::Message"]],["impl UnwindSafe for Args",1,["air::beautify::Args"]],["impl UnwindSafe for Args",1,["air::data::Args"]],["impl UnwindSafe for ModeArgs",1,["air::data::ModeArgs"]],["impl UnwindSafe for Cli",1,["air::Cli"]],["impl UnwindSafe for AnomalyDataArgs",1,["air::trace::run::data::anomaly::AnomalyDataArgs"]],["impl UnwindSafe for PlainDataArgs",1,["air::trace::run::data::plain::PlainDataArgs"]],["impl UnwindSafe for NativeAvmRunner",1,["air::trace::run::native::NativeAvmRunner"]],["impl UnwindSafe for TestInitParameters",1,["air::trace::run::runner::TestInitParameters"]],["impl UnwindSafe for Args",1,["air::trace::run::Args"]],["impl UnwindSafe for Keys",1,["air::trace::run::Keys"]],["impl UnwindSafe for ModeArgs",1,["air::trace::run::ModeArgs"]],["impl UnwindSafe for CloseMessage",1,["air::trace::stats::log_data::CloseMessage"]],["impl UnwindSafe for LogKey",1,["air::trace::stats::log_data::LogKey"]],["impl UnwindSafe for LogRecord",1,["air::trace::stats::log_data::LogRecord"]],["impl UnwindSafe for LogValue",1,["air::trace::stats::log_data::LogValue"]],["impl UnwindSafe for Span",1,["air::trace::stats::log_data::Span"]],["impl UnwindSafe for StatsReport",1,["air::trace::stats::report::StatsReport"]],["impl UnwindSafe for Args",1,["air::trace::stats::Args"]],["impl<'ctx> UnwindSafe for ExecutionData<'ctx>",1,["air::trace::run::data::ExecutionData"]]], +"air_beautifier":[["impl !UnwindSafe for BeautifyError",1,["air_beautifier::beautifier::BeautifyError"]],["impl<W> UnwindSafe for Beautifier<W>
where\n W: UnwindSafe,
",1,["air_beautifier::beautifier::Beautifier"]]], +"air_execution_info_collector":[["impl UnwindSafe for ApTracker",1,["air_execution_info_collector::instructions_tracker::ApTracker"]],["impl UnwindSafe for CallTracker",1,["air_execution_info_collector::instructions_tracker::CallTracker"]],["impl UnwindSafe for FoldTracker",1,["air_execution_info_collector::instructions_tracker::FoldTracker"]],["impl UnwindSafe for InstructionTracker",1,["air_execution_info_collector::instructions_tracker::InstructionTracker"]],["impl UnwindSafe for NewTracker",1,["air_execution_info_collector::instructions_tracker::NewTracker"]],["impl UnwindSafe for ParTracker",1,["air_execution_info_collector::instructions_tracker::ParTracker"]]], +"air_interpreter_cid":[["impl !UnwindSafe for CidCalculationError",1,["air_interpreter_cid::CidCalculationError"]],["impl !UnwindSafe for CidVerificationError",1,["air_interpreter_cid::verify::CidVerificationError"]],["impl<T> !UnwindSafe for ArchivedCID<T>",1,["air_interpreter_cid::ArchivedCID"]],["impl<T> !UnwindSafe for CIDResolver<T>",1,["air_interpreter_cid::CIDResolver"]],["impl<T> UnwindSafe for CID<T>
where\n T: RefUnwindSafe + ?Sized,
",1,["air_interpreter_cid::CID"]]], +"air_interpreter_data":[["impl !UnwindSafe for CallResult",1,["air_interpreter_data::executed_state::CallResult"]],["impl !UnwindSafe for CanonResult",1,["air_interpreter_data::executed_state::CanonResult"]],["impl !UnwindSafe for CidStoreVerificationError",1,["air_interpreter_data::cid_store::CidStoreVerificationError"]],["impl !UnwindSafe for DataDeserializationError",1,["air_interpreter_data::interpreter_data::DataDeserializationError"]],["impl !UnwindSafe for ExecutedState",1,["air_interpreter_data::executed_state::ExecutedState"]],["impl !UnwindSafe for Provenance",1,["air_interpreter_data::executed_state::Provenance"]],["impl !UnwindSafe for ValueRef",1,["air_interpreter_data::executed_state::ValueRef"]],["impl !UnwindSafe for DataVerifierError",1,["air_interpreter_data::interpreter_data::errors::DataVerifierError"]],["impl !UnwindSafe for CanonCidAggregate",1,["air_interpreter_data::executed_state::CanonCidAggregate"]],["impl !UnwindSafe for CanonResultCidAggregate",1,["air_interpreter_data::executed_state::CanonResultCidAggregate"]],["impl !UnwindSafe for CidInfo",1,["air_interpreter_data::cid_info::CidInfo"]],["impl !UnwindSafe for ExecutionTrace",1,["air_interpreter_data::trace::ExecutionTrace"]],["impl !UnwindSafe for InterpreterData",1,["air_interpreter_data::interpreter_data::InterpreterData"]],["impl !UnwindSafe for ServiceResultCidAggregate",1,["air_interpreter_data::executed_state::ServiceResultCidAggregate"]],["impl UnwindSafe for ArchivedCallResult",1,["air_interpreter_data::executed_state::ArchivedCallResult"]],["impl UnwindSafe for ArchivedCanonResult",1,["air_interpreter_data::executed_state::ArchivedCanonResult"]],["impl UnwindSafe for ArchivedExecutedState",1,["air_interpreter_data::executed_state::ArchivedExecutedState"]],["impl UnwindSafe for ArchivedProvenance",1,["air_interpreter_data::executed_state::ArchivedProvenance"]],["impl UnwindSafe for ArchivedSender",1,["air_interpreter_data::executed_state::ArchivedSender"]],["impl UnwindSafe for ArchivedValueRef",1,["air_interpreter_data::executed_state::ArchivedValueRef"]],["impl UnwindSafe for CallResultResolver",1,["air_interpreter_data::executed_state::CallResultResolver"]],["impl UnwindSafe for CanonResultResolver",1,["air_interpreter_data::executed_state::CanonResultResolver"]],["impl UnwindSafe for ExecutedStateResolver",1,["air_interpreter_data::executed_state::ExecutedStateResolver"]],["impl UnwindSafe for ProvenanceResolver",1,["air_interpreter_data::executed_state::ProvenanceResolver"]],["impl UnwindSafe for Sender",1,["air_interpreter_data::executed_state::Sender"]],["impl UnwindSafe for SenderResolver",1,["air_interpreter_data::executed_state::SenderResolver"]],["impl UnwindSafe for ValueRefResolver",1,["air_interpreter_data::executed_state::ValueRefResolver"]],["impl UnwindSafe for ApResult",1,["air_interpreter_data::executed_state::ApResult"]],["impl UnwindSafe for ApResultResolver",1,["air_interpreter_data::executed_state::ApResultResolver"]],["impl UnwindSafe for ArchivedApResult",1,["air_interpreter_data::executed_state::ArchivedApResult"]],["impl UnwindSafe for ArchivedCallServiceFailed",1,["air_interpreter_data::executed_state::ArchivedCallServiceFailed"]],["impl UnwindSafe for ArchivedCanonCidAggregate",1,["air_interpreter_data::executed_state::ArchivedCanonCidAggregate"]],["impl UnwindSafe for ArchivedCanonResultCidAggregate",1,["air_interpreter_data::executed_state::ArchivedCanonResultCidAggregate"]],["impl UnwindSafe for ArchivedCidInfo",1,["air_interpreter_data::cid_info::ArchivedCidInfo"]],["impl UnwindSafe for ArchivedExecutionTrace",1,["air_interpreter_data::trace::ArchivedExecutionTrace"]],["impl UnwindSafe for ArchivedFoldResult",1,["air_interpreter_data::executed_state::ArchivedFoldResult"]],["impl UnwindSafe for ArchivedFoldSubTraceLore",1,["air_interpreter_data::executed_state::ArchivedFoldSubTraceLore"]],["impl UnwindSafe for ArchivedGenerationIdx",1,["air_interpreter_data::generation_idx::ArchivedGenerationIdx"]],["impl UnwindSafe for ArchivedInterpreterData",1,["air_interpreter_data::interpreter_data::ArchivedInterpreterData"]],["impl UnwindSafe for ArchivedParResult",1,["air_interpreter_data::executed_state::ArchivedParResult"]],["impl UnwindSafe for ArchivedRawValue",1,["air_interpreter_data::raw_value::ArchivedRawValue"]],["impl UnwindSafe for ArchivedServiceResultCidAggregate",1,["air_interpreter_data::executed_state::ArchivedServiceResultCidAggregate"]],["impl UnwindSafe for ArchivedSubTraceDesc",1,["air_interpreter_data::executed_state::ArchivedSubTraceDesc"]],["impl UnwindSafe for ArchivedTracePos",1,["air_interpreter_data::trace_pos::ArchivedTracePos"]],["impl UnwindSafe for CallServiceFailed",1,["air_interpreter_data::executed_state::CallServiceFailed"]],["impl UnwindSafe for CallServiceFailedResolver",1,["air_interpreter_data::executed_state::CallServiceFailedResolver"]],["impl UnwindSafe for CanonCidAggregateResolver",1,["air_interpreter_data::executed_state::CanonCidAggregateResolver"]],["impl UnwindSafe for CanonResultCidAggregateResolver",1,["air_interpreter_data::executed_state::CanonResultCidAggregateResolver"]],["impl UnwindSafe for CidInfoResolver",1,["air_interpreter_data::cid_info::CidInfoResolver"]],["impl UnwindSafe for ExecutionTraceResolver",1,["air_interpreter_data::trace::ExecutionTraceResolver"]],["impl UnwindSafe for FoldResult",1,["air_interpreter_data::executed_state::FoldResult"]],["impl UnwindSafe for FoldResultResolver",1,["air_interpreter_data::executed_state::FoldResultResolver"]],["impl UnwindSafe for FoldSubTraceLore",1,["air_interpreter_data::executed_state::FoldSubTraceLore"]],["impl UnwindSafe for FoldSubTraceLoreResolver",1,["air_interpreter_data::executed_state::FoldSubTraceLoreResolver"]],["impl UnwindSafe for GenerationIdx",1,["air_interpreter_data::generation_idx::GenerationIdx"]],["impl UnwindSafe for GenerationIdxResolver",1,["air_interpreter_data::generation_idx::GenerationIdxResolver"]],["impl UnwindSafe for InterpreterDataEnvelopeRepr",1,["air_interpreter_data::interpreter_data::repr::InterpreterDataEnvelopeRepr"]],["impl UnwindSafe for InterpreterDataResolver",1,["air_interpreter_data::interpreter_data::InterpreterDataResolver"]],["impl UnwindSafe for ParResult",1,["air_interpreter_data::executed_state::ParResult"]],["impl UnwindSafe for ParResultResolver",1,["air_interpreter_data::executed_state::ParResultResolver"]],["impl UnwindSafe for RawValue",1,["air_interpreter_data::raw_value::RawValue"]],["impl UnwindSafe for RawValueResolver",1,["air_interpreter_data::raw_value::RawValueResolver"]],["impl UnwindSafe for ServiceResultCidAggregateResolver",1,["air_interpreter_data::executed_state::ServiceResultCidAggregateResolver"]],["impl UnwindSafe for SubTraceDesc",1,["air_interpreter_data::executed_state::SubTraceDesc"]],["impl UnwindSafe for SubTraceDescResolver",1,["air_interpreter_data::executed_state::SubTraceDescResolver"]],["impl UnwindSafe for TracePos",1,["air_interpreter_data::trace_pos::TracePos"]],["impl UnwindSafe for TracePosResolver",1,["air_interpreter_data::trace_pos::TracePosResolver"]],["impl UnwindSafe for Versions",1,["air_interpreter_data::interpreter_data::Versions"]],["impl<'a> UnwindSafe for InterpreterDataEnvelope<'a>",1,["air_interpreter_data::interpreter_data::InterpreterDataEnvelope"]],["impl<'data> UnwindSafe for DataVerifier<'data>",1,["air_interpreter_data::interpreter_data::verification::DataVerifier"]],["impl<Val> !UnwindSafe for ArchivedCidStore<Val>",1,["air_interpreter_data::cid_store::ArchivedCidStore"]],["impl<Val> !UnwindSafe for CidStoreResolver<Val>",1,["air_interpreter_data::cid_store::CidStoreResolver"]],["impl<Val> UnwindSafe for CidStore<Val>
where\n Val: RefUnwindSafe,
",1,["air_interpreter_data::cid_store::CidStore"]],["impl<Val> UnwindSafe for CidTracker<Val>
where\n Val: RefUnwindSafe,
",1,["air_interpreter_data::cid_store::CidTracker"]]], +"air_interpreter_interface":[["impl UnwindSafe for CallArgumentsRepr",1,["air_interpreter_interface::call_request_parameters::CallArgumentsRepr"]],["impl UnwindSafe for CallRequestParams",1,["air_interpreter_interface::call_request_parameters::CallRequestParams"]],["impl UnwindSafe for CallRequestsRepr",1,["air_interpreter_interface::call_request_parameters::CallRequestsRepr"]],["impl UnwindSafe for CallResultsRepr",1,["air_interpreter_interface::call_service_result::CallResultsRepr"]],["impl UnwindSafe for CallServiceResult",1,["air_interpreter_interface::call_service_result::CallServiceResult"]],["impl UnwindSafe for InterpreterOutcome",1,["air_interpreter_interface::interpreter_outcome::InterpreterOutcome"]],["impl UnwindSafe for RunParameters",1,["air_interpreter_interface::run_parameters::RunParameters"]],["impl UnwindSafe for SerializedCallArguments",1,["air_interpreter_interface::call_request_parameters::SerializedCallArguments"]],["impl UnwindSafe for SerializedCallRequests",1,["air_interpreter_interface::call_request_parameters::SerializedCallRequests"]],["impl UnwindSafe for SerializedCallResults",1,["air_interpreter_interface::call_service_result::SerializedCallResults"]],["impl UnwindSafe for SerializedTetraplets",1,["air_interpreter_interface::call_request_parameters::SerializedTetraplets"]],["impl UnwindSafe for SoftLimitsTriggering",1,["air_interpreter_interface::interpreter_outcome::SoftLimitsTriggering"]],["impl UnwindSafe for TetrapletsRepr",1,["air_interpreter_interface::call_request_parameters::TetrapletsRepr"]]], +"air_interpreter_sede":[["impl UnwindSafe for RmpSerdeFormat",1,["air_interpreter_sede::rmp_serde::RmpSerdeFormat"]],["impl UnwindSafe for RmpSerdeMultiformat",1,["air_interpreter_sede::rmp_serde::RmpSerdeMultiformat"]],["impl<FormatError> !UnwindSafe for EncodeError<FormatError>",1,["air_interpreter_sede::multiformat::EncodeError"]],["impl<FormatError> UnwindSafe for DecodeError<FormatError>
where\n FormatError: UnwindSafe,
",1,["air_interpreter_sede::multiformat::DecodeError"]]], +"air_interpreter_signatures":[["impl !UnwindSafe for KeyError",1,["air_interpreter_signatures::KeyError"]],["impl !UnwindSafe for VerificationError",1,["air_interpreter_signatures::VerificationError"]],["impl UnwindSafe for ArchivedPublicKey",1,["air_interpreter_signatures::ArchivedPublicKey"]],["impl UnwindSafe for ArchivedSignature",1,["air_interpreter_signatures::ArchivedSignature"]],["impl UnwindSafe for KeyPair",1,["air_interpreter_signatures::KeyPair"]],["impl UnwindSafe for PeerCidTracker",1,["air_interpreter_signatures::trackers::PeerCidTracker"]],["impl UnwindSafe for PublicKey",1,["air_interpreter_signatures::PublicKey"]],["impl UnwindSafe for PublicKeyResolver",1,["air_interpreter_signatures::PublicKeyResolver"]],["impl UnwindSafe for Signature",1,["air_interpreter_signatures::Signature"]],["impl UnwindSafe for SignatureResolver",1,["air_interpreter_signatures::SignatureResolver"]],["impl<Key = PublicKey, Sign = Signature> !UnwindSafe for ArchivedSignatureStore<Key, Sign>",1,["air_interpreter_signatures::stores::ArchivedSignatureStore"]],["impl<Key = PublicKey, Sign = Signature> !UnwindSafe for SignatureStoreResolver<Key, Sign>",1,["air_interpreter_signatures::stores::SignatureStoreResolver"]],["impl<Key, Sign> UnwindSafe for SignatureStore<Key, Sign>
where\n Key: UnwindSafe,\n Sign: UnwindSafe,
",1,["air_interpreter_signatures::stores::SignatureStore"]]], +"air_interpreter_value":[["impl UnwindSafe for JValue",1,["air_interpreter_value::value::JValue"]]], +"air_lambda_ast":[["impl UnwindSafe for Functor",1,["air_lambda_ast::ast::Functor"]],["impl<'input> UnwindSafe for LambdaAST<'input>",1,["air_lambda_ast::ast::LambdaAST"]],["impl<'input> UnwindSafe for ValueAccessor<'input>",1,["air_lambda_ast::ast::ValueAccessor"]]], +"air_lambda_parser":[["impl UnwindSafe for LexerError",1,["air_lambda_parser::parser::lexer::errors::LexerError"]],["impl<'input> UnwindSafe for LambdaParserError<'input>",1,["air_lambda_parser::parser::errors::LambdaParserError"]],["impl<'input> UnwindSafe for LambdaASTLexer<'input>",1,["air_lambda_parser::parser::lexer::lambda_ast_lexer::LambdaASTLexer"]]], +"air_parser":[["impl UnwindSafe for Number",1,["air_parser::ast::instruction_arguments::Number"]],["impl UnwindSafe for Never",1,["air_parser::ast::instructions::Never"]],["impl UnwindSafe for Null",1,["air_parser::ast::instructions::Null"]],["impl UnwindSafe for Span",1,["air_parser::parser::span::Span"]],["impl UnwindSafe for AIRParser",1,["air_parser::parser::air::__parse__AIR::AIRParser"]],["impl UnwindSafe for AirPos",1,["air_parser::parser::lexer::text_pos::AirPos"]],["impl<'i> UnwindSafe for ApArgument<'i>",1,["air_parser::ast::instruction_arguments::ApArgument"]],["impl<'i> UnwindSafe for ApResult<'i>",1,["air_parser::ast::instruction_arguments::ApResult"]],["impl<'i> UnwindSafe for CallOutputValue<'i>",1,["air_parser::ast::instruction_arguments::CallOutputValue"]],["impl<'i> UnwindSafe for Fail<'i>",1,["air_parser::ast::instructions::Fail"]],["impl<'i> UnwindSafe for FoldScalarIterable<'i>",1,["air_parser::ast::instruction_arguments::FoldScalarIterable"]],["impl<'i> UnwindSafe for ImmutableValue<'i>",1,["air_parser::ast::instruction_arguments::ImmutableValue"]],["impl<'i> UnwindSafe for ImmutableVariable<'i>",1,["air_parser::ast::values::ImmutableVariable"]],["impl<'i> UnwindSafe for ImmutableVariableWithLambda<'i>",1,["air_parser::ast::values::ImmutableVariableWithLambda"]],["impl<'i> UnwindSafe for Instruction<'i>",1,["air_parser::ast::instructions::Instruction"]],["impl<'i> UnwindSafe for NewArgument<'i>",1,["air_parser::ast::instruction_arguments::NewArgument"]],["impl<'i> UnwindSafe for ResolvableToPeerIdVariable<'i>",1,["air_parser::ast::instruction_arguments::ResolvableToPeerIdVariable"]],["impl<'i> UnwindSafe for ResolvableToStringVariable<'i>",1,["air_parser::ast::instruction_arguments::ResolvableToStringVariable"]],["impl<'i> UnwindSafe for StreamMapKeyClause<'i>",1,["air_parser::ast::instruction_arguments::StreamMapKeyClause"]],["impl<'i> UnwindSafe for Ap<'i>",1,["air_parser::ast::instructions::Ap"]],["impl<'i> UnwindSafe for ApMap<'i>",1,["air_parser::ast::instructions::ApMap"]],["impl<'i> UnwindSafe for Call<'i>",1,["air_parser::ast::instructions::Call"]],["impl<'i> UnwindSafe for Canon<'i>",1,["air_parser::ast::instructions::Canon"]],["impl<'i> UnwindSafe for CanonMap<'i>",1,["air_parser::ast::instructions::CanonMap"]],["impl<'i> UnwindSafe for CanonStream<'i>",1,["air_parser::ast::values::CanonStream"]],["impl<'i> UnwindSafe for CanonStreamMap<'i>",1,["air_parser::ast::values::CanonStreamMap"]],["impl<'i> UnwindSafe for CanonStreamMapScalar<'i>",1,["air_parser::ast::instructions::CanonStreamMapScalar"]],["impl<'i> UnwindSafe for CanonStreamMapWithLambda<'i>",1,["air_parser::ast::values::CanonStreamMapWithLambda"]],["impl<'i> UnwindSafe for CanonStreamWithLambda<'i>",1,["air_parser::ast::values::CanonStreamWithLambda"]],["impl<'i> UnwindSafe for FoldScalar<'i>",1,["air_parser::ast::instructions::FoldScalar"]],["impl<'i> UnwindSafe for FoldStream<'i>",1,["air_parser::ast::instructions::FoldStream"]],["impl<'i> UnwindSafe for FoldStreamMap<'i>",1,["air_parser::ast::instructions::FoldStreamMap"]],["impl<'i> UnwindSafe for Match<'i>",1,["air_parser::ast::instructions::Match"]],["impl<'i> UnwindSafe for MisMatch<'i>",1,["air_parser::ast::instructions::MisMatch"]],["impl<'i> UnwindSafe for New<'i>",1,["air_parser::ast::instructions::New"]],["impl<'i> UnwindSafe for Next<'i>",1,["air_parser::ast::instructions::Next"]],["impl<'i> UnwindSafe for Par<'i>",1,["air_parser::ast::instructions::Par"]],["impl<'i> UnwindSafe for Scalar<'i>",1,["air_parser::ast::values::Scalar"]],["impl<'i> UnwindSafe for ScalarWithLambda<'i>",1,["air_parser::ast::values::ScalarWithLambda"]],["impl<'i> UnwindSafe for Seq<'i>",1,["air_parser::ast::instructions::Seq"]],["impl<'i> UnwindSafe for Stream<'i>",1,["air_parser::ast::values::Stream"]],["impl<'i> UnwindSafe for StreamMap<'i>",1,["air_parser::ast::values::StreamMap"]],["impl<'i> UnwindSafe for Triplet<'i>",1,["air_parser::ast::instruction_arguments::Triplet"]],["impl<'i> UnwindSafe for Xor<'i>",1,["air_parser::ast::instructions::Xor"]],["impl<'i> UnwindSafe for VariableValidator<'i>",1,["air_parser::parser::validator::VariableValidator"]],["impl<'input> UnwindSafe for AIRLexer<'input>",1,["air_parser::parser::lexer::air_lexer::AIRLexer"]],["impl<'lens> UnwindSafe for InstructionErrorAST<'lens>",1,["air_parser::ast::values::InstructionErrorAST"]]], +"air_test_framework":[["impl !UnwindSafe for MarineServiceHandle",1,["air_test_framework::services::MarineServiceHandle"]],["impl UnwindSafe for ServiceDefinition",1,["air_test_framework::asserts::ServiceDefinition"]],["impl UnwindSafe for ServiceTagName",1,["air_test_framework::asserts::ServiceTagName"]],["impl UnwindSafe for AlterState",1,["air_test_framework::ephemeral::neighborhood::AlterState"]],["impl UnwindSafe for FunctionOutcome",1,["air_test_framework::services::FunctionOutcome"]],["impl UnwindSafe for PeerId",1,["air_test_framework::ephemeral::PeerId"]],["impl<R = WasmAirRunner> !UnwindSafe for Neighborhood<R>",1,["air_test_framework::ephemeral::neighborhood::Neighborhood"]],["impl<R = WasmAirRunner> !UnwindSafe for Network<R>",1,["air_test_framework::ephemeral::Network"]],["impl<R = WasmAirRunner> !UnwindSafe for AirScriptExecutor<R>",1,["air_test_framework::execution::AirScriptExecutor"]],["impl<R = WasmAirRunner> !UnwindSafe for TransformedAirScript<R>",1,["air_test_framework::transform::walker::TransformedAirScript"]],["impl<R> !UnwindSafe for PeerEnv<R>",1,["air_test_framework::ephemeral::neighborhood::PeerEnv"]],["impl<R> !UnwindSafe for Peer<R>",1,["air_test_framework::ephemeral::Peer"]]], +"air_test_utils":[["impl !UnwindSafe for CanonResultAlike",1,["air_test_utils::executed_state::CanonResultAlike"]],["impl !UnwindSafe for ValueAggregateAlike",1,["air_test_utils::executed_state::ValueAggregateAlike"]],["impl !UnwindSafe for ReleaseWasmAirRunner",1,["air_test_utils::wasm_test_runner::ReleaseWasmAirRunner"]],["impl !UnwindSafe for WasmAirRunner",1,["air_test_utils::wasm_test_runner::WasmAirRunner"]],["impl UnwindSafe for VariableOptionSource",1,["air_test_utils::call_services::VariableOptionSource"]],["impl UnwindSafe for ExecutedCallBuilder",1,["air_test_utils::executed_state::ExecutedCallBuilder"]],["impl UnwindSafe for NativeAirRunner",1,["air_test_utils::native_test_runner::NativeAirRunner"]],["impl UnwindSafe for TestInitParameters",1,["air_test_utils::test_runner::TestInitParameters"]],["impl UnwindSafe for TestRunParameters",1,["air_test_utils::test_runner::TestRunParameters"]],["impl<R = WasmAirRunner> !UnwindSafe for TestRunner<R>",1,["air_test_utils::test_runner::TestRunner"]]], +"air_trace_handler":[["impl !UnwindSafe for GenerationCompactificationError",1,["air_trace_handler::errors::GenerationCompactificationError"]],["impl !UnwindSafe for KeeperError",1,["air_trace_handler::data_keeper::errors::KeeperError"]],["impl !UnwindSafe for StateFSMError",1,["air_trace_handler::state_automata::errors::StateFSMError"]],["impl !UnwindSafe for TraceHandlerError",1,["air_trace_handler::errors::TraceHandlerError"]],["impl !UnwindSafe for CallResultError",1,["air_trace_handler::merger::errors::CallResultError"]],["impl !UnwindSafe for CanonResultError",1,["air_trace_handler::merger::errors::CanonResultError"]],["impl !UnwindSafe for MergeError",1,["air_trace_handler::merger::errors::MergeError"]],["impl !UnwindSafe for MergerCallResult",1,["air_trace_handler::merger::call_merger::MergerCallResult"]],["impl !UnwindSafe for MergerCanonResult",1,["air_trace_handler::merger::canon_merger::MergerCanonResult"]],["impl !UnwindSafe for MetCallResult",1,["air_trace_handler::merger::call_merger::MetCallResult"]],["impl !UnwindSafe for TraceHandler",1,["air_trace_handler::handler::TraceHandler"]],["impl UnwindSafe for IntConversionError",1,["air_trace_handler::errors::IntConversionError"]],["impl UnwindSafe for SubgraphType",1,["air_trace_handler::state_automata::par_fsm::SubgraphType"]],["impl UnwindSafe for ApResultError",1,["air_trace_handler::merger::errors::ApResultError"]],["impl UnwindSafe for DataType",1,["air_trace_handler::merger::errors::DataType"]],["impl UnwindSafe for FoldResultError",1,["air_trace_handler::merger::errors::FoldResultError"]],["impl UnwindSafe for MergeCtxType",1,["air_trace_handler::merger::MergeCtxType"]],["impl UnwindSafe for MergerApResult",1,["air_trace_handler::merger::ap_merger::MergerApResult"]],["impl UnwindSafe for PreparationScheme",1,["air_trace_handler::merger::position_mapping::PreparationScheme"]],["impl UnwindSafe for ValueSource",1,["air_trace_handler::merger::ValueSource"]],["impl UnwindSafe for MergerFoldResult",1,["air_trace_handler::merger::fold_merger::MergerFoldResult"]],["impl UnwindSafe for MergerParResult",1,["air_trace_handler::merger::par_merger::MergerParResult"]],["impl UnwindSafe for MetApResult",1,["air_trace_handler::merger::ap_merger::MetApResult"]],["impl UnwindSafe for ResolvedFold",1,["air_trace_handler::merger::fold_merger::fold_lore_resolver::ResolvedFold"]],["impl UnwindSafe for ResolvedSubTraceDescs",1,["air_trace_handler::merger::fold_merger::fold_lore_resolver::ResolvedSubTraceDescs"]]], +"avm_data_store":[["impl<'data> UnwindSafe for AnomalyData<'data>",1,["avm_data_store::AnomalyData"]]], +"avm_interface":[["impl !UnwindSafe for CallSeDeErrors",1,["avm_interface::CallSeDeErrors"]],["impl UnwindSafe for RawAVMOutcome",1,["avm_interface::raw_outcome::RawAVMOutcome"]],["impl UnwindSafe for AVMOutcome",1,["avm_interface::outcome::AVMOutcome"]],["impl UnwindSafe for CallRequestParams",1,["avm_interface::call_request_parameters::CallRequestParams"]],["impl UnwindSafe for CallServiceResult",1,["avm_interface::call_service_result::CallServiceResult"]],["impl UnwindSafe for ErrorAVMOutcome",1,["avm_interface::outcome::ErrorAVMOutcome"]],["impl<'ctx> UnwindSafe for ParticleParameters<'ctx>",1,["avm_interface::particle_parameters::ParticleParameters"]]], +"avm_server":[["impl !UnwindSafe for RunnerError",1,["avm_server::errors::RunnerError"]],["impl UnwindSafe for AVMMemoryStats",1,["avm_server::runner::AVMMemoryStats"]],["impl UnwindSafe for AVMRuntimeLimits",1,["avm_server::runner::AVMRuntimeLimits"]],["impl UnwindSafe for AquaVMRuntimeLimits",1,["avm_server::runner::AquaVMRuntimeLimits"]],["impl<E> !UnwindSafe for AVMError<E>",1,["avm_server::errors::AVMError"]],["impl<E> !UnwindSafe for AVMConfig<E>",1,["avm_server::config::AVMConfig"]],["impl<E, WB> !UnwindSafe for AVM<E, WB>",1,["avm_server::avm::AVM"]],["impl<WB> !UnwindSafe for AVMRunner<WB>",1,["avm_server::runner::AVMRunner"]]], +"polyplets":[["impl UnwindSafe for ResolvedTriplet",1,["polyplets::triplet::ResolvedTriplet"]]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/trait.impl/core/str/traits/trait.FromStr.js b/trait.impl/core/str/traits/trait.FromStr.js new file mode 100644 index 00000000..de8a1e73 --- /dev/null +++ b/trait.impl/core/str/traits/trait.FromStr.js @@ -0,0 +1,3 @@ +(function() {var implementors = { +"air_test_framework":[["impl FromStr for ServiceDefinition"],["impl FromStr for ServiceTagName"]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/trait.impl/num_traits/ops/checked/trait.CheckedAdd.js b/trait.impl/num_traits/ops/checked/trait.CheckedAdd.js new file mode 100644 index 00000000..a786d5cf --- /dev/null +++ b/trait.impl/num_traits/ops/checked/trait.CheckedAdd.js @@ -0,0 +1,3 @@ +(function() {var implementors = { +"air_interpreter_data":[["impl CheckedAdd for TracePos"]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/trait.impl/rkyv/trait.Archive.js b/trait.impl/rkyv/trait.Archive.js new file mode 100644 index 00000000..700b4a25 --- /dev/null +++ b/trait.impl/rkyv/trait.Archive.js @@ -0,0 +1,5 @@ +(function() {var implementors = { +"air_interpreter_cid":[["impl<T: ?Sized> Archive for CID<T>
where\n Rc<CidRef>: Archive,\n With<PhantomData<*const T>, Skip>: Archive,
"]], +"air_interpreter_data":[["impl Archive for CallResult
where\n Sender: Archive,\n ValueRef: Archive,\n CID<ServiceResultCidAggregate>: Archive,
"],["impl Archive for CanonResult
where\n Rc<String>: Archive,\n CID<CanonResultCidAggregate>: Archive,
"],["impl Archive for ExecutedState
where\n ParResult: Archive,\n CallResult: Archive,\n FoldResult: Archive,\n ApResult: Archive,\n CanonResult: Archive,
"],["impl Archive for Provenance"],["impl Archive for Sender
where\n Rc<String>: Archive,\n u32: Archive,
"],["impl Archive for ValueRef
where\n CID<ServiceResultCidAggregate>: Archive,\n GenerationIdx: Archive,\n CID<JValue>: Archive,
"],["impl Archive for ApResult
where\n Vec<GenerationIdx>: Archive,
"],["impl Archive for CallServiceFailed
where\n i32: Archive,\n Rc<String>: Archive,
"],["impl Archive for CanonCidAggregate
where\n CID<RawValue>: Archive,\n CID<SecurityTetraplet>: Archive,\n Provenance: Archive,
"],["impl Archive for CanonResultCidAggregate
where\n CID<SecurityTetraplet>: Archive,\n Vec<CID<CanonCidAggregate>>: Archive,
"],["impl Archive for CidInfo
where\n CidStore<RawValue>: Archive,\n CidStore<SecurityTetraplet>: Archive,\n CidStore<CanonCidAggregate>: Archive,\n CidStore<CanonResultCidAggregate>: Archive,\n CidStore<ServiceResultCidAggregate>: Archive,
"],["impl Archive for ExecutionTrace
where\n Vec<ExecutedState>: Archive,
"],["impl Archive for FoldResult
where\n FoldLore: Archive,
"],["impl Archive for FoldSubTraceLore
where\n TracePos: Archive,\n Vec<SubTraceDesc>: Archive,
"],["impl Archive for GenerationIdx
where\n u32: Archive,
"],["impl Archive for InterpreterData
where\n ExecutionTrace: Archive,\n u32: Archive,\n CidInfo: Archive,\n SignatureStore: Archive,
"],["impl Archive for ParResult
where\n u32: Archive,
"],["impl Archive for RawValue
where\n Box<str>: Archive,\n With<RefCell<Option<JValue>>, Skip>: Archive,
"],["impl Archive for ServiceResultCidAggregate
where\n CID<RawValue>: Archive,\n Rc<str>: Archive,\n CID<SecurityTetraplet>: Archive,
"],["impl Archive for SubTraceDesc
where\n TracePos: Archive,\n u32: Archive,
"],["impl Archive for TracePos
where\n PosType: Archive,
"],["impl<Val> Archive for CidStore<Val>
where\n With<HashMap<CID<Val>, Rc<Val>>, AsVec>: Archive,
"]], +"air_interpreter_signatures":[["impl Archive for PublicKey
where\n Box<[u8]>: Archive,
"],["impl Archive for Signature
where\n Box<[u8]>: Archive,
"],["impl<Key: Hash + Eq, Sign> Archive for SignatureStore<Key, Sign>
where\n With<HashMap<Key, Sign>, AsVec>: Archive,
"]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/trait.impl/rkyv/trait.Deserialize.js b/trait.impl/rkyv/trait.Deserialize.js new file mode 100644 index 00000000..b7de1884 --- /dev/null +++ b/trait.impl/rkyv/trait.Deserialize.js @@ -0,0 +1,5 @@ +(function() {var implementors = { +"air_interpreter_cid":[["impl<__D: Fallible + ?Sized, T: ?Sized> Deserialize<CID<T>, __D> for Archived<CID<T>>
where\n Rc<CidRef>: Archive,\n Archived<Rc<CidRef>>: Deserialize<Rc<CidRef>, __D>,\n With<PhantomData<*const T>, Skip>: Archive,\n Archived<With<PhantomData<*const T>, Skip>>: Deserialize<With<PhantomData<*const T>, Skip>, __D>,
"]], +"air_interpreter_data":[["impl<__D: Fallible + ?Sized> Deserialize<CallResult, __D> for Archived<CallResult>
where\n Sender: Archive,\n Archived<Sender>: Deserialize<Sender, __D>,\n ValueRef: Archive,\n Archived<ValueRef>: Deserialize<ValueRef, __D>,\n CID<ServiceResultCidAggregate>: Archive,\n Archived<CID<ServiceResultCidAggregate>>: Deserialize<CID<ServiceResultCidAggregate>, __D>,
"],["impl<__D: Fallible + ?Sized> Deserialize<CanonResult, __D> for Archived<CanonResult>
where\n Rc<String>: Archive,\n Archived<Rc<String>>: Deserialize<Rc<String>, __D>,\n CID<CanonResultCidAggregate>: Archive,\n Archived<CID<CanonResultCidAggregate>>: Deserialize<CID<CanonResultCidAggregate>, __D>,
"],["impl<__D: Fallible + ?Sized> Deserialize<ExecutedState, __D> for Archived<ExecutedState>
where\n ParResult: Archive,\n Archived<ParResult>: Deserialize<ParResult, __D>,\n CallResult: Archive,\n Archived<CallResult>: Deserialize<CallResult, __D>,\n FoldResult: Archive,\n Archived<FoldResult>: Deserialize<FoldResult, __D>,\n ApResult: Archive,\n Archived<ApResult>: Deserialize<ApResult, __D>,\n CanonResult: Archive,\n Archived<CanonResult>: Deserialize<CanonResult, __D>,
"],["impl<__D: Fallible + ?Sized> Deserialize<Provenance, __D> for Archived<Provenance>
where\n CID<ServiceResultCidAggregate>: Archive,\n Archived<CID<ServiceResultCidAggregate>>: Deserialize<CID<ServiceResultCidAggregate>, __D>,\n CID<CanonResultCidAggregate>: Archive,\n Archived<CID<CanonResultCidAggregate>>: Deserialize<CID<CanonResultCidAggregate>, __D>,
"],["impl<__D: Fallible + ?Sized> Deserialize<Sender, __D> for Archived<Sender>
where\n Rc<String>: Archive,\n Archived<Rc<String>>: Deserialize<Rc<String>, __D>,\n u32: Archive,\n Archived<u32>: Deserialize<u32, __D>,
"],["impl<__D: Fallible + ?Sized> Deserialize<ValueRef, __D> for Archived<ValueRef>
where\n CID<ServiceResultCidAggregate>: Archive,\n Archived<CID<ServiceResultCidAggregate>>: Deserialize<CID<ServiceResultCidAggregate>, __D>,\n GenerationIdx: Archive,\n Archived<GenerationIdx>: Deserialize<GenerationIdx, __D>,\n CID<JValue>: Archive,\n Archived<CID<JValue>>: Deserialize<CID<JValue>, __D>,
"],["impl<__D: Fallible + ?Sized> Deserialize<ApResult, __D> for Archived<ApResult>
where\n Vec<GenerationIdx>: Archive,\n Archived<Vec<GenerationIdx>>: Deserialize<Vec<GenerationIdx>, __D>,
"],["impl<__D: Fallible + ?Sized> Deserialize<CallServiceFailed, __D> for Archived<CallServiceFailed>
where\n i32: Archive,\n Archived<i32>: Deserialize<i32, __D>,\n Rc<String>: Archive,\n Archived<Rc<String>>: Deserialize<Rc<String>, __D>,
"],["impl<__D: Fallible + ?Sized> Deserialize<CanonCidAggregate, __D> for Archived<CanonCidAggregate>
where\n CID<RawValue>: Archive,\n Archived<CID<RawValue>>: Deserialize<CID<RawValue>, __D>,\n CID<SecurityTetraplet>: Archive,\n Archived<CID<SecurityTetraplet>>: Deserialize<CID<SecurityTetraplet>, __D>,\n Provenance: Archive,\n Archived<Provenance>: Deserialize<Provenance, __D>,
"],["impl<__D: Fallible + ?Sized> Deserialize<CanonResultCidAggregate, __D> for Archived<CanonResultCidAggregate>
where\n CID<SecurityTetraplet>: Archive,\n Archived<CID<SecurityTetraplet>>: Deserialize<CID<SecurityTetraplet>, __D>,\n Vec<CID<CanonCidAggregate>>: Archive,\n Archived<Vec<CID<CanonCidAggregate>>>: Deserialize<Vec<CID<CanonCidAggregate>>, __D>,
"],["impl<__D: Fallible + ?Sized> Deserialize<CidInfo, __D> for Archived<CidInfo>
where\n CidStore<RawValue>: Archive,\n Archived<CidStore<RawValue>>: Deserialize<CidStore<RawValue>, __D>,\n CidStore<SecurityTetraplet>: Archive,\n Archived<CidStore<SecurityTetraplet>>: Deserialize<CidStore<SecurityTetraplet>, __D>,\n CidStore<CanonCidAggregate>: Archive,\n Archived<CidStore<CanonCidAggregate>>: Deserialize<CidStore<CanonCidAggregate>, __D>,\n CidStore<CanonResultCidAggregate>: Archive,\n Archived<CidStore<CanonResultCidAggregate>>: Deserialize<CidStore<CanonResultCidAggregate>, __D>,\n CidStore<ServiceResultCidAggregate>: Archive,\n Archived<CidStore<ServiceResultCidAggregate>>: Deserialize<CidStore<ServiceResultCidAggregate>, __D>,
"],["impl<__D: Fallible + ?Sized> Deserialize<ExecutionTrace, __D> for Archived<ExecutionTrace>
where\n Vec<ExecutedState>: Archive,\n Archived<Vec<ExecutedState>>: Deserialize<Vec<ExecutedState>, __D>,
"],["impl<__D: Fallible + ?Sized> Deserialize<FoldResult, __D> for Archived<FoldResult>
where\n FoldLore: Archive,\n Archived<FoldLore>: Deserialize<FoldLore, __D>,
"],["impl<__D: Fallible + ?Sized> Deserialize<FoldSubTraceLore, __D> for Archived<FoldSubTraceLore>
where\n TracePos: Archive,\n Archived<TracePos>: Deserialize<TracePos, __D>,\n Vec<SubTraceDesc>: Archive,\n Archived<Vec<SubTraceDesc>>: Deserialize<Vec<SubTraceDesc>, __D>,
"],["impl<__D: Fallible + ?Sized> Deserialize<GenerationIdx, __D> for Archived<GenerationIdx>
where\n u32: Archive,\n Archived<u32>: Deserialize<u32, __D>,
"],["impl<__D: Fallible + ?Sized> Deserialize<InterpreterData, __D> for Archived<InterpreterData>
where\n ExecutionTrace: Archive,\n Archived<ExecutionTrace>: Deserialize<ExecutionTrace, __D>,\n u32: Archive,\n Archived<u32>: Deserialize<u32, __D>,\n CidInfo: Archive,\n Archived<CidInfo>: Deserialize<CidInfo, __D>,\n SignatureStore: Archive,\n Archived<SignatureStore>: Deserialize<SignatureStore, __D>,
"],["impl<__D: Fallible + ?Sized> Deserialize<ParResult, __D> for Archived<ParResult>
where\n u32: Archive,\n Archived<u32>: Deserialize<u32, __D>,
"],["impl<__D: Fallible + ?Sized> Deserialize<RawValue, __D> for Archived<RawValue>
where\n Box<str>: Archive,\n Archived<Box<str>>: Deserialize<Box<str>, __D>,\n With<RefCell<Option<JValue>>, Skip>: Archive,\n Archived<With<RefCell<Option<JValue>>, Skip>>: Deserialize<With<RefCell<Option<JValue>>, Skip>, __D>,
"],["impl<__D: Fallible + ?Sized> Deserialize<ServiceResultCidAggregate, __D> for Archived<ServiceResultCidAggregate>
where\n CID<RawValue>: Archive,\n Archived<CID<RawValue>>: Deserialize<CID<RawValue>, __D>,\n Rc<str>: Archive,\n Archived<Rc<str>>: Deserialize<Rc<str>, __D>,\n CID<SecurityTetraplet>: Archive,\n Archived<CID<SecurityTetraplet>>: Deserialize<CID<SecurityTetraplet>, __D>,
"],["impl<__D: Fallible + ?Sized> Deserialize<SubTraceDesc, __D> for Archived<SubTraceDesc>
where\n TracePos: Archive,\n Archived<TracePos>: Deserialize<TracePos, __D>,\n u32: Archive,\n Archived<u32>: Deserialize<u32, __D>,
"],["impl<__D: Fallible + ?Sized> Deserialize<TracePos, __D> for Archived<TracePos>
where\n PosType: Archive,\n Archived<PosType>: Deserialize<PosType, __D>,
"],["impl<__D: Fallible + ?Sized, Val> Deserialize<CidStore<Val>, __D> for Archived<CidStore<Val>>
where\n With<HashMap<CID<Val>, Rc<Val>>, AsVec>: Archive,\n Archived<With<HashMap<CID<Val>, Rc<Val>>, AsVec>>: Deserialize<With<HashMap<CID<Val>, Rc<Val>>, AsVec>, __D>,
"]], +"air_interpreter_signatures":[["impl<__D: Fallible + ?Sized> Deserialize<PublicKey, __D> for Archived<PublicKey>
where\n Box<[u8]>: Archive,\n Archived<Box<[u8]>>: Deserialize<Box<[u8]>, __D>,
"],["impl<__D: Fallible + ?Sized> Deserialize<Signature, __D> for Archived<Signature>
where\n Box<[u8]>: Archive,\n Archived<Box<[u8]>>: Deserialize<Box<[u8]>, __D>,
"],["impl<__D: Fallible + ?Sized, Key: Hash + Eq, Sign> Deserialize<SignatureStore<Key, Sign>, __D> for Archived<SignatureStore<Key, Sign>>
where\n With<HashMap<Key, Sign>, AsVec>: Archive,\n Archived<With<HashMap<Key, Sign>, AsVec>>: Deserialize<With<HashMap<Key, Sign>, AsVec>, __D>,
"]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/trait.impl/rkyv/trait.Serialize.js b/trait.impl/rkyv/trait.Serialize.js new file mode 100644 index 00000000..0de2dcf2 --- /dev/null +++ b/trait.impl/rkyv/trait.Serialize.js @@ -0,0 +1,5 @@ +(function() {var implementors = { +"air_interpreter_cid":[["impl<__S: Fallible + ?Sized, T: ?Sized> Serialize<__S> for CID<T>
where\n Rc<CidRef>: Serialize<__S>,\n With<PhantomData<*const T>, Skip>: Serialize<__S>,
"]], +"air_interpreter_data":[["impl<__S: Fallible + ?Sized> Serialize<__S> for CallResult
where\n Sender: Serialize<__S>,\n ValueRef: Serialize<__S>,\n CID<ServiceResultCidAggregate>: Serialize<__S>,
"],["impl<__S: Fallible + ?Sized> Serialize<__S> for CanonResult
where\n Rc<String>: Serialize<__S>,\n CID<CanonResultCidAggregate>: Serialize<__S>,
"],["impl<__S: Fallible + ?Sized> Serialize<__S> for ExecutedState
where\n ParResult: Serialize<__S>,\n CallResult: Serialize<__S>,\n FoldResult: Serialize<__S>,\n ApResult: Serialize<__S>,\n CanonResult: Serialize<__S>,
"],["impl<__S: Fallible + ?Sized> Serialize<__S> for Provenance
where\n CID<ServiceResultCidAggregate>: Serialize<__S>,\n CID<CanonResultCidAggregate>: Serialize<__S>,
"],["impl<__S: Fallible + ?Sized> Serialize<__S> for Sender
where\n Rc<String>: Serialize<__S>,\n u32: Serialize<__S>,
"],["impl<__S: Fallible + ?Sized> Serialize<__S> for ValueRef
where\n CID<ServiceResultCidAggregate>: Serialize<__S>,\n GenerationIdx: Serialize<__S>,\n CID<JValue>: Serialize<__S>,
"],["impl<__S: Fallible + ?Sized> Serialize<__S> for ApResult
where\n Vec<GenerationIdx>: Serialize<__S>,
"],["impl<__S: Fallible + ?Sized> Serialize<__S> for CallServiceFailed
where\n i32: Serialize<__S>,\n Rc<String>: Serialize<__S>,
"],["impl<__S: Fallible + ?Sized> Serialize<__S> for CanonCidAggregate
where\n CID<RawValue>: Serialize<__S>,\n CID<SecurityTetraplet>: Serialize<__S>,\n Provenance: Serialize<__S>,
"],["impl<__S: Fallible + ?Sized> Serialize<__S> for CanonResultCidAggregate
where\n CID<SecurityTetraplet>: Serialize<__S>,\n Vec<CID<CanonCidAggregate>>: Serialize<__S>,
"],["impl<__S: Fallible + ?Sized> Serialize<__S> for CidInfo
where\n CidStore<RawValue>: Serialize<__S>,\n CidStore<SecurityTetraplet>: Serialize<__S>,\n CidStore<CanonCidAggregate>: Serialize<__S>,\n CidStore<CanonResultCidAggregate>: Serialize<__S>,\n CidStore<ServiceResultCidAggregate>: Serialize<__S>,
"],["impl<__S: Fallible + ?Sized> Serialize<__S> for ExecutionTrace
where\n Vec<ExecutedState>: Serialize<__S>,
"],["impl<__S: Fallible + ?Sized> Serialize<__S> for FoldResult
where\n FoldLore: Serialize<__S>,
"],["impl<__S: Fallible + ?Sized> Serialize<__S> for FoldSubTraceLore
where\n TracePos: Serialize<__S>,\n Vec<SubTraceDesc>: Serialize<__S>,
"],["impl<__S: Fallible + ?Sized> Serialize<__S> for GenerationIdx
where\n u32: Serialize<__S>,
"],["impl<__S: Fallible + ?Sized> Serialize<__S> for InterpreterData
where\n ExecutionTrace: Serialize<__S>,\n u32: Serialize<__S>,\n CidInfo: Serialize<__S>,\n SignatureStore: Serialize<__S>,
"],["impl<__S: Fallible + ?Sized> Serialize<__S> for ParResult
where\n u32: Serialize<__S>,
"],["impl<__S: Fallible + ?Sized> Serialize<__S> for RawValue
where\n Box<str>: Serialize<__S>,\n With<RefCell<Option<JValue>>, Skip>: Serialize<__S>,
"],["impl<__S: Fallible + ?Sized> Serialize<__S> for ServiceResultCidAggregate
where\n CID<RawValue>: Serialize<__S>,\n Rc<str>: Serialize<__S>,\n CID<SecurityTetraplet>: Serialize<__S>,
"],["impl<__S: Fallible + ?Sized> Serialize<__S> for SubTraceDesc
where\n TracePos: Serialize<__S>,\n u32: Serialize<__S>,
"],["impl<__S: Fallible + ?Sized> Serialize<__S> for TracePos
where\n PosType: Serialize<__S>,
"],["impl<__S: Fallible + ?Sized, Val> Serialize<__S> for CidStore<Val>
where\n With<HashMap<CID<Val>, Rc<Val>>, AsVec>: Serialize<__S>,
"]], +"air_interpreter_signatures":[["impl<__S: Fallible + ?Sized> Serialize<__S> for PublicKey
where\n Box<[u8]>: Serialize<__S>,
"],["impl<__S: Fallible + ?Sized> Serialize<__S> for Signature
where\n Box<[u8]>: Serialize<__S>,
"],["impl<__S: Fallible + ?Sized, Key: Hash + Eq, Sign> Serialize<__S> for SignatureStore<Key, Sign>
where\n With<HashMap<Key, Sign>, AsVec>: Serialize<__S>,
"]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/trait.impl/serde/de/trait.Deserialize.js b/trait.impl/serde/de/trait.Deserialize.js new file mode 100644 index 00000000..3aef3f3a --- /dev/null +++ b/trait.impl/serde/de/trait.Deserialize.js @@ -0,0 +1,14 @@ +(function() {var implementors = { +"air":[["impl<'de> Deserialize<'de> for Message"],["impl<'de> Deserialize<'de> for CloseMessage"],["impl<'de> Deserialize<'de> for LogRecord"],["impl<'de> Deserialize<'de> for LogValue"],["impl<'de> Deserialize<'de> for Span"]], +"air_interpreter_cid":[["impl<'de, T: ?Sized> Deserialize<'de> for CID<T>"]], +"air_interpreter_data":[["impl<'de> Deserialize<'de> for CallResult"],["impl<'de> Deserialize<'de> for CanonResult"],["impl<'de> Deserialize<'de> for ExecutedState"],["impl<'de> Deserialize<'de> for Provenance"],["impl<'de> Deserialize<'de> for Sender"],["impl<'de> Deserialize<'de> for ValueRef"],["impl<'de> Deserialize<'de> for ApResult"],["impl<'de> Deserialize<'de> for CallServiceFailed"],["impl<'de> Deserialize<'de> for CanonCidAggregate"],["impl<'de> Deserialize<'de> for CanonResultCidAggregate"],["impl<'de> Deserialize<'de> for CidInfo"],["impl<'de> Deserialize<'de> for ExecutionTrace"],["impl<'de> Deserialize<'de> for FoldResult"],["impl<'de> Deserialize<'de> for FoldSubTraceLore"],["impl<'de> Deserialize<'de> for GenerationIdx"],["impl<'de> Deserialize<'de> for InterpreterData"],["impl<'de> Deserialize<'de> for RawValue"],["impl<'de> Deserialize<'de> for ServiceResultCidAggregate"],["impl<'de> Deserialize<'de> for SubTraceDesc"],["impl<'de> Deserialize<'de> for TracePos"],["impl<'de> Deserialize<'de> for Versions"],["impl<'de, Val> Deserialize<'de> for CidStore<Val>
where\n Val: Deserialize<'de>,
"],["impl<'de: 'a, 'a> Deserialize<'de> for InterpreterDataEnvelope<'a>"]], +"air_interpreter_interface":[["impl<'de> Deserialize<'de> for CallRequestParams"],["impl<'de> Deserialize<'de> for CallServiceResult"],["impl<'de> Deserialize<'de> for InterpreterOutcome"],["impl<'de> Deserialize<'de> for RunParameters"],["impl<'de> Deserialize<'de> for SerializedCallArguments"],["impl<'de> Deserialize<'de> for SerializedCallRequests"],["impl<'de> Deserialize<'de> for SerializedCallResults"],["impl<'de> Deserialize<'de> for SerializedTetraplets"],["impl<'de> Deserialize<'de> for SoftLimitsTriggering"]], +"air_interpreter_signatures":[["impl<'de> Deserialize<'de> for PublicKey"],["impl<'de> Deserialize<'de> for Signature"],["impl<'de, Key, Sign> Deserialize<'de> for SignatureStore<Key, Sign>
where\n Key: Deserialize<'de> + Hash + Eq,\n Sign: Deserialize<'de>,
"]], +"air_interpreter_value":[["impl<'de> Deserialize<'de> for JValue"]], +"air_lambda_ast":[["impl<'de> Deserialize<'de> for Functor"],["impl<'de: 'input, 'input> Deserialize<'de> for LambdaAST<'input>"],["impl<'de: 'input, 'input> Deserialize<'de> for ValueAccessor<'input>"]], +"air_parser":[["impl<'de> Deserialize<'de> for Number"],["impl<'de> Deserialize<'de> for Span"],["impl<'de> Deserialize<'de> for AirPos"],["impl<'de: 'i, 'i> Deserialize<'de> for ApArgument<'i>"],["impl<'de: 'i, 'i> Deserialize<'de> for ApResult<'i>"],["impl<'de: 'i, 'i> Deserialize<'de> for FoldScalarIterable<'i>"],["impl<'de: 'i, 'i> Deserialize<'de> for ImmutableValue<'i>"],["impl<'de: 'i, 'i> Deserialize<'de> for ImmutableVariable<'i>"],["impl<'de: 'i, 'i> Deserialize<'de> for ImmutableVariableWithLambda<'i>"],["impl<'de: 'i, 'i> Deserialize<'de> for NewArgument<'i>"],["impl<'de: 'i, 'i> Deserialize<'de> for ResolvableToPeerIdVariable<'i>"],["impl<'de: 'i, 'i> Deserialize<'de> for ResolvableToStringVariable<'i>"],["impl<'de: 'i, 'i> Deserialize<'de> for StreamMapKeyClause<'i>"],["impl<'de: 'i, 'i> Deserialize<'de> for CanonStream<'i>"],["impl<'de: 'i, 'i> Deserialize<'de> for CanonStreamMap<'i>"],["impl<'de: 'i, 'i> Deserialize<'de> for CanonStreamMapWithLambda<'i>"],["impl<'de: 'i, 'i> Deserialize<'de> for CanonStreamWithLambda<'i>"],["impl<'de: 'i, 'i> Deserialize<'de> for Scalar<'i>"],["impl<'de: 'i, 'i> Deserialize<'de> for ScalarWithLambda<'i>"],["impl<'de: 'i, 'i> Deserialize<'de> for Stream<'i>"],["impl<'de: 'i, 'i> Deserialize<'de> for StreamMap<'i>"],["impl<'de: 'i, 'i> Deserialize<'de> for Triplet<'i>"],["impl<'de: 'lens, 'lens> Deserialize<'de> for InstructionErrorAST<'lens>"]], +"air_test_utils":[["impl<'de> Deserialize<'de> for CanonResultAlike"],["impl<'de> Deserialize<'de> for ValueAggregateAlike"]], +"avm_data_store":[["impl<'de: 'data, 'data> Deserialize<'de> for AnomalyData<'data>"]], +"avm_interface":[["impl<'de> Deserialize<'de> for RawAVMOutcome"],["impl<'de> Deserialize<'de> for AVMOutcome"],["impl<'de> Deserialize<'de> for CallRequestParams"],["impl<'de> Deserialize<'de> for CallServiceResult"],["impl<'de> Deserialize<'de> for ErrorAVMOutcome"],["impl<'de, 'ctx> Deserialize<'de> for ParticleParameters<'ctx>"]], +"polyplets":[["impl<'de> Deserialize<'de> for ResolvedTriplet"]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/trait.impl/serde/ser/trait.Serialize.js b/trait.impl/serde/ser/trait.Serialize.js new file mode 100644 index 00000000..42bdc6f0 --- /dev/null +++ b/trait.impl/serde/ser/trait.Serialize.js @@ -0,0 +1,13 @@ +(function() {var implementors = { +"air_interpreter_cid":[["impl<T: ?Sized> Serialize for CID<T>"]], +"air_interpreter_data":[["impl Serialize for CallResult"],["impl Serialize for CanonResult"],["impl Serialize for ExecutedState"],["impl Serialize for Provenance"],["impl Serialize for Sender"],["impl Serialize for ValueRef"],["impl Serialize for ApResult"],["impl Serialize for CallServiceFailed"],["impl Serialize for CanonCidAggregate"],["impl Serialize for CanonResultCidAggregate"],["impl Serialize for CidInfo"],["impl Serialize for ExecutionTrace"],["impl Serialize for FoldResult"],["impl Serialize for FoldSubTraceLore"],["impl Serialize for GenerationIdx"],["impl Serialize for InterpreterData"],["impl Serialize for RawValue"],["impl Serialize for ServiceResultCidAggregate"],["impl Serialize for SubTraceDesc"],["impl Serialize for TracePos"],["impl Serialize for Versions"],["impl<'a> Serialize for InterpreterDataEnvelope<'a>"],["impl<Val> Serialize for CidStore<Val>
where\n Val: Serialize,
"]], +"air_interpreter_interface":[["impl Serialize for CallRequestParams"],["impl Serialize for CallServiceResult"],["impl Serialize for InterpreterOutcome"],["impl Serialize for RunParameters"],["impl Serialize for SerializedCallArguments"],["impl Serialize for SerializedCallRequests"],["impl Serialize for SerializedCallResults"],["impl Serialize for SerializedTetraplets"],["impl Serialize for SoftLimitsTriggering"]], +"air_interpreter_signatures":[["impl Serialize for PublicKey"],["impl Serialize for Signature"],["impl<Key, Sign> Serialize for SignatureStore<Key, Sign>
where\n Key: Serialize + Hash + Eq,\n Sign: Serialize,
"]], +"air_interpreter_value":[["impl Serialize for JValue"]], +"air_lambda_ast":[["impl Serialize for Functor"],["impl<'input> Serialize for LambdaAST<'input>"],["impl<'input> Serialize for ValueAccessor<'input>"]], +"air_parser":[["impl Serialize for Number"],["impl Serialize for Never"],["impl Serialize for Null"],["impl Serialize for Span"],["impl Serialize for AirPos"],["impl<'i> Serialize for ApArgument<'i>"],["impl<'i> Serialize for ApResult<'i>"],["impl<'i> Serialize for CallOutputValue<'i>"],["impl<'i> Serialize for Fail<'i>"],["impl<'i> Serialize for FoldScalarIterable<'i>"],["impl<'i> Serialize for ImmutableValue<'i>"],["impl<'i> Serialize for ImmutableVariable<'i>"],["impl<'i> Serialize for ImmutableVariableWithLambda<'i>"],["impl<'i> Serialize for Instruction<'i>"],["impl<'i> Serialize for NewArgument<'i>"],["impl<'i> Serialize for ResolvableToPeerIdVariable<'i>"],["impl<'i> Serialize for ResolvableToStringVariable<'i>"],["impl<'i> Serialize for StreamMapKeyClause<'i>"],["impl<'i> Serialize for Ap<'i>"],["impl<'i> Serialize for ApMap<'i>"],["impl<'i> Serialize for Call<'i>"],["impl<'i> Serialize for Canon<'i>"],["impl<'i> Serialize for CanonMap<'i>"],["impl<'i> Serialize for CanonStream<'i>"],["impl<'i> Serialize for CanonStreamMap<'i>"],["impl<'i> Serialize for CanonStreamMapScalar<'i>"],["impl<'i> Serialize for CanonStreamMapWithLambda<'i>"],["impl<'i> Serialize for CanonStreamWithLambda<'i>"],["impl<'i> Serialize for FoldScalar<'i>"],["impl<'i> Serialize for FoldStream<'i>"],["impl<'i> Serialize for FoldStreamMap<'i>"],["impl<'i> Serialize for Match<'i>"],["impl<'i> Serialize for MisMatch<'i>"],["impl<'i> Serialize for New<'i>"],["impl<'i> Serialize for Next<'i>"],["impl<'i> Serialize for Par<'i>"],["impl<'i> Serialize for Scalar<'i>"],["impl<'i> Serialize for ScalarWithLambda<'i>"],["impl<'i> Serialize for Seq<'i>"],["impl<'i> Serialize for Stream<'i>"],["impl<'i> Serialize for StreamMap<'i>"],["impl<'i> Serialize for Triplet<'i>"],["impl<'i> Serialize for Xor<'i>"],["impl<'lens> Serialize for InstructionErrorAST<'lens>"]], +"air_test_utils":[["impl Serialize for CanonResultAlike"],["impl Serialize for ValueAggregateAlike"]], +"avm_data_store":[["impl<'data> Serialize for AnomalyData<'data>"]], +"avm_interface":[["impl Serialize for RawAVMOutcome"],["impl Serialize for AVMOutcome"],["impl Serialize for CallRequestParams"],["impl Serialize for CallServiceResult"],["impl Serialize for ErrorAVMOutcome"],["impl<'ctx> Serialize for ParticleParameters<'ctx>"]], +"polyplets":[["impl Serialize for ResolvedTriplet"]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/trait.impl/strum/trait.EnumCount.js b/trait.impl/strum/trait.EnumCount.js new file mode 100644 index 00000000..af24533d --- /dev/null +++ b/trait.impl/strum/trait.EnumCount.js @@ -0,0 +1,3 @@ +(function() {var implementors = { +"air":[["impl EnumCount for FarewellError"]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/type.impl/air_interpreter_interface/struct.CallArgumentsRepr.js b/type.impl/air_interpreter_interface/struct.CallArgumentsRepr.js new file mode 100644 index 00000000..a26dec60 --- /dev/null +++ b/type.impl/air_interpreter_interface/struct.CallArgumentsRepr.js @@ -0,0 +1,3 @@ +(function() {var type_impls = { +"air_interpreter_interface":[["
source§

impl Default for CallArgumentsRepr

source§

fn default() -> CallArgumentsRepr

Returns the “default value” for a type. Read more
","Default","air_interpreter_interface::call_request_parameters::CallArgumentsDeserializeError"],["
source§

impl FromSerialized<Vec<JValue>> for CallArgumentsRepr

source§

fn deserialize(\n &self,\n repr: &[u8],\n) -> Result<Vec<JValue>, Self::DeserializeError>

","FromSerialized>","air_interpreter_interface::call_request_parameters::CallArgumentsDeserializeError"],["
source§

impl FromSerialized<Vec<Value>> for CallArgumentsRepr

source§

fn deserialize(&self, repr: &[u8]) -> Result<Vec<Value>, Self::DeserializeError>

","FromSerialized>","air_interpreter_interface::call_request_parameters::CallArgumentsDeserializeError"],["
source§

impl Representation for CallArgumentsRepr

","Representation","air_interpreter_interface::call_request_parameters::CallArgumentsDeserializeError"],["
source§

impl ToSerialized<Vec<JValue>> for CallArgumentsRepr

source§

fn serialize(\n &self,\n value: &Vec<JValue>,\n) -> Result<SerializedCallArguments, Self::SerializeError>

","ToSerialized>","air_interpreter_interface::call_request_parameters::CallArgumentsDeserializeError"],["
source§

impl ToWriter<Vec<JValue>> for CallArgumentsRepr

source§

fn to_writer<W: Write>(\n &self,\n value: &Vec<JValue>,\n writer: &mut W,\n) -> Result<(), Self::WriteError>

","ToWriter>","air_interpreter_interface::call_request_parameters::CallArgumentsDeserializeError"]] +};if (window.register_type_impls) {window.register_type_impls(type_impls);} else {window.pending_type_impls = type_impls;}})() \ No newline at end of file diff --git a/type.impl/air_interpreter_interface/struct.CallRequestsRepr.js b/type.impl/air_interpreter_interface/struct.CallRequestsRepr.js new file mode 100644 index 00000000..6faf1553 --- /dev/null +++ b/type.impl/air_interpreter_interface/struct.CallRequestsRepr.js @@ -0,0 +1,3 @@ +(function() {var type_impls = { +"air_interpreter_interface":[["
source§

impl Default for CallRequestsRepr

source§

fn default() -> CallRequestsRepr

Returns the “default value” for a type. Read more
","Default","air_interpreter_interface::call_request_parameters::CallRequestsDeserializeError"],["
source§

impl FromSerialized<HashMap<u32, CallRequestParams>> for CallRequestsRepr

source§

fn deserialize(\n &self,\n repr: &[u8],\n) -> Result<CallRequests, Self::DeserializeError>

","FromSerialized>","air_interpreter_interface::call_request_parameters::CallRequestsDeserializeError"],["
source§

impl Representation for CallRequestsRepr

","Representation","air_interpreter_interface::call_request_parameters::CallRequestsDeserializeError"],["
source§

impl ToSerialized<HashMap<u32, CallRequestParams>> for CallRequestsRepr

","ToSerialized>","air_interpreter_interface::call_request_parameters::CallRequestsDeserializeError"],["
source§

impl ToWriter<HashMap<u32, CallRequestParams>> for CallRequestsRepr

source§

fn to_writer<W: Write>(\n &self,\n value: &CallRequests,\n writer: &mut W,\n) -> Result<(), Self::WriteError>

","ToWriter>","air_interpreter_interface::call_request_parameters::CallRequestsDeserializeError"]] +};if (window.register_type_impls) {window.register_type_impls(type_impls);} else {window.pending_type_impls = type_impls;}})() \ No newline at end of file diff --git a/type.impl/air_interpreter_interface/struct.CallResultsRepr.js b/type.impl/air_interpreter_interface/struct.CallResultsRepr.js new file mode 100644 index 00000000..c50d02f8 --- /dev/null +++ b/type.impl/air_interpreter_interface/struct.CallResultsRepr.js @@ -0,0 +1,3 @@ +(function() {var type_impls = { +"air_interpreter_interface":[["
source§

impl Default for CallResultsRepr

source§

fn default() -> CallResultsRepr

Returns the “default value” for a type. Read more
","Default","air_interpreter_interface::call_service_result::CallResultsDeserializeError","air_interpreter_interface::call_service_result::CallResultsSerializeError"],["
source§

impl FromSerialized<HashMap<String, CallServiceResult>> for CallResultsRepr

source§

fn deserialize(\n &self,\n repr: &[u8],\n) -> Result<CallResults, Self::DeserializeError>

","FromSerialized>","air_interpreter_interface::call_service_result::CallResultsDeserializeError","air_interpreter_interface::call_service_result::CallResultsSerializeError"],["
source§

impl Representation for CallResultsRepr

","Representation","air_interpreter_interface::call_service_result::CallResultsDeserializeError","air_interpreter_interface::call_service_result::CallResultsSerializeError"],["
source§

impl ToSerialized<HashMap<String, CallServiceResult>> for CallResultsRepr

","ToSerialized>","air_interpreter_interface::call_service_result::CallResultsDeserializeError","air_interpreter_interface::call_service_result::CallResultsSerializeError"],["
source§

impl ToWriter<HashMap<String, CallServiceResult>> for CallResultsRepr

source§

fn to_writer<W: Write>(\n &self,\n value: &CallResults,\n writer: &mut W,\n) -> Result<(), Self::WriteError>

","ToWriter>","air_interpreter_interface::call_service_result::CallResultsDeserializeError","air_interpreter_interface::call_service_result::CallResultsSerializeError"]] +};if (window.register_type_impls) {window.register_type_impls(type_impls);} else {window.pending_type_impls = type_impls;}})() \ No newline at end of file diff --git a/type.impl/air_interpreter_interface/struct.TetrapletsRepr.js b/type.impl/air_interpreter_interface/struct.TetrapletsRepr.js new file mode 100644 index 00000000..18da95b1 --- /dev/null +++ b/type.impl/air_interpreter_interface/struct.TetrapletsRepr.js @@ -0,0 +1,3 @@ +(function() {var type_impls = { +"air_interpreter_interface":[["
source§

impl Default for TetrapletsRepr

source§

fn default() -> TetrapletsRepr

Returns the “default value” for a type. Read more
","Default","air_interpreter_interface::call_request_parameters::TetrapletDeserializeError"],["
source§

impl FromSerialized<Vec<Vec<Rc<SecurityTetraplet>>>> for TetrapletsRepr

source§

fn deserialize(\n &self,\n repr: &[u8],\n) -> Result<Vec<Vec<Rc<SecurityTetraplet>>>, Self::DeserializeError>

","FromSerialized>>>","air_interpreter_interface::call_request_parameters::TetrapletDeserializeError"],["
source§

impl FromSerialized<Vec<Vec<SecurityTetraplet>>> for TetrapletsRepr

source§

fn deserialize(\n &self,\n repr: &[u8],\n) -> Result<Vec<Vec<SecurityTetraplet>>, Self::DeserializeError>

","FromSerialized>>","air_interpreter_interface::call_request_parameters::TetrapletDeserializeError"],["
source§

impl Representation for TetrapletsRepr

","Representation","air_interpreter_interface::call_request_parameters::TetrapletDeserializeError"],["
source§

impl ToSerialized<Vec<Vec<Rc<SecurityTetraplet>>>> for TetrapletsRepr

source§

fn serialize(\n &self,\n value: &Vec<Vec<Rc<SecurityTetraplet>>>,\n) -> Result<SerializedTetraplets, Self::SerializeError>

","ToSerialized>>>","air_interpreter_interface::call_request_parameters::TetrapletDeserializeError"],["
source§

impl ToWriter<Vec<Vec<Rc<SecurityTetraplet>>>> for TetrapletsRepr

source§

fn to_writer<W: Write>(\n &self,\n value: &Vec<Vec<Rc<SecurityTetraplet>>>,\n writer: &mut W,\n) -> Result<(), Self::WriteError>

","ToWriter>>>","air_interpreter_interface::call_request_parameters::TetrapletDeserializeError"]] +};if (window.register_type_impls) {window.register_type_impls(type_impls);} else {window.pending_type_impls = type_impls;}})() \ No newline at end of file diff --git a/type.impl/air_interpreter_sede/rmp_serde/struct.RmpSerdeFormat.js b/type.impl/air_interpreter_sede/rmp_serde/struct.RmpSerdeFormat.js new file mode 100644 index 00000000..f00ee82b --- /dev/null +++ b/type.impl/air_interpreter_sede/rmp_serde/struct.RmpSerdeFormat.js @@ -0,0 +1,6 @@ +(function() {var type_impls = { +"air":[["
source§

impl Clone for RmpSerdeFormat

source§

fn clone(&self) -> RmpSerdeFormat

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
","Clone","air::interpreter_data::InterpreterDataEnvelopeFormat"],["
source§

impl Default for RmpSerdeFormat

source§

fn default() -> RmpSerdeFormat

Returns the “default value” for a type. Read more
","Default","air::interpreter_data::InterpreterDataEnvelopeFormat"],["
source§

impl<Value> Format<Value> for RmpSerdeFormat
where\n Value: Serialize + DeserializeOwned,

§

type SerializationError = Error

§

type DeserializationError = Error

§

type WriteError = Error

source§

fn to_vec(\n &self,\n val: &Value,\n) -> Result<Vec<u8>, <RmpSerdeFormat as Format<Value>>::SerializationError>

source§

fn from_slice(\n &self,\n slice: &[u8],\n) -> Result<Value, <RmpSerdeFormat as Format<Value>>::DeserializationError>

source§

fn to_writer<W>(\n &self,\n value: &Value,\n write: &mut W,\n) -> Result<(), <RmpSerdeFormat as Format<Value>>::WriteError>
where\n W: Write,

","Format","air::interpreter_data::InterpreterDataEnvelopeFormat"],["
source§

impl Copy for RmpSerdeFormat

","Copy","air::interpreter_data::InterpreterDataEnvelopeFormat"]], +"air_interpreter_data":[["
source§

impl Clone for RmpSerdeFormat

source§

fn clone(&self) -> RmpSerdeFormat

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
","Clone","air_interpreter_data::interpreter_data::repr::InterpreterDataEnvelopeFormat"],["
source§

impl Default for RmpSerdeFormat

source§

fn default() -> RmpSerdeFormat

Returns the “default value” for a type. Read more
","Default","air_interpreter_data::interpreter_data::repr::InterpreterDataEnvelopeFormat"],["
source§

impl<Value> Format<Value> for RmpSerdeFormat
where\n Value: Serialize + DeserializeOwned,

§

type SerializationError = Error

§

type DeserializationError = Error

§

type WriteError = Error

source§

fn to_vec(\n &self,\n val: &Value,\n) -> Result<Vec<u8>, <RmpSerdeFormat as Format<Value>>::SerializationError>

source§

fn from_slice(\n &self,\n slice: &[u8],\n) -> Result<Value, <RmpSerdeFormat as Format<Value>>::DeserializationError>

source§

fn to_writer<W>(\n &self,\n value: &Value,\n write: &mut W,\n) -> Result<(), <RmpSerdeFormat as Format<Value>>::WriteError>
where\n W: Write,

","Format","air_interpreter_data::interpreter_data::repr::InterpreterDataEnvelopeFormat"],["
source§

impl Copy for RmpSerdeFormat

","Copy","air_interpreter_data::interpreter_data::repr::InterpreterDataEnvelopeFormat"]], +"air_interpreter_interface":[["
source§

impl Clone for RmpSerdeFormat

source§

fn clone(&self) -> RmpSerdeFormat

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
","Clone","air_interpreter_interface::call_request_parameters::CallArgumentsFormat","air_interpreter_interface::call_request_parameters::TetrapletsFormat"],["
source§

impl Default for RmpSerdeFormat

source§

fn default() -> RmpSerdeFormat

Returns the “default value” for a type. Read more
","Default","air_interpreter_interface::call_request_parameters::CallArgumentsFormat","air_interpreter_interface::call_request_parameters::TetrapletsFormat"],["
source§

impl<Value> Format<Value> for RmpSerdeFormat
where\n Value: Serialize + DeserializeOwned,

§

type SerializationError = Error

§

type DeserializationError = Error

§

type WriteError = Error

source§

fn to_vec(\n &self,\n val: &Value,\n) -> Result<Vec<u8>, <RmpSerdeFormat as Format<Value>>::SerializationError>

source§

fn from_slice(\n &self,\n slice: &[u8],\n) -> Result<Value, <RmpSerdeFormat as Format<Value>>::DeserializationError>

source§

fn to_writer<W>(\n &self,\n value: &Value,\n write: &mut W,\n) -> Result<(), <RmpSerdeFormat as Format<Value>>::WriteError>
where\n W: Write,

","Format","air_interpreter_interface::call_request_parameters::CallArgumentsFormat","air_interpreter_interface::call_request_parameters::TetrapletsFormat"],["
source§

impl Copy for RmpSerdeFormat

","Copy","air_interpreter_interface::call_request_parameters::CallArgumentsFormat","air_interpreter_interface::call_request_parameters::TetrapletsFormat"]], +"air_test_utils":[["
source§

impl Clone for RmpSerdeFormat

source§

fn clone(&self) -> RmpSerdeFormat

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
","Clone","air_test_utils::InterpreterDataEnvelopeFormat"],["
source§

impl Default for RmpSerdeFormat

source§

fn default() -> RmpSerdeFormat

Returns the “default value” for a type. Read more
","Default","air_test_utils::InterpreterDataEnvelopeFormat"],["
source§

impl<Value> Format<Value> for RmpSerdeFormat
where\n Value: Serialize + DeserializeOwned,

§

type SerializationError = Error

§

type DeserializationError = Error

§

type WriteError = Error

source§

fn to_vec(\n &self,\n val: &Value,\n) -> Result<Vec<u8>, <RmpSerdeFormat as Format<Value>>::SerializationError>

source§

fn from_slice(\n &self,\n slice: &[u8],\n) -> Result<Value, <RmpSerdeFormat as Format<Value>>::DeserializationError>

source§

fn to_writer<W>(\n &self,\n value: &Value,\n write: &mut W,\n) -> Result<(), <RmpSerdeFormat as Format<Value>>::WriteError>
where\n W: Write,

","Format","air_test_utils::InterpreterDataEnvelopeFormat"],["
source§

impl Copy for RmpSerdeFormat

","Copy","air_test_utils::InterpreterDataEnvelopeFormat"]] +};if (window.register_type_impls) {window.register_type_impls(type_impls);} else {window.pending_type_impls = type_impls;}})() \ No newline at end of file diff --git a/type.impl/air_interpreter_sede/rmp_serde/struct.RmpSerdeMultiformat.js b/type.impl/air_interpreter_sede/rmp_serde/struct.RmpSerdeMultiformat.js new file mode 100644 index 00000000..703e9a2f --- /dev/null +++ b/type.impl/air_interpreter_sede/rmp_serde/struct.RmpSerdeMultiformat.js @@ -0,0 +1,3 @@ +(function() {var type_impls = { +"air_interpreter_interface":[["
source§

impl Clone for RmpSerdeMultiformat

source§

fn clone(&self) -> RmpSerdeMultiformat

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
","Clone","air_interpreter_interface::call_request_parameters::CallRequestsFormat","air_interpreter_interface::call_service_result::CallResultsFormat"],["
source§

impl Default for RmpSerdeMultiformat

source§

fn default() -> RmpSerdeMultiformat

Returns the “default value” for a type. Read more
","Default","air_interpreter_interface::call_request_parameters::CallRequestsFormat","air_interpreter_interface::call_service_result::CallResultsFormat"],["
source§

impl<Value> Format<Value> for RmpSerdeMultiformat
where\n Value: Serialize + DeserializeOwned,

§

type SerializationError = EncodeError<Error>

§

type DeserializationError = DecodeError<Error>

§

type WriteError = EncodeError<Error>

source§

fn to_vec(\n &self,\n value: &Value,\n) -> Result<Vec<u8>, <RmpSerdeMultiformat as Format<Value>>::SerializationError>

source§

fn from_slice(\n &self,\n slice: &[u8],\n) -> Result<Value, <RmpSerdeMultiformat as Format<Value>>::DeserializationError>

source§

fn to_writer<W>(\n &self,\n value: &Value,\n write: &mut W,\n) -> Result<(), <RmpSerdeMultiformat as Format<Value>>::WriteError>
where\n W: Write,

","Format","air_interpreter_interface::call_request_parameters::CallRequestsFormat","air_interpreter_interface::call_service_result::CallResultsFormat"],["
source§

impl Copy for RmpSerdeMultiformat

","Copy","air_interpreter_interface::call_request_parameters::CallRequestsFormat","air_interpreter_interface::call_service_result::CallResultsFormat"]] +};if (window.register_type_impls) {window.register_type_impls(type_impls);} else {window.pending_type_impls = type_impls;}})() \ No newline at end of file diff --git a/type.impl/alloc/boxed/struct.Box.js b/type.impl/alloc/boxed/struct.Box.js new file mode 100644 index 00000000..c674c6f0 --- /dev/null +++ b/type.impl/alloc/boxed/struct.Box.js @@ -0,0 +1,4 @@ +(function() {var type_impls = { +"air_test_utils":[["
§

impl<'a, A> Arbitrary<'a> for Box<A>
where\n A: Arbitrary<'a>,

§

fn arbitrary(u: &mut Unstructured<'a>) -> Result<Box<A>, Error>

Generate an arbitrary value of Self from the given unstructured data. Read more
§

fn size_hint(depth: usize) -> (usize, Option<usize>)

Get a size hint for how many bytes out of an Unstructured this type\nneeds to construct itself. Read more
§

fn arbitrary_take_rest(u: Unstructured<'a>) -> Result<Self, Error>

Generate an arbitrary value of Self from the entirety of the given\nunstructured data. Read more
","Arbitrary<'a>","air_test_utils::CallServiceClosure","air_test_utils::AVMDataStore","air_test_utils::HostExportedFunc"],["
§

impl<T> Archive for Box<T>
where\n T: ArchiveUnsized + ?Sized,

§

type Archived = ArchivedBox<<T as ArchiveUnsized>::Archived>

The archived representation of this type. Read more
§

type Resolver = BoxResolver<<T as ArchiveUnsized>::MetadataResolver>

The resolver for this type. It must contain all the additional information from serializing\nneeded to make the archived type from the normal type.
§

unsafe fn resolve(\n &self,\n pos: usize,\n resolver: <Box<T> as Archive>::Resolver,\n out: *mut <Box<T> as Archive>::Archived,\n)

Creates the archived version of this value at the given position and writes it to the given\noutput. Read more
","Archive","air_test_utils::CallServiceClosure","air_test_utils::AVMDataStore","air_test_utils::HostExportedFunc"],["
1.64.0 · source§

impl<T> AsFd for Box<T>
where\n T: AsFd + ?Sized,

source§

fn as_fd(&self) -> BorrowedFd<'_>

Borrows the file descriptor. Read more
","AsFd","air_test_utils::CallServiceClosure","air_test_utils::AVMDataStore","air_test_utils::HostExportedFunc"],["
1.5.0 · source§

impl<T, A> AsMut<T> for Box<T, A>
where\n A: Allocator,\n T: ?Sized,

source§

fn as_mut(&mut self) -> &mut T

Converts this type into a mutable reference of the (usually inferred) input type.
","AsMut","air_test_utils::CallServiceClosure","air_test_utils::AVMDataStore","air_test_utils::HostExportedFunc"],["
1.63.0 · source§

impl<T> AsRawFd for Box<T>
where\n T: AsRawFd,

source§

fn as_raw_fd(&self) -> i32

Extracts the raw file descriptor. Read more
","AsRawFd","air_test_utils::CallServiceClosure","air_test_utils::AVMDataStore","air_test_utils::HostExportedFunc"],["
§

impl<T> AsRawReadWriteFd for Box<T>
where\n T: AsRawReadWriteFd,

§

fn as_raw_read_fd(&self) -> i32

Extracts the raw file descriptor for reading. Read more
§

fn as_raw_write_fd(&self) -> i32

Extracts the raw file descriptor for writing. Read more
","AsRawReadWriteFd","air_test_utils::CallServiceClosure","air_test_utils::AVMDataStore","air_test_utils::HostExportedFunc"],["
§

impl<T> AsReadWriteFd for Box<T>
where\n T: AsReadWriteFd,

§

fn as_read_fd(&self) -> BorrowedFd<'_>

Extracts the file descriptor for reading. Read more
§

fn as_write_fd(&self) -> BorrowedFd<'_>

Extracts the file descriptor for writing. Read more
","AsReadWriteFd","air_test_utils::CallServiceClosure","air_test_utils::AVMDataStore","air_test_utils::HostExportedFunc"],["
1.5.0 · source§

impl<T, A> AsRef<T> for Box<T, A>
where\n A: Allocator,\n T: ?Sized,

source§

fn as_ref(&self) -> &T

Converts this type into a shared reference of the (usually inferred) input type.
","AsRef","air_test_utils::CallServiceClosure","air_test_utils::AVMDataStore","air_test_utils::HostExportedFunc"],["
§

impl<T> AsyncBufRead for Box<T>
where\n T: AsyncBufRead + Unpin + ?Sized,

§

fn poll_fill_buf(\n self: Pin<&mut Box<T>>,\n cx: &mut Context<'_>,\n) -> Poll<Result<&[u8], Error>>

Attempt to return the contents of the internal buffer, filling it with more data\nfrom the inner reader if it is empty. Read more
§

fn consume(self: Pin<&mut Box<T>>, amt: usize)

Tells this buffer that amt bytes have been consumed from the buffer,\nso they should no longer be returned in calls to poll_read. Read more
","AsyncBufRead","air_test_utils::CallServiceClosure","air_test_utils::AVMDataStore","air_test_utils::HostExportedFunc"],["
§

impl<T> AsyncBufRead for Box<T>
where\n T: AsyncBufRead + Unpin + ?Sized,

§

fn poll_fill_buf(\n self: Pin<&mut Box<T>>,\n cx: &mut Context<'_>,\n) -> Poll<Result<&[u8], Error>>

Attempts to return the contents of the internal buffer, filling it with more data\nfrom the inner reader if it is empty. Read more
§

fn consume(self: Pin<&mut Box<T>>, amt: usize)

Tells this buffer that amt bytes have been consumed from the buffer,\nso they should no longer be returned in calls to poll_read. Read more
","AsyncBufRead","air_test_utils::CallServiceClosure","air_test_utils::AVMDataStore","air_test_utils::HostExportedFunc"],["
source§

impl<Args, F, A> AsyncFn<Args> for Box<F, A>
where\n Args: Tuple,\n F: AsyncFn<Args> + ?Sized,\n A: Allocator,

source§

extern "rust-call" fn async_call(\n &self,\n args: Args,\n) -> <Box<F, A> as AsyncFnMut<Args>>::CallRefFuture<'_>

🔬This is a nightly-only experimental API. (async_fn_traits)
Call the AsyncFn, returning a future which may borrow from the called closure.
","AsyncFn","air_test_utils::CallServiceClosure","air_test_utils::AVMDataStore","air_test_utils::HostExportedFunc"],["
source§

impl<Args, F, A> AsyncFnMut<Args> for Box<F, A>
where\n Args: Tuple,\n F: AsyncFnMut<Args> + ?Sized,\n A: Allocator,

§

type CallRefFuture<'a> = <F as AsyncFnMut<Args>>::CallRefFuture<'a>\nwhere\n Box<F, A>: 'a

🔬This is a nightly-only experimental API. (async_fn_traits)
source§

extern "rust-call" fn async_call_mut(\n &mut self,\n args: Args,\n) -> <Box<F, A> as AsyncFnMut<Args>>::CallRefFuture<'_>

🔬This is a nightly-only experimental API. (async_fn_traits)
Call the AsyncFnMut, returning a future which may borrow from the called closure.
","AsyncFnMut","air_test_utils::CallServiceClosure","air_test_utils::AVMDataStore","air_test_utils::HostExportedFunc"],["
source§

impl<Args, F, A> AsyncFnOnce<Args> for Box<F, A>
where\n Args: Tuple,\n F: AsyncFnOnce<Args> + ?Sized,\n A: Allocator,

§

type Output = <F as AsyncFnOnce<Args>>::Output

🔬This is a nightly-only experimental API. (async_fn_traits)
Output type of the called closure’s future.
§

type CallOnceFuture = <F as AsyncFnOnce<Args>>::CallOnceFuture

🔬This is a nightly-only experimental API. (async_fn_traits)
Future returned by AsyncFnOnce::async_call_once.
source§

extern "rust-call" fn async_call_once(\n self,\n args: Args,\n) -> <Box<F, A> as AsyncFnOnce<Args>>::CallOnceFuture

🔬This is a nightly-only experimental API. (async_fn_traits)
Call the AsyncFnOnce, returning a future which may move out of the called closure.
","AsyncFnOnce","air_test_utils::CallServiceClosure","air_test_utils::AVMDataStore","air_test_utils::HostExportedFunc"],["
source§

impl<S> AsyncIterator for Box<S>
where\n S: AsyncIterator + Unpin + ?Sized,

§

type Item = <S as AsyncIterator>::Item

🔬This is a nightly-only experimental API. (async_iterator)
The type of items yielded by the async iterator.
source§

fn poll_next(\n self: Pin<&mut Box<S>>,\n cx: &mut Context<'_>,\n) -> Poll<Option<<Box<S> as AsyncIterator>::Item>>

🔬This is a nightly-only experimental API. (async_iterator)
Attempt to pull out the next value of this async iterator, registering the\ncurrent task for wakeup if the value is not yet available, and returning\nNone if the async iterator is exhausted. Read more
source§

fn size_hint(&self) -> (usize, Option<usize>)

🔬This is a nightly-only experimental API. (async_iterator)
Returns the bounds on the remaining length of the async iterator. Read more
","AsyncIterator","air_test_utils::CallServiceClosure","air_test_utils::AVMDataStore","air_test_utils::HostExportedFunc"],["
§

impl<T> AsyncRead for Box<T>
where\n T: AsyncRead + Unpin + ?Sized,

§

fn poll_read(\n self: Pin<&mut Box<T>>,\n cx: &mut Context<'_>,\n buf: &mut ReadBuf<'_>,\n) -> Poll<Result<(), Error>>

Attempts to read from the AsyncRead into buf. Read more
","AsyncRead","air_test_utils::CallServiceClosure","air_test_utils::AVMDataStore","air_test_utils::HostExportedFunc"],["
§

impl<T> AsyncRead for Box<T>
where\n T: AsyncRead + Unpin + ?Sized,

§

fn poll_read(\n self: Pin<&mut Box<T>>,\n cx: &mut Context<'_>,\n buf: &mut [u8],\n) -> Poll<Result<usize, Error>>

Attempt to read from the AsyncRead into buf. Read more
§

fn poll_read_vectored(\n self: Pin<&mut Box<T>>,\n cx: &mut Context<'_>,\n bufs: &mut [IoSliceMut<'_>],\n) -> Poll<Result<usize, Error>>

Attempt to read from the AsyncRead into bufs using vectored\nIO operations. Read more
","AsyncRead","air_test_utils::CallServiceClosure","air_test_utils::AVMDataStore","air_test_utils::HostExportedFunc"],["
§

impl<T> AsyncSeek for Box<T>
where\n T: AsyncSeek + Unpin + ?Sized,

§

fn poll_seek(\n self: Pin<&mut Box<T>>,\n cx: &mut Context<'_>,\n pos: SeekFrom,\n) -> Poll<Result<u64, Error>>

Attempt to seek to an offset, in bytes, in a stream. Read more
","AsyncSeek","air_test_utils::CallServiceClosure","air_test_utils::AVMDataStore","air_test_utils::HostExportedFunc"],["
§

impl<T> AsyncSeek for Box<T>
where\n T: AsyncSeek + Unpin + ?Sized,

§

fn start_seek(self: Pin<&mut Box<T>>, pos: SeekFrom) -> Result<(), Error>

Attempts to seek to an offset, in bytes, in a stream. Read more
§

fn poll_complete(\n self: Pin<&mut Box<T>>,\n cx: &mut Context<'_>,\n) -> Poll<Result<u64, Error>>

Waits for a seek operation to complete. Read more
","AsyncSeek","air_test_utils::CallServiceClosure","air_test_utils::AVMDataStore","air_test_utils::HostExportedFunc"],["
§

impl<T> AsyncWrite for Box<T>
where\n T: AsyncWrite + Unpin + ?Sized,

§

fn poll_write(\n self: Pin<&mut Box<T>>,\n cx: &mut Context<'_>,\n buf: &[u8],\n) -> Poll<Result<usize, Error>>

Attempt to write bytes from buf into the object. Read more
§

fn poll_write_vectored(\n self: Pin<&mut Box<T>>,\n cx: &mut Context<'_>,\n bufs: &[IoSlice<'_>],\n) -> Poll<Result<usize, Error>>

Attempt to write bytes from bufs into the object using vectored\nIO operations. Read more
§

fn poll_flush(\n self: Pin<&mut Box<T>>,\n cx: &mut Context<'_>,\n) -> Poll<Result<(), Error>>

Attempt to flush the object, ensuring that any buffered data reach\ntheir destination. Read more
§

fn poll_close(\n self: Pin<&mut Box<T>>,\n cx: &mut Context<'_>,\n) -> Poll<Result<(), Error>>

Attempt to close the object. Read more
","AsyncWrite","air_test_utils::CallServiceClosure","air_test_utils::AVMDataStore","air_test_utils::HostExportedFunc"],["
§

impl<T> AsyncWrite for Box<T>
where\n T: AsyncWrite + Unpin + ?Sized,

§

fn poll_write(\n self: Pin<&mut Box<T>>,\n cx: &mut Context<'_>,\n buf: &[u8],\n) -> Poll<Result<usize, Error>>

Attempt to write bytes from buf into the object. Read more
§

fn poll_write_vectored(\n self: Pin<&mut Box<T>>,\n cx: &mut Context<'_>,\n bufs: &[IoSlice<'_>],\n) -> Poll<Result<usize, Error>>

Like poll_write, except that it writes from a slice of buffers. Read more
§

fn is_write_vectored(&self) -> bool

Determines if this writer has an efficient poll_write_vectored\nimplementation. Read more
§

fn poll_flush(\n self: Pin<&mut Box<T>>,\n cx: &mut Context<'_>,\n) -> Poll<Result<(), Error>>

Attempts to flush the object, ensuring that any buffered data reach\ntheir destination. Read more
§

fn poll_shutdown(\n self: Pin<&mut Box<T>>,\n cx: &mut Context<'_>,\n) -> Poll<Result<(), Error>>

Initiates or attempts to shut down this writer, returning success when\nthe I/O connection has completely shut down. Read more
","AsyncWrite","air_test_utils::CallServiceClosure","air_test_utils::AVMDataStore","air_test_utils::HostExportedFunc"],["
1.1.0 · source§

impl<T, A> Borrow<T> for Box<T, A>
where\n A: Allocator,\n T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
","Borrow","air_test_utils::CallServiceClosure","air_test_utils::AVMDataStore","air_test_utils::HostExportedFunc"],["
1.1.0 · source§

impl<T, A> BorrowMut<T> for Box<T, A>
where\n A: Allocator,\n T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
","BorrowMut","air_test_utils::CallServiceClosure","air_test_utils::AVMDataStore","air_test_utils::HostExportedFunc"],["
§

impl<T, U> BorshDeserialize for Box<T>
where\n U: Into<Box<T>> + Borrow<T>,\n T: ToOwned<Owned = U> + ?Sized,\n <T as ToOwned>::Owned: BorshDeserialize,

§

fn deserialize_reader<R>(reader: &mut R) -> Result<Box<T>, Error>
where\n R: Read,

§

fn deserialize(buf: &mut &[u8]) -> Result<Self, Error>

Deserializes this instance from a given slice of bytes.\nUpdates the buffer to point at the remaining bytes.
§

fn try_from_slice(v: &[u8]) -> Result<Self, Error>

Deserialize this instance from a slice of bytes.
§

fn try_from_reader<R>(reader: &mut R) -> Result<Self, Error>
where\n R: Read,

","BorshDeserialize","air_test_utils::CallServiceClosure","air_test_utils::AVMDataStore","air_test_utils::HostExportedFunc"],["
§

impl<T> BorshSerialize for Box<T>
where\n T: BorshSerialize + ?Sized,

§

fn serialize<W>(&self, writer: &mut W) -> Result<(), Error>
where\n W: Write,

","BorshSerialize","air_test_utils::CallServiceClosure","air_test_utils::AVMDataStore","air_test_utils::HostExportedFunc"],["
source§

impl<T> Box<T>

1.0.0 · source

pub fn new(x: T) -> Box<T>

Allocates memory on the heap and then places x into it.

\n

This doesn’t actually allocate if T is zero-sized.

\n
§Examples
\n
let five = Box::new(5);
\n
source

pub fn new_uninit() -> Box<MaybeUninit<T>>

🔬This is a nightly-only experimental API. (new_uninit)

Constructs a new box with uninitialized contents.

\n
§Examples
\n
#![feature(new_uninit)]\n\nlet mut five = Box::<u32>::new_uninit();\n\nlet five = unsafe {\n    // Deferred initialization:\n    five.as_mut_ptr().write(5);\n\n    five.assume_init()\n};\n\nassert_eq!(*five, 5)
\n
source

pub fn new_zeroed() -> Box<MaybeUninit<T>>

🔬This is a nightly-only experimental API. (new_uninit)

Constructs a new Box with uninitialized contents, with the memory\nbeing filled with 0 bytes.

\n

See MaybeUninit::zeroed for examples of correct and incorrect usage\nof this method.

\n
§Examples
\n
#![feature(new_uninit)]\n\nlet zero = Box::<u32>::new_zeroed();\nlet zero = unsafe { zero.assume_init() };\n\nassert_eq!(*zero, 0)
\n
1.33.0 · source

pub fn pin(x: T) -> Pin<Box<T>>

Constructs a new Pin<Box<T>>. If T does not implement Unpin, then\nx will be pinned in memory and unable to be moved.

\n

Constructing and pinning of the Box can also be done in two steps: Box::pin(x)\ndoes the same as Box::into_pin(Box::new(x)). Consider using\ninto_pin if you already have a Box<T>, or if you want to\nconstruct a (pinned) Box in a different way than with Box::new.

\n
source

pub fn try_new(x: T) -> Result<Box<T>, AllocError>

🔬This is a nightly-only experimental API. (allocator_api)

Allocates memory on the heap then places x into it,\nreturning an error if the allocation fails

\n

This doesn’t actually allocate if T is zero-sized.

\n
§Examples
\n
#![feature(allocator_api)]\n\nlet five = Box::try_new(5)?;
\n
source

pub fn try_new_uninit() -> Result<Box<MaybeUninit<T>>, AllocError>

🔬This is a nightly-only experimental API. (allocator_api)

Constructs a new box with uninitialized contents on the heap,\nreturning an error if the allocation fails

\n
§Examples
\n
#![feature(allocator_api, new_uninit)]\n\nlet mut five = Box::<u32>::try_new_uninit()?;\n\nlet five = unsafe {\n    // Deferred initialization:\n    five.as_mut_ptr().write(5);\n\n    five.assume_init()\n};\n\nassert_eq!(*five, 5);
\n
source

pub fn try_new_zeroed() -> Result<Box<MaybeUninit<T>>, AllocError>

🔬This is a nightly-only experimental API. (allocator_api)

Constructs a new Box with uninitialized contents, with the memory\nbeing filled with 0 bytes on the heap

\n

See MaybeUninit::zeroed for examples of correct and incorrect usage\nof this method.

\n
§Examples
\n
#![feature(allocator_api, new_uninit)]\n\nlet zero = Box::<u32>::try_new_zeroed()?;\nlet zero = unsafe { zero.assume_init() };\n\nassert_eq!(*zero, 0);
\n
",0,"air_test_utils::CallServiceClosure","air_test_utils::AVMDataStore","air_test_utils::HostExportedFunc"],["
source§

impl<T> Box<T>
where\n T: ?Sized,

1.4.0 · source

pub unsafe fn from_raw(raw: *mut T) -> Box<T>

Constructs a box from a raw pointer.

\n

After calling this function, the raw pointer is owned by the\nresulting Box. Specifically, the Box destructor will call\nthe destructor of T and free the allocated memory. For this\nto be safe, the memory must have been allocated in accordance\nwith the memory layout used by Box .

\n
§Safety
\n

This function is unsafe because improper use may lead to\nmemory problems. For example, a double-free may occur if the\nfunction is called twice on the same raw pointer.

\n

The safety conditions are described in the memory layout section.

\n
§Examples
\n

Recreate a Box which was previously converted to a raw pointer\nusing Box::into_raw:

\n\n
let x = Box::new(5);\nlet ptr = Box::into_raw(x);\nlet x = unsafe { Box::from_raw(ptr) };
\n

Manually create a Box from scratch by using the global allocator:

\n\n
use std::alloc::{alloc, Layout};\n\nunsafe {\n    let ptr = alloc(Layout::new::<i32>()) as *mut i32;\n    // In general .write is required to avoid attempting to destruct\n    // the (uninitialized) previous contents of `ptr`, though for this\n    // simple example `*ptr = 5` would have worked as well.\n    ptr.write(5);\n    let x = Box::from_raw(ptr);\n}
\n
",0,"air_test_utils::CallServiceClosure","air_test_utils::AVMDataStore","air_test_utils::HostExportedFunc"],["
source§

impl<T, A> Box<T, A>
where\n A: Allocator,

source

pub fn new_in(x: T, alloc: A) -> Box<T, A>
where\n A: Allocator,

🔬This is a nightly-only experimental API. (allocator_api)

Allocates memory in the given allocator then places x into it.

\n

This doesn’t actually allocate if T is zero-sized.

\n
§Examples
\n
#![feature(allocator_api)]\n\nuse std::alloc::System;\n\nlet five = Box::new_in(5, System);
\n
source

pub fn try_new_in(x: T, alloc: A) -> Result<Box<T, A>, AllocError>
where\n A: Allocator,

🔬This is a nightly-only experimental API. (allocator_api)

Allocates memory in the given allocator then places x into it,\nreturning an error if the allocation fails

\n

This doesn’t actually allocate if T is zero-sized.

\n
§Examples
\n
#![feature(allocator_api)]\n\nuse std::alloc::System;\n\nlet five = Box::try_new_in(5, System)?;
\n
source

pub fn new_uninit_in(alloc: A) -> Box<MaybeUninit<T>, A>
where\n A: Allocator,

🔬This is a nightly-only experimental API. (allocator_api)

Constructs a new box with uninitialized contents in the provided allocator.

\n
§Examples
\n
#![feature(allocator_api, new_uninit)]\n\nuse std::alloc::System;\n\nlet mut five = Box::<u32, _>::new_uninit_in(System);\n\nlet five = unsafe {\n    // Deferred initialization:\n    five.as_mut_ptr().write(5);\n\n    five.assume_init()\n};\n\nassert_eq!(*five, 5)
\n
source

pub fn try_new_uninit_in(alloc: A) -> Result<Box<MaybeUninit<T>, A>, AllocError>
where\n A: Allocator,

🔬This is a nightly-only experimental API. (allocator_api)

Constructs a new box with uninitialized contents in the provided allocator,\nreturning an error if the allocation fails

\n
§Examples
\n
#![feature(allocator_api, new_uninit)]\n\nuse std::alloc::System;\n\nlet mut five = Box::<u32, _>::try_new_uninit_in(System)?;\n\nlet five = unsafe {\n    // Deferred initialization:\n    five.as_mut_ptr().write(5);\n\n    five.assume_init()\n};\n\nassert_eq!(*five, 5);
\n
source

pub fn new_zeroed_in(alloc: A) -> Box<MaybeUninit<T>, A>
where\n A: Allocator,

🔬This is a nightly-only experimental API. (allocator_api)

Constructs a new Box with uninitialized contents, with the memory\nbeing filled with 0 bytes in the provided allocator.

\n

See MaybeUninit::zeroed for examples of correct and incorrect usage\nof this method.

\n
§Examples
\n
#![feature(allocator_api, new_uninit)]\n\nuse std::alloc::System;\n\nlet zero = Box::<u32, _>::new_zeroed_in(System);\nlet zero = unsafe { zero.assume_init() };\n\nassert_eq!(*zero, 0)
\n
source

pub fn try_new_zeroed_in(alloc: A) -> Result<Box<MaybeUninit<T>, A>, AllocError>
where\n A: Allocator,

🔬This is a nightly-only experimental API. (allocator_api)

Constructs a new Box with uninitialized contents, with the memory\nbeing filled with 0 bytes in the provided allocator,\nreturning an error if the allocation fails,

\n

See MaybeUninit::zeroed for examples of correct and incorrect usage\nof this method.

\n
§Examples
\n
#![feature(allocator_api, new_uninit)]\n\nuse std::alloc::System;\n\nlet zero = Box::<u32, _>::try_new_zeroed_in(System)?;\nlet zero = unsafe { zero.assume_init() };\n\nassert_eq!(*zero, 0);
\n
source

pub fn pin_in(x: T, alloc: A) -> Pin<Box<T, A>>
where\n A: 'static + Allocator,

🔬This is a nightly-only experimental API. (allocator_api)

Constructs a new Pin<Box<T, A>>. If T does not implement Unpin, then\nx will be pinned in memory and unable to be moved.

\n

Constructing and pinning of the Box can also be done in two steps: Box::pin_in(x, alloc)\ndoes the same as Box::into_pin(Box::new_in(x, alloc)). Consider using\ninto_pin if you already have a Box<T, A>, or if you want to\nconstruct a (pinned) Box in a different way than with Box::new_in.

\n
source

pub fn into_boxed_slice(boxed: Box<T, A>) -> Box<[T], A>

🔬This is a nightly-only experimental API. (box_into_boxed_slice)

Converts a Box<T> into a Box<[T]>

\n

This conversion does not allocate on the heap and happens in place.

\n
source

pub fn into_inner(boxed: Box<T, A>) -> T

🔬This is a nightly-only experimental API. (box_into_inner)

Consumes the Box, returning the wrapped value.

\n
§Examples
\n
#![feature(box_into_inner)]\n\nlet c = Box::new(5);\n\nassert_eq!(Box::into_inner(c), 5);
\n
",0,"air_test_utils::CallServiceClosure","air_test_utils::AVMDataStore","air_test_utils::HostExportedFunc"],["
source§

impl<T, A> Box<T, A>
where\n A: Allocator,\n T: ?Sized,

source

pub const unsafe fn from_raw_in(raw: *mut T, alloc: A) -> Box<T, A>

🔬This is a nightly-only experimental API. (allocator_api)

Constructs a box from a raw pointer in the given allocator.

\n

After calling this function, the raw pointer is owned by the\nresulting Box. Specifically, the Box destructor will call\nthe destructor of T and free the allocated memory. For this\nto be safe, the memory must have been allocated in accordance\nwith the memory layout used by Box .

\n
§Safety
\n

This function is unsafe because improper use may lead to\nmemory problems. For example, a double-free may occur if the\nfunction is called twice on the same raw pointer.

\n
§Examples
\n

Recreate a Box which was previously converted to a raw pointer\nusing Box::into_raw_with_allocator:

\n\n
#![feature(allocator_api)]\n\nuse std::alloc::System;\n\nlet x = Box::new_in(5, System);\nlet (ptr, alloc) = Box::into_raw_with_allocator(x);\nlet x = unsafe { Box::from_raw_in(ptr, alloc) };
\n

Manually create a Box from scratch by using the system allocator:

\n\n
#![feature(allocator_api, slice_ptr_get)]\n\nuse std::alloc::{Allocator, Layout, System};\n\nunsafe {\n    let ptr = System.allocate(Layout::new::<i32>())?.as_mut_ptr() as *mut i32;\n    // In general .write is required to avoid attempting to destruct\n    // the (uninitialized) previous contents of `ptr`, though for this\n    // simple example `*ptr = 5` would have worked as well.\n    ptr.write(5);\n    let x = Box::from_raw_in(ptr, System);\n}
\n
1.4.0 · source

pub fn into_raw(b: Box<T, A>) -> *mut T

Consumes the Box, returning a wrapped raw pointer.

\n

The pointer will be properly aligned and non-null.

\n

After calling this function, the caller is responsible for the\nmemory previously managed by the Box. In particular, the\ncaller should properly destroy T and release the memory, taking\ninto account the memory layout used by Box. The easiest way to\ndo this is to convert the raw pointer back into a Box with the\nBox::from_raw function, allowing the Box destructor to perform\nthe cleanup.

\n

Note: this is an associated function, which means that you have\nto call it as Box::into_raw(b) instead of b.into_raw(). This\nis so that there is no conflict with a method on the inner type.

\n
§Examples
\n

Converting the raw pointer back into a Box with Box::from_raw\nfor automatic cleanup:

\n\n
let x = Box::new(String::from(\"Hello\"));\nlet ptr = Box::into_raw(x);\nlet x = unsafe { Box::from_raw(ptr) };
\n

Manual cleanup by explicitly running the destructor and deallocating\nthe memory:

\n\n
use std::alloc::{dealloc, Layout};\nuse std::ptr;\n\nlet x = Box::new(String::from(\"Hello\"));\nlet ptr = Box::into_raw(x);\nunsafe {\n    ptr::drop_in_place(ptr);\n    dealloc(ptr as *mut u8, Layout::new::<String>());\n}
\n

Note: This is equivalent to the following:

\n\n
let x = Box::new(String::from(\"Hello\"));\nlet ptr = Box::into_raw(x);\nunsafe {\n    drop(Box::from_raw(ptr));\n}
\n
source

pub fn into_raw_with_allocator(b: Box<T, A>) -> (*mut T, A)

🔬This is a nightly-only experimental API. (allocator_api)

Consumes the Box, returning a wrapped raw pointer and the allocator.

\n

The pointer will be properly aligned and non-null.

\n

After calling this function, the caller is responsible for the\nmemory previously managed by the Box. In particular, the\ncaller should properly destroy T and release the memory, taking\ninto account the memory layout used by Box. The easiest way to\ndo this is to convert the raw pointer back into a Box with the\nBox::from_raw_in function, allowing the Box destructor to perform\nthe cleanup.

\n

Note: this is an associated function, which means that you have\nto call it as Box::into_raw_with_allocator(b) instead of b.into_raw_with_allocator(). This\nis so that there is no conflict with a method on the inner type.

\n
§Examples
\n

Converting the raw pointer back into a Box with Box::from_raw_in\nfor automatic cleanup:

\n\n
#![feature(allocator_api)]\n\nuse std::alloc::System;\n\nlet x = Box::new_in(String::from(\"Hello\"), System);\nlet (ptr, alloc) = Box::into_raw_with_allocator(x);\nlet x = unsafe { Box::from_raw_in(ptr, alloc) };
\n

Manual cleanup by explicitly running the destructor and deallocating\nthe memory:

\n\n
#![feature(allocator_api)]\n\nuse std::alloc::{Allocator, Layout, System};\nuse std::ptr::{self, NonNull};\n\nlet x = Box::new_in(String::from(\"Hello\"), System);\nlet (ptr, alloc) = Box::into_raw_with_allocator(x);\nunsafe {\n    ptr::drop_in_place(ptr);\n    let non_null = NonNull::new_unchecked(ptr);\n    alloc.deallocate(non_null.cast(), Layout::new::<String>());\n}
\n
source

pub const fn allocator(b: &Box<T, A>) -> &A

🔬This is a nightly-only experimental API. (allocator_api)

Returns a reference to the underlying allocator.

\n

Note: this is an associated function, which means that you have\nto call it as Box::allocator(&b) instead of b.allocator(). This\nis so that there is no conflict with a method on the inner type.

\n
1.26.0 · source

pub fn leak<'a>(b: Box<T, A>) -> &'a mut T
where\n A: 'a,

Consumes and leaks the Box, returning a mutable reference,\n&'a mut T. Note that the type T must outlive the chosen lifetime\n'a. If the type has only static references, or none at all, then this\nmay be chosen to be 'static.

\n

This function is mainly useful for data that lives for the remainder of\nthe program’s life. Dropping the returned reference will cause a memory\nleak. If this is not acceptable, the reference should first be wrapped\nwith the Box::from_raw function producing a Box. This Box can\nthen be dropped which will properly destroy T and release the\nallocated memory.

\n

Note: this is an associated function, which means that you have\nto call it as Box::leak(b) instead of b.leak(). This\nis so that there is no conflict with a method on the inner type.

\n
§Examples
\n

Simple usage:

\n\n
let x = Box::new(41);\nlet static_ref: &'static mut usize = Box::leak(x);\n*static_ref += 1;\nassert_eq!(*static_ref, 42);
\n

Unsized data:

\n\n
let x = vec![1, 2, 3].into_boxed_slice();\nlet static_ref = Box::leak(x);\nstatic_ref[0] = 4;\nassert_eq!(*static_ref, [4, 2, 3]);
\n
1.63.0 (const: unstable) · source

pub fn into_pin(boxed: Box<T, A>) -> Pin<Box<T, A>>
where\n A: 'static,

Converts a Box<T> into a Pin<Box<T>>. If T does not implement Unpin, then\n*boxed will be pinned in memory and unable to be moved.

\n

This conversion does not allocate on the heap and happens in place.

\n

This is also available via From.

\n

Constructing and pinning a Box with Box::into_pin(Box::new(x))\ncan also be written more concisely using Box::pin(x).\nThis into_pin method is useful if you already have a Box<T>, or you are\nconstructing a (pinned) Box in a different way than with Box::new.

\n
§Notes
\n

It’s not recommended that crates add an impl like From<Box<T>> for Pin<T>,\nas it’ll introduce an ambiguity when calling Pin::from.\nA demonstration of such a poor impl is shown below.

\n\n
struct Foo; // A type defined in this crate.\nimpl From<Box<()>> for Pin<Foo> {\n    fn from(_: Box<()>) -> Pin<Foo> {\n        Pin::new(Foo)\n    }\n}\n\nlet foo = Box::new(());\nlet bar = Pin::from(foo);
\n
",0,"air_test_utils::CallServiceClosure","air_test_utils::AVMDataStore","air_test_utils::HostExportedFunc"],["
§

impl<T> Buf for Box<T>
where\n T: Buf + ?Sized,

§

fn remaining(&self) -> usize

Returns the number of bytes between the current position and the end of\nthe buffer. Read more
§

fn chunk(&self) -> &[u8]

Returns a slice starting at the current position and of length between 0\nand Buf::remaining(). Note that this can return shorter slice (this allows\nnon-continuous internal representation). Read more
§

fn chunks_vectored<'b>(&'b self, dst: &mut [IoSlice<'b>]) -> usize

Fills dst with potentially multiple slices starting at self’s\ncurrent position. Read more
§

fn advance(&mut self, cnt: usize)

Advance the internal cursor of the Buf Read more
§

fn has_remaining(&self) -> bool

Returns true if there are any more bytes to consume Read more
§

fn copy_to_slice(&mut self, dst: &mut [u8])

Copies bytes from self into dst. Read more
§

fn get_u8(&mut self) -> u8

Gets an unsigned 8 bit integer from self. Read more
§

fn get_i8(&mut self) -> i8

Gets a signed 8 bit integer from self. Read more
§

fn get_u16(&mut self) -> u16

Gets an unsigned 16 bit integer from self in big-endian byte order. Read more
§

fn get_u16_le(&mut self) -> u16

Gets an unsigned 16 bit integer from self in little-endian byte order. Read more
§

fn get_u16_ne(&mut self) -> u16

Gets an unsigned 16 bit integer from self in native-endian byte order. Read more
§

fn get_i16(&mut self) -> i16

Gets a signed 16 bit integer from self in big-endian byte order. Read more
§

fn get_i16_le(&mut self) -> i16

Gets a signed 16 bit integer from self in little-endian byte order. Read more
§

fn get_i16_ne(&mut self) -> i16

Gets a signed 16 bit integer from self in native-endian byte order. Read more
§

fn get_u32(&mut self) -> u32

Gets an unsigned 32 bit integer from self in the big-endian byte order. Read more
§

fn get_u32_le(&mut self) -> u32

Gets an unsigned 32 bit integer from self in the little-endian byte order. Read more
§

fn get_u32_ne(&mut self) -> u32

Gets an unsigned 32 bit integer from self in native-endian byte order. Read more
§

fn get_i32(&mut self) -> i32

Gets a signed 32 bit integer from self in big-endian byte order. Read more
§

fn get_i32_le(&mut self) -> i32

Gets a signed 32 bit integer from self in little-endian byte order. Read more
§

fn get_i32_ne(&mut self) -> i32

Gets a signed 32 bit integer from self in native-endian byte order. Read more
§

fn get_u64(&mut self) -> u64

Gets an unsigned 64 bit integer from self in big-endian byte order. Read more
§

fn get_u64_le(&mut self) -> u64

Gets an unsigned 64 bit integer from self in little-endian byte order. Read more
§

fn get_u64_ne(&mut self) -> u64

Gets an unsigned 64 bit integer from self in native-endian byte order. Read more
§

fn get_i64(&mut self) -> i64

Gets a signed 64 bit integer from self in big-endian byte order. Read more
§

fn get_i64_le(&mut self) -> i64

Gets a signed 64 bit integer from self in little-endian byte order. Read more
§

fn get_i64_ne(&mut self) -> i64

Gets a signed 64 bit integer from self in native-endian byte order. Read more
§

fn get_uint(&mut self, nbytes: usize) -> u64

Gets an unsigned n-byte integer from self in big-endian byte order. Read more
§

fn get_uint_le(&mut self, nbytes: usize) -> u64

Gets an unsigned n-byte integer from self in little-endian byte order. Read more
§

fn get_uint_ne(&mut self, nbytes: usize) -> u64

Gets an unsigned n-byte integer from self in native-endian byte order. Read more
§

fn get_int(&mut self, nbytes: usize) -> i64

Gets a signed n-byte integer from self in big-endian byte order. Read more
§

fn get_int_le(&mut self, nbytes: usize) -> i64

Gets a signed n-byte integer from self in little-endian byte order. Read more
§

fn get_int_ne(&mut self, nbytes: usize) -> i64

Gets a signed n-byte integer from self in native-endian byte order. Read more
§

fn copy_to_bytes(&mut self, len: usize) -> Bytes

Consumes len bytes inside self and returns new instance of Bytes\nwith this data. Read more
§

fn get_u128(&mut self) -> u128

Gets an unsigned 128 bit integer from self in big-endian byte order. Read more
§

fn get_u128_le(&mut self) -> u128

Gets an unsigned 128 bit integer from self in little-endian byte order. Read more
§

fn get_u128_ne(&mut self) -> u128

Gets an unsigned 128 bit integer from self in native-endian byte order. Read more
§

fn get_i128(&mut self) -> i128

Gets a signed 128 bit integer from self in big-endian byte order. Read more
§

fn get_i128_le(&mut self) -> i128

Gets a signed 128 bit integer from self in little-endian byte order. Read more
§

fn get_i128_ne(&mut self) -> i128

Gets a signed 128 bit integer from self in native-endian byte order. Read more
§

fn get_f32(&mut self) -> f32

Gets an IEEE754 single-precision (4 bytes) floating point number from\nself in big-endian byte order. Read more
§

fn get_f32_le(&mut self) -> f32

Gets an IEEE754 single-precision (4 bytes) floating point number from\nself in little-endian byte order. Read more
§

fn get_f32_ne(&mut self) -> f32

Gets an IEEE754 single-precision (4 bytes) floating point number from\nself in native-endian byte order. Read more
§

fn get_f64(&mut self) -> f64

Gets an IEEE754 double-precision (8 bytes) floating point number from\nself in big-endian byte order. Read more
§

fn get_f64_le(&mut self) -> f64

Gets an IEEE754 double-precision (8 bytes) floating point number from\nself in little-endian byte order. Read more
§

fn get_f64_ne(&mut self) -> f64

Gets an IEEE754 double-precision (8 bytes) floating point number from\nself in native-endian byte order. Read more
§

fn take(self, limit: usize) -> Take<Self>
where\n Self: Sized,

Creates an adaptor which will read at most limit bytes from self. Read more
§

fn chain<U>(self, next: U) -> Chain<Self, U>
where\n U: Buf,\n Self: Sized,

Creates an adaptor which will chain this buffer with another. Read more
§

fn reader(self) -> Reader<Self>
where\n Self: Sized,

Creates an adaptor which implements the Read trait for self. Read more
","Buf","air_test_utils::CallServiceClosure","air_test_utils::AVMDataStore","air_test_utils::HostExportedFunc"],["
§

impl<T> BufMut for Box<T>
where\n T: BufMut + ?Sized,

§

fn remaining_mut(&self) -> usize

Returns the number of bytes that can be written from the current\nposition until the end of the buffer is reached. Read more
§

fn chunk_mut(&mut self) -> &mut UninitSlice

Returns a mutable slice starting at the current BufMut position and of\nlength between 0 and BufMut::remaining_mut(). Note that this can be shorter than the\nwhole remainder of the buffer (this allows non-continuous implementation). Read more
§

unsafe fn advance_mut(&mut self, cnt: usize)

Advance the internal cursor of the BufMut Read more
§

fn put_slice(&mut self, src: &[u8])

Transfer bytes into self from src and advance the cursor by the\nnumber of bytes written. Read more
§

fn put_u8(&mut self, n: u8)

Writes an unsigned 8 bit integer to self. Read more
§

fn put_i8(&mut self, n: i8)

Writes a signed 8 bit integer to self. Read more
§

fn put_u16(&mut self, n: u16)

Writes an unsigned 16 bit integer to self in big-endian byte order. Read more
§

fn put_u16_le(&mut self, n: u16)

Writes an unsigned 16 bit integer to self in little-endian byte order. Read more
§

fn put_u16_ne(&mut self, n: u16)

Writes an unsigned 16 bit integer to self in native-endian byte order. Read more
§

fn put_i16(&mut self, n: i16)

Writes a signed 16 bit integer to self in big-endian byte order. Read more
§

fn put_i16_le(&mut self, n: i16)

Writes a signed 16 bit integer to self in little-endian byte order. Read more
§

fn put_i16_ne(&mut self, n: i16)

Writes a signed 16 bit integer to self in native-endian byte order. Read more
§

fn put_u32(&mut self, n: u32)

Writes an unsigned 32 bit integer to self in big-endian byte order. Read more
§

fn put_u32_le(&mut self, n: u32)

Writes an unsigned 32 bit integer to self in little-endian byte order. Read more
§

fn put_u32_ne(&mut self, n: u32)

Writes an unsigned 32 bit integer to self in native-endian byte order. Read more
§

fn put_i32(&mut self, n: i32)

Writes a signed 32 bit integer to self in big-endian byte order. Read more
§

fn put_i32_le(&mut self, n: i32)

Writes a signed 32 bit integer to self in little-endian byte order. Read more
§

fn put_i32_ne(&mut self, n: i32)

Writes a signed 32 bit integer to self in native-endian byte order. Read more
§

fn put_u64(&mut self, n: u64)

Writes an unsigned 64 bit integer to self in the big-endian byte order. Read more
§

fn put_u64_le(&mut self, n: u64)

Writes an unsigned 64 bit integer to self in little-endian byte order. Read more
§

fn put_u64_ne(&mut self, n: u64)

Writes an unsigned 64 bit integer to self in native-endian byte order. Read more
§

fn put_i64(&mut self, n: i64)

Writes a signed 64 bit integer to self in the big-endian byte order. Read more
§

fn put_i64_le(&mut self, n: i64)

Writes a signed 64 bit integer to self in little-endian byte order. Read more
§

fn put_i64_ne(&mut self, n: i64)

Writes a signed 64 bit integer to self in native-endian byte order. Read more
§

fn has_remaining_mut(&self) -> bool

Returns true if there is space in self for more bytes. Read more
§

fn put<T>(&mut self, src: T)
where\n T: Buf,\n Self: Sized,

Transfer bytes into self from src and advance the cursor by the\nnumber of bytes written. Read more
§

fn put_bytes(&mut self, val: u8, cnt: usize)

Put cnt bytes val into self. Read more
§

fn put_u128(&mut self, n: u128)

Writes an unsigned 128 bit integer to self in the big-endian byte order. Read more
§

fn put_u128_le(&mut self, n: u128)

Writes an unsigned 128 bit integer to self in little-endian byte order. Read more
§

fn put_u128_ne(&mut self, n: u128)

Writes an unsigned 128 bit integer to self in native-endian byte order. Read more
§

fn put_i128(&mut self, n: i128)

Writes a signed 128 bit integer to self in the big-endian byte order. Read more
§

fn put_i128_le(&mut self, n: i128)

Writes a signed 128 bit integer to self in little-endian byte order. Read more
§

fn put_i128_ne(&mut self, n: i128)

Writes a signed 128 bit integer to self in native-endian byte order. Read more
§

fn put_uint(&mut self, n: u64, nbytes: usize)

Writes an unsigned n-byte integer to self in big-endian byte order. Read more
§

fn put_uint_le(&mut self, n: u64, nbytes: usize)

Writes an unsigned n-byte integer to self in the little-endian byte order. Read more
§

fn put_uint_ne(&mut self, n: u64, nbytes: usize)

Writes an unsigned n-byte integer to self in the native-endian byte order. Read more
§

fn put_int(&mut self, n: i64, nbytes: usize)

Writes low nbytes of a signed integer to self in big-endian byte order. Read more
§

fn put_int_le(&mut self, n: i64, nbytes: usize)

Writes low nbytes of a signed integer to self in little-endian byte order. Read more
§

fn put_int_ne(&mut self, n: i64, nbytes: usize)

Writes low nbytes of a signed integer to self in native-endian byte order. Read more
§

fn put_f32(&mut self, n: f32)

Writes an IEEE754 single-precision (4 bytes) floating point number to\nself in big-endian byte order. Read more
§

fn put_f32_le(&mut self, n: f32)

Writes an IEEE754 single-precision (4 bytes) floating point number to\nself in little-endian byte order. Read more
§

fn put_f32_ne(&mut self, n: f32)

Writes an IEEE754 single-precision (4 bytes) floating point number to\nself in native-endian byte order. Read more
§

fn put_f64(&mut self, n: f64)

Writes an IEEE754 double-precision (8 bytes) floating point number to\nself in big-endian byte order. Read more
§

fn put_f64_le(&mut self, n: f64)

Writes an IEEE754 double-precision (8 bytes) floating point number to\nself in little-endian byte order. Read more
§

fn put_f64_ne(&mut self, n: f64)

Writes an IEEE754 double-precision (8 bytes) floating point number to\nself in native-endian byte order. Read more
§

fn limit(self, limit: usize) -> Limit<Self>
where\n Self: Sized,

Creates an adaptor which can write at most limit bytes to self. Read more
§

fn writer(self) -> Writer<Self>
where\n Self: Sized,

Creates an adaptor which implements the Write trait for self. Read more
§

fn chain_mut<U>(self, next: U) -> Chain<Self, U>
where\n U: BufMut,\n Self: Sized,

Creates an adapter which will chain this buffer with another. Read more
","BufMut","air_test_utils::CallServiceClosure","air_test_utils::AVMDataStore","air_test_utils::HostExportedFunc"],["
1.0.0 · source§

impl<B> BufRead for Box<B>
where\n B: BufRead + ?Sized,

source§

fn fill_buf(&mut self) -> Result<&[u8], Error>

Returns the contents of the internal buffer, filling it with more data\nfrom the inner reader if it is empty. Read more
source§

fn consume(&mut self, amt: usize)

Tells this buffer that amt bytes have been consumed from the buffer,\nso they should no longer be returned in calls to read. Read more
source§

fn read_until(&mut self, byte: u8, buf: &mut Vec<u8>) -> Result<usize, Error>

Read all bytes into buf until the delimiter byte or EOF is reached. Read more
source§

fn read_line(&mut self, buf: &mut String) -> Result<usize, Error>

Read all bytes until a newline (the 0xA byte) is reached, and append\nthem to the provided String buffer. Read more
source§

fn has_data_left(&mut self) -> Result<bool, Error>

🔬This is a nightly-only experimental API. (buf_read_has_data_left)
Check if the underlying Read has any data left to be read. Read more
source§

fn skip_until(&mut self, byte: u8) -> Result<usize, Error>

🔬This is a nightly-only experimental API. (bufread_skip_until)
Skip all bytes until the delimiter byte or EOF is reached. Read more
1.0.0 · source§

fn split(self, byte: u8) -> Split<Self>
where\n Self: Sized,

Returns an iterator over the contents of this reader split on the byte\nbyte. Read more
1.0.0 · source§

fn lines(self) -> Lines<Self>
where\n Self: Sized,

Returns an iterator over the lines of this reader. Read more
","BufRead","air_test_utils::CallServiceClosure","air_test_utils::AVMDataStore","air_test_utils::HostExportedFunc"],["
1.0.0 · source§

impl<T, A> Clone for Box<T, A>
where\n T: Clone,\n A: Allocator + Clone,

source§

fn clone(&self) -> Box<T, A>

Returns a new box with a clone() of this box’s contents.

\n
§Examples
\n
let x = Box::new(5);\nlet y = x.clone();\n\n// The value is the same\nassert_eq!(x, y);\n\n// But they are unique objects\nassert_ne!(&*x as *const i32, &*y as *const i32);
\n
source§

fn clone_from(&mut self, source: &Box<T, A>)

Copies source’s contents into self without creating a new allocation.

\n
§Examples
\n
let x = Box::new(5);\nlet mut y = Box::new(10);\nlet yp: *const i32 = &*y;\n\ny.clone_from(&x);\n\n// The value is the same\nassert_eq!(x, y);\n\n// And no allocation occurred\nassert_eq!(yp, &*y);
\n
","Clone","air_test_utils::CallServiceClosure","air_test_utils::AVMDataStore","air_test_utils::HostExportedFunc"],["
source§

impl<G, R, A> Coroutine<R> for Box<G, A>
where\n G: Coroutine<R> + Unpin + ?Sized,\n A: Allocator,

§

type Yield = <G as Coroutine<R>>::Yield

🔬This is a nightly-only experimental API. (coroutine_trait)
The type of value this coroutine yields. Read more
§

type Return = <G as Coroutine<R>>::Return

🔬This is a nightly-only experimental API. (coroutine_trait)
The type of value this coroutine returns. Read more
source§

fn resume(\n self: Pin<&mut Box<G, A>>,\n arg: R,\n) -> CoroutineState<<Box<G, A> as Coroutine<R>>::Yield, <Box<G, A> as Coroutine<R>>::Return>

🔬This is a nightly-only experimental API. (coroutine_trait)
Resumes the execution of this coroutine. Read more
","Coroutine","air_test_utils::CallServiceClosure","air_test_utils::AVMDataStore","air_test_utils::HostExportedFunc"],["
1.0.0 · source§

impl<T, A> Debug for Box<T, A>
where\n T: Debug + ?Sized,\n A: Allocator,

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
","Debug","air_test_utils::CallServiceClosure","air_test_utils::AVMDataStore","air_test_utils::HostExportedFunc"],["
1.0.0 · source§

impl<T> Default for Box<T>
where\n T: Default,

source§

fn default() -> Box<T>

Creates a Box<T>, with the Default value for T.

\n
","Default","air_test_utils::CallServiceClosure","air_test_utils::AVMDataStore","air_test_utils::HostExportedFunc"],["
1.0.0 · source§

impl<T, A> Deref for Box<T, A>
where\n A: Allocator,\n T: ?Sized,

§

type Target = T

The resulting type after dereferencing.
source§

fn deref(&self) -> &T

Dereferences the value.
","Deref","air_test_utils::CallServiceClosure","air_test_utils::AVMDataStore","air_test_utils::HostExportedFunc"],["
1.0.0 · source§

impl<T, A> DerefMut for Box<T, A>
where\n A: Allocator,\n T: ?Sized,

source§

fn deref_mut(&mut self) -> &mut T

Mutably dereferences the value.
","DerefMut","air_test_utils::CallServiceClosure","air_test_utils::AVMDataStore","air_test_utils::HostExportedFunc"],["
source§

impl<'de, T> Deserialize<'de> for Box<T>
where\n T: Deserialize<'de>,

source§

fn deserialize<D>(\n deserializer: D,\n) -> Result<Box<T>, <D as Deserializer<'de>>::Error>
where\n D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
","Deserialize<'de>","air_test_utils::CallServiceClosure","air_test_utils::AVMDataStore","air_test_utils::HostExportedFunc"],["
source§

impl<'de, T, U> DeserializeAs<'de, Box<T>> for Box<U>
where\n U: DeserializeAs<'de, T>,

source§

fn deserialize_as<D>(\n deserializer: D,\n) -> Result<Box<T>, <D as Deserializer<'de>>::Error>
where\n D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer.
","DeserializeAs<'de, Box>","air_test_utils::CallServiceClosure","air_test_utils::AVMDataStore","air_test_utils::HostExportedFunc"],["
1.0.0 · source§

impl<T, A> Display for Box<T, A>
where\n T: Display + ?Sized,\n A: Allocator,

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
","Display","air_test_utils::CallServiceClosure","air_test_utils::AVMDataStore","air_test_utils::HostExportedFunc"],["
source§

impl<I> DoubleEndedFallibleIterator for Box<I>

source§

fn next_back(\n &mut self,\n) -> Result<Option<<I as FallibleIterator>::Item>, <I as FallibleIterator>::Error>

Advances the end of the iterator, returning the last value.
source§

fn rfold<B, F>(self, init: B, f: F) -> Result<B, Self::Error>
where\n Self: Sized,\n F: FnMut(B, Self::Item) -> Result<B, Self::Error>,

Applies a function over the elements of the iterator in reverse order, producing a single final value.
source§

fn try_rfold<B, E, F>(&mut self, init: B, f: F) -> Result<B, E>
where\n Self: Sized,\n E: From<Self::Error>,\n F: FnMut(B, Self::Item) -> Result<B, E>,

Applies a function over the elements of the iterator in reverse, producing a single final value. Read more
","DoubleEndedFallibleIterator","air_test_utils::CallServiceClosure","air_test_utils::AVMDataStore","air_test_utils::HostExportedFunc"],["
1.0.0 · source§

impl<I, A> DoubleEndedIterator for Box<I, A>
where\n I: DoubleEndedIterator + ?Sized,\n A: Allocator,

source§

fn next_back(&mut self) -> Option<<I as Iterator>::Item>

Removes and returns an element from the end of the iterator. Read more
source§

fn nth_back(&mut self, n: usize) -> Option<<I as Iterator>::Item>

Returns the nth element from the end of the iterator. Read more
source§

fn advance_back_by(&mut self, n: usize) -> Result<(), NonZero<usize>>

🔬This is a nightly-only experimental API. (iter_advance_by)
Advances the iterator from the back by n elements. Read more
1.27.0 · source§

fn try_rfold<B, F, R>(&mut self, init: B, f: F) -> R
where\n Self: Sized,\n F: FnMut(B, Self::Item) -> R,\n R: Try<Output = B>,

This is the reverse version of Iterator::try_fold(): it takes\nelements starting from the back of the iterator. Read more
1.27.0 · source§

fn rfold<B, F>(self, init: B, f: F) -> B
where\n Self: Sized,\n F: FnMut(B, Self::Item) -> B,

An iterator method that reduces the iterator’s elements to a single,\nfinal value, starting from the back. Read more
1.27.0 · source§

fn rfind<P>(&mut self, predicate: P) -> Option<Self::Item>
where\n Self: Sized,\n P: FnMut(&Self::Item) -> bool,

Searches for an element of an iterator from the back that satisfies a predicate. Read more
","DoubleEndedIterator","air_test_utils::CallServiceClosure","air_test_utils::AVMDataStore","air_test_utils::HostExportedFunc"],["
1.0.0 · source§

impl<T, A> Drop for Box<T, A>
where\n A: Allocator,\n T: ?Sized,

source§

fn drop(&mut self)

Executes the destructor for this type. Read more
","Drop","air_test_utils::CallServiceClosure","air_test_utils::AVMDataStore","air_test_utils::HostExportedFunc"],["
1.8.0 · source§

impl<T> Error for Box<T>
where\n T: Error,

source§

fn description(&self) -> &str

👎Deprecated since 1.42.0: use the Display impl or to_string()
source§

fn cause(&self) -> Option<&dyn Error>

👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
source§

fn source(&self) -> Option<&(dyn Error + 'static)>

The lower-level source of this error, if any. Read more
source§

fn provide<'b>(&'b self, request: &mut Request<'b>)

🔬This is a nightly-only experimental API. (error_generic_member_access)
Provides type based access to context intended for error reports. Read more
","Error","air_test_utils::CallServiceClosure","air_test_utils::AVMDataStore","air_test_utils::HostExportedFunc"],["
1.0.0 · source§

impl<I, A> ExactSizeIterator for Box<I, A>
where\n I: ExactSizeIterator + ?Sized,\n A: Allocator,

source§

fn len(&self) -> usize

Returns the exact remaining length of the iterator. Read more
source§

fn is_empty(&self) -> bool

🔬This is a nightly-only experimental API. (exact_size_is_empty)
Returns true if the iterator is empty. Read more
","ExactSizeIterator","air_test_utils::CallServiceClosure","air_test_utils::AVMDataStore","air_test_utils::HostExportedFunc"],["
source§

impl<I> FallibleIterator for Box<I>
where\n I: FallibleIterator + ?Sized,

§

type Item = <I as FallibleIterator>::Item

The type being iterated over.
§

type Error = <I as FallibleIterator>::Error

The error type.
source§

fn next(\n &mut self,\n) -> Result<Option<<I as FallibleIterator>::Item>, <I as FallibleIterator>::Error>

Advances the iterator and returns the next value. Read more
source§

fn size_hint(&self) -> (usize, Option<usize>)

Returns bounds on the remaining length of the iterator. Read more
source§

fn nth(\n &mut self,\n n: usize,\n) -> Result<Option<<I as FallibleIterator>::Item>, <I as FallibleIterator>::Error>

Returns the nth element of the iterator.
source§

fn count(self) -> Result<usize, Self::Error>
where\n Self: Sized,

Consumes the iterator, returning the number of remaining items.
source§

fn last(self) -> Result<Option<Self::Item>, Self::Error>
where\n Self: Sized,

Returns the last element of the iterator.
source§

fn step_by(self, step: usize) -> StepBy<Self>
where\n Self: Sized,

Returns an iterator starting at the same point, but stepping by the given amount at each iteration. Read more
source§

fn chain<I>(self, it: I) -> Chain<Self, I>
where\n I: IntoFallibleIterator<Item = Self::Item, Error = Self::Error>,\n Self: Sized,

Returns an iterator which yields the elements of this iterator followed\nby another.
source§

fn zip<I>(\n self,\n o: I,\n) -> Zip<Self, <I as IntoFallibleIterator>::IntoFallibleIter>
where\n Self: Sized,\n I: IntoFallibleIterator<Error = Self::Error>,

Returns an iterator that yields pairs of this iterator’s and another\niterator’s values.
source§

fn map<F, B>(self, f: F) -> Map<Self, F>
where\n Self: Sized,\n F: FnMut(Self::Item) -> Result<B, Self::Error>,

Returns an iterator which applies a fallible transform to the elements\nof the underlying iterator.
source§

fn for_each<F>(self, f: F) -> Result<(), Self::Error>
where\n Self: Sized,\n F: FnMut(Self::Item) -> Result<(), Self::Error>,

Calls a fallible closure on each element of an iterator.
source§

fn filter<F>(self, f: F) -> Filter<Self, F>
where\n Self: Sized,\n F: FnMut(&Self::Item) -> Result<bool, Self::Error>,

Returns an iterator which uses a predicate to determine which values\nshould be yielded. The predicate may fail; such failures are passed to\nthe caller.
source§

fn filter_map<B, F>(self, f: F) -> FilterMap<Self, F>
where\n Self: Sized,\n F: FnMut(Self::Item) -> Result<Option<B>, Self::Error>,

Returns an iterator which both filters and maps. The closure may fail;\nsuch failures are passed along to the consumer.
source§

fn enumerate(self) -> Enumerate<Self>
where\n Self: Sized,

Returns an iterator which yields the current iteration count as well\nas the value.
source§

fn peekable(self) -> Peekable<Self>
where\n Self: Sized,

Returns an iterator that can peek at the next element without consuming\nit.
source§

fn skip_while<P>(self, predicate: P) -> SkipWhile<Self, P>
where\n Self: Sized,\n P: FnMut(&Self::Item) -> Result<bool, Self::Error>,

Returns an iterator that skips elements based on a predicate.
source§

fn take_while<P>(self, predicate: P) -> TakeWhile<Self, P>
where\n Self: Sized,\n P: FnMut(&Self::Item) -> Result<bool, Self::Error>,

Returns an iterator that yields elements based on a predicate.
source§

fn skip(self, n: usize) -> Skip<Self>
where\n Self: Sized,

Returns an iterator which skips the first n values of this iterator.
source§

fn take(self, n: usize) -> Take<Self>
where\n Self: Sized,

Returns an iterator that yields only the first n values of this\niterator.
source§

fn scan<St, B, F>(self, initial_state: St, f: F) -> Scan<Self, St, F>
where\n Self: Sized,\n F: FnMut(&mut St, Self::Item) -> Result<Option<B>, Self::Error>,

Returns an iterator which applies a stateful map to values of this\niterator.
source§

fn flat_map<U, F>(self, f: F) -> FlatMap<Self, U, F>
where\n Self: Sized,\n U: IntoFallibleIterator<Error = Self::Error>,\n F: FnMut(Self::Item) -> Result<U, Self::Error>,

Returns an iterator which maps this iterator’s elements to iterators, yielding those iterators’ values.
source§

fn fuse(self) -> Fuse<Self>
where\n Self: Sized,

Returns an iterator which yields this iterator’s elements and ends after\nthe first Ok(None). Read more
source§

fn inspect<F>(self, f: F) -> Inspect<Self, F>
where\n Self: Sized,\n F: FnMut(&Self::Item) -> Result<(), Self::Error>,

Returns an iterator which passes each element to a closure before returning it.
source§

fn by_ref(&mut self) -> &mut Self
where\n Self: Sized,

Borrow an iterator rather than consuming it. Read more
source§

fn collect<T>(self) -> Result<T, Self::Error>
where\n T: FromFallibleIterator<Self::Item>,\n Self: Sized,

Transforms the iterator into a collection. Read more
source§

fn partition<B, F>(self, f: F) -> Result<(B, B), Self::Error>
where\n Self: Sized,\n B: Default + Extend<Self::Item>,\n F: FnMut(&Self::Item) -> Result<bool, Self::Error>,

Transforms the iterator into two collections, partitioning elements by a closure.
source§

fn fold<B, F>(self, init: B, f: F) -> Result<B, Self::Error>
where\n Self: Sized,\n F: FnMut(B, Self::Item) -> Result<B, Self::Error>,

Applies a function over the elements of the iterator, producing a single\nfinal value.
source§

fn try_fold<B, E, F>(&mut self, init: B, f: F) -> Result<B, E>
where\n Self: Sized,\n E: From<Self::Error>,\n F: FnMut(B, Self::Item) -> Result<B, E>,

Applies a function over the elements of the iterator, producing a single final value. Read more
source§

fn all<F>(&mut self, f: F) -> Result<bool, Self::Error>
where\n Self: Sized,\n F: FnMut(Self::Item) -> Result<bool, Self::Error>,

Determines if all elements of this iterator match a predicate.
source§

fn any<F>(&mut self, f: F) -> Result<bool, Self::Error>
where\n Self: Sized,\n F: FnMut(Self::Item) -> Result<bool, Self::Error>,

Determines if any element of this iterator matches a predicate.
source§

fn find<F>(&mut self, f: F) -> Result<Option<Self::Item>, Self::Error>
where\n Self: Sized,\n F: FnMut(&Self::Item) -> Result<bool, Self::Error>,

Returns the first element of the iterator that matches a predicate.
source§

fn find_map<B, F>(&mut self, f: F) -> Result<Option<B>, Self::Error>
where\n Self: Sized,\n F: FnMut(Self::Item) -> Result<Option<B>, Self::Error>,

Applies a function to the elements of the iterator, returning the first non-None result.
source§

fn position<F>(&mut self, f: F) -> Result<Option<usize>, Self::Error>
where\n Self: Sized,\n F: FnMut(Self::Item) -> Result<bool, Self::Error>,

Returns the position of the first element of this iterator that matches\na predicate. The predicate may fail; such failures are returned to the\ncaller.
source§

fn max_by_key<B, F>(self, f: F) -> Result<Option<Self::Item>, Self::Error>
where\n Self: Sized,\n B: Ord,\n F: FnMut(&Self::Item) -> Result<B, Self::Error>,

Returns the element of the iterator which gives the maximum value from\nthe function.
source§

fn max_by<F>(self, f: F) -> Result<Option<Self::Item>, Self::Error>
where\n Self: Sized,\n F: FnMut(&Self::Item, &Self::Item) -> Result<Ordering, Self::Error>,

Returns the element that gives the maximum value with respect to the function.
source§

fn min_by_key<B, F>(self, f: F) -> Result<Option<Self::Item>, Self::Error>
where\n Self: Sized,\n B: Ord,\n F: FnMut(&Self::Item) -> Result<B, Self::Error>,

Returns the element of the iterator which gives the minimum value from\nthe function.
source§

fn min_by<F>(self, f: F) -> Result<Option<Self::Item>, Self::Error>
where\n Self: Sized,\n F: FnMut(&Self::Item, &Self::Item) -> Result<Ordering, Self::Error>,

Returns the element that gives the minimum value with respect to the function.
source§

fn unzip<A, B, FromA, FromB>(self) -> Result<(FromA, FromB), Self::Error>
where\n Self: Sized + FallibleIterator<Item = (A, B)>,\n FromA: Default + Extend<A>,\n FromB: Default + Extend<B>,

Converts an iterator of pairs into a pair of containers.
source§

fn cloned<'a, T>(self) -> Cloned<Self>
where\n Self: Sized + FallibleIterator<Item = &'a T>,\n T: 'a + Clone,

Returns an iterator which clones all of its elements.
source§

fn partial_cmp<I>(self, other: I) -> Result<Option<Ordering>, Self::Error>
where\n Self: Sized,\n I: IntoFallibleIterator<Error = Self::Error>,\n Self::Item: PartialOrd<<I as IntoFallibleIterator>::Item>,

Lexicographically compares the elements of this iterator to that of\nanother.
source§

fn eq<I>(self, other: I) -> Result<bool, Self::Error>
where\n Self: Sized,\n I: IntoFallibleIterator<Error = Self::Error>,\n Self::Item: PartialEq<<I as IntoFallibleIterator>::Item>,

Determines if the elements of this iterator are equal to those of\nanother.
source§

fn ne<I>(self, other: I) -> Result<bool, Self::Error>
where\n Self: Sized,\n I: IntoFallibleIterator<Error = Self::Error>,\n Self::Item: PartialEq<<I as IntoFallibleIterator>::Item>,

Determines if the elements of this iterator are not equal to those of\nanother.
source§

fn lt<I>(self, other: I) -> Result<bool, Self::Error>
where\n Self: Sized,\n I: IntoFallibleIterator<Error = Self::Error>,\n Self::Item: PartialOrd<<I as IntoFallibleIterator>::Item>,

Determines if the elements of this iterator are lexicographically less\nthan those of another.
source§

fn le<I>(self, other: I) -> Result<bool, Self::Error>
where\n Self: Sized,\n I: IntoFallibleIterator<Error = Self::Error>,\n Self::Item: PartialOrd<<I as IntoFallibleIterator>::Item>,

Determines if the elements of this iterator are lexicographically less\nthan or equal to those of another.
source§

fn gt<I>(self, other: I) -> Result<bool, Self::Error>
where\n Self: Sized,\n I: IntoFallibleIterator<Error = Self::Error>,\n Self::Item: PartialOrd<<I as IntoFallibleIterator>::Item>,

Determines if the elements of this iterator are lexicographically\ngreater than those of another.
source§

fn ge<I>(self, other: I) -> Result<bool, Self::Error>
where\n Self: Sized,\n I: IntoFallibleIterator<Error = Self::Error>,\n Self::Item: PartialOrd<<I as IntoFallibleIterator>::Item>,

Determines if the elements of this iterator are lexicographically\ngreater than or equal to those of another.
source§

fn iterator(self) -> Iterator<Self>
where\n Self: Sized,

Returns a normal (non-fallible) iterator over Result<Item, Error>.
source§

fn map_err<B, F>(self, f: F) -> MapErr<Self, F>
where\n F: FnMut(Self::Error) -> B,\n Self: Sized,

Returns an iterator which applies a transform to the errors of the\nunderlying iterator.
","FallibleIterator","air_test_utils::CallServiceClosure","air_test_utils::AVMDataStore","air_test_utils::HostExportedFunc"],["
1.35.0 · source§

impl<Args, F, A> Fn<Args> for Box<F, A>
where\n Args: Tuple,\n F: Fn<Args> + ?Sized,\n A: Allocator,

source§

extern "rust-call" fn call(\n &self,\n args: Args,\n) -> <Box<F, A> as FnOnce<Args>>::Output

🔬This is a nightly-only experimental API. (fn_traits)
Performs the call operation.
","Fn","air_test_utils::CallServiceClosure","air_test_utils::AVMDataStore","air_test_utils::HostExportedFunc"],["
1.35.0 · source§

impl<Args, F, A> FnMut<Args> for Box<F, A>
where\n Args: Tuple,\n F: FnMut<Args> + ?Sized,\n A: Allocator,

source§

extern "rust-call" fn call_mut(\n &mut self,\n args: Args,\n) -> <Box<F, A> as FnOnce<Args>>::Output

🔬This is a nightly-only experimental API. (fn_traits)
Performs the call operation.
","FnMut","air_test_utils::CallServiceClosure","air_test_utils::AVMDataStore","air_test_utils::HostExportedFunc"],["
1.35.0 · source§

impl<Args, F, A> FnOnce<Args> for Box<F, A>
where\n Args: Tuple,\n F: FnOnce<Args> + ?Sized,\n A: Allocator,

§

type Output = <F as FnOnce<Args>>::Output

The returned type after the call operator is used.
source§

extern "rust-call" fn call_once(\n self,\n args: Args,\n) -> <Box<F, A> as FnOnce<Args>>::Output

🔬This is a nightly-only experimental API. (fn_traits)
Performs the call operation.
","FnOnce","air_test_utils::CallServiceClosure","air_test_utils::AVMDataStore","air_test_utils::HostExportedFunc"],["
1.6.0 · source§

impl<T> From<T> for Box<T>

source§

fn from(t: T) -> Box<T>

Converts a T into a Box<T>

\n

The conversion allocates on the heap and moves t\nfrom the stack into it.

\n
§Examples
\n
let x = 5;\nlet boxed = Box::new(5);\n\nassert_eq!(Box::from(x), boxed);
\n
","From","air_test_utils::CallServiceClosure","air_test_utils::AVMDataStore","air_test_utils::HostExportedFunc"],["
§

impl<F> FusedFuture for Box<F>
where\n F: FusedFuture + Unpin + ?Sized,

§

fn is_terminated(&self) -> bool

Returns true if the underlying future should no longer be polled.
","FusedFuture","air_test_utils::CallServiceClosure","air_test_utils::AVMDataStore","air_test_utils::HostExportedFunc"],["
§

impl<S> FusedStream for Box<S>
where\n S: FusedStream + Unpin + ?Sized,

§

fn is_terminated(&self) -> bool

Returns true if the stream should no longer be polled.
","FusedStream","air_test_utils::CallServiceClosure","air_test_utils::AVMDataStore","air_test_utils::HostExportedFunc"],["
1.36.0 · source§

impl<F, A> Future for Box<F, A>
where\n F: Future + Unpin + ?Sized,\n A: Allocator,

§

type Output = <F as Future>::Output

The type of value produced on completion.
source§

fn poll(\n self: Pin<&mut Box<F, A>>,\n cx: &mut Context<'_>,\n) -> Poll<<Box<F, A> as Future>::Output>

Attempt to resolve the future to a final value, registering\nthe current task for wakeup if the value is not yet available. Read more
","Future","air_test_utils::CallServiceClosure","air_test_utils::AVMDataStore","air_test_utils::HostExportedFunc"],["
§

impl<T> GuestMemory for Box<T>
where\n T: GuestMemory + ?Sized,

§

fn base(&self) -> &[UnsafeCell<u8>]

Returns the base allocation of this guest memory, located in host\nmemory. Read more
§

fn has_outstanding_borrows(&self) -> bool

Indicates whether any outstanding borrows are known to the\nGuestMemory. This function must be false in order for it to be\nsafe to recursively call into a WebAssembly module, or to manipulate\nthe WebAssembly memory by any other means.
§

fn is_mut_borrowed(&self, r: Region) -> bool

Check if a region of linear memory is exclusively borrowed. This is called during any\nGuestPtr::read or GuestPtr::write operation to ensure that wiggle is not reading or\nwriting a region of memory which Rust believes it has exclusive access to.
§

fn is_shared_borrowed(&self, r: Region) -> bool

Check if a region of linear memory has any shared borrows.
§

fn mut_borrow(&self, r: Region) -> Result<BorrowHandle, GuestError>

Exclusively borrow a region of linear memory. This is used when constructing a\nGuestSliceMut or GuestStrMut. Those types will give Rust &mut access\nto the region of linear memory, therefore, the GuestMemory impl must\nguarantee that at most one BorrowHandle is issued to a given region,\nGuestMemory::has_outstanding_borrows is true for the duration of the\nborrow, and that GuestMemory::is_mut_borrowed of any overlapping region\nis false for the duration of the borrow.
§

fn shared_borrow(&self, r: Region) -> Result<BorrowHandle, GuestError>

Shared borrow a region of linear memory. This is used when constructing a\nGuestSlice or GuestStr. Those types will give Rust & (shared reference) access\nto the region of linear memory.
§

fn mut_unborrow(&self, h: BorrowHandle)

Unborrow a previously borrowed mutable region. As long as GuestSliceMut and\nGuestStrMut are implemented correctly, a mut BorrowHandle should only be\nunborrowed once.
§

fn shared_unborrow(&self, h: BorrowHandle)

Unborrow a previously borrowed shared region. As long as GuestSlice and\nGuestStr are implemented correctly, a shared BorrowHandle should only be\nunborrowed once.
§

fn ptr<'a, T>(&'a self, offset: <T as Pointee>::Pointer) -> GuestPtr<'a, T>
where\n Self: Sized,\n T: Pointee + ?Sized,

Convenience method for creating a GuestPtr at a particular offset. Read more
§

fn is_shared_memory(&self) -> bool

Check if the underlying memory is shared across multiple threads; e.g.,\nwith a WebAssembly shared memory.
","GuestMemory","air_test_utils::CallServiceClosure","air_test_utils::AVMDataStore","air_test_utils::HostExportedFunc"],["
1.0.0 · source§

impl<T, A> Hash for Box<T, A>
where\n T: Hash + ?Sized,\n A: Allocator,

source§

fn hash<H>(&self, state: &mut H)
where\n H: Hasher,

Feeds this value into the given Hasher. Read more
1.3.0 · source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where\n H: Hasher,\n Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
","Hash","air_test_utils::CallServiceClosure","air_test_utils::AVMDataStore","air_test_utils::HostExportedFunc"],["
1.22.0 · source§

impl<T, A> Hasher for Box<T, A>
where\n T: Hasher + ?Sized,\n A: Allocator,

source§

fn finish(&self) -> u64

Returns the hash value for the values written so far. Read more
source§

fn write(&mut self, bytes: &[u8])

Writes some data into this Hasher. Read more
source§

fn write_u8(&mut self, i: u8)

Writes a single u8 into this hasher.
source§

fn write_u16(&mut self, i: u16)

Writes a single u16 into this hasher.
source§

fn write_u32(&mut self, i: u32)

Writes a single u32 into this hasher.
source§

fn write_u64(&mut self, i: u64)

Writes a single u64 into this hasher.
source§

fn write_u128(&mut self, i: u128)

Writes a single u128 into this hasher.
source§

fn write_usize(&mut self, i: usize)

Writes a single usize into this hasher.
source§

fn write_i8(&mut self, i: i8)

Writes a single i8 into this hasher.
source§

fn write_i16(&mut self, i: i16)

Writes a single i16 into this hasher.
source§

fn write_i32(&mut self, i: i32)

Writes a single i32 into this hasher.
source§

fn write_i64(&mut self, i: i64)

Writes a single i64 into this hasher.
source§

fn write_i128(&mut self, i: i128)

Writes a single i128 into this hasher.
source§

fn write_isize(&mut self, i: isize)

Writes a single isize into this hasher.
source§

fn write_length_prefix(&mut self, len: usize)

🔬This is a nightly-only experimental API. (hasher_prefixfree_extras)
Writes a length prefix into this hasher, as part of being prefix-free. Read more
source§

fn write_str(&mut self, s: &str)

🔬This is a nightly-only experimental API. (hasher_prefixfree_extras)
Writes a single str into this hasher. Read more
","Hasher","air_test_utils::CallServiceClosure","air_test_utils::AVMDataStore","air_test_utils::HostExportedFunc"],["
1.0.0 · source§

impl<I, A> Iterator for Box<I, A>
where\n I: Iterator + ?Sized,\n A: Allocator,

§

type Item = <I as Iterator>::Item

The type of the elements being iterated over.
source§

fn next(&mut self) -> Option<<I as Iterator>::Item>

Advances the iterator and returns the next value. Read more
source§

fn size_hint(&self) -> (usize, Option<usize>)

Returns the bounds on the remaining length of the iterator. Read more
source§

fn nth(&mut self, n: usize) -> Option<<I as Iterator>::Item>

Returns the nth element of the iterator. Read more
source§

fn last(self) -> Option<<I as Iterator>::Item>

Consumes the iterator, returning the last element. Read more
source§

fn next_chunk<const N: usize>(\n &mut self,\n) -> Result<[Self::Item; N], IntoIter<Self::Item, N>>
where\n Self: Sized,

🔬This is a nightly-only experimental API. (iter_next_chunk)
Advances the iterator and returns an array containing the next N values. Read more
1.0.0 · source§

fn count(self) -> usize
where\n Self: Sized,

Consumes the iterator, counting the number of iterations and returning it. Read more
source§

fn advance_by(&mut self, n: usize) -> Result<(), NonZero<usize>>

🔬This is a nightly-only experimental API. (iter_advance_by)
Advances the iterator by n elements. Read more
1.28.0 · source§

fn step_by(self, step: usize) -> StepBy<Self>
where\n Self: Sized,

Creates an iterator starting at the same point, but stepping by\nthe given amount at each iteration. Read more
1.0.0 · source§

fn chain<U>(self, other: U) -> Chain<Self, <U as IntoIterator>::IntoIter>
where\n Self: Sized,\n U: IntoIterator<Item = Self::Item>,

Takes two iterators and creates a new iterator over both in sequence. Read more
1.0.0 · source§

fn zip<U>(self, other: U) -> Zip<Self, <U as IntoIterator>::IntoIter>
where\n Self: Sized,\n U: IntoIterator,

‘Zips up’ two iterators into a single iterator of pairs. Read more
source§

fn intersperse_with<G>(self, separator: G) -> IntersperseWith<Self, G>
where\n Self: Sized,\n G: FnMut() -> Self::Item,

🔬This is a nightly-only experimental API. (iter_intersperse)
Creates a new iterator which places an item generated by separator\nbetween adjacent items of the original iterator. Read more
1.0.0 · source§

fn map<B, F>(self, f: F) -> Map<Self, F>
where\n Self: Sized,\n F: FnMut(Self::Item) -> B,

Takes a closure and creates an iterator which calls that closure on each\nelement. Read more
1.21.0 · source§

fn for_each<F>(self, f: F)
where\n Self: Sized,\n F: FnMut(Self::Item),

Calls a closure on each element of an iterator. Read more
1.0.0 · source§

fn filter<P>(self, predicate: P) -> Filter<Self, P>
where\n Self: Sized,\n P: FnMut(&Self::Item) -> bool,

Creates an iterator which uses a closure to determine if an element\nshould be yielded. Read more
1.0.0 · source§

fn filter_map<B, F>(self, f: F) -> FilterMap<Self, F>
where\n Self: Sized,\n F: FnMut(Self::Item) -> Option<B>,

Creates an iterator that both filters and maps. Read more
1.0.0 · source§

fn enumerate(self) -> Enumerate<Self>
where\n Self: Sized,

Creates an iterator which gives the current iteration count as well as\nthe next value. Read more
1.0.0 · source§

fn peekable(self) -> Peekable<Self>
where\n Self: Sized,

Creates an iterator which can use the peek and peek_mut methods\nto look at the next element of the iterator without consuming it. See\ntheir documentation for more information. Read more
1.0.0 · source§

fn skip_while<P>(self, predicate: P) -> SkipWhile<Self, P>
where\n Self: Sized,\n P: FnMut(&Self::Item) -> bool,

Creates an iterator that skips elements based on a predicate. Read more
1.0.0 · source§

fn take_while<P>(self, predicate: P) -> TakeWhile<Self, P>
where\n Self: Sized,\n P: FnMut(&Self::Item) -> bool,

Creates an iterator that yields elements based on a predicate. Read more
1.57.0 · source§

fn map_while<B, P>(self, predicate: P) -> MapWhile<Self, P>
where\n Self: Sized,\n P: FnMut(Self::Item) -> Option<B>,

Creates an iterator that both yields elements based on a predicate and maps. Read more
1.0.0 · source§

fn skip(self, n: usize) -> Skip<Self>
where\n Self: Sized,

Creates an iterator that skips the first n elements. Read more
1.0.0 · source§

fn take(self, n: usize) -> Take<Self>
where\n Self: Sized,

Creates an iterator that yields the first n elements, or fewer\nif the underlying iterator ends sooner. Read more
1.0.0 · source§

fn scan<St, B, F>(self, initial_state: St, f: F) -> Scan<Self, St, F>
where\n Self: Sized,\n F: FnMut(&mut St, Self::Item) -> Option<B>,

An iterator adapter which, like fold, holds internal state, but\nunlike fold, produces a new iterator. Read more
1.0.0 · source§

fn flat_map<U, F>(self, f: F) -> FlatMap<Self, U, F>
where\n Self: Sized,\n U: IntoIterator,\n F: FnMut(Self::Item) -> U,

Creates an iterator that works like map, but flattens nested structure. Read more
source§

fn map_windows<F, R, const N: usize>(self, f: F) -> MapWindows<Self, F, N>
where\n Self: Sized,\n F: FnMut(&[Self::Item; N]) -> R,

🔬This is a nightly-only experimental API. (iter_map_windows)
Calls the given function f for each contiguous window of size N over\nself and returns an iterator over the outputs of f. Like slice::windows(),\nthe windows during mapping overlap as well. Read more
1.0.0 · source§

fn fuse(self) -> Fuse<Self>
where\n Self: Sized,

Creates an iterator which ends after the first None. Read more
1.0.0 · source§

fn inspect<F>(self, f: F) -> Inspect<Self, F>
where\n Self: Sized,\n F: FnMut(&Self::Item),

Does something with each element of an iterator, passing the value on. Read more
1.0.0 · source§

fn by_ref(&mut self) -> &mut Self
where\n Self: Sized,

Borrows an iterator, rather than consuming it. Read more
1.0.0 · source§

fn collect<B>(self) -> B
where\n B: FromIterator<Self::Item>,\n Self: Sized,

Transforms an iterator into a collection. Read more
source§

fn collect_into<E>(self, collection: &mut E) -> &mut E
where\n E: Extend<Self::Item>,\n Self: Sized,

🔬This is a nightly-only experimental API. (iter_collect_into)
Collects all the items from an iterator into a collection. Read more
1.0.0 · source§

fn partition<B, F>(self, f: F) -> (B, B)
where\n Self: Sized,\n B: Default + Extend<Self::Item>,\n F: FnMut(&Self::Item) -> bool,

Consumes an iterator, creating two collections from it. Read more
source§

fn is_partitioned<P>(self, predicate: P) -> bool
where\n Self: Sized,\n P: FnMut(Self::Item) -> bool,

🔬This is a nightly-only experimental API. (iter_is_partitioned)
Checks if the elements of this iterator are partitioned according to the given predicate,\nsuch that all those that return true precede all those that return false. Read more
1.27.0 · source§

fn try_fold<B, F, R>(&mut self, init: B, f: F) -> R
where\n Self: Sized,\n F: FnMut(B, Self::Item) -> R,\n R: Try<Output = B>,

An iterator method that applies a function as long as it returns\nsuccessfully, producing a single, final value. Read more
1.27.0 · source§

fn try_for_each<F, R>(&mut self, f: F) -> R
where\n Self: Sized,\n F: FnMut(Self::Item) -> R,\n R: Try<Output = ()>,

An iterator method that applies a fallible function to each item in the\niterator, stopping at the first error and returning that error. Read more
1.0.0 · source§

fn fold<B, F>(self, init: B, f: F) -> B
where\n Self: Sized,\n F: FnMut(B, Self::Item) -> B,

Folds every element into an accumulator by applying an operation,\nreturning the final result. Read more
1.51.0 · source§

fn reduce<F>(self, f: F) -> Option<Self::Item>
where\n Self: Sized,\n F: FnMut(Self::Item, Self::Item) -> Self::Item,

Reduces the elements to a single one, by repeatedly applying a reducing\noperation. Read more
source§

fn try_reduce<R>(\n &mut self,\n f: impl FnMut(Self::Item, Self::Item) -> R,\n) -> <<R as Try>::Residual as Residual<Option<<R as Try>::Output>>>::TryType
where\n Self: Sized,\n R: Try<Output = Self::Item>,\n <R as Try>::Residual: Residual<Option<Self::Item>>,

🔬This is a nightly-only experimental API. (iterator_try_reduce)
Reduces the elements to a single one by repeatedly applying a reducing operation. If the\nclosure returns a failure, the failure is propagated back to the caller immediately. Read more
1.0.0 · source§

fn all<F>(&mut self, f: F) -> bool
where\n Self: Sized,\n F: FnMut(Self::Item) -> bool,

Tests if every element of the iterator matches a predicate. Read more
1.0.0 · source§

fn any<F>(&mut self, f: F) -> bool
where\n Self: Sized,\n F: FnMut(Self::Item) -> bool,

Tests if any element of the iterator matches a predicate. Read more
1.0.0 · source§

fn find<P>(&mut self, predicate: P) -> Option<Self::Item>
where\n Self: Sized,\n P: FnMut(&Self::Item) -> bool,

Searches for an element of an iterator that satisfies a predicate. Read more
1.30.0 · source§

fn find_map<B, F>(&mut self, f: F) -> Option<B>
where\n Self: Sized,\n F: FnMut(Self::Item) -> Option<B>,

Applies function to the elements of iterator and returns\nthe first non-none result. Read more
source§

fn try_find<R>(\n &mut self,\n f: impl FnMut(&Self::Item) -> R,\n) -> <<R as Try>::Residual as Residual<Option<Self::Item>>>::TryType
where\n Self: Sized,\n R: Try<Output = bool>,\n <R as Try>::Residual: Residual<Option<Self::Item>>,

🔬This is a nightly-only experimental API. (try_find)
Applies function to the elements of iterator and returns\nthe first true result or the first error. Read more
1.0.0 · source§

fn position<P>(&mut self, predicate: P) -> Option<usize>
where\n Self: Sized,\n P: FnMut(Self::Item) -> bool,

Searches for an element in an iterator, returning its index. Read more
1.6.0 · source§

fn max_by_key<B, F>(self, f: F) -> Option<Self::Item>
where\n B: Ord,\n Self: Sized,\n F: FnMut(&Self::Item) -> B,

Returns the element that gives the maximum value from the\nspecified function. Read more
1.15.0 · source§

fn max_by<F>(self, compare: F) -> Option<Self::Item>
where\n Self: Sized,\n F: FnMut(&Self::Item, &Self::Item) -> Ordering,

Returns the element that gives the maximum value with respect to the\nspecified comparison function. Read more
1.6.0 · source§

fn min_by_key<B, F>(self, f: F) -> Option<Self::Item>
where\n B: Ord,\n Self: Sized,\n F: FnMut(&Self::Item) -> B,

Returns the element that gives the minimum value from the\nspecified function. Read more
1.15.0 · source§

fn min_by<F>(self, compare: F) -> Option<Self::Item>
where\n Self: Sized,\n F: FnMut(&Self::Item, &Self::Item) -> Ordering,

Returns the element that gives the minimum value with respect to the\nspecified comparison function. Read more
1.0.0 · source§

fn unzip<A, B, FromA, FromB>(self) -> (FromA, FromB)
where\n FromA: Default + Extend<A>,\n FromB: Default + Extend<B>,\n Self: Sized + Iterator<Item = (A, B)>,

Converts an iterator of pairs into a pair of containers. Read more
1.36.0 · source§

fn copied<'a, T>(self) -> Copied<Self>
where\n T: 'a + Copy,\n Self: Sized + Iterator<Item = &'a T>,

Creates an iterator which copies all of its elements. Read more
1.0.0 · source§

fn cloned<'a, T>(self) -> Cloned<Self>
where\n T: 'a + Clone,\n Self: Sized + Iterator<Item = &'a T>,

Creates an iterator which clones all of its elements. Read more
source§

fn array_chunks<const N: usize>(self) -> ArrayChunks<Self, N>
where\n Self: Sized,

🔬This is a nightly-only experimental API. (iter_array_chunks)
Returns an iterator over N elements of the iterator at a time. Read more
1.11.0 · source§

fn sum<S>(self) -> S
where\n Self: Sized,\n S: Sum<Self::Item>,

Sums the elements of an iterator. Read more
1.11.0 · source§

fn product<P>(self) -> P
where\n Self: Sized,\n P: Product<Self::Item>,

Iterates over the entire iterator, multiplying all the elements Read more
source§

fn cmp_by<I, F>(self, other: I, cmp: F) -> Ordering
where\n Self: Sized,\n I: IntoIterator,\n F: FnMut(Self::Item, <I as IntoIterator>::Item) -> Ordering,

🔬This is a nightly-only experimental API. (iter_order_by)
Lexicographically compares the elements of this Iterator with those\nof another with respect to the specified comparison function. Read more
1.5.0 · source§

fn partial_cmp<I>(self, other: I) -> Option<Ordering>
where\n I: IntoIterator,\n Self::Item: PartialOrd<<I as IntoIterator>::Item>,\n Self: Sized,

Lexicographically compares the PartialOrd elements of\nthis Iterator with those of another. The comparison works like short-circuit\nevaluation, returning a result without comparing the remaining elements.\nAs soon as an order can be determined, the evaluation stops and a result is returned. Read more
source§

fn partial_cmp_by<I, F>(self, other: I, partial_cmp: F) -> Option<Ordering>
where\n Self: Sized,\n I: IntoIterator,\n F: FnMut(Self::Item, <I as IntoIterator>::Item) -> Option<Ordering>,

🔬This is a nightly-only experimental API. (iter_order_by)
Lexicographically compares the elements of this Iterator with those\nof another with respect to the specified comparison function. Read more
1.5.0 · source§

fn eq<I>(self, other: I) -> bool
where\n I: IntoIterator,\n Self::Item: PartialEq<<I as IntoIterator>::Item>,\n Self: Sized,

Determines if the elements of this Iterator are equal to those of\nanother. Read more
source§

fn eq_by<I, F>(self, other: I, eq: F) -> bool
where\n Self: Sized,\n I: IntoIterator,\n F: FnMut(Self::Item, <I as IntoIterator>::Item) -> bool,

🔬This is a nightly-only experimental API. (iter_order_by)
Determines if the elements of this Iterator are equal to those of\nanother with respect to the specified equality function. Read more
1.5.0 · source§

fn ne<I>(self, other: I) -> bool
where\n I: IntoIterator,\n Self::Item: PartialEq<<I as IntoIterator>::Item>,\n Self: Sized,

Determines if the elements of this Iterator are not equal to those of\nanother. Read more
1.5.0 · source§

fn lt<I>(self, other: I) -> bool
where\n I: IntoIterator,\n Self::Item: PartialOrd<<I as IntoIterator>::Item>,\n Self: Sized,

Determines if the elements of this Iterator are lexicographically\nless than those of another. Read more
1.5.0 · source§

fn le<I>(self, other: I) -> bool
where\n I: IntoIterator,\n Self::Item: PartialOrd<<I as IntoIterator>::Item>,\n Self: Sized,

Determines if the elements of this Iterator are lexicographically\nless or equal to those of another. Read more
1.5.0 · source§

fn gt<I>(self, other: I) -> bool
where\n I: IntoIterator,\n Self::Item: PartialOrd<<I as IntoIterator>::Item>,\n Self: Sized,

Determines if the elements of this Iterator are lexicographically\ngreater than those of another. Read more
1.5.0 · source§

fn ge<I>(self, other: I) -> bool
where\n I: IntoIterator,\n Self::Item: PartialOrd<<I as IntoIterator>::Item>,\n Self: Sized,

Determines if the elements of this Iterator are lexicographically\ngreater than or equal to those of another. Read more
source§

fn is_sorted_by<F>(self, compare: F) -> bool
where\n Self: Sized,\n F: FnMut(&Self::Item, &Self::Item) -> bool,

🔬This is a nightly-only experimental API. (is_sorted)
Checks if the elements of this iterator are sorted using the given comparator function. Read more
source§

fn is_sorted_by_key<F, K>(self, f: F) -> bool
where\n Self: Sized,\n F: FnMut(Self::Item) -> K,\n K: PartialOrd,

🔬This is a nightly-only experimental API. (is_sorted)
Checks if the elements of this iterator are sorted using the given key extraction\nfunction. Read more
","Iterator","air_test_utils::CallServiceClosure","air_test_utils::AVMDataStore","air_test_utils::HostExportedFunc"],["
§

impl<Sp> LocalSpawn for Box<Sp>
where\n Sp: LocalSpawn + ?Sized,

§

fn spawn_local_obj(\n &self,\n future: LocalFutureObj<'static, ()>,\n) -> Result<(), SpawnError>

Spawns a future that will be run to completion. Read more
§

fn status_local(&self) -> Result<(), SpawnError>

Determines whether the executor is able to spawn new tasks. Read more
","LocalSpawn","air_test_utils::CallServiceClosure","air_test_utils::AVMDataStore","air_test_utils::HostExportedFunc"],["
source§

impl<T> Log for Box<T>
where\n T: Log + ?Sized,

source§

fn enabled(&self, metadata: &Metadata<'_>) -> bool

Determines if a log message with the specified metadata would be\nlogged. Read more
source§

fn log(&self, record: &Record<'_>)

Logs the Record. Read more
source§

fn flush(&self)

Flushes any buffered records.
","Log","air_test_utils::CallServiceClosure","air_test_utils::AVMDataStore","air_test_utils::HostExportedFunc"],["
1.0.0 · source§

impl<T, A> Ord for Box<T, A>
where\n T: Ord + ?Sized,\n A: Allocator,

source§

fn cmp(&self, other: &Box<T, A>) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · source§

fn max(self, other: Self) -> Self
where\n Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · source§

fn min(self, other: Self) -> Self
where\n Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · source§

fn clamp(self, min: Self, max: Self) -> Self
where\n Self: Sized + PartialOrd,

Restrict a value to a certain interval. Read more
","Ord","air_test_utils::CallServiceClosure","air_test_utils::AVMDataStore","air_test_utils::HostExportedFunc"],["
§

impl<'a, T> Parse<'a> for Box<T>
where\n T: Parse<'a>,

§

fn parse(parser: Parser<'a>) -> Result<Box<T>, Error>

Attempts to parse Self from parser, returning an error if it could\nnot be parsed. Read more
","Parse<'a>","air_test_utils::CallServiceClosure","air_test_utils::AVMDataStore","air_test_utils::HostExportedFunc"],["
1.0.0 · source§

impl<T, A> PartialEq for Box<T, A>
where\n T: PartialEq + ?Sized,\n A: Allocator,

source§

fn eq(&self, other: &Box<T, A>) -> bool

This method tests for self and other values to be equal, and is used\nby ==.
source§

fn ne(&self, other: &Box<T, A>) -> bool

This method tests for !=. The default implementation is almost always\nsufficient, and should not be overridden without very good reason.
","PartialEq","air_test_utils::CallServiceClosure","air_test_utils::AVMDataStore","air_test_utils::HostExportedFunc"],["
1.0.0 · source§

impl<T, A> PartialOrd for Box<T, A>
where\n T: PartialOrd + ?Sized,\n A: Allocator,

source§

fn partial_cmp(&self, other: &Box<T, A>) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
source§

fn lt(&self, other: &Box<T, A>) -> bool

This method tests less than (for self and other) and is used by the < operator. Read more
source§

fn le(&self, other: &Box<T, A>) -> bool

This method tests less than or equal to (for self and other) and is used by the <=\noperator. Read more
source§

fn ge(&self, other: &Box<T, A>) -> bool

This method tests greater than or equal to (for self and other) and is used by the >=\noperator. Read more
source§

fn gt(&self, other: &Box<T, A>) -> bool

This method tests greater than (for self and other) and is used by the > operator. Read more
","PartialOrd","air_test_utils::CallServiceClosure","air_test_utils::AVMDataStore","air_test_utils::HostExportedFunc"],["
§

impl<B> Peek for Box<B>
where\n B: BufRead + ?Sized,

§

fn peek(&mut self, buf: &mut [u8]) -> Result<usize, Error>

Reads data from a stream without consuming it; subsequent reads will\nre-read the data. May return fewer bytes than requested; Ok(0)\nindicates that seeking is not possible (but reading may still be).
","Peek","air_test_utils::CallServiceClosure","air_test_utils::AVMDataStore","air_test_utils::HostExportedFunc"],["
1.0.0 · source§

impl<T, A> Pointer for Box<T, A>
where\n A: Allocator,\n T: ?Sized,

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
","Pointer","air_test_utils::CallServiceClosure","air_test_utils::AVMDataStore","air_test_utils::HostExportedFunc"],["
1.0.0 · source§

impl<R> Read for Box<R>
where\n R: Read + ?Sized,

source§

fn read(&mut self, buf: &mut [u8]) -> Result<usize, Error>

Pull some bytes from this source into the specified buffer, returning\nhow many bytes were read. Read more
source§

fn read_buf(&mut self, cursor: BorrowedCursor<'_>) -> Result<(), Error>

🔬This is a nightly-only experimental API. (read_buf)
Pull some bytes from this source into the specified buffer. Read more
source§

fn read_vectored(&mut self, bufs: &mut [IoSliceMut<'_>]) -> Result<usize, Error>

Like read, except that it reads into a slice of buffers. Read more
source§

fn is_read_vectored(&self) -> bool

🔬This is a nightly-only experimental API. (can_vector)
Determines if this Reader has an efficient read_vectored\nimplementation. Read more
source§

fn read_to_end(&mut self, buf: &mut Vec<u8>) -> Result<usize, Error>

Read all bytes until EOF in this source, placing them into buf. Read more
source§

fn read_to_string(&mut self, buf: &mut String) -> Result<usize, Error>

Read all bytes until EOF in this source, appending them to buf. Read more
source§

fn read_exact(&mut self, buf: &mut [u8]) -> Result<(), Error>

Read the exact number of bytes required to fill buf. Read more
source§

fn read_buf_exact(&mut self, cursor: BorrowedCursor<'_>) -> Result<(), Error>

🔬This is a nightly-only experimental API. (read_buf)
Read the exact number of bytes required to fill cursor. Read more
1.0.0 · source§

fn by_ref(&mut self) -> &mut Self
where\n Self: Sized,

Creates a “by reference” adaptor for this instance of Read. Read more
1.0.0 · source§

fn bytes(self) -> Bytes<Self>
where\n Self: Sized,

Transforms this Read instance to an Iterator over its bytes. Read more
1.0.0 · source§

fn chain<R>(self, next: R) -> Chain<Self, R>
where\n R: Read,\n Self: Sized,

Creates an adapter which will chain this stream with another. Read more
1.0.0 · source§

fn take(self, limit: u64) -> Take<Self>
where\n Self: Sized,

Creates an adapter which will read at most limit bytes from it. Read more
","Read","air_test_utils::CallServiceClosure","air_test_utils::AVMDataStore","air_test_utils::HostExportedFunc"],["
§

impl<R> ReadReady for Box<R>
where\n R: ReadReady,

Implement ReadReady for Box.

\n
§

fn num_ready_bytes(&self) -> Result<u64, Error>

Return the number of bytes which are ready to be read immediately. Read more
","ReadReady","air_test_utils::CallServiceClosure","air_test_utils::AVMDataStore","air_test_utils::HostExportedFunc"],["
source§

impl<R> RngCore for Box<R>
where\n R: RngCore + ?Sized,

source§

fn next_u32(&mut self) -> u32

Return the next random u32. Read more
source§

fn next_u64(&mut self) -> u64

Return the next random u64. Read more
source§

fn fill_bytes(&mut self, dest: &mut [u8])

Fill dest with random data. Read more
source§

fn try_fill_bytes(&mut self, dest: &mut [u8]) -> Result<(), Error>

Fill dest entirely with random data. Read more
","RngCore","air_test_utils::CallServiceClosure","air_test_utils::AVMDataStore","air_test_utils::HostExportedFunc"],["
1.0.0 · source§

impl<S> Seek for Box<S>
where\n S: Seek + ?Sized,

source§

fn seek(&mut self, pos: SeekFrom) -> Result<u64, Error>

Seek to an offset, in bytes, in a stream. Read more
source§

fn stream_position(&mut self) -> Result<u64, Error>

Returns the current seek position from the start of the stream. Read more
1.55.0 · source§

fn rewind(&mut self) -> Result<(), Error>

Rewind to the beginning of a stream. Read more
source§

fn stream_len(&mut self) -> Result<u64, Error>

🔬This is a nightly-only experimental API. (seek_stream_len)
Returns the length of this stream (in bytes). Read more
1.80.0 · source§

fn seek_relative(&mut self, offset: i64) -> Result<(), Error>

Seeks relative to the current position. Read more
","Seek","air_test_utils::CallServiceClosure","air_test_utils::AVMDataStore","air_test_utils::HostExportedFunc"],["
§

impl<T, S> Serialize<S> for Box<T>
where\n T: SerializeUnsized<S> + ?Sized,\n S: Fallible + ?Sized,

§

fn serialize(\n &self,\n serializer: &mut S,\n) -> Result<<Box<T> as Archive>::Resolver, <S as Fallible>::Error>

Writes the dependencies for the object and returns a resolver that can create the archived\ntype.
","Serialize","air_test_utils::CallServiceClosure","air_test_utils::AVMDataStore","air_test_utils::HostExportedFunc"],["
source§

impl<T> Serialize for Box<T>
where\n T: Serialize + ?Sized,

source§

fn serialize<S>(\n &self,\n serializer: S,\n) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error>
where\n S: Serializer,

Serialize this value into the given Serde serializer. Read more
","Serialize","air_test_utils::CallServiceClosure","air_test_utils::AVMDataStore","air_test_utils::HostExportedFunc"],["
source§

impl<T> Serialize for Box<T>
where\n T: Serialize + ?Sized,

source§

fn serialize<S>(\n &self,\n serializer: S,\n) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error>
where\n S: Serializer,

","Serialize","air_test_utils::CallServiceClosure","air_test_utils::AVMDataStore","air_test_utils::HostExportedFunc"],["
source§

impl<T, U> SerializeAs<Box<T>> for Box<U>
where\n U: SerializeAs<T>,

source§

fn serialize_as<S>(\n source: &Box<T>,\n serializer: S,\n) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error>
where\n S: Serializer,

Serialize this value into the given Serde serializer.
","SerializeAs>","air_test_utils::CallServiceClosure","air_test_utils::AVMDataStore","air_test_utils::HostExportedFunc"],["
§

impl<S, Item> Sink<Item> for Box<S>
where\n S: Sink<Item> + Unpin + ?Sized,

§

type Error = <S as Sink<Item>>::Error

The type of value produced by the sink when an error occurs.
§

fn poll_ready(\n self: Pin<&mut Box<S>>,\n cx: &mut Context<'_>,\n) -> Poll<Result<(), <Box<S> as Sink<Item>>::Error>>

Attempts to prepare the Sink to receive a value. Read more
§

fn start_send(\n self: Pin<&mut Box<S>>,\n item: Item,\n) -> Result<(), <Box<S> as Sink<Item>>::Error>

Begin the process of sending a value to the sink.\nEach call to this function must be preceded by a successful call to\npoll_ready which returned Poll::Ready(Ok(())). Read more
§

fn poll_flush(\n self: Pin<&mut Box<S>>,\n cx: &mut Context<'_>,\n) -> Poll<Result<(), <Box<S> as Sink<Item>>::Error>>

Flush any remaining output from this sink. Read more
§

fn poll_close(\n self: Pin<&mut Box<S>>,\n cx: &mut Context<'_>,\n) -> Poll<Result<(), <Box<S> as Sink<Item>>::Error>>

Flush any remaining output and close this sink, if necessary. Read more
","Sink","air_test_utils::CallServiceClosure","air_test_utils::AVMDataStore","air_test_utils::HostExportedFunc"],["
§

impl<T> Source for Box<T>
where\n T: Source + ?Sized,

§

fn register(\n &mut self,\n registry: &Registry,\n token: Token,\n interests: Interest,\n) -> Result<(), Error>

Register self with the given Registry instance. Read more
§

fn reregister(\n &mut self,\n registry: &Registry,\n token: Token,\n interests: Interest,\n) -> Result<(), Error>

Re-register self with the given Registry instance. Read more
§

fn deregister(&mut self, registry: &Registry) -> Result<(), Error>

Deregister self from the given Registry instance. Read more
","Source","air_test_utils::CallServiceClosure","air_test_utils::AVMDataStore","air_test_utils::HostExportedFunc"],["
§

impl<Sp> Spawn for Box<Sp>
where\n Sp: Spawn + ?Sized,

§

fn spawn_obj(&self, future: FutureObj<'static, ()>) -> Result<(), SpawnError>

Spawns a future that will be run to completion. Read more
§

fn status(&self) -> Result<(), SpawnError>

Determines whether the executor is able to spawn new tasks. Read more
","Spawn","air_test_utils::CallServiceClosure","air_test_utils::AVMDataStore","air_test_utils::HostExportedFunc"],["
§

impl<S> Stream for Box<S>
where\n S: Stream + Unpin + ?Sized,

§

type Item = <S as Stream>::Item

Values yielded by the stream.
§

fn poll_next(\n self: Pin<&mut Box<S>>,\n cx: &mut Context<'_>,\n) -> Poll<Option<<Box<S> as Stream>::Item>>

Attempt to pull out the next value of this stream, registering the\ncurrent task for wakeup if the value is not yet available, and returning\nNone if the stream is exhausted. Read more
§

fn size_hint(&self) -> (usize, Option<usize>)

Returns the bounds on the remaining length of the stream. Read more
","Stream","air_test_utils::CallServiceClosure","air_test_utils::AVMDataStore","air_test_utils::HostExportedFunc"],["
§

impl<S> Subscriber for Box<S>
where\n S: Subscriber + ?Sized,

§

fn register_callsite(&self, metadata: &'static Metadata<'static>) -> Interest

Registers a new callsite with this subscriber, returning whether or not\nthe subscriber is interested in being notified about the callsite. Read more
§

fn enabled(&self, metadata: &Metadata<'_>) -> bool

Returns true if a span or event with the specified metadata would be\nrecorded. Read more
§

fn max_level_hint(&self) -> Option<LevelFilter>

Returns the highest verbosity level that this Subscriber will\nenable, or None, if the subscriber does not implement level-based\nfiltering or chooses not to implement this method. Read more
§

fn new_span(&self, span: &Attributes<'_>) -> Id

Visit the construction of a new span, returning a new span ID for the\nspan being constructed. Read more
§

fn record(&self, span: &Id, values: &Record<'_>)

Record a set of values on a span. Read more
§

fn record_follows_from(&self, span: &Id, follows: &Id)

Adds an indication that span follows from the span with the id\nfollows. Read more
§

fn event_enabled(&self, event: &Event<'_>) -> bool

Determine if an [Event] should be recorded. Read more
§

fn event(&self, event: &Event<'_>)

Records that an Event has occurred. Read more
§

fn enter(&self, span: &Id)

Records that a span has been entered. Read more
§

fn exit(&self, span: &Id)

Records that a span has been exited. Read more
§

fn clone_span(&self, id: &Id) -> Id

Notifies the subscriber that a span ID has been cloned. Read more
§

fn try_close(&self, id: Id) -> bool

Notifies the subscriber that a span ID has been dropped, and returns\ntrue if there are now 0 IDs that refer to that span. Read more
§

fn drop_span(&self, id: Id)

👎Deprecated since 0.1.2: use Subscriber::try_close instead
This method is deprecated. Read more
§

fn current_span(&self) -> Current

Returns a type representing this subscriber’s view of the current span. Read more
§

unsafe fn downcast_raw(&self, id: TypeId) -> Option<*const ()>

If self is the same type as the provided TypeId, returns an untyped\n*const pointer to that type. Otherwise, returns None. Read more
§

fn on_register_dispatch(&self, subscriber: &Dispatch)

Invoked when this subscriber becomes a [Dispatch]. Read more
","Subscriber","air_test_utils::CallServiceClosure","air_test_utils::AVMDataStore","air_test_utils::HostExportedFunc"],["
§

impl<'a, T, F> UnsafeFutureObj<'a, T> for Box<F>
where\n F: Future<Output = T> + 'a,

§

fn into_raw(self) -> *mut dyn Future<Output = T> + 'a

Convert an owned instance into a (conceptually owned) fat pointer. Read more
§

unsafe fn drop(ptr: *mut dyn Future<Output = T> + 'a)

Drops the future represented by the given fat pointer. Read more
","UnsafeFutureObj<'a, T>","air_test_utils::CallServiceClosure","air_test_utils::AVMDataStore","air_test_utils::HostExportedFunc"],["
§

impl<T> Value for Box<T>
where\n T: Value + ?Sized,

§

fn record(&self, key: &Field, visitor: &mut dyn Visit)

Visits this value with the given Visitor.
","Value","air_test_utils::CallServiceClosure","air_test_utils::AVMDataStore","air_test_utils::HostExportedFunc"],["
§

impl<'a, V> VisitOperator<'a> for Box<V>
where\n V: VisitOperator<'a> + ?Sized,

§

type Output = <V as VisitOperator<'a>>::Output

The result type of the visitor.
§

fn visit_operator(\n &mut self,\n op: &Operator<'a>,\n) -> <Box<V> as VisitOperator<'a>>::Output

Visits the [Operator] op using the given offset. Read more
§

fn visit_unreachable(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_nop(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_block(\n &mut self,\n blockty: BlockType,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_loop(\n &mut self,\n blockty: BlockType,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_if(\n &mut self,\n blockty: BlockType,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_else(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_try(\n &mut self,\n blockty: BlockType,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_catch(\n &mut self,\n tag_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_throw(\n &mut self,\n tag_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_rethrow(\n &mut self,\n relative_depth: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_end(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_br(\n &mut self,\n relative_depth: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_br_if(\n &mut self,\n relative_depth: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_br_table(\n &mut self,\n targets: BrTable<'a>,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_return(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_call(\n &mut self,\n function_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_call_indirect(\n &mut self,\n type_index: u32,\n table_index: u32,\n table_byte: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_return_call(\n &mut self,\n function_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_return_call_indirect(\n &mut self,\n type_index: u32,\n table_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_delegate(\n &mut self,\n relative_depth: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_catch_all(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_drop(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_select(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_typed_select(\n &mut self,\n ty: ValType,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_local_get(\n &mut self,\n local_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_local_set(\n &mut self,\n local_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_local_tee(\n &mut self,\n local_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_global_get(\n &mut self,\n global_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_global_set(\n &mut self,\n global_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_load(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_load(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_load(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_load(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_load8_s(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_load8_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_load16_s(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_load16_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_load8_s(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_load8_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_load16_s(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_load16_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_load32_s(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_load32_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_store(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_store(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_store(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_store(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_store8(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_store16(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_store8(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_store16(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_store32(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_memory_size(\n &mut self,\n mem: u32,\n mem_byte: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_memory_grow(\n &mut self,\n mem: u32,\n mem_byte: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_const(\n &mut self,\n value: i32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_const(\n &mut self,\n value: i64,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_const(\n &mut self,\n value: Ieee32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_const(\n &mut self,\n value: Ieee64,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_ref_null(\n &mut self,\n hty: HeapType,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_ref_is_null(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_ref_func(\n &mut self,\n function_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_eqz(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_eq(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_ne(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_lt_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_lt_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_gt_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_gt_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_le_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_le_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_ge_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_ge_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_eqz(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_eq(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_ne(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_lt_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_lt_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_gt_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_gt_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_le_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_le_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_ge_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_ge_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_eq(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_ne(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_lt(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_gt(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_le(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_ge(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_eq(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_ne(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_lt(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_gt(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_le(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_ge(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_clz(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_ctz(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_popcnt(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_add(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_sub(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_mul(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_div_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_div_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_rem_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_rem_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_and(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_or(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_xor(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_shl(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_shr_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_shr_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_rotl(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_rotr(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_clz(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_ctz(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_popcnt(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_add(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_sub(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_mul(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_div_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_div_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_rem_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_rem_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_and(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_or(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_xor(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_shl(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_shr_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_shr_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_rotl(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_rotr(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_abs(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_neg(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_ceil(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_floor(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_trunc(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_nearest(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_sqrt(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_add(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_sub(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_mul(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_div(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_min(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_max(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_copysign(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_abs(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_neg(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_ceil(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_floor(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_trunc(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_nearest(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_sqrt(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_add(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_sub(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_mul(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_div(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_min(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_max(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_copysign(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_wrap_i64(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_trunc_f32_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_trunc_f32_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_trunc_f64_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_trunc_f64_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_extend_i32_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_extend_i32_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_trunc_f32_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_trunc_f32_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_trunc_f64_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_trunc_f64_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_convert_i32_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_convert_i32_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_convert_i64_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_convert_i64_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_demote_f64(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_convert_i32_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_convert_i32_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_convert_i64_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_convert_i64_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_promote_f32(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_reinterpret_f32(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_reinterpret_f64(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_reinterpret_i32(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_reinterpret_i64(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_extend8_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_extend16_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_extend8_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_extend16_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_extend32_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i31_new(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i31_get_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i31_get_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_trunc_sat_f32_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_trunc_sat_f32_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_trunc_sat_f64_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_trunc_sat_f64_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_trunc_sat_f32_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_trunc_sat_f32_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_trunc_sat_f64_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_trunc_sat_f64_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_memory_init(\n &mut self,\n data_index: u32,\n mem: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_data_drop(\n &mut self,\n data_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_memory_copy(\n &mut self,\n dst_mem: u32,\n src_mem: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_memory_fill(\n &mut self,\n mem: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_table_init(\n &mut self,\n elem_index: u32,\n table: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_elem_drop(\n &mut self,\n elem_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_table_copy(\n &mut self,\n dst_table: u32,\n src_table: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_table_fill(\n &mut self,\n table: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_table_get(\n &mut self,\n table: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_table_set(\n &mut self,\n table: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_table_grow(\n &mut self,\n table: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_table_size(\n &mut self,\n table: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_memory_discard(\n &mut self,\n mem: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_memory_atomic_notify(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_memory_atomic_wait32(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_memory_atomic_wait64(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_atomic_fence(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_load(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_load(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_load8_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_load16_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_load8_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_load16_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_load32_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_store(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_store(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_store8(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_store16(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_store8(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_store16(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_store32(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw_add(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw_add(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw8_add_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw16_add_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw8_add_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw16_add_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw32_add_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw_sub(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw_sub(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw8_sub_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw16_sub_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw8_sub_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw16_sub_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw32_sub_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw_and(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw_and(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw8_and_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw16_and_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw8_and_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw16_and_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw32_and_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw_or(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw_or(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw8_or_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw16_or_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw8_or_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw16_or_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw32_or_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw_xor(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw_xor(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw8_xor_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw16_xor_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw8_xor_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw16_xor_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw32_xor_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw_xchg(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw_xchg(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw8_xchg_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw16_xchg_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw8_xchg_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw16_xchg_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw32_xchg_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw_cmpxchg(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw_cmpxchg(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw8_cmpxchg_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw16_cmpxchg_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw8_cmpxchg_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw16_cmpxchg_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw32_cmpxchg_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_load(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_load8x8_s(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_load8x8_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_load16x4_s(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_load16x4_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_load32x2_s(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_load32x2_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_load8_splat(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_load16_splat(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_load32_splat(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_load64_splat(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_load32_zero(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_load64_zero(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_store(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_load8_lane(\n &mut self,\n memarg: MemArg,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_load16_lane(\n &mut self,\n memarg: MemArg,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_load32_lane(\n &mut self,\n memarg: MemArg,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_load64_lane(\n &mut self,\n memarg: MemArg,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_store8_lane(\n &mut self,\n memarg: MemArg,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_store16_lane(\n &mut self,\n memarg: MemArg,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_store32_lane(\n &mut self,\n memarg: MemArg,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_store64_lane(\n &mut self,\n memarg: MemArg,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_const(\n &mut self,\n value: V128,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_shuffle(\n &mut self,\n lanes: [u8; 16],\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_extract_lane_s(\n &mut self,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_extract_lane_u(\n &mut self,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_replace_lane(\n &mut self,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_extract_lane_s(\n &mut self,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_extract_lane_u(\n &mut self,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_replace_lane(\n &mut self,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_extract_lane(\n &mut self,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_replace_lane(\n &mut self,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_extract_lane(\n &mut self,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_replace_lane(\n &mut self,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_extract_lane(\n &mut self,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_replace_lane(\n &mut self,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_extract_lane(\n &mut self,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_replace_lane(\n &mut self,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_swizzle(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_splat(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_splat(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_splat(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_splat(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_splat(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_splat(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_eq(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_ne(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_lt_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_lt_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_gt_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_gt_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_le_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_le_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_ge_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_ge_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_eq(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_ne(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_lt_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_lt_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_gt_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_gt_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_le_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_le_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_ge_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_ge_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_eq(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_ne(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_lt_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_lt_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_gt_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_gt_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_le_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_le_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_ge_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_ge_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_eq(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_ne(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_lt_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_gt_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_le_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_ge_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_eq(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_ne(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_lt(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_gt(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_le(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_ge(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_eq(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_ne(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_lt(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_gt(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_le(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_ge(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_not(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_and(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_andnot(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_or(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_xor(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_bitselect(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_any_true(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_abs(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_neg(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_popcnt(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_all_true(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_bitmask(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_narrow_i16x8_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_narrow_i16x8_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_shl(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_shr_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_shr_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_add(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_add_sat_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_add_sat_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_sub(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_sub_sat_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_sub_sat_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_min_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_min_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_max_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_max_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_avgr_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_extadd_pairwise_i8x16_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_extadd_pairwise_i8x16_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_abs(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_neg(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_q15mulr_sat_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_all_true(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_bitmask(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_narrow_i32x4_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_narrow_i32x4_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_extend_low_i8x16_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_extend_high_i8x16_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_extend_low_i8x16_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_extend_high_i8x16_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_shl(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_shr_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_shr_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_add(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_add_sat_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_add_sat_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_sub(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_sub_sat_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_sub_sat_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_mul(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_min_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_min_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_max_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_max_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_avgr_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_extmul_low_i8x16_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_extmul_high_i8x16_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_extmul_low_i8x16_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_extmul_high_i8x16_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_extadd_pairwise_i16x8_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_extadd_pairwise_i16x8_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_abs(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_neg(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_all_true(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_bitmask(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_extend_low_i16x8_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_extend_high_i16x8_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_extend_low_i16x8_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_extend_high_i16x8_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_shl(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_shr_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_shr_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_add(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_sub(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_mul(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_min_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_min_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_max_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_max_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_dot_i16x8_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_extmul_low_i16x8_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_extmul_high_i16x8_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_extmul_low_i16x8_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_extmul_high_i16x8_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_abs(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_neg(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_all_true(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_bitmask(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_extend_low_i32x4_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_extend_high_i32x4_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_extend_low_i32x4_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_extend_high_i32x4_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_shl(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_shr_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_shr_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_add(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_sub(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_mul(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_extmul_low_i32x4_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_extmul_high_i32x4_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_extmul_low_i32x4_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_extmul_high_i32x4_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_ceil(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_floor(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_trunc(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_nearest(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_abs(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_neg(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_sqrt(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_add(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_sub(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_mul(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_div(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_min(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_max(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_pmin(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_pmax(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_ceil(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_floor(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_trunc(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_nearest(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_abs(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_neg(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_sqrt(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_add(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_sub(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_mul(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_div(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_min(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_max(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_pmin(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_pmax(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_trunc_sat_f32x4_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_trunc_sat_f32x4_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_convert_i32x4_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_convert_i32x4_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_trunc_sat_f64x2_s_zero(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_trunc_sat_f64x2_u_zero(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_convert_low_i32x4_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_convert_low_i32x4_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_demote_f64x2_zero(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_promote_low_f32x4(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_relaxed_swizzle(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_relaxed_trunc_f32x4_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_relaxed_trunc_f32x4_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_relaxed_trunc_f64x2_s_zero(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_relaxed_trunc_f64x2_u_zero(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_relaxed_madd(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_relaxed_nmadd(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_relaxed_madd(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_relaxed_nmadd(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_relaxed_laneselect(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_relaxed_laneselect(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_relaxed_laneselect(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_relaxed_laneselect(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_relaxed_min(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_relaxed_max(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_relaxed_min(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_relaxed_max(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_relaxed_q15mulr_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_relaxed_dot_i8x16_i7x16_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_relaxed_dot_i8x16_i7x16_add_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_call_ref(\n &mut self,\n type_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_return_call_ref(\n &mut self,\n type_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_ref_as_non_null(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_br_on_null(\n &mut self,\n relative_depth: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_br_on_non_null(\n &mut self,\n relative_depth: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

","VisitOperator<'a>","air_test_utils::CallServiceClosure","air_test_utils::AVMDataStore","air_test_utils::HostExportedFunc"],["
§

impl<'a, V> VisitOperator<'a> for Box<V>
where\n V: VisitOperator<'a> + ?Sized,

§

type Output = <V as VisitOperator<'a>>::Output

The result type of the visitor.
§

fn visit_operator(\n &mut self,\n op: &Operator<'a>,\n) -> <Box<V> as VisitOperator<'a>>::Output

Visits the [Operator] op using the given offset. Read more
§

fn visit_unreachable(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_nop(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_block(\n &mut self,\n blockty: BlockType,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_loop(\n &mut self,\n blockty: BlockType,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_if(\n &mut self,\n blockty: BlockType,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_else(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_try(\n &mut self,\n blockty: BlockType,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_catch(\n &mut self,\n tag_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_throw(\n &mut self,\n tag_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_rethrow(\n &mut self,\n relative_depth: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_end(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_br(\n &mut self,\n relative_depth: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_br_if(\n &mut self,\n relative_depth: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_br_table(\n &mut self,\n targets: BrTable<'a>,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_return(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_call(\n &mut self,\n function_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_call_indirect(\n &mut self,\n type_index: u32,\n table_index: u32,\n table_byte: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_return_call(\n &mut self,\n function_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_return_call_indirect(\n &mut self,\n type_index: u32,\n table_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_delegate(\n &mut self,\n relative_depth: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_catch_all(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_drop(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_select(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_typed_select(\n &mut self,\n ty: ValType,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_local_get(\n &mut self,\n local_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_local_set(\n &mut self,\n local_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_local_tee(\n &mut self,\n local_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_global_get(\n &mut self,\n global_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_global_set(\n &mut self,\n global_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_load(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_load(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_load(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_load(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_load8_s(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_load8_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_load16_s(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_load16_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_load8_s(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_load8_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_load16_s(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_load16_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_load32_s(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_load32_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_store(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_store(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_store(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_store(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_store8(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_store16(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_store8(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_store16(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_store32(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_memory_size(\n &mut self,\n mem: u32,\n mem_byte: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_memory_grow(\n &mut self,\n mem: u32,\n mem_byte: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_const(\n &mut self,\n value: i32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_const(\n &mut self,\n value: i64,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_const(\n &mut self,\n value: Ieee32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_const(\n &mut self,\n value: Ieee64,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_ref_null(\n &mut self,\n hty: HeapType,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_ref_is_null(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_ref_func(\n &mut self,\n function_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_eqz(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_eq(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_ne(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_lt_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_lt_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_gt_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_gt_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_le_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_le_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_ge_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_ge_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_eqz(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_eq(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_ne(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_lt_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_lt_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_gt_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_gt_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_le_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_le_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_ge_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_ge_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_eq(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_ne(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_lt(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_gt(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_le(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_ge(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_eq(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_ne(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_lt(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_gt(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_le(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_ge(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_clz(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_ctz(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_popcnt(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_add(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_sub(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_mul(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_div_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_div_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_rem_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_rem_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_and(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_or(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_xor(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_shl(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_shr_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_shr_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_rotl(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_rotr(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_clz(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_ctz(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_popcnt(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_add(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_sub(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_mul(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_div_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_div_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_rem_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_rem_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_and(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_or(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_xor(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_shl(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_shr_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_shr_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_rotl(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_rotr(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_abs(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_neg(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_ceil(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_floor(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_trunc(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_nearest(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_sqrt(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_add(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_sub(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_mul(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_div(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_min(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_max(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_copysign(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_abs(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_neg(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_ceil(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_floor(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_trunc(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_nearest(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_sqrt(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_add(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_sub(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_mul(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_div(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_min(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_max(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_copysign(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_wrap_i64(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_trunc_f32_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_trunc_f32_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_trunc_f64_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_trunc_f64_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_extend_i32_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_extend_i32_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_trunc_f32_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_trunc_f32_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_trunc_f64_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_trunc_f64_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_convert_i32_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_convert_i32_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_convert_i64_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_convert_i64_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_demote_f64(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_convert_i32_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_convert_i32_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_convert_i64_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_convert_i64_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_promote_f32(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_reinterpret_f32(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_reinterpret_f64(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_reinterpret_i32(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_reinterpret_i64(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_extend8_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_extend16_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_extend8_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_extend16_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_extend32_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_trunc_sat_f32_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_trunc_sat_f32_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_trunc_sat_f64_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_trunc_sat_f64_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_trunc_sat_f32_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_trunc_sat_f32_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_trunc_sat_f64_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_trunc_sat_f64_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_memory_init(\n &mut self,\n data_index: u32,\n mem: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_data_drop(\n &mut self,\n data_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_memory_copy(\n &mut self,\n dst_mem: u32,\n src_mem: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_memory_fill(\n &mut self,\n mem: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_table_init(\n &mut self,\n elem_index: u32,\n table: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_elem_drop(\n &mut self,\n elem_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_table_copy(\n &mut self,\n dst_table: u32,\n src_table: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_table_fill(\n &mut self,\n table: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_table_get(\n &mut self,\n table: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_table_set(\n &mut self,\n table: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_table_grow(\n &mut self,\n table: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_table_size(\n &mut self,\n table: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_memory_discard(\n &mut self,\n mem: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_memory_atomic_notify(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_memory_atomic_wait32(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_memory_atomic_wait64(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_atomic_fence(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_load(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_load(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_load8_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_load16_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_load8_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_load16_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_load32_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_store(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_store(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_store8(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_store16(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_store8(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_store16(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_store32(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw_add(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw_add(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw8_add_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw16_add_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw8_add_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw16_add_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw32_add_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw_sub(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw_sub(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw8_sub_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw16_sub_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw8_sub_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw16_sub_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw32_sub_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw_and(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw_and(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw8_and_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw16_and_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw8_and_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw16_and_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw32_and_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw_or(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw_or(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw8_or_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw16_or_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw8_or_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw16_or_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw32_or_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw_xor(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw_xor(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw8_xor_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw16_xor_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw8_xor_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw16_xor_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw32_xor_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw_xchg(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw_xchg(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw8_xchg_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw16_xchg_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw8_xchg_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw16_xchg_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw32_xchg_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw_cmpxchg(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw_cmpxchg(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw8_cmpxchg_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw16_cmpxchg_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw8_cmpxchg_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw16_cmpxchg_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw32_cmpxchg_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_load(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_load8x8_s(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_load8x8_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_load16x4_s(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_load16x4_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_load32x2_s(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_load32x2_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_load8_splat(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_load16_splat(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_load32_splat(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_load64_splat(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_load32_zero(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_load64_zero(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_store(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_load8_lane(\n &mut self,\n memarg: MemArg,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_load16_lane(\n &mut self,\n memarg: MemArg,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_load32_lane(\n &mut self,\n memarg: MemArg,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_load64_lane(\n &mut self,\n memarg: MemArg,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_store8_lane(\n &mut self,\n memarg: MemArg,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_store16_lane(\n &mut self,\n memarg: MemArg,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_store32_lane(\n &mut self,\n memarg: MemArg,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_store64_lane(\n &mut self,\n memarg: MemArg,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_const(\n &mut self,\n value: V128,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_shuffle(\n &mut self,\n lanes: [u8; 16],\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_extract_lane_s(\n &mut self,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_extract_lane_u(\n &mut self,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_replace_lane(\n &mut self,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_extract_lane_s(\n &mut self,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_extract_lane_u(\n &mut self,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_replace_lane(\n &mut self,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_extract_lane(\n &mut self,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_replace_lane(\n &mut self,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_extract_lane(\n &mut self,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_replace_lane(\n &mut self,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_extract_lane(\n &mut self,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_replace_lane(\n &mut self,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_extract_lane(\n &mut self,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_replace_lane(\n &mut self,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_swizzle(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_splat(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_splat(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_splat(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_splat(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_splat(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_splat(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_eq(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_ne(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_lt_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_lt_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_gt_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_gt_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_le_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_le_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_ge_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_ge_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_eq(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_ne(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_lt_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_lt_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_gt_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_gt_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_le_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_le_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_ge_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_ge_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_eq(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_ne(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_lt_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_lt_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_gt_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_gt_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_le_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_le_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_ge_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_ge_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_eq(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_ne(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_lt_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_gt_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_le_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_ge_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_eq(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_ne(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_lt(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_gt(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_le(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_ge(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_eq(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_ne(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_lt(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_gt(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_le(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_ge(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_not(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_and(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_andnot(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_or(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_xor(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_bitselect(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_any_true(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_abs(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_neg(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_popcnt(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_all_true(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_bitmask(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_narrow_i16x8_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_narrow_i16x8_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_shl(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_shr_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_shr_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_add(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_add_sat_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_add_sat_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_sub(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_sub_sat_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_sub_sat_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_min_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_min_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_max_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_max_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_avgr_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_extadd_pairwise_i8x16_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_extadd_pairwise_i8x16_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_abs(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_neg(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_q15mulr_sat_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_all_true(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_bitmask(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_narrow_i32x4_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_narrow_i32x4_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_extend_low_i8x16_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_extend_high_i8x16_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_extend_low_i8x16_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_extend_high_i8x16_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_shl(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_shr_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_shr_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_add(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_add_sat_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_add_sat_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_sub(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_sub_sat_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_sub_sat_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_mul(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_min_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_min_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_max_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_max_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_avgr_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_extmul_low_i8x16_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_extmul_high_i8x16_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_extmul_low_i8x16_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_extmul_high_i8x16_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_extadd_pairwise_i16x8_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_extadd_pairwise_i16x8_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_abs(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_neg(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_all_true(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_bitmask(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_extend_low_i16x8_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_extend_high_i16x8_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_extend_low_i16x8_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_extend_high_i16x8_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_shl(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_shr_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_shr_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_add(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_sub(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_mul(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_min_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_min_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_max_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_max_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_dot_i16x8_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_extmul_low_i16x8_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_extmul_high_i16x8_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_extmul_low_i16x8_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_extmul_high_i16x8_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_abs(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_neg(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_all_true(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_bitmask(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_extend_low_i32x4_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_extend_high_i32x4_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_extend_low_i32x4_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_extend_high_i32x4_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_shl(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_shr_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_shr_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_add(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_sub(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_mul(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_extmul_low_i32x4_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_extmul_high_i32x4_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_extmul_low_i32x4_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_extmul_high_i32x4_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_ceil(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_floor(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_trunc(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_nearest(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_abs(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_neg(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_sqrt(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_add(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_sub(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_mul(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_div(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_min(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_max(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_pmin(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_pmax(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_ceil(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_floor(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_trunc(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_nearest(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_abs(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_neg(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_sqrt(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_add(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_sub(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_mul(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_div(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_min(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_max(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_pmin(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_pmax(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_trunc_sat_f32x4_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_trunc_sat_f32x4_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_convert_i32x4_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_convert_i32x4_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_trunc_sat_f64x2_s_zero(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_trunc_sat_f64x2_u_zero(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_convert_low_i32x4_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_convert_low_i32x4_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_demote_f64x2_zero(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_promote_low_f32x4(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_relaxed_swizzle(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_relaxed_trunc_sat_f32x4_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_relaxed_trunc_sat_f32x4_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_relaxed_trunc_sat_f64x2_s_zero(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_relaxed_trunc_sat_f64x2_u_zero(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_relaxed_fma(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_relaxed_fnma(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_relaxed_fma(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_relaxed_fnma(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_relaxed_laneselect(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_relaxed_laneselect(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_relaxed_laneselect(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_relaxed_laneselect(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_relaxed_min(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_relaxed_max(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_relaxed_min(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_relaxed_max(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_relaxed_q15mulr_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_dot_i8x16_i7x16_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_dot_i8x16_i7x16_add_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_relaxed_dot_bf16x8_add_f32x4(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_call_ref(\n &mut self,\n hty: HeapType,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_return_call_ref(\n &mut self,\n hty: HeapType,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_ref_as_non_null(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_br_on_null(\n &mut self,\n relative_depth: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_br_on_non_null(\n &mut self,\n relative_depth: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

","VisitOperator<'a>","air_test_utils::CallServiceClosure","air_test_utils::AVMDataStore","air_test_utils::HostExportedFunc"],["
§

impl<'a, V> VisitOperator<'a> for Box<V>
where\n V: VisitOperator<'a> + ?Sized,

§

type Output = <V as VisitOperator<'a>>::Output

The result type of the visitor.
§

fn visit_operator(\n &mut self,\n op: &Operator<'a>,\n) -> <Box<V> as VisitOperator<'a>>::Output

Visits the [Operator] op using the given offset. Read more
§

fn visit_unreachable(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_nop(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_block(\n &mut self,\n blockty: BlockType,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_loop(\n &mut self,\n blockty: BlockType,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_if(\n &mut self,\n blockty: BlockType,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_else(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_try_table(\n &mut self,\n try_table: TryTable,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_throw(\n &mut self,\n tag_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_throw_ref(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_try(\n &mut self,\n blockty: BlockType,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_catch(\n &mut self,\n tag_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_rethrow(\n &mut self,\n relative_depth: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_delegate(\n &mut self,\n relative_depth: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_catch_all(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_end(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_br(\n &mut self,\n relative_depth: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_br_if(\n &mut self,\n relative_depth: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_br_table(\n &mut self,\n targets: BrTable<'a>,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_return(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_call(\n &mut self,\n function_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_call_indirect(\n &mut self,\n type_index: u32,\n table_index: u32,\n table_byte: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_return_call(\n &mut self,\n function_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_return_call_indirect(\n &mut self,\n type_index: u32,\n table_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_drop(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_select(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_typed_select(\n &mut self,\n ty: ValType,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_local_get(\n &mut self,\n local_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_local_set(\n &mut self,\n local_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_local_tee(\n &mut self,\n local_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_global_get(\n &mut self,\n global_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_global_set(\n &mut self,\n global_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_load(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_load(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_load(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_load(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_load8_s(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_load8_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_load16_s(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_load16_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_load8_s(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_load8_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_load16_s(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_load16_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_load32_s(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_load32_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_store(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_store(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_store(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_store(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_store8(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_store16(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_store8(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_store16(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_store32(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_memory_size(\n &mut self,\n mem: u32,\n mem_byte: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_memory_grow(\n &mut self,\n mem: u32,\n mem_byte: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_const(\n &mut self,\n value: i32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_const(\n &mut self,\n value: i64,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_const(\n &mut self,\n value: Ieee32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_const(\n &mut self,\n value: Ieee64,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_ref_null(\n &mut self,\n hty: HeapType,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_ref_is_null(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_ref_func(\n &mut self,\n function_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_ref_eq(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_eqz(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_eq(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_ne(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_lt_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_lt_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_gt_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_gt_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_le_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_le_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_ge_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_ge_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_eqz(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_eq(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_ne(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_lt_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_lt_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_gt_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_gt_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_le_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_le_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_ge_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_ge_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_eq(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_ne(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_lt(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_gt(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_le(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_ge(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_eq(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_ne(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_lt(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_gt(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_le(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_ge(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_clz(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_ctz(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_popcnt(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_add(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_sub(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_mul(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_div_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_div_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_rem_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_rem_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_and(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_or(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_xor(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_shl(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_shr_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_shr_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_rotl(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_rotr(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_clz(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_ctz(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_popcnt(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_add(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_sub(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_mul(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_div_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_div_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_rem_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_rem_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_and(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_or(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_xor(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_shl(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_shr_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_shr_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_rotl(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_rotr(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_abs(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_neg(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_ceil(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_floor(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_trunc(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_nearest(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_sqrt(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_add(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_sub(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_mul(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_div(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_min(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_max(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_copysign(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_abs(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_neg(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_ceil(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_floor(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_trunc(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_nearest(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_sqrt(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_add(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_sub(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_mul(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_div(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_min(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_max(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_copysign(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_wrap_i64(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_trunc_f32_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_trunc_f32_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_trunc_f64_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_trunc_f64_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_extend_i32_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_extend_i32_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_trunc_f32_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_trunc_f32_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_trunc_f64_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_trunc_f64_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_convert_i32_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_convert_i32_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_convert_i64_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_convert_i64_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_demote_f64(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_convert_i32_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_convert_i32_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_convert_i64_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_convert_i64_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_promote_f32(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_reinterpret_f32(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_reinterpret_f64(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_reinterpret_i32(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_reinterpret_i64(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_extend8_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_extend16_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_extend8_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_extend16_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_extend32_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_struct_new(\n &mut self,\n struct_type_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_struct_new_default(\n &mut self,\n struct_type_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_struct_get(\n &mut self,\n struct_type_index: u32,\n field_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_struct_get_s(\n &mut self,\n struct_type_index: u32,\n field_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_struct_get_u(\n &mut self,\n struct_type_index: u32,\n field_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_struct_set(\n &mut self,\n struct_type_index: u32,\n field_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_array_new(\n &mut self,\n array_type_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_array_new_default(\n &mut self,\n array_type_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_array_new_fixed(\n &mut self,\n array_type_index: u32,\n array_size: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_array_new_data(\n &mut self,\n array_type_index: u32,\n array_data_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_array_new_elem(\n &mut self,\n array_type_index: u32,\n array_elem_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_array_get(\n &mut self,\n array_type_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_array_get_s(\n &mut self,\n array_type_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_array_get_u(\n &mut self,\n array_type_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_array_set(\n &mut self,\n array_type_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_array_len(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_array_fill(\n &mut self,\n array_type_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_array_copy(\n &mut self,\n array_type_index_dst: u32,\n array_type_index_src: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_array_init_data(\n &mut self,\n array_type_index: u32,\n array_data_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_array_init_elem(\n &mut self,\n array_type_index: u32,\n array_elem_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_ref_test_non_null(\n &mut self,\n hty: HeapType,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_ref_test_nullable(\n &mut self,\n hty: HeapType,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_ref_cast_non_null(\n &mut self,\n hty: HeapType,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_ref_cast_nullable(\n &mut self,\n hty: HeapType,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_br_on_cast(\n &mut self,\n relative_depth: u32,\n from_ref_type: RefType,\n to_ref_type: RefType,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_br_on_cast_fail(\n &mut self,\n relative_depth: u32,\n from_ref_type: RefType,\n to_ref_type: RefType,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_any_convert_extern(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_extern_convert_any(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_ref_i31(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i31_get_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i31_get_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_trunc_sat_f32_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_trunc_sat_f32_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_trunc_sat_f64_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_trunc_sat_f64_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_trunc_sat_f32_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_trunc_sat_f32_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_trunc_sat_f64_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_trunc_sat_f64_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_memory_init(\n &mut self,\n data_index: u32,\n mem: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_data_drop(\n &mut self,\n data_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_memory_copy(\n &mut self,\n dst_mem: u32,\n src_mem: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_memory_fill(\n &mut self,\n mem: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_table_init(\n &mut self,\n elem_index: u32,\n table: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_elem_drop(\n &mut self,\n elem_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_table_copy(\n &mut self,\n dst_table: u32,\n src_table: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_table_fill(\n &mut self,\n table: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_table_get(\n &mut self,\n table: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_table_set(\n &mut self,\n table: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_table_grow(\n &mut self,\n table: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_table_size(\n &mut self,\n table: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_memory_discard(\n &mut self,\n mem: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_memory_atomic_notify(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_memory_atomic_wait32(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_memory_atomic_wait64(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_atomic_fence(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_load(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_load(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_load8_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_load16_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_load8_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_load16_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_load32_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_store(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_store(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_store8(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_store16(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_store8(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_store16(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_store32(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw_add(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw_add(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw8_add_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw16_add_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw8_add_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw16_add_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw32_add_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw_sub(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw_sub(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw8_sub_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw16_sub_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw8_sub_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw16_sub_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw32_sub_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw_and(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw_and(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw8_and_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw16_and_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw8_and_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw16_and_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw32_and_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw_or(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw_or(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw8_or_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw16_or_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw8_or_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw16_or_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw32_or_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw_xor(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw_xor(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw8_xor_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw16_xor_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw8_xor_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw16_xor_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw32_xor_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw_xchg(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw_xchg(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw8_xchg_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw16_xchg_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw8_xchg_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw16_xchg_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw32_xchg_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw_cmpxchg(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw_cmpxchg(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw8_cmpxchg_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw16_cmpxchg_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw8_cmpxchg_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw16_cmpxchg_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw32_cmpxchg_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_load(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_load8x8_s(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_load8x8_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_load16x4_s(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_load16x4_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_load32x2_s(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_load32x2_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_load8_splat(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_load16_splat(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_load32_splat(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_load64_splat(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_load32_zero(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_load64_zero(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_store(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_load8_lane(\n &mut self,\n memarg: MemArg,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_load16_lane(\n &mut self,\n memarg: MemArg,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_load32_lane(\n &mut self,\n memarg: MemArg,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_load64_lane(\n &mut self,\n memarg: MemArg,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_store8_lane(\n &mut self,\n memarg: MemArg,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_store16_lane(\n &mut self,\n memarg: MemArg,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_store32_lane(\n &mut self,\n memarg: MemArg,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_store64_lane(\n &mut self,\n memarg: MemArg,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_const(\n &mut self,\n value: V128,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_shuffle(\n &mut self,\n lanes: [u8; 16],\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_extract_lane_s(\n &mut self,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_extract_lane_u(\n &mut self,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_replace_lane(\n &mut self,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_extract_lane_s(\n &mut self,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_extract_lane_u(\n &mut self,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_replace_lane(\n &mut self,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_extract_lane(\n &mut self,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_replace_lane(\n &mut self,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_extract_lane(\n &mut self,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_replace_lane(\n &mut self,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_extract_lane(\n &mut self,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_replace_lane(\n &mut self,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_extract_lane(\n &mut self,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_replace_lane(\n &mut self,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_swizzle(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_splat(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_splat(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_splat(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_splat(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_splat(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_splat(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_eq(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_ne(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_lt_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_lt_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_gt_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_gt_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_le_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_le_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_ge_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_ge_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_eq(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_ne(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_lt_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_lt_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_gt_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_gt_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_le_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_le_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_ge_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_ge_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_eq(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_ne(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_lt_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_lt_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_gt_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_gt_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_le_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_le_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_ge_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_ge_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_eq(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_ne(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_lt_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_gt_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_le_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_ge_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_eq(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_ne(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_lt(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_gt(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_le(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_ge(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_eq(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_ne(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_lt(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_gt(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_le(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_ge(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_not(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_and(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_andnot(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_or(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_xor(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_bitselect(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_any_true(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_abs(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_neg(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_popcnt(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_all_true(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_bitmask(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_narrow_i16x8_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_narrow_i16x8_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_shl(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_shr_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_shr_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_add(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_add_sat_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_add_sat_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_sub(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_sub_sat_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_sub_sat_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_min_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_min_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_max_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_max_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_avgr_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_extadd_pairwise_i8x16_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_extadd_pairwise_i8x16_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_abs(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_neg(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_q15mulr_sat_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_all_true(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_bitmask(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_narrow_i32x4_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_narrow_i32x4_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_extend_low_i8x16_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_extend_high_i8x16_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_extend_low_i8x16_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_extend_high_i8x16_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_shl(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_shr_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_shr_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_add(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_add_sat_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_add_sat_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_sub(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_sub_sat_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_sub_sat_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_mul(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_min_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_min_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_max_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_max_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_avgr_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_extmul_low_i8x16_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_extmul_high_i8x16_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_extmul_low_i8x16_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_extmul_high_i8x16_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_extadd_pairwise_i16x8_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_extadd_pairwise_i16x8_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_abs(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_neg(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_all_true(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_bitmask(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_extend_low_i16x8_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_extend_high_i16x8_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_extend_low_i16x8_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_extend_high_i16x8_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_shl(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_shr_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_shr_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_add(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_sub(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_mul(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_min_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_min_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_max_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_max_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_dot_i16x8_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_extmul_low_i16x8_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_extmul_high_i16x8_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_extmul_low_i16x8_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_extmul_high_i16x8_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_abs(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_neg(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_all_true(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_bitmask(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_extend_low_i32x4_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_extend_high_i32x4_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_extend_low_i32x4_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_extend_high_i32x4_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_shl(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_shr_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_shr_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_add(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_sub(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_mul(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_extmul_low_i32x4_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_extmul_high_i32x4_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_extmul_low_i32x4_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_extmul_high_i32x4_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_ceil(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_floor(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_trunc(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_nearest(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_abs(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_neg(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_sqrt(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_add(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_sub(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_mul(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_div(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_min(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_max(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_pmin(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_pmax(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_ceil(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_floor(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_trunc(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_nearest(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_abs(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_neg(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_sqrt(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_add(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_sub(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_mul(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_div(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_min(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_max(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_pmin(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_pmax(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_trunc_sat_f32x4_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_trunc_sat_f32x4_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_convert_i32x4_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_convert_i32x4_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_trunc_sat_f64x2_s_zero(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_trunc_sat_f64x2_u_zero(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_convert_low_i32x4_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_convert_low_i32x4_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_demote_f64x2_zero(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_promote_low_f32x4(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_relaxed_swizzle(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_relaxed_trunc_f32x4_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_relaxed_trunc_f32x4_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_relaxed_trunc_f64x2_s_zero(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_relaxed_trunc_f64x2_u_zero(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_relaxed_madd(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_relaxed_nmadd(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_relaxed_madd(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_relaxed_nmadd(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_relaxed_laneselect(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_relaxed_laneselect(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_relaxed_laneselect(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_relaxed_laneselect(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_relaxed_min(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_relaxed_max(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_relaxed_min(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_relaxed_max(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_relaxed_q15mulr_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_relaxed_dot_i8x16_i7x16_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_relaxed_dot_i8x16_i7x16_add_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_call_ref(\n &mut self,\n type_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_return_call_ref(\n &mut self,\n type_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_ref_as_non_null(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_br_on_null(\n &mut self,\n relative_depth: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_br_on_non_null(\n &mut self,\n relative_depth: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

","VisitOperator<'a>","air_test_utils::CallServiceClosure","air_test_utils::AVMDataStore","air_test_utils::HostExportedFunc"],["
1.0.0 · source§

impl<W> Write for Box<W>
where\n W: Write + ?Sized,

source§

fn write(&mut self, buf: &[u8]) -> Result<usize, Error>

Write a buffer into this writer, returning how many bytes were written. Read more
source§

fn write_vectored(&mut self, bufs: &[IoSlice<'_>]) -> Result<usize, Error>

Like write, except that it writes from a slice of buffers. Read more
source§

fn is_write_vectored(&self) -> bool

🔬This is a nightly-only experimental API. (can_vector)
Determines if this Writer has an efficient write_vectored\nimplementation. Read more
source§

fn flush(&mut self) -> Result<(), Error>

Flush this output stream, ensuring that all intermediately buffered\ncontents reach their destination. Read more
source§

fn write_all(&mut self, buf: &[u8]) -> Result<(), Error>

Attempts to write an entire buffer into this writer. Read more
source§

fn write_fmt(&mut self, fmt: Arguments<'_>) -> Result<(), Error>

Writes a formatted string into this writer, returning any error\nencountered. Read more
source§

fn write_all_vectored(&mut self, bufs: &mut [IoSlice<'_>]) -> Result<(), Error>

🔬This is a nightly-only experimental API. (write_all_vectored)
Attempts to write multiple buffers into this writer. Read more
1.0.0 · source§

fn by_ref(&mut self) -> &mut Self
where\n Self: Sized,

Creates a “by reference” adapter for this instance of Write. Read more
","Write","air_test_utils::CallServiceClosure","air_test_utils::AVMDataStore","air_test_utils::HostExportedFunc"],["
§

impl<T> WriteColor for Box<T>
where\n T: WriteColor + ?Sized,

§

fn supports_color(&self) -> bool

Returns true if and only if the underlying writer supports colors.
§

fn supports_hyperlinks(&self) -> bool

Returns true if and only if the underlying writer supports hyperlinks. Read more
§

fn set_color(&mut self, spec: &ColorSpec) -> Result<(), Error>

Set the color settings of the writer. Read more
§

fn set_hyperlink(&mut self, link: &HyperlinkSpec<'_>) -> Result<(), Error>

Set the current hyperlink of the writer. Read more
§

fn reset(&mut self) -> Result<(), Error>

Reset the current color settings to their original settings. Read more
§

fn is_synchronous(&self) -> bool

Returns true if and only if the underlying writer must synchronously\ninteract with an end user’s device in order to control colors. By\ndefault, this always returns false. Read more
","WriteColor","air_test_utils::CallServiceClosure","air_test_utils::AVMDataStore","air_test_utils::HostExportedFunc"],["
source§

impl<T, U, A> CoerceUnsized<Box<U, A>> for Box<T, A>
where\n T: Unsize<U> + ?Sized,\n A: Allocator,\n U: ?Sized,

","CoerceUnsized>","air_test_utils::CallServiceClosure","air_test_utils::AVMDataStore","air_test_utils::HostExportedFunc"],["
§

impl<T> ComponentType for Box<T>
where\n T: ComponentType + ?Sized,

","ComponentType","air_test_utils::CallServiceClosure","air_test_utils::AVMDataStore","air_test_utils::HostExportedFunc"],["
source§

impl<R> CryptoRng for Box<R>
where\n R: CryptoRng + ?Sized,

","CryptoRng","air_test_utils::CallServiceClosure","air_test_utils::AVMDataStore","air_test_utils::HostExportedFunc"],["
source§

impl<T, A> DerefPure for Box<T, A>
where\n A: Allocator,\n T: ?Sized,

","DerefPure","air_test_utils::CallServiceClosure","air_test_utils::AVMDataStore","air_test_utils::HostExportedFunc"],["
source§

impl<T, U> DispatchFromDyn<Box<U>> for Box<T>
where\n T: Unsize<U> + ?Sized,\n U: ?Sized,

","DispatchFromDyn>","air_test_utils::CallServiceClosure","air_test_utils::AVMDataStore","air_test_utils::HostExportedFunc"],["
1.0.0 · source§

impl<T, A> Eq for Box<T, A>
where\n T: Eq + ?Sized,\n A: Allocator,

","Eq","air_test_utils::CallServiceClosure","air_test_utils::AVMDataStore","air_test_utils::HostExportedFunc"],["
1.26.0 · source§

impl<I, A> FusedIterator for Box<I, A>
where\n I: FusedIterator + ?Sized,\n A: Allocator,

","FusedIterator","air_test_utils::CallServiceClosure","air_test_utils::AVMDataStore","air_test_utils::HostExportedFunc"],["
§

impl<T> Lower for Box<T>
where\n T: Lower + ?Sized,

","Lower","air_test_utils::CallServiceClosure","air_test_utils::AVMDataStore","air_test_utils::HostExportedFunc"],["
§

impl<T> StableDeref for Box<T>
where\n T: ?Sized,

","StableDeref","air_test_utils::CallServiceClosure","air_test_utils::AVMDataStore","air_test_utils::HostExportedFunc"],["
1.33.0 · source§

impl<T, A> Unpin for Box<T, A>
where\n A: Allocator,\n T: ?Sized,

","Unpin","air_test_utils::CallServiceClosure","air_test_utils::AVMDataStore","air_test_utils::HostExportedFunc"]], +"avm_server":[["
§

impl<'a, A> Arbitrary<'a> for Box<A>
where\n A: Arbitrary<'a>,

§

fn arbitrary(u: &mut Unstructured<'a>) -> Result<Box<A>, Error>

Generate an arbitrary value of Self from the given unstructured data. Read more
§

fn size_hint(depth: usize) -> (usize, Option<usize>)

Get a size hint for how many bytes out of an Unstructured this type\nneeds to construct itself. Read more
§

fn arbitrary_take_rest(u: Unstructured<'a>) -> Result<Self, Error>

Generate an arbitrary value of Self from the entirety of the given\nunstructured data. Read more
","Arbitrary<'a>","avm_server::AVMDataStore","avm_server::HostExportedFunc"],["
§

impl<T> Archive for Box<T>
where\n T: ArchiveUnsized + ?Sized,

§

type Archived = ArchivedBox<<T as ArchiveUnsized>::Archived>

The archived representation of this type. Read more
§

type Resolver = BoxResolver<<T as ArchiveUnsized>::MetadataResolver>

The resolver for this type. It must contain all the additional information from serializing\nneeded to make the archived type from the normal type.
§

unsafe fn resolve(\n &self,\n pos: usize,\n resolver: <Box<T> as Archive>::Resolver,\n out: *mut <Box<T> as Archive>::Archived,\n)

Creates the archived version of this value at the given position and writes it to the given\noutput. Read more
","Archive","avm_server::AVMDataStore","avm_server::HostExportedFunc"],["
1.64.0 · source§

impl<T> AsFd for Box<T>
where\n T: AsFd + ?Sized,

source§

fn as_fd(&self) -> BorrowedFd<'_>

Borrows the file descriptor. Read more
","AsFd","avm_server::AVMDataStore","avm_server::HostExportedFunc"],["
1.5.0 · source§

impl<T, A> AsMut<T> for Box<T, A>
where\n A: Allocator,\n T: ?Sized,

source§

fn as_mut(&mut self) -> &mut T

Converts this type into a mutable reference of the (usually inferred) input type.
","AsMut","avm_server::AVMDataStore","avm_server::HostExportedFunc"],["
1.63.0 · source§

impl<T> AsRawFd for Box<T>
where\n T: AsRawFd,

source§

fn as_raw_fd(&self) -> i32

Extracts the raw file descriptor. Read more
","AsRawFd","avm_server::AVMDataStore","avm_server::HostExportedFunc"],["
§

impl<T> AsRawReadWriteFd for Box<T>
where\n T: AsRawReadWriteFd,

§

fn as_raw_read_fd(&self) -> i32

Extracts the raw file descriptor for reading. Read more
§

fn as_raw_write_fd(&self) -> i32

Extracts the raw file descriptor for writing. Read more
","AsRawReadWriteFd","avm_server::AVMDataStore","avm_server::HostExportedFunc"],["
§

impl<T> AsReadWriteFd for Box<T>
where\n T: AsReadWriteFd,

§

fn as_read_fd(&self) -> BorrowedFd<'_>

Extracts the file descriptor for reading. Read more
§

fn as_write_fd(&self) -> BorrowedFd<'_>

Extracts the file descriptor for writing. Read more
","AsReadWriteFd","avm_server::AVMDataStore","avm_server::HostExportedFunc"],["
1.5.0 · source§

impl<T, A> AsRef<T> for Box<T, A>
where\n A: Allocator,\n T: ?Sized,

source§

fn as_ref(&self) -> &T

Converts this type into a shared reference of the (usually inferred) input type.
","AsRef","avm_server::AVMDataStore","avm_server::HostExportedFunc"],["
§

impl<T> AsyncBufRead for Box<T>
where\n T: AsyncBufRead + Unpin + ?Sized,

§

fn poll_fill_buf(\n self: Pin<&mut Box<T>>,\n cx: &mut Context<'_>,\n) -> Poll<Result<&[u8], Error>>

Attempt to return the contents of the internal buffer, filling it with more data\nfrom the inner reader if it is empty. Read more
§

fn consume(self: Pin<&mut Box<T>>, amt: usize)

Tells this buffer that amt bytes have been consumed from the buffer,\nso they should no longer be returned in calls to poll_read. Read more
","AsyncBufRead","avm_server::AVMDataStore","avm_server::HostExportedFunc"],["
§

impl<T> AsyncBufRead for Box<T>
where\n T: AsyncBufRead + Unpin + ?Sized,

§

fn poll_fill_buf(\n self: Pin<&mut Box<T>>,\n cx: &mut Context<'_>,\n) -> Poll<Result<&[u8], Error>>

Attempts to return the contents of the internal buffer, filling it with more data\nfrom the inner reader if it is empty. Read more
§

fn consume(self: Pin<&mut Box<T>>, amt: usize)

Tells this buffer that amt bytes have been consumed from the buffer,\nso they should no longer be returned in calls to poll_read. Read more
","AsyncBufRead","avm_server::AVMDataStore","avm_server::HostExportedFunc"],["
source§

impl<Args, F, A> AsyncFn<Args> for Box<F, A>
where\n Args: Tuple,\n F: AsyncFn<Args> + ?Sized,\n A: Allocator,

source§

extern "rust-call" fn async_call(\n &self,\n args: Args,\n) -> <Box<F, A> as AsyncFnMut<Args>>::CallRefFuture<'_>

🔬This is a nightly-only experimental API. (async_fn_traits)
Call the AsyncFn, returning a future which may borrow from the called closure.
","AsyncFn","avm_server::AVMDataStore","avm_server::HostExportedFunc"],["
source§

impl<Args, F, A> AsyncFnMut<Args> for Box<F, A>
where\n Args: Tuple,\n F: AsyncFnMut<Args> + ?Sized,\n A: Allocator,

§

type CallRefFuture<'a> = <F as AsyncFnMut<Args>>::CallRefFuture<'a>\nwhere\n Box<F, A>: 'a

🔬This is a nightly-only experimental API. (async_fn_traits)
source§

extern "rust-call" fn async_call_mut(\n &mut self,\n args: Args,\n) -> <Box<F, A> as AsyncFnMut<Args>>::CallRefFuture<'_>

🔬This is a nightly-only experimental API. (async_fn_traits)
Call the AsyncFnMut, returning a future which may borrow from the called closure.
","AsyncFnMut","avm_server::AVMDataStore","avm_server::HostExportedFunc"],["
source§

impl<Args, F, A> AsyncFnOnce<Args> for Box<F, A>
where\n Args: Tuple,\n F: AsyncFnOnce<Args> + ?Sized,\n A: Allocator,

§

type Output = <F as AsyncFnOnce<Args>>::Output

🔬This is a nightly-only experimental API. (async_fn_traits)
Output type of the called closure’s future.
§

type CallOnceFuture = <F as AsyncFnOnce<Args>>::CallOnceFuture

🔬This is a nightly-only experimental API. (async_fn_traits)
Future returned by AsyncFnOnce::async_call_once.
source§

extern "rust-call" fn async_call_once(\n self,\n args: Args,\n) -> <Box<F, A> as AsyncFnOnce<Args>>::CallOnceFuture

🔬This is a nightly-only experimental API. (async_fn_traits)
Call the AsyncFnOnce, returning a future which may move out of the called closure.
","AsyncFnOnce","avm_server::AVMDataStore","avm_server::HostExportedFunc"],["
source§

impl<S> AsyncIterator for Box<S>
where\n S: AsyncIterator + Unpin + ?Sized,

§

type Item = <S as AsyncIterator>::Item

🔬This is a nightly-only experimental API. (async_iterator)
The type of items yielded by the async iterator.
source§

fn poll_next(\n self: Pin<&mut Box<S>>,\n cx: &mut Context<'_>,\n) -> Poll<Option<<Box<S> as AsyncIterator>::Item>>

🔬This is a nightly-only experimental API. (async_iterator)
Attempt to pull out the next value of this async iterator, registering the\ncurrent task for wakeup if the value is not yet available, and returning\nNone if the async iterator is exhausted. Read more
source§

fn size_hint(&self) -> (usize, Option<usize>)

🔬This is a nightly-only experimental API. (async_iterator)
Returns the bounds on the remaining length of the async iterator. Read more
","AsyncIterator","avm_server::AVMDataStore","avm_server::HostExportedFunc"],["
§

impl<T> AsyncRead for Box<T>
where\n T: AsyncRead + Unpin + ?Sized,

§

fn poll_read(\n self: Pin<&mut Box<T>>,\n cx: &mut Context<'_>,\n buf: &mut ReadBuf<'_>,\n) -> Poll<Result<(), Error>>

Attempts to read from the AsyncRead into buf. Read more
","AsyncRead","avm_server::AVMDataStore","avm_server::HostExportedFunc"],["
§

impl<T> AsyncRead for Box<T>
where\n T: AsyncRead + Unpin + ?Sized,

§

fn poll_read(\n self: Pin<&mut Box<T>>,\n cx: &mut Context<'_>,\n buf: &mut [u8],\n) -> Poll<Result<usize, Error>>

Attempt to read from the AsyncRead into buf. Read more
§

fn poll_read_vectored(\n self: Pin<&mut Box<T>>,\n cx: &mut Context<'_>,\n bufs: &mut [IoSliceMut<'_>],\n) -> Poll<Result<usize, Error>>

Attempt to read from the AsyncRead into bufs using vectored\nIO operations. Read more
","AsyncRead","avm_server::AVMDataStore","avm_server::HostExportedFunc"],["
§

impl<T> AsyncSeek for Box<T>
where\n T: AsyncSeek + Unpin + ?Sized,

§

fn poll_seek(\n self: Pin<&mut Box<T>>,\n cx: &mut Context<'_>,\n pos: SeekFrom,\n) -> Poll<Result<u64, Error>>

Attempt to seek to an offset, in bytes, in a stream. Read more
","AsyncSeek","avm_server::AVMDataStore","avm_server::HostExportedFunc"],["
§

impl<T> AsyncSeek for Box<T>
where\n T: AsyncSeek + Unpin + ?Sized,

§

fn start_seek(self: Pin<&mut Box<T>>, pos: SeekFrom) -> Result<(), Error>

Attempts to seek to an offset, in bytes, in a stream. Read more
§

fn poll_complete(\n self: Pin<&mut Box<T>>,\n cx: &mut Context<'_>,\n) -> Poll<Result<u64, Error>>

Waits for a seek operation to complete. Read more
","AsyncSeek","avm_server::AVMDataStore","avm_server::HostExportedFunc"],["
§

impl<T> AsyncWrite for Box<T>
where\n T: AsyncWrite + Unpin + ?Sized,

§

fn poll_write(\n self: Pin<&mut Box<T>>,\n cx: &mut Context<'_>,\n buf: &[u8],\n) -> Poll<Result<usize, Error>>

Attempt to write bytes from buf into the object. Read more
§

fn poll_write_vectored(\n self: Pin<&mut Box<T>>,\n cx: &mut Context<'_>,\n bufs: &[IoSlice<'_>],\n) -> Poll<Result<usize, Error>>

Attempt to write bytes from bufs into the object using vectored\nIO operations. Read more
§

fn poll_flush(\n self: Pin<&mut Box<T>>,\n cx: &mut Context<'_>,\n) -> Poll<Result<(), Error>>

Attempt to flush the object, ensuring that any buffered data reach\ntheir destination. Read more
§

fn poll_close(\n self: Pin<&mut Box<T>>,\n cx: &mut Context<'_>,\n) -> Poll<Result<(), Error>>

Attempt to close the object. Read more
","AsyncWrite","avm_server::AVMDataStore","avm_server::HostExportedFunc"],["
§

impl<T> AsyncWrite for Box<T>
where\n T: AsyncWrite + Unpin + ?Sized,

§

fn poll_write(\n self: Pin<&mut Box<T>>,\n cx: &mut Context<'_>,\n buf: &[u8],\n) -> Poll<Result<usize, Error>>

Attempt to write bytes from buf into the object. Read more
§

fn poll_write_vectored(\n self: Pin<&mut Box<T>>,\n cx: &mut Context<'_>,\n bufs: &[IoSlice<'_>],\n) -> Poll<Result<usize, Error>>

Like poll_write, except that it writes from a slice of buffers. Read more
§

fn is_write_vectored(&self) -> bool

Determines if this writer has an efficient poll_write_vectored\nimplementation. Read more
§

fn poll_flush(\n self: Pin<&mut Box<T>>,\n cx: &mut Context<'_>,\n) -> Poll<Result<(), Error>>

Attempts to flush the object, ensuring that any buffered data reach\ntheir destination. Read more
§

fn poll_shutdown(\n self: Pin<&mut Box<T>>,\n cx: &mut Context<'_>,\n) -> Poll<Result<(), Error>>

Initiates or attempts to shut down this writer, returning success when\nthe I/O connection has completely shut down. Read more
","AsyncWrite","avm_server::AVMDataStore","avm_server::HostExportedFunc"],["
1.1.0 · source§

impl<T, A> Borrow<T> for Box<T, A>
where\n A: Allocator,\n T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
","Borrow","avm_server::AVMDataStore","avm_server::HostExportedFunc"],["
1.1.0 · source§

impl<T, A> BorrowMut<T> for Box<T, A>
where\n A: Allocator,\n T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
","BorrowMut","avm_server::AVMDataStore","avm_server::HostExportedFunc"],["
source§

impl<T> Box<T>

1.0.0 · source

pub fn new(x: T) -> Box<T>

Allocates memory on the heap and then places x into it.

\n

This doesn’t actually allocate if T is zero-sized.

\n
§Examples
\n
let five = Box::new(5);
\n
source

pub fn new_uninit() -> Box<MaybeUninit<T>>

🔬This is a nightly-only experimental API. (new_uninit)

Constructs a new box with uninitialized contents.

\n
§Examples
\n
#![feature(new_uninit)]\n\nlet mut five = Box::<u32>::new_uninit();\n\nlet five = unsafe {\n    // Deferred initialization:\n    five.as_mut_ptr().write(5);\n\n    five.assume_init()\n};\n\nassert_eq!(*five, 5)
\n
source

pub fn new_zeroed() -> Box<MaybeUninit<T>>

🔬This is a nightly-only experimental API. (new_uninit)

Constructs a new Box with uninitialized contents, with the memory\nbeing filled with 0 bytes.

\n

See MaybeUninit::zeroed for examples of correct and incorrect usage\nof this method.

\n
§Examples
\n
#![feature(new_uninit)]\n\nlet zero = Box::<u32>::new_zeroed();\nlet zero = unsafe { zero.assume_init() };\n\nassert_eq!(*zero, 0)
\n
1.33.0 · source

pub fn pin(x: T) -> Pin<Box<T>>

Constructs a new Pin<Box<T>>. If T does not implement Unpin, then\nx will be pinned in memory and unable to be moved.

\n

Constructing and pinning of the Box can also be done in two steps: Box::pin(x)\ndoes the same as Box::into_pin(Box::new(x)). Consider using\ninto_pin if you already have a Box<T>, or if you want to\nconstruct a (pinned) Box in a different way than with Box::new.

\n
source

pub fn try_new(x: T) -> Result<Box<T>, AllocError>

🔬This is a nightly-only experimental API. (allocator_api)

Allocates memory on the heap then places x into it,\nreturning an error if the allocation fails

\n

This doesn’t actually allocate if T is zero-sized.

\n
§Examples
\n
#![feature(allocator_api)]\n\nlet five = Box::try_new(5)?;
\n
source

pub fn try_new_uninit() -> Result<Box<MaybeUninit<T>>, AllocError>

🔬This is a nightly-only experimental API. (allocator_api)

Constructs a new box with uninitialized contents on the heap,\nreturning an error if the allocation fails

\n
§Examples
\n
#![feature(allocator_api, new_uninit)]\n\nlet mut five = Box::<u32>::try_new_uninit()?;\n\nlet five = unsafe {\n    // Deferred initialization:\n    five.as_mut_ptr().write(5);\n\n    five.assume_init()\n};\n\nassert_eq!(*five, 5);
\n
source

pub fn try_new_zeroed() -> Result<Box<MaybeUninit<T>>, AllocError>

🔬This is a nightly-only experimental API. (allocator_api)

Constructs a new Box with uninitialized contents, with the memory\nbeing filled with 0 bytes on the heap

\n

See MaybeUninit::zeroed for examples of correct and incorrect usage\nof this method.

\n
§Examples
\n
#![feature(allocator_api, new_uninit)]\n\nlet zero = Box::<u32>::try_new_zeroed()?;\nlet zero = unsafe { zero.assume_init() };\n\nassert_eq!(*zero, 0);
\n
",0,"avm_server::AVMDataStore","avm_server::HostExportedFunc"],["
source§

impl<T> Box<T>
where\n T: ?Sized,

1.4.0 · source

pub unsafe fn from_raw(raw: *mut T) -> Box<T>

Constructs a box from a raw pointer.

\n

After calling this function, the raw pointer is owned by the\nresulting Box. Specifically, the Box destructor will call\nthe destructor of T and free the allocated memory. For this\nto be safe, the memory must have been allocated in accordance\nwith the memory layout used by Box .

\n
§Safety
\n

This function is unsafe because improper use may lead to\nmemory problems. For example, a double-free may occur if the\nfunction is called twice on the same raw pointer.

\n

The safety conditions are described in the memory layout section.

\n
§Examples
\n

Recreate a Box which was previously converted to a raw pointer\nusing Box::into_raw:

\n\n
let x = Box::new(5);\nlet ptr = Box::into_raw(x);\nlet x = unsafe { Box::from_raw(ptr) };
\n

Manually create a Box from scratch by using the global allocator:

\n\n
use std::alloc::{alloc, Layout};\n\nunsafe {\n    let ptr = alloc(Layout::new::<i32>()) as *mut i32;\n    // In general .write is required to avoid attempting to destruct\n    // the (uninitialized) previous contents of `ptr`, though for this\n    // simple example `*ptr = 5` would have worked as well.\n    ptr.write(5);\n    let x = Box::from_raw(ptr);\n}
\n
",0,"avm_server::AVMDataStore","avm_server::HostExportedFunc"],["
source§

impl<T, A> Box<T, A>
where\n A: Allocator,

source

pub fn new_in(x: T, alloc: A) -> Box<T, A>
where\n A: Allocator,

🔬This is a nightly-only experimental API. (allocator_api)

Allocates memory in the given allocator then places x into it.

\n

This doesn’t actually allocate if T is zero-sized.

\n
§Examples
\n
#![feature(allocator_api)]\n\nuse std::alloc::System;\n\nlet five = Box::new_in(5, System);
\n
source

pub fn try_new_in(x: T, alloc: A) -> Result<Box<T, A>, AllocError>
where\n A: Allocator,

🔬This is a nightly-only experimental API. (allocator_api)

Allocates memory in the given allocator then places x into it,\nreturning an error if the allocation fails

\n

This doesn’t actually allocate if T is zero-sized.

\n
§Examples
\n
#![feature(allocator_api)]\n\nuse std::alloc::System;\n\nlet five = Box::try_new_in(5, System)?;
\n
source

pub fn new_uninit_in(alloc: A) -> Box<MaybeUninit<T>, A>
where\n A: Allocator,

🔬This is a nightly-only experimental API. (allocator_api)

Constructs a new box with uninitialized contents in the provided allocator.

\n
§Examples
\n
#![feature(allocator_api, new_uninit)]\n\nuse std::alloc::System;\n\nlet mut five = Box::<u32, _>::new_uninit_in(System);\n\nlet five = unsafe {\n    // Deferred initialization:\n    five.as_mut_ptr().write(5);\n\n    five.assume_init()\n};\n\nassert_eq!(*five, 5)
\n
source

pub fn try_new_uninit_in(alloc: A) -> Result<Box<MaybeUninit<T>, A>, AllocError>
where\n A: Allocator,

🔬This is a nightly-only experimental API. (allocator_api)

Constructs a new box with uninitialized contents in the provided allocator,\nreturning an error if the allocation fails

\n
§Examples
\n
#![feature(allocator_api, new_uninit)]\n\nuse std::alloc::System;\n\nlet mut five = Box::<u32, _>::try_new_uninit_in(System)?;\n\nlet five = unsafe {\n    // Deferred initialization:\n    five.as_mut_ptr().write(5);\n\n    five.assume_init()\n};\n\nassert_eq!(*five, 5);
\n
source

pub fn new_zeroed_in(alloc: A) -> Box<MaybeUninit<T>, A>
where\n A: Allocator,

🔬This is a nightly-only experimental API. (allocator_api)

Constructs a new Box with uninitialized contents, with the memory\nbeing filled with 0 bytes in the provided allocator.

\n

See MaybeUninit::zeroed for examples of correct and incorrect usage\nof this method.

\n
§Examples
\n
#![feature(allocator_api, new_uninit)]\n\nuse std::alloc::System;\n\nlet zero = Box::<u32, _>::new_zeroed_in(System);\nlet zero = unsafe { zero.assume_init() };\n\nassert_eq!(*zero, 0)
\n
source

pub fn try_new_zeroed_in(alloc: A) -> Result<Box<MaybeUninit<T>, A>, AllocError>
where\n A: Allocator,

🔬This is a nightly-only experimental API. (allocator_api)

Constructs a new Box with uninitialized contents, with the memory\nbeing filled with 0 bytes in the provided allocator,\nreturning an error if the allocation fails,

\n

See MaybeUninit::zeroed for examples of correct and incorrect usage\nof this method.

\n
§Examples
\n
#![feature(allocator_api, new_uninit)]\n\nuse std::alloc::System;\n\nlet zero = Box::<u32, _>::try_new_zeroed_in(System)?;\nlet zero = unsafe { zero.assume_init() };\n\nassert_eq!(*zero, 0);
\n
source

pub fn pin_in(x: T, alloc: A) -> Pin<Box<T, A>>
where\n A: 'static + Allocator,

🔬This is a nightly-only experimental API. (allocator_api)

Constructs a new Pin<Box<T, A>>. If T does not implement Unpin, then\nx will be pinned in memory and unable to be moved.

\n

Constructing and pinning of the Box can also be done in two steps: Box::pin_in(x, alloc)\ndoes the same as Box::into_pin(Box::new_in(x, alloc)). Consider using\ninto_pin if you already have a Box<T, A>, or if you want to\nconstruct a (pinned) Box in a different way than with Box::new_in.

\n
source

pub fn into_boxed_slice(boxed: Box<T, A>) -> Box<[T], A>

🔬This is a nightly-only experimental API. (box_into_boxed_slice)

Converts a Box<T> into a Box<[T]>

\n

This conversion does not allocate on the heap and happens in place.

\n
source

pub fn into_inner(boxed: Box<T, A>) -> T

🔬This is a nightly-only experimental API. (box_into_inner)

Consumes the Box, returning the wrapped value.

\n
§Examples
\n
#![feature(box_into_inner)]\n\nlet c = Box::new(5);\n\nassert_eq!(Box::into_inner(c), 5);
\n
",0,"avm_server::AVMDataStore","avm_server::HostExportedFunc"],["
source§

impl<T, A> Box<T, A>
where\n A: Allocator,\n T: ?Sized,

source

pub const unsafe fn from_raw_in(raw: *mut T, alloc: A) -> Box<T, A>

🔬This is a nightly-only experimental API. (allocator_api)

Constructs a box from a raw pointer in the given allocator.

\n

After calling this function, the raw pointer is owned by the\nresulting Box. Specifically, the Box destructor will call\nthe destructor of T and free the allocated memory. For this\nto be safe, the memory must have been allocated in accordance\nwith the memory layout used by Box .

\n
§Safety
\n

This function is unsafe because improper use may lead to\nmemory problems. For example, a double-free may occur if the\nfunction is called twice on the same raw pointer.

\n
§Examples
\n

Recreate a Box which was previously converted to a raw pointer\nusing Box::into_raw_with_allocator:

\n\n
#![feature(allocator_api)]\n\nuse std::alloc::System;\n\nlet x = Box::new_in(5, System);\nlet (ptr, alloc) = Box::into_raw_with_allocator(x);\nlet x = unsafe { Box::from_raw_in(ptr, alloc) };
\n

Manually create a Box from scratch by using the system allocator:

\n\n
#![feature(allocator_api, slice_ptr_get)]\n\nuse std::alloc::{Allocator, Layout, System};\n\nunsafe {\n    let ptr = System.allocate(Layout::new::<i32>())?.as_mut_ptr() as *mut i32;\n    // In general .write is required to avoid attempting to destruct\n    // the (uninitialized) previous contents of `ptr`, though for this\n    // simple example `*ptr = 5` would have worked as well.\n    ptr.write(5);\n    let x = Box::from_raw_in(ptr, System);\n}
\n
1.4.0 · source

pub fn into_raw(b: Box<T, A>) -> *mut T

Consumes the Box, returning a wrapped raw pointer.

\n

The pointer will be properly aligned and non-null.

\n

After calling this function, the caller is responsible for the\nmemory previously managed by the Box. In particular, the\ncaller should properly destroy T and release the memory, taking\ninto account the memory layout used by Box. The easiest way to\ndo this is to convert the raw pointer back into a Box with the\nBox::from_raw function, allowing the Box destructor to perform\nthe cleanup.

\n

Note: this is an associated function, which means that you have\nto call it as Box::into_raw(b) instead of b.into_raw(). This\nis so that there is no conflict with a method on the inner type.

\n
§Examples
\n

Converting the raw pointer back into a Box with Box::from_raw\nfor automatic cleanup:

\n\n
let x = Box::new(String::from(\"Hello\"));\nlet ptr = Box::into_raw(x);\nlet x = unsafe { Box::from_raw(ptr) };
\n

Manual cleanup by explicitly running the destructor and deallocating\nthe memory:

\n\n
use std::alloc::{dealloc, Layout};\nuse std::ptr;\n\nlet x = Box::new(String::from(\"Hello\"));\nlet ptr = Box::into_raw(x);\nunsafe {\n    ptr::drop_in_place(ptr);\n    dealloc(ptr as *mut u8, Layout::new::<String>());\n}
\n

Note: This is equivalent to the following:

\n\n
let x = Box::new(String::from(\"Hello\"));\nlet ptr = Box::into_raw(x);\nunsafe {\n    drop(Box::from_raw(ptr));\n}
\n
source

pub fn into_raw_with_allocator(b: Box<T, A>) -> (*mut T, A)

🔬This is a nightly-only experimental API. (allocator_api)

Consumes the Box, returning a wrapped raw pointer and the allocator.

\n

The pointer will be properly aligned and non-null.

\n

After calling this function, the caller is responsible for the\nmemory previously managed by the Box. In particular, the\ncaller should properly destroy T and release the memory, taking\ninto account the memory layout used by Box. The easiest way to\ndo this is to convert the raw pointer back into a Box with the\nBox::from_raw_in function, allowing the Box destructor to perform\nthe cleanup.

\n

Note: this is an associated function, which means that you have\nto call it as Box::into_raw_with_allocator(b) instead of b.into_raw_with_allocator(). This\nis so that there is no conflict with a method on the inner type.

\n
§Examples
\n

Converting the raw pointer back into a Box with Box::from_raw_in\nfor automatic cleanup:

\n\n
#![feature(allocator_api)]\n\nuse std::alloc::System;\n\nlet x = Box::new_in(String::from(\"Hello\"), System);\nlet (ptr, alloc) = Box::into_raw_with_allocator(x);\nlet x = unsafe { Box::from_raw_in(ptr, alloc) };
\n

Manual cleanup by explicitly running the destructor and deallocating\nthe memory:

\n\n
#![feature(allocator_api)]\n\nuse std::alloc::{Allocator, Layout, System};\nuse std::ptr::{self, NonNull};\n\nlet x = Box::new_in(String::from(\"Hello\"), System);\nlet (ptr, alloc) = Box::into_raw_with_allocator(x);\nunsafe {\n    ptr::drop_in_place(ptr);\n    let non_null = NonNull::new_unchecked(ptr);\n    alloc.deallocate(non_null.cast(), Layout::new::<String>());\n}
\n
source

pub const fn allocator(b: &Box<T, A>) -> &A

🔬This is a nightly-only experimental API. (allocator_api)

Returns a reference to the underlying allocator.

\n

Note: this is an associated function, which means that you have\nto call it as Box::allocator(&b) instead of b.allocator(). This\nis so that there is no conflict with a method on the inner type.

\n
1.26.0 · source

pub fn leak<'a>(b: Box<T, A>) -> &'a mut T
where\n A: 'a,

Consumes and leaks the Box, returning a mutable reference,\n&'a mut T. Note that the type T must outlive the chosen lifetime\n'a. If the type has only static references, or none at all, then this\nmay be chosen to be 'static.

\n

This function is mainly useful for data that lives for the remainder of\nthe program’s life. Dropping the returned reference will cause a memory\nleak. If this is not acceptable, the reference should first be wrapped\nwith the Box::from_raw function producing a Box. This Box can\nthen be dropped which will properly destroy T and release the\nallocated memory.

\n

Note: this is an associated function, which means that you have\nto call it as Box::leak(b) instead of b.leak(). This\nis so that there is no conflict with a method on the inner type.

\n
§Examples
\n

Simple usage:

\n\n
let x = Box::new(41);\nlet static_ref: &'static mut usize = Box::leak(x);\n*static_ref += 1;\nassert_eq!(*static_ref, 42);
\n

Unsized data:

\n\n
let x = vec![1, 2, 3].into_boxed_slice();\nlet static_ref = Box::leak(x);\nstatic_ref[0] = 4;\nassert_eq!(*static_ref, [4, 2, 3]);
\n
1.63.0 (const: unstable) · source

pub fn into_pin(boxed: Box<T, A>) -> Pin<Box<T, A>>
where\n A: 'static,

Converts a Box<T> into a Pin<Box<T>>. If T does not implement Unpin, then\n*boxed will be pinned in memory and unable to be moved.

\n

This conversion does not allocate on the heap and happens in place.

\n

This is also available via From.

\n

Constructing and pinning a Box with Box::into_pin(Box::new(x))\ncan also be written more concisely using Box::pin(x).\nThis into_pin method is useful if you already have a Box<T>, or you are\nconstructing a (pinned) Box in a different way than with Box::new.

\n
§Notes
\n

It’s not recommended that crates add an impl like From<Box<T>> for Pin<T>,\nas it’ll introduce an ambiguity when calling Pin::from.\nA demonstration of such a poor impl is shown below.

\n\n
struct Foo; // A type defined in this crate.\nimpl From<Box<()>> for Pin<Foo> {\n    fn from(_: Box<()>) -> Pin<Foo> {\n        Pin::new(Foo)\n    }\n}\n\nlet foo = Box::new(());\nlet bar = Pin::from(foo);
\n
",0,"avm_server::AVMDataStore","avm_server::HostExportedFunc"],["
§

impl<T> Buf for Box<T>
where\n T: Buf + ?Sized,

§

fn remaining(&self) -> usize

Returns the number of bytes between the current position and the end of\nthe buffer. Read more
§

fn chunk(&self) -> &[u8]

Returns a slice starting at the current position and of length between 0\nand Buf::remaining(). Note that this can return shorter slice (this allows\nnon-continuous internal representation). Read more
§

fn chunks_vectored<'b>(&'b self, dst: &mut [IoSlice<'b>]) -> usize

Fills dst with potentially multiple slices starting at self’s\ncurrent position. Read more
§

fn advance(&mut self, cnt: usize)

Advance the internal cursor of the Buf Read more
§

fn has_remaining(&self) -> bool

Returns true if there are any more bytes to consume Read more
§

fn copy_to_slice(&mut self, dst: &mut [u8])

Copies bytes from self into dst. Read more
§

fn get_u8(&mut self) -> u8

Gets an unsigned 8 bit integer from self. Read more
§

fn get_i8(&mut self) -> i8

Gets a signed 8 bit integer from self. Read more
§

fn get_u16(&mut self) -> u16

Gets an unsigned 16 bit integer from self in big-endian byte order. Read more
§

fn get_u16_le(&mut self) -> u16

Gets an unsigned 16 bit integer from self in little-endian byte order. Read more
§

fn get_u16_ne(&mut self) -> u16

Gets an unsigned 16 bit integer from self in native-endian byte order. Read more
§

fn get_i16(&mut self) -> i16

Gets a signed 16 bit integer from self in big-endian byte order. Read more
§

fn get_i16_le(&mut self) -> i16

Gets a signed 16 bit integer from self in little-endian byte order. Read more
§

fn get_i16_ne(&mut self) -> i16

Gets a signed 16 bit integer from self in native-endian byte order. Read more
§

fn get_u32(&mut self) -> u32

Gets an unsigned 32 bit integer from self in the big-endian byte order. Read more
§

fn get_u32_le(&mut self) -> u32

Gets an unsigned 32 bit integer from self in the little-endian byte order. Read more
§

fn get_u32_ne(&mut self) -> u32

Gets an unsigned 32 bit integer from self in native-endian byte order. Read more
§

fn get_i32(&mut self) -> i32

Gets a signed 32 bit integer from self in big-endian byte order. Read more
§

fn get_i32_le(&mut self) -> i32

Gets a signed 32 bit integer from self in little-endian byte order. Read more
§

fn get_i32_ne(&mut self) -> i32

Gets a signed 32 bit integer from self in native-endian byte order. Read more
§

fn get_u64(&mut self) -> u64

Gets an unsigned 64 bit integer from self in big-endian byte order. Read more
§

fn get_u64_le(&mut self) -> u64

Gets an unsigned 64 bit integer from self in little-endian byte order. Read more
§

fn get_u64_ne(&mut self) -> u64

Gets an unsigned 64 bit integer from self in native-endian byte order. Read more
§

fn get_i64(&mut self) -> i64

Gets a signed 64 bit integer from self in big-endian byte order. Read more
§

fn get_i64_le(&mut self) -> i64

Gets a signed 64 bit integer from self in little-endian byte order. Read more
§

fn get_i64_ne(&mut self) -> i64

Gets a signed 64 bit integer from self in native-endian byte order. Read more
§

fn get_uint(&mut self, nbytes: usize) -> u64

Gets an unsigned n-byte integer from self in big-endian byte order. Read more
§

fn get_uint_le(&mut self, nbytes: usize) -> u64

Gets an unsigned n-byte integer from self in little-endian byte order. Read more
§

fn get_uint_ne(&mut self, nbytes: usize) -> u64

Gets an unsigned n-byte integer from self in native-endian byte order. Read more
§

fn get_int(&mut self, nbytes: usize) -> i64

Gets a signed n-byte integer from self in big-endian byte order. Read more
§

fn get_int_le(&mut self, nbytes: usize) -> i64

Gets a signed n-byte integer from self in little-endian byte order. Read more
§

fn get_int_ne(&mut self, nbytes: usize) -> i64

Gets a signed n-byte integer from self in native-endian byte order. Read more
§

fn copy_to_bytes(&mut self, len: usize) -> Bytes

Consumes len bytes inside self and returns new instance of Bytes\nwith this data. Read more
§

fn get_u128(&mut self) -> u128

Gets an unsigned 128 bit integer from self in big-endian byte order. Read more
§

fn get_u128_le(&mut self) -> u128

Gets an unsigned 128 bit integer from self in little-endian byte order. Read more
§

fn get_u128_ne(&mut self) -> u128

Gets an unsigned 128 bit integer from self in native-endian byte order. Read more
§

fn get_i128(&mut self) -> i128

Gets a signed 128 bit integer from self in big-endian byte order. Read more
§

fn get_i128_le(&mut self) -> i128

Gets a signed 128 bit integer from self in little-endian byte order. Read more
§

fn get_i128_ne(&mut self) -> i128

Gets a signed 128 bit integer from self in native-endian byte order. Read more
§

fn get_f32(&mut self) -> f32

Gets an IEEE754 single-precision (4 bytes) floating point number from\nself in big-endian byte order. Read more
§

fn get_f32_le(&mut self) -> f32

Gets an IEEE754 single-precision (4 bytes) floating point number from\nself in little-endian byte order. Read more
§

fn get_f32_ne(&mut self) -> f32

Gets an IEEE754 single-precision (4 bytes) floating point number from\nself in native-endian byte order. Read more
§

fn get_f64(&mut self) -> f64

Gets an IEEE754 double-precision (8 bytes) floating point number from\nself in big-endian byte order. Read more
§

fn get_f64_le(&mut self) -> f64

Gets an IEEE754 double-precision (8 bytes) floating point number from\nself in little-endian byte order. Read more
§

fn get_f64_ne(&mut self) -> f64

Gets an IEEE754 double-precision (8 bytes) floating point number from\nself in native-endian byte order. Read more
§

fn take(self, limit: usize) -> Take<Self>
where\n Self: Sized,

Creates an adaptor which will read at most limit bytes from self. Read more
§

fn chain<U>(self, next: U) -> Chain<Self, U>
where\n U: Buf,\n Self: Sized,

Creates an adaptor which will chain this buffer with another. Read more
§

fn reader(self) -> Reader<Self>
where\n Self: Sized,

Creates an adaptor which implements the Read trait for self. Read more
","Buf","avm_server::AVMDataStore","avm_server::HostExportedFunc"],["
§

impl<T> BufMut for Box<T>
where\n T: BufMut + ?Sized,

§

fn remaining_mut(&self) -> usize

Returns the number of bytes that can be written from the current\nposition until the end of the buffer is reached. Read more
§

fn chunk_mut(&mut self) -> &mut UninitSlice

Returns a mutable slice starting at the current BufMut position and of\nlength between 0 and BufMut::remaining_mut(). Note that this can be shorter than the\nwhole remainder of the buffer (this allows non-continuous implementation). Read more
§

unsafe fn advance_mut(&mut self, cnt: usize)

Advance the internal cursor of the BufMut Read more
§

fn put_slice(&mut self, src: &[u8])

Transfer bytes into self from src and advance the cursor by the\nnumber of bytes written. Read more
§

fn put_u8(&mut self, n: u8)

Writes an unsigned 8 bit integer to self. Read more
§

fn put_i8(&mut self, n: i8)

Writes a signed 8 bit integer to self. Read more
§

fn put_u16(&mut self, n: u16)

Writes an unsigned 16 bit integer to self in big-endian byte order. Read more
§

fn put_u16_le(&mut self, n: u16)

Writes an unsigned 16 bit integer to self in little-endian byte order. Read more
§

fn put_u16_ne(&mut self, n: u16)

Writes an unsigned 16 bit integer to self in native-endian byte order. Read more
§

fn put_i16(&mut self, n: i16)

Writes a signed 16 bit integer to self in big-endian byte order. Read more
§

fn put_i16_le(&mut self, n: i16)

Writes a signed 16 bit integer to self in little-endian byte order. Read more
§

fn put_i16_ne(&mut self, n: i16)

Writes a signed 16 bit integer to self in native-endian byte order. Read more
§

fn put_u32(&mut self, n: u32)

Writes an unsigned 32 bit integer to self in big-endian byte order. Read more
§

fn put_u32_le(&mut self, n: u32)

Writes an unsigned 32 bit integer to self in little-endian byte order. Read more
§

fn put_u32_ne(&mut self, n: u32)

Writes an unsigned 32 bit integer to self in native-endian byte order. Read more
§

fn put_i32(&mut self, n: i32)

Writes a signed 32 bit integer to self in big-endian byte order. Read more
§

fn put_i32_le(&mut self, n: i32)

Writes a signed 32 bit integer to self in little-endian byte order. Read more
§

fn put_i32_ne(&mut self, n: i32)

Writes a signed 32 bit integer to self in native-endian byte order. Read more
§

fn put_u64(&mut self, n: u64)

Writes an unsigned 64 bit integer to self in the big-endian byte order. Read more
§

fn put_u64_le(&mut self, n: u64)

Writes an unsigned 64 bit integer to self in little-endian byte order. Read more
§

fn put_u64_ne(&mut self, n: u64)

Writes an unsigned 64 bit integer to self in native-endian byte order. Read more
§

fn put_i64(&mut self, n: i64)

Writes a signed 64 bit integer to self in the big-endian byte order. Read more
§

fn put_i64_le(&mut self, n: i64)

Writes a signed 64 bit integer to self in little-endian byte order. Read more
§

fn put_i64_ne(&mut self, n: i64)

Writes a signed 64 bit integer to self in native-endian byte order. Read more
§

fn has_remaining_mut(&self) -> bool

Returns true if there is space in self for more bytes. Read more
§

fn put<T>(&mut self, src: T)
where\n T: Buf,\n Self: Sized,

Transfer bytes into self from src and advance the cursor by the\nnumber of bytes written. Read more
§

fn put_bytes(&mut self, val: u8, cnt: usize)

Put cnt bytes val into self. Read more
§

fn put_u128(&mut self, n: u128)

Writes an unsigned 128 bit integer to self in the big-endian byte order. Read more
§

fn put_u128_le(&mut self, n: u128)

Writes an unsigned 128 bit integer to self in little-endian byte order. Read more
§

fn put_u128_ne(&mut self, n: u128)

Writes an unsigned 128 bit integer to self in native-endian byte order. Read more
§

fn put_i128(&mut self, n: i128)

Writes a signed 128 bit integer to self in the big-endian byte order. Read more
§

fn put_i128_le(&mut self, n: i128)

Writes a signed 128 bit integer to self in little-endian byte order. Read more
§

fn put_i128_ne(&mut self, n: i128)

Writes a signed 128 bit integer to self in native-endian byte order. Read more
§

fn put_uint(&mut self, n: u64, nbytes: usize)

Writes an unsigned n-byte integer to self in big-endian byte order. Read more
§

fn put_uint_le(&mut self, n: u64, nbytes: usize)

Writes an unsigned n-byte integer to self in the little-endian byte order. Read more
§

fn put_uint_ne(&mut self, n: u64, nbytes: usize)

Writes an unsigned n-byte integer to self in the native-endian byte order. Read more
§

fn put_int(&mut self, n: i64, nbytes: usize)

Writes low nbytes of a signed integer to self in big-endian byte order. Read more
§

fn put_int_le(&mut self, n: i64, nbytes: usize)

Writes low nbytes of a signed integer to self in little-endian byte order. Read more
§

fn put_int_ne(&mut self, n: i64, nbytes: usize)

Writes low nbytes of a signed integer to self in native-endian byte order. Read more
§

fn put_f32(&mut self, n: f32)

Writes an IEEE754 single-precision (4 bytes) floating point number to\nself in big-endian byte order. Read more
§

fn put_f32_le(&mut self, n: f32)

Writes an IEEE754 single-precision (4 bytes) floating point number to\nself in little-endian byte order. Read more
§

fn put_f32_ne(&mut self, n: f32)

Writes an IEEE754 single-precision (4 bytes) floating point number to\nself in native-endian byte order. Read more
§

fn put_f64(&mut self, n: f64)

Writes an IEEE754 double-precision (8 bytes) floating point number to\nself in big-endian byte order. Read more
§

fn put_f64_le(&mut self, n: f64)

Writes an IEEE754 double-precision (8 bytes) floating point number to\nself in little-endian byte order. Read more
§

fn put_f64_ne(&mut self, n: f64)

Writes an IEEE754 double-precision (8 bytes) floating point number to\nself in native-endian byte order. Read more
§

fn limit(self, limit: usize) -> Limit<Self>
where\n Self: Sized,

Creates an adaptor which can write at most limit bytes to self. Read more
§

fn writer(self) -> Writer<Self>
where\n Self: Sized,

Creates an adaptor which implements the Write trait for self. Read more
§

fn chain_mut<U>(self, next: U) -> Chain<Self, U>
where\n U: BufMut,\n Self: Sized,

Creates an adapter which will chain this buffer with another. Read more
","BufMut","avm_server::AVMDataStore","avm_server::HostExportedFunc"],["
1.0.0 · source§

impl<B> BufRead for Box<B>
where\n B: BufRead + ?Sized,

source§

fn fill_buf(&mut self) -> Result<&[u8], Error>

Returns the contents of the internal buffer, filling it with more data\nfrom the inner reader if it is empty. Read more
source§

fn consume(&mut self, amt: usize)

Tells this buffer that amt bytes have been consumed from the buffer,\nso they should no longer be returned in calls to read. Read more
source§

fn read_until(&mut self, byte: u8, buf: &mut Vec<u8>) -> Result<usize, Error>

Read all bytes into buf until the delimiter byte or EOF is reached. Read more
source§

fn read_line(&mut self, buf: &mut String) -> Result<usize, Error>

Read all bytes until a newline (the 0xA byte) is reached, and append\nthem to the provided String buffer. Read more
source§

fn has_data_left(&mut self) -> Result<bool, Error>

🔬This is a nightly-only experimental API. (buf_read_has_data_left)
Check if the underlying Read has any data left to be read. Read more
source§

fn skip_until(&mut self, byte: u8) -> Result<usize, Error>

🔬This is a nightly-only experimental API. (bufread_skip_until)
Skip all bytes until the delimiter byte or EOF is reached. Read more
1.0.0 · source§

fn split(self, byte: u8) -> Split<Self>
where\n Self: Sized,

Returns an iterator over the contents of this reader split on the byte\nbyte. Read more
1.0.0 · source§

fn lines(self) -> Lines<Self>
where\n Self: Sized,

Returns an iterator over the lines of this reader. Read more
","BufRead","avm_server::AVMDataStore","avm_server::HostExportedFunc"],["
1.0.0 · source§

impl<T, A> Clone for Box<T, A>
where\n T: Clone,\n A: Allocator + Clone,

source§

fn clone(&self) -> Box<T, A>

Returns a new box with a clone() of this box’s contents.

\n
§Examples
\n
let x = Box::new(5);\nlet y = x.clone();\n\n// The value is the same\nassert_eq!(x, y);\n\n// But they are unique objects\nassert_ne!(&*x as *const i32, &*y as *const i32);
\n
source§

fn clone_from(&mut self, source: &Box<T, A>)

Copies source’s contents into self without creating a new allocation.

\n
§Examples
\n
let x = Box::new(5);\nlet mut y = Box::new(10);\nlet yp: *const i32 = &*y;\n\ny.clone_from(&x);\n\n// The value is the same\nassert_eq!(x, y);\n\n// And no allocation occurred\nassert_eq!(yp, &*y);
\n
","Clone","avm_server::AVMDataStore","avm_server::HostExportedFunc"],["
source§

impl<G, R, A> Coroutine<R> for Box<G, A>
where\n G: Coroutine<R> + Unpin + ?Sized,\n A: Allocator,

§

type Yield = <G as Coroutine<R>>::Yield

🔬This is a nightly-only experimental API. (coroutine_trait)
The type of value this coroutine yields. Read more
§

type Return = <G as Coroutine<R>>::Return

🔬This is a nightly-only experimental API. (coroutine_trait)
The type of value this coroutine returns. Read more
source§

fn resume(\n self: Pin<&mut Box<G, A>>,\n arg: R,\n) -> CoroutineState<<Box<G, A> as Coroutine<R>>::Yield, <Box<G, A> as Coroutine<R>>::Return>

🔬This is a nightly-only experimental API. (coroutine_trait)
Resumes the execution of this coroutine. Read more
","Coroutine","avm_server::AVMDataStore","avm_server::HostExportedFunc"],["
1.0.0 · source§

impl<T, A> Debug for Box<T, A>
where\n T: Debug + ?Sized,\n A: Allocator,

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
","Debug","avm_server::AVMDataStore","avm_server::HostExportedFunc"],["
1.0.0 · source§

impl<T> Default for Box<T>
where\n T: Default,

source§

fn default() -> Box<T>

Creates a Box<T>, with the Default value for T.

\n
","Default","avm_server::AVMDataStore","avm_server::HostExportedFunc"],["
1.0.0 · source§

impl<T, A> Deref for Box<T, A>
where\n A: Allocator,\n T: ?Sized,

§

type Target = T

The resulting type after dereferencing.
source§

fn deref(&self) -> &T

Dereferences the value.
","Deref","avm_server::AVMDataStore","avm_server::HostExportedFunc"],["
1.0.0 · source§

impl<T, A> DerefMut for Box<T, A>
where\n A: Allocator,\n T: ?Sized,

source§

fn deref_mut(&mut self) -> &mut T

Mutably dereferences the value.
","DerefMut","avm_server::AVMDataStore","avm_server::HostExportedFunc"],["
source§

impl<'de, T> Deserialize<'de> for Box<T>
where\n T: Deserialize<'de>,

source§

fn deserialize<D>(\n deserializer: D,\n) -> Result<Box<T>, <D as Deserializer<'de>>::Error>
where\n D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
","Deserialize<'de>","avm_server::AVMDataStore","avm_server::HostExportedFunc"],["
source§

impl<'de, T, U> DeserializeAs<'de, Box<T>> for Box<U>
where\n U: DeserializeAs<'de, T>,

source§

fn deserialize_as<D>(\n deserializer: D,\n) -> Result<Box<T>, <D as Deserializer<'de>>::Error>
where\n D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer.
","DeserializeAs<'de, Box>","avm_server::AVMDataStore","avm_server::HostExportedFunc"],["
1.0.0 · source§

impl<T, A> Display for Box<T, A>
where\n T: Display + ?Sized,\n A: Allocator,

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
","Display","avm_server::AVMDataStore","avm_server::HostExportedFunc"],["
source§

impl<I> DoubleEndedFallibleIterator for Box<I>

source§

fn next_back(\n &mut self,\n) -> Result<Option<<I as FallibleIterator>::Item>, <I as FallibleIterator>::Error>

Advances the end of the iterator, returning the last value.
source§

fn rfold<B, F>(self, init: B, f: F) -> Result<B, Self::Error>
where\n Self: Sized,\n F: FnMut(B, Self::Item) -> Result<B, Self::Error>,

Applies a function over the elements of the iterator in reverse order, producing a single final value.
source§

fn try_rfold<B, E, F>(&mut self, init: B, f: F) -> Result<B, E>
where\n Self: Sized,\n E: From<Self::Error>,\n F: FnMut(B, Self::Item) -> Result<B, E>,

Applies a function over the elements of the iterator in reverse, producing a single final value. Read more
","DoubleEndedFallibleIterator","avm_server::AVMDataStore","avm_server::HostExportedFunc"],["
1.0.0 · source§

impl<I, A> DoubleEndedIterator for Box<I, A>
where\n I: DoubleEndedIterator + ?Sized,\n A: Allocator,

source§

fn next_back(&mut self) -> Option<<I as Iterator>::Item>

Removes and returns an element from the end of the iterator. Read more
source§

fn nth_back(&mut self, n: usize) -> Option<<I as Iterator>::Item>

Returns the nth element from the end of the iterator. Read more
source§

fn advance_back_by(&mut self, n: usize) -> Result<(), NonZero<usize>>

🔬This is a nightly-only experimental API. (iter_advance_by)
Advances the iterator from the back by n elements. Read more
1.27.0 · source§

fn try_rfold<B, F, R>(&mut self, init: B, f: F) -> R
where\n Self: Sized,\n F: FnMut(B, Self::Item) -> R,\n R: Try<Output = B>,

This is the reverse version of Iterator::try_fold(): it takes\nelements starting from the back of the iterator. Read more
1.27.0 · source§

fn rfold<B, F>(self, init: B, f: F) -> B
where\n Self: Sized,\n F: FnMut(B, Self::Item) -> B,

An iterator method that reduces the iterator’s elements to a single,\nfinal value, starting from the back. Read more
1.27.0 · source§

fn rfind<P>(&mut self, predicate: P) -> Option<Self::Item>
where\n Self: Sized,\n P: FnMut(&Self::Item) -> bool,

Searches for an element of an iterator from the back that satisfies a predicate. Read more
","DoubleEndedIterator","avm_server::AVMDataStore","avm_server::HostExportedFunc"],["
1.0.0 · source§

impl<T, A> Drop for Box<T, A>
where\n A: Allocator,\n T: ?Sized,

source§

fn drop(&mut self)

Executes the destructor for this type. Read more
","Drop","avm_server::AVMDataStore","avm_server::HostExportedFunc"],["
1.8.0 · source§

impl<T> Error for Box<T>
where\n T: Error,

source§

fn description(&self) -> &str

👎Deprecated since 1.42.0: use the Display impl or to_string()
source§

fn cause(&self) -> Option<&dyn Error>

👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
source§

fn source(&self) -> Option<&(dyn Error + 'static)>

The lower-level source of this error, if any. Read more
source§

fn provide<'b>(&'b self, request: &mut Request<'b>)

🔬This is a nightly-only experimental API. (error_generic_member_access)
Provides type based access to context intended for error reports. Read more
","Error","avm_server::AVMDataStore","avm_server::HostExportedFunc"],["
1.0.0 · source§

impl<I, A> ExactSizeIterator for Box<I, A>
where\n I: ExactSizeIterator + ?Sized,\n A: Allocator,

source§

fn len(&self) -> usize

Returns the exact remaining length of the iterator. Read more
source§

fn is_empty(&self) -> bool

🔬This is a nightly-only experimental API. (exact_size_is_empty)
Returns true if the iterator is empty. Read more
","ExactSizeIterator","avm_server::AVMDataStore","avm_server::HostExportedFunc"],["
source§

impl<I> FallibleIterator for Box<I>
where\n I: FallibleIterator + ?Sized,

§

type Item = <I as FallibleIterator>::Item

The type being iterated over.
§

type Error = <I as FallibleIterator>::Error

The error type.
source§

fn next(\n &mut self,\n) -> Result<Option<<I as FallibleIterator>::Item>, <I as FallibleIterator>::Error>

Advances the iterator and returns the next value. Read more
source§

fn size_hint(&self) -> (usize, Option<usize>)

Returns bounds on the remaining length of the iterator. Read more
source§

fn nth(\n &mut self,\n n: usize,\n) -> Result<Option<<I as FallibleIterator>::Item>, <I as FallibleIterator>::Error>

Returns the nth element of the iterator.
source§

fn count(self) -> Result<usize, Self::Error>
where\n Self: Sized,

Consumes the iterator, returning the number of remaining items.
source§

fn last(self) -> Result<Option<Self::Item>, Self::Error>
where\n Self: Sized,

Returns the last element of the iterator.
source§

fn step_by(self, step: usize) -> StepBy<Self>
where\n Self: Sized,

Returns an iterator starting at the same point, but stepping by the given amount at each iteration. Read more
source§

fn chain<I>(self, it: I) -> Chain<Self, I>
where\n I: IntoFallibleIterator<Item = Self::Item, Error = Self::Error>,\n Self: Sized,

Returns an iterator which yields the elements of this iterator followed\nby another.
source§

fn zip<I>(\n self,\n o: I,\n) -> Zip<Self, <I as IntoFallibleIterator>::IntoFallibleIter>
where\n Self: Sized,\n I: IntoFallibleIterator<Error = Self::Error>,

Returns an iterator that yields pairs of this iterator’s and another\niterator’s values.
source§

fn map<F, B>(self, f: F) -> Map<Self, F>
where\n Self: Sized,\n F: FnMut(Self::Item) -> Result<B, Self::Error>,

Returns an iterator which applies a fallible transform to the elements\nof the underlying iterator.
source§

fn for_each<F>(self, f: F) -> Result<(), Self::Error>
where\n Self: Sized,\n F: FnMut(Self::Item) -> Result<(), Self::Error>,

Calls a fallible closure on each element of an iterator.
source§

fn filter<F>(self, f: F) -> Filter<Self, F>
where\n Self: Sized,\n F: FnMut(&Self::Item) -> Result<bool, Self::Error>,

Returns an iterator which uses a predicate to determine which values\nshould be yielded. The predicate may fail; such failures are passed to\nthe caller.
source§

fn filter_map<B, F>(self, f: F) -> FilterMap<Self, F>
where\n Self: Sized,\n F: FnMut(Self::Item) -> Result<Option<B>, Self::Error>,

Returns an iterator which both filters and maps. The closure may fail;\nsuch failures are passed along to the consumer.
source§

fn enumerate(self) -> Enumerate<Self>
where\n Self: Sized,

Returns an iterator which yields the current iteration count as well\nas the value.
source§

fn peekable(self) -> Peekable<Self>
where\n Self: Sized,

Returns an iterator that can peek at the next element without consuming\nit.
source§

fn skip_while<P>(self, predicate: P) -> SkipWhile<Self, P>
where\n Self: Sized,\n P: FnMut(&Self::Item) -> Result<bool, Self::Error>,

Returns an iterator that skips elements based on a predicate.
source§

fn take_while<P>(self, predicate: P) -> TakeWhile<Self, P>
where\n Self: Sized,\n P: FnMut(&Self::Item) -> Result<bool, Self::Error>,

Returns an iterator that yields elements based on a predicate.
source§

fn skip(self, n: usize) -> Skip<Self>
where\n Self: Sized,

Returns an iterator which skips the first n values of this iterator.
source§

fn take(self, n: usize) -> Take<Self>
where\n Self: Sized,

Returns an iterator that yields only the first n values of this\niterator.
source§

fn scan<St, B, F>(self, initial_state: St, f: F) -> Scan<Self, St, F>
where\n Self: Sized,\n F: FnMut(&mut St, Self::Item) -> Result<Option<B>, Self::Error>,

Returns an iterator which applies a stateful map to values of this\niterator.
source§

fn flat_map<U, F>(self, f: F) -> FlatMap<Self, U, F>
where\n Self: Sized,\n U: IntoFallibleIterator<Error = Self::Error>,\n F: FnMut(Self::Item) -> Result<U, Self::Error>,

Returns an iterator which maps this iterator’s elements to iterators, yielding those iterators’ values.
source§

fn fuse(self) -> Fuse<Self>
where\n Self: Sized,

Returns an iterator which yields this iterator’s elements and ends after\nthe first Ok(None). Read more
source§

fn inspect<F>(self, f: F) -> Inspect<Self, F>
where\n Self: Sized,\n F: FnMut(&Self::Item) -> Result<(), Self::Error>,

Returns an iterator which passes each element to a closure before returning it.
source§

fn by_ref(&mut self) -> &mut Self
where\n Self: Sized,

Borrow an iterator rather than consuming it. Read more
source§

fn collect<T>(self) -> Result<T, Self::Error>
where\n T: FromFallibleIterator<Self::Item>,\n Self: Sized,

Transforms the iterator into a collection. Read more
source§

fn partition<B, F>(self, f: F) -> Result<(B, B), Self::Error>
where\n Self: Sized,\n B: Default + Extend<Self::Item>,\n F: FnMut(&Self::Item) -> Result<bool, Self::Error>,

Transforms the iterator into two collections, partitioning elements by a closure.
source§

fn fold<B, F>(self, init: B, f: F) -> Result<B, Self::Error>
where\n Self: Sized,\n F: FnMut(B, Self::Item) -> Result<B, Self::Error>,

Applies a function over the elements of the iterator, producing a single\nfinal value.
source§

fn try_fold<B, E, F>(&mut self, init: B, f: F) -> Result<B, E>
where\n Self: Sized,\n E: From<Self::Error>,\n F: FnMut(B, Self::Item) -> Result<B, E>,

Applies a function over the elements of the iterator, producing a single final value. Read more
source§

fn all<F>(&mut self, f: F) -> Result<bool, Self::Error>
where\n Self: Sized,\n F: FnMut(Self::Item) -> Result<bool, Self::Error>,

Determines if all elements of this iterator match a predicate.
source§

fn any<F>(&mut self, f: F) -> Result<bool, Self::Error>
where\n Self: Sized,\n F: FnMut(Self::Item) -> Result<bool, Self::Error>,

Determines if any element of this iterator matches a predicate.
source§

fn find<F>(&mut self, f: F) -> Result<Option<Self::Item>, Self::Error>
where\n Self: Sized,\n F: FnMut(&Self::Item) -> Result<bool, Self::Error>,

Returns the first element of the iterator that matches a predicate.
source§

fn find_map<B, F>(&mut self, f: F) -> Result<Option<B>, Self::Error>
where\n Self: Sized,\n F: FnMut(Self::Item) -> Result<Option<B>, Self::Error>,

Applies a function to the elements of the iterator, returning the first non-None result.
source§

fn position<F>(&mut self, f: F) -> Result<Option<usize>, Self::Error>
where\n Self: Sized,\n F: FnMut(Self::Item) -> Result<bool, Self::Error>,

Returns the position of the first element of this iterator that matches\na predicate. The predicate may fail; such failures are returned to the\ncaller.
source§

fn max_by_key<B, F>(self, f: F) -> Result<Option<Self::Item>, Self::Error>
where\n Self: Sized,\n B: Ord,\n F: FnMut(&Self::Item) -> Result<B, Self::Error>,

Returns the element of the iterator which gives the maximum value from\nthe function.
source§

fn max_by<F>(self, f: F) -> Result<Option<Self::Item>, Self::Error>
where\n Self: Sized,\n F: FnMut(&Self::Item, &Self::Item) -> Result<Ordering, Self::Error>,

Returns the element that gives the maximum value with respect to the function.
source§

fn min_by_key<B, F>(self, f: F) -> Result<Option<Self::Item>, Self::Error>
where\n Self: Sized,\n B: Ord,\n F: FnMut(&Self::Item) -> Result<B, Self::Error>,

Returns the element of the iterator which gives the minimum value from\nthe function.
source§

fn min_by<F>(self, f: F) -> Result<Option<Self::Item>, Self::Error>
where\n Self: Sized,\n F: FnMut(&Self::Item, &Self::Item) -> Result<Ordering, Self::Error>,

Returns the element that gives the minimum value with respect to the function.
source§

fn unzip<A, B, FromA, FromB>(self) -> Result<(FromA, FromB), Self::Error>
where\n Self: Sized + FallibleIterator<Item = (A, B)>,\n FromA: Default + Extend<A>,\n FromB: Default + Extend<B>,

Converts an iterator of pairs into a pair of containers.
source§

fn cloned<'a, T>(self) -> Cloned<Self>
where\n Self: Sized + FallibleIterator<Item = &'a T>,\n T: 'a + Clone,

Returns an iterator which clones all of its elements.
source§

fn partial_cmp<I>(self, other: I) -> Result<Option<Ordering>, Self::Error>
where\n Self: Sized,\n I: IntoFallibleIterator<Error = Self::Error>,\n Self::Item: PartialOrd<<I as IntoFallibleIterator>::Item>,

Lexicographically compares the elements of this iterator to that of\nanother.
source§

fn eq<I>(self, other: I) -> Result<bool, Self::Error>
where\n Self: Sized,\n I: IntoFallibleIterator<Error = Self::Error>,\n Self::Item: PartialEq<<I as IntoFallibleIterator>::Item>,

Determines if the elements of this iterator are equal to those of\nanother.
source§

fn ne<I>(self, other: I) -> Result<bool, Self::Error>
where\n Self: Sized,\n I: IntoFallibleIterator<Error = Self::Error>,\n Self::Item: PartialEq<<I as IntoFallibleIterator>::Item>,

Determines if the elements of this iterator are not equal to those of\nanother.
source§

fn lt<I>(self, other: I) -> Result<bool, Self::Error>
where\n Self: Sized,\n I: IntoFallibleIterator<Error = Self::Error>,\n Self::Item: PartialOrd<<I as IntoFallibleIterator>::Item>,

Determines if the elements of this iterator are lexicographically less\nthan those of another.
source§

fn le<I>(self, other: I) -> Result<bool, Self::Error>
where\n Self: Sized,\n I: IntoFallibleIterator<Error = Self::Error>,\n Self::Item: PartialOrd<<I as IntoFallibleIterator>::Item>,

Determines if the elements of this iterator are lexicographically less\nthan or equal to those of another.
source§

fn gt<I>(self, other: I) -> Result<bool, Self::Error>
where\n Self: Sized,\n I: IntoFallibleIterator<Error = Self::Error>,\n Self::Item: PartialOrd<<I as IntoFallibleIterator>::Item>,

Determines if the elements of this iterator are lexicographically\ngreater than those of another.
source§

fn ge<I>(self, other: I) -> Result<bool, Self::Error>
where\n Self: Sized,\n I: IntoFallibleIterator<Error = Self::Error>,\n Self::Item: PartialOrd<<I as IntoFallibleIterator>::Item>,

Determines if the elements of this iterator are lexicographically\ngreater than or equal to those of another.
source§

fn iterator(self) -> Iterator<Self>
where\n Self: Sized,

Returns a normal (non-fallible) iterator over Result<Item, Error>.
source§

fn map_err<B, F>(self, f: F) -> MapErr<Self, F>
where\n F: FnMut(Self::Error) -> B,\n Self: Sized,

Returns an iterator which applies a transform to the errors of the\nunderlying iterator.
","FallibleIterator","avm_server::AVMDataStore","avm_server::HostExportedFunc"],["
1.35.0 · source§

impl<Args, F, A> Fn<Args> for Box<F, A>
where\n Args: Tuple,\n F: Fn<Args> + ?Sized,\n A: Allocator,

source§

extern "rust-call" fn call(\n &self,\n args: Args,\n) -> <Box<F, A> as FnOnce<Args>>::Output

🔬This is a nightly-only experimental API. (fn_traits)
Performs the call operation.
","Fn","avm_server::AVMDataStore","avm_server::HostExportedFunc"],["
1.35.0 · source§

impl<Args, F, A> FnMut<Args> for Box<F, A>
where\n Args: Tuple,\n F: FnMut<Args> + ?Sized,\n A: Allocator,

source§

extern "rust-call" fn call_mut(\n &mut self,\n args: Args,\n) -> <Box<F, A> as FnOnce<Args>>::Output

🔬This is a nightly-only experimental API. (fn_traits)
Performs the call operation.
","FnMut","avm_server::AVMDataStore","avm_server::HostExportedFunc"],["
1.35.0 · source§

impl<Args, F, A> FnOnce<Args> for Box<F, A>
where\n Args: Tuple,\n F: FnOnce<Args> + ?Sized,\n A: Allocator,

§

type Output = <F as FnOnce<Args>>::Output

The returned type after the call operator is used.
source§

extern "rust-call" fn call_once(\n self,\n args: Args,\n) -> <Box<F, A> as FnOnce<Args>>::Output

🔬This is a nightly-only experimental API. (fn_traits)
Performs the call operation.
","FnOnce","avm_server::AVMDataStore","avm_server::HostExportedFunc"],["
1.6.0 · source§

impl<T> From<T> for Box<T>

source§

fn from(t: T) -> Box<T>

Converts a T into a Box<T>

\n

The conversion allocates on the heap and moves t\nfrom the stack into it.

\n
§Examples
\n
let x = 5;\nlet boxed = Box::new(5);\n\nassert_eq!(Box::from(x), boxed);
\n
","From","avm_server::AVMDataStore","avm_server::HostExportedFunc"],["
§

impl<F> FusedFuture for Box<F>
where\n F: FusedFuture + Unpin + ?Sized,

§

fn is_terminated(&self) -> bool

Returns true if the underlying future should no longer be polled.
","FusedFuture","avm_server::AVMDataStore","avm_server::HostExportedFunc"],["
§

impl<S> FusedStream for Box<S>
where\n S: FusedStream + Unpin + ?Sized,

§

fn is_terminated(&self) -> bool

Returns true if the stream should no longer be polled.
","FusedStream","avm_server::AVMDataStore","avm_server::HostExportedFunc"],["
1.36.0 · source§

impl<F, A> Future for Box<F, A>
where\n F: Future + Unpin + ?Sized,\n A: Allocator,

§

type Output = <F as Future>::Output

The type of value produced on completion.
source§

fn poll(\n self: Pin<&mut Box<F, A>>,\n cx: &mut Context<'_>,\n) -> Poll<<Box<F, A> as Future>::Output>

Attempt to resolve the future to a final value, registering\nthe current task for wakeup if the value is not yet available. Read more
","Future","avm_server::AVMDataStore","avm_server::HostExportedFunc"],["
§

impl<T> GuestMemory for Box<T>
where\n T: GuestMemory + ?Sized,

§

fn base(&self) -> &[UnsafeCell<u8>]

Returns the base allocation of this guest memory, located in host\nmemory. Read more
§

fn has_outstanding_borrows(&self) -> bool

Indicates whether any outstanding borrows are known to the\nGuestMemory. This function must be false in order for it to be\nsafe to recursively call into a WebAssembly module, or to manipulate\nthe WebAssembly memory by any other means.
§

fn is_mut_borrowed(&self, r: Region) -> bool

Check if a region of linear memory is exclusively borrowed. This is called during any\nGuestPtr::read or GuestPtr::write operation to ensure that wiggle is not reading or\nwriting a region of memory which Rust believes it has exclusive access to.
§

fn is_shared_borrowed(&self, r: Region) -> bool

Check if a region of linear memory has any shared borrows.
§

fn mut_borrow(&self, r: Region) -> Result<BorrowHandle, GuestError>

Exclusively borrow a region of linear memory. This is used when constructing a\nGuestSliceMut or GuestStrMut. Those types will give Rust &mut access\nto the region of linear memory, therefore, the GuestMemory impl must\nguarantee that at most one BorrowHandle is issued to a given region,\nGuestMemory::has_outstanding_borrows is true for the duration of the\nborrow, and that GuestMemory::is_mut_borrowed of any overlapping region\nis false for the duration of the borrow.
§

fn shared_borrow(&self, r: Region) -> Result<BorrowHandle, GuestError>

Shared borrow a region of linear memory. This is used when constructing a\nGuestSlice or GuestStr. Those types will give Rust & (shared reference) access\nto the region of linear memory.
§

fn mut_unborrow(&self, h: BorrowHandle)

Unborrow a previously borrowed mutable region. As long as GuestSliceMut and\nGuestStrMut are implemented correctly, a mut BorrowHandle should only be\nunborrowed once.
§

fn shared_unborrow(&self, h: BorrowHandle)

Unborrow a previously borrowed shared region. As long as GuestSlice and\nGuestStr are implemented correctly, a shared BorrowHandle should only be\nunborrowed once.
§

fn ptr<'a, T>(&'a self, offset: <T as Pointee>::Pointer) -> GuestPtr<'a, T>
where\n Self: Sized,\n T: Pointee + ?Sized,

Convenience method for creating a GuestPtr at a particular offset. Read more
§

fn is_shared_memory(&self) -> bool

Check if the underlying memory is shared across multiple threads; e.g.,\nwith a WebAssembly shared memory.
","GuestMemory","avm_server::AVMDataStore","avm_server::HostExportedFunc"],["
1.0.0 · source§

impl<T, A> Hash for Box<T, A>
where\n T: Hash + ?Sized,\n A: Allocator,

source§

fn hash<H>(&self, state: &mut H)
where\n H: Hasher,

Feeds this value into the given Hasher. Read more
1.3.0 · source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where\n H: Hasher,\n Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
","Hash","avm_server::AVMDataStore","avm_server::HostExportedFunc"],["
1.22.0 · source§

impl<T, A> Hasher for Box<T, A>
where\n T: Hasher + ?Sized,\n A: Allocator,

source§

fn finish(&self) -> u64

Returns the hash value for the values written so far. Read more
source§

fn write(&mut self, bytes: &[u8])

Writes some data into this Hasher. Read more
source§

fn write_u8(&mut self, i: u8)

Writes a single u8 into this hasher.
source§

fn write_u16(&mut self, i: u16)

Writes a single u16 into this hasher.
source§

fn write_u32(&mut self, i: u32)

Writes a single u32 into this hasher.
source§

fn write_u64(&mut self, i: u64)

Writes a single u64 into this hasher.
source§

fn write_u128(&mut self, i: u128)

Writes a single u128 into this hasher.
source§

fn write_usize(&mut self, i: usize)

Writes a single usize into this hasher.
source§

fn write_i8(&mut self, i: i8)

Writes a single i8 into this hasher.
source§

fn write_i16(&mut self, i: i16)

Writes a single i16 into this hasher.
source§

fn write_i32(&mut self, i: i32)

Writes a single i32 into this hasher.
source§

fn write_i64(&mut self, i: i64)

Writes a single i64 into this hasher.
source§

fn write_i128(&mut self, i: i128)

Writes a single i128 into this hasher.
source§

fn write_isize(&mut self, i: isize)

Writes a single isize into this hasher.
source§

fn write_length_prefix(&mut self, len: usize)

🔬This is a nightly-only experimental API. (hasher_prefixfree_extras)
Writes a length prefix into this hasher, as part of being prefix-free. Read more
source§

fn write_str(&mut self, s: &str)

🔬This is a nightly-only experimental API. (hasher_prefixfree_extras)
Writes a single str into this hasher. Read more
","Hasher","avm_server::AVMDataStore","avm_server::HostExportedFunc"],["
1.0.0 · source§

impl<I, A> Iterator for Box<I, A>
where\n I: Iterator + ?Sized,\n A: Allocator,

§

type Item = <I as Iterator>::Item

The type of the elements being iterated over.
source§

fn next(&mut self) -> Option<<I as Iterator>::Item>

Advances the iterator and returns the next value. Read more
source§

fn size_hint(&self) -> (usize, Option<usize>)

Returns the bounds on the remaining length of the iterator. Read more
source§

fn nth(&mut self, n: usize) -> Option<<I as Iterator>::Item>

Returns the nth element of the iterator. Read more
source§

fn last(self) -> Option<<I as Iterator>::Item>

Consumes the iterator, returning the last element. Read more
source§

fn next_chunk<const N: usize>(\n &mut self,\n) -> Result<[Self::Item; N], IntoIter<Self::Item, N>>
where\n Self: Sized,

🔬This is a nightly-only experimental API. (iter_next_chunk)
Advances the iterator and returns an array containing the next N values. Read more
1.0.0 · source§

fn count(self) -> usize
where\n Self: Sized,

Consumes the iterator, counting the number of iterations and returning it. Read more
source§

fn advance_by(&mut self, n: usize) -> Result<(), NonZero<usize>>

🔬This is a nightly-only experimental API. (iter_advance_by)
Advances the iterator by n elements. Read more
1.28.0 · source§

fn step_by(self, step: usize) -> StepBy<Self>
where\n Self: Sized,

Creates an iterator starting at the same point, but stepping by\nthe given amount at each iteration. Read more
1.0.0 · source§

fn chain<U>(self, other: U) -> Chain<Self, <U as IntoIterator>::IntoIter>
where\n Self: Sized,\n U: IntoIterator<Item = Self::Item>,

Takes two iterators and creates a new iterator over both in sequence. Read more
1.0.0 · source§

fn zip<U>(self, other: U) -> Zip<Self, <U as IntoIterator>::IntoIter>
where\n Self: Sized,\n U: IntoIterator,

‘Zips up’ two iterators into a single iterator of pairs. Read more
source§

fn intersperse_with<G>(self, separator: G) -> IntersperseWith<Self, G>
where\n Self: Sized,\n G: FnMut() -> Self::Item,

🔬This is a nightly-only experimental API. (iter_intersperse)
Creates a new iterator which places an item generated by separator\nbetween adjacent items of the original iterator. Read more
1.0.0 · source§

fn map<B, F>(self, f: F) -> Map<Self, F>
where\n Self: Sized,\n F: FnMut(Self::Item) -> B,

Takes a closure and creates an iterator which calls that closure on each\nelement. Read more
1.21.0 · source§

fn for_each<F>(self, f: F)
where\n Self: Sized,\n F: FnMut(Self::Item),

Calls a closure on each element of an iterator. Read more
1.0.0 · source§

fn filter<P>(self, predicate: P) -> Filter<Self, P>
where\n Self: Sized,\n P: FnMut(&Self::Item) -> bool,

Creates an iterator which uses a closure to determine if an element\nshould be yielded. Read more
1.0.0 · source§

fn filter_map<B, F>(self, f: F) -> FilterMap<Self, F>
where\n Self: Sized,\n F: FnMut(Self::Item) -> Option<B>,

Creates an iterator that both filters and maps. Read more
1.0.0 · source§

fn enumerate(self) -> Enumerate<Self>
where\n Self: Sized,

Creates an iterator which gives the current iteration count as well as\nthe next value. Read more
1.0.0 · source§

fn peekable(self) -> Peekable<Self>
where\n Self: Sized,

Creates an iterator which can use the peek and peek_mut methods\nto look at the next element of the iterator without consuming it. See\ntheir documentation for more information. Read more
1.0.0 · source§

fn skip_while<P>(self, predicate: P) -> SkipWhile<Self, P>
where\n Self: Sized,\n P: FnMut(&Self::Item) -> bool,

Creates an iterator that skips elements based on a predicate. Read more
1.0.0 · source§

fn take_while<P>(self, predicate: P) -> TakeWhile<Self, P>
where\n Self: Sized,\n P: FnMut(&Self::Item) -> bool,

Creates an iterator that yields elements based on a predicate. Read more
1.57.0 · source§

fn map_while<B, P>(self, predicate: P) -> MapWhile<Self, P>
where\n Self: Sized,\n P: FnMut(Self::Item) -> Option<B>,

Creates an iterator that both yields elements based on a predicate and maps. Read more
1.0.0 · source§

fn skip(self, n: usize) -> Skip<Self>
where\n Self: Sized,

Creates an iterator that skips the first n elements. Read more
1.0.0 · source§

fn take(self, n: usize) -> Take<Self>
where\n Self: Sized,

Creates an iterator that yields the first n elements, or fewer\nif the underlying iterator ends sooner. Read more
1.0.0 · source§

fn scan<St, B, F>(self, initial_state: St, f: F) -> Scan<Self, St, F>
where\n Self: Sized,\n F: FnMut(&mut St, Self::Item) -> Option<B>,

An iterator adapter which, like fold, holds internal state, but\nunlike fold, produces a new iterator. Read more
1.0.0 · source§

fn flat_map<U, F>(self, f: F) -> FlatMap<Self, U, F>
where\n Self: Sized,\n U: IntoIterator,\n F: FnMut(Self::Item) -> U,

Creates an iterator that works like map, but flattens nested structure. Read more
source§

fn map_windows<F, R, const N: usize>(self, f: F) -> MapWindows<Self, F, N>
where\n Self: Sized,\n F: FnMut(&[Self::Item; N]) -> R,

🔬This is a nightly-only experimental API. (iter_map_windows)
Calls the given function f for each contiguous window of size N over\nself and returns an iterator over the outputs of f. Like slice::windows(),\nthe windows during mapping overlap as well. Read more
1.0.0 · source§

fn fuse(self) -> Fuse<Self>
where\n Self: Sized,

Creates an iterator which ends after the first None. Read more
1.0.0 · source§

fn inspect<F>(self, f: F) -> Inspect<Self, F>
where\n Self: Sized,\n F: FnMut(&Self::Item),

Does something with each element of an iterator, passing the value on. Read more
1.0.0 · source§

fn by_ref(&mut self) -> &mut Self
where\n Self: Sized,

Borrows an iterator, rather than consuming it. Read more
1.0.0 · source§

fn collect<B>(self) -> B
where\n B: FromIterator<Self::Item>,\n Self: Sized,

Transforms an iterator into a collection. Read more
source§

fn collect_into<E>(self, collection: &mut E) -> &mut E
where\n E: Extend<Self::Item>,\n Self: Sized,

🔬This is a nightly-only experimental API. (iter_collect_into)
Collects all the items from an iterator into a collection. Read more
1.0.0 · source§

fn partition<B, F>(self, f: F) -> (B, B)
where\n Self: Sized,\n B: Default + Extend<Self::Item>,\n F: FnMut(&Self::Item) -> bool,

Consumes an iterator, creating two collections from it. Read more
source§

fn is_partitioned<P>(self, predicate: P) -> bool
where\n Self: Sized,\n P: FnMut(Self::Item) -> bool,

🔬This is a nightly-only experimental API. (iter_is_partitioned)
Checks if the elements of this iterator are partitioned according to the given predicate,\nsuch that all those that return true precede all those that return false. Read more
1.27.0 · source§

fn try_fold<B, F, R>(&mut self, init: B, f: F) -> R
where\n Self: Sized,\n F: FnMut(B, Self::Item) -> R,\n R: Try<Output = B>,

An iterator method that applies a function as long as it returns\nsuccessfully, producing a single, final value. Read more
1.27.0 · source§

fn try_for_each<F, R>(&mut self, f: F) -> R
where\n Self: Sized,\n F: FnMut(Self::Item) -> R,\n R: Try<Output = ()>,

An iterator method that applies a fallible function to each item in the\niterator, stopping at the first error and returning that error. Read more
1.0.0 · source§

fn fold<B, F>(self, init: B, f: F) -> B
where\n Self: Sized,\n F: FnMut(B, Self::Item) -> B,

Folds every element into an accumulator by applying an operation,\nreturning the final result. Read more
1.51.0 · source§

fn reduce<F>(self, f: F) -> Option<Self::Item>
where\n Self: Sized,\n F: FnMut(Self::Item, Self::Item) -> Self::Item,

Reduces the elements to a single one, by repeatedly applying a reducing\noperation. Read more
source§

fn try_reduce<R>(\n &mut self,\n f: impl FnMut(Self::Item, Self::Item) -> R,\n) -> <<R as Try>::Residual as Residual<Option<<R as Try>::Output>>>::TryType
where\n Self: Sized,\n R: Try<Output = Self::Item>,\n <R as Try>::Residual: Residual<Option<Self::Item>>,

🔬This is a nightly-only experimental API. (iterator_try_reduce)
Reduces the elements to a single one by repeatedly applying a reducing operation. If the\nclosure returns a failure, the failure is propagated back to the caller immediately. Read more
1.0.0 · source§

fn all<F>(&mut self, f: F) -> bool
where\n Self: Sized,\n F: FnMut(Self::Item) -> bool,

Tests if every element of the iterator matches a predicate. Read more
1.0.0 · source§

fn any<F>(&mut self, f: F) -> bool
where\n Self: Sized,\n F: FnMut(Self::Item) -> bool,

Tests if any element of the iterator matches a predicate. Read more
1.0.0 · source§

fn find<P>(&mut self, predicate: P) -> Option<Self::Item>
where\n Self: Sized,\n P: FnMut(&Self::Item) -> bool,

Searches for an element of an iterator that satisfies a predicate. Read more
1.30.0 · source§

fn find_map<B, F>(&mut self, f: F) -> Option<B>
where\n Self: Sized,\n F: FnMut(Self::Item) -> Option<B>,

Applies function to the elements of iterator and returns\nthe first non-none result. Read more
source§

fn try_find<R>(\n &mut self,\n f: impl FnMut(&Self::Item) -> R,\n) -> <<R as Try>::Residual as Residual<Option<Self::Item>>>::TryType
where\n Self: Sized,\n R: Try<Output = bool>,\n <R as Try>::Residual: Residual<Option<Self::Item>>,

🔬This is a nightly-only experimental API. (try_find)
Applies function to the elements of iterator and returns\nthe first true result or the first error. Read more
1.0.0 · source§

fn position<P>(&mut self, predicate: P) -> Option<usize>
where\n Self: Sized,\n P: FnMut(Self::Item) -> bool,

Searches for an element in an iterator, returning its index. Read more
1.6.0 · source§

fn max_by_key<B, F>(self, f: F) -> Option<Self::Item>
where\n B: Ord,\n Self: Sized,\n F: FnMut(&Self::Item) -> B,

Returns the element that gives the maximum value from the\nspecified function. Read more
1.15.0 · source§

fn max_by<F>(self, compare: F) -> Option<Self::Item>
where\n Self: Sized,\n F: FnMut(&Self::Item, &Self::Item) -> Ordering,

Returns the element that gives the maximum value with respect to the\nspecified comparison function. Read more
1.6.0 · source§

fn min_by_key<B, F>(self, f: F) -> Option<Self::Item>
where\n B: Ord,\n Self: Sized,\n F: FnMut(&Self::Item) -> B,

Returns the element that gives the minimum value from the\nspecified function. Read more
1.15.0 · source§

fn min_by<F>(self, compare: F) -> Option<Self::Item>
where\n Self: Sized,\n F: FnMut(&Self::Item, &Self::Item) -> Ordering,

Returns the element that gives the minimum value with respect to the\nspecified comparison function. Read more
1.0.0 · source§

fn unzip<A, B, FromA, FromB>(self) -> (FromA, FromB)
where\n FromA: Default + Extend<A>,\n FromB: Default + Extend<B>,\n Self: Sized + Iterator<Item = (A, B)>,

Converts an iterator of pairs into a pair of containers. Read more
1.36.0 · source§

fn copied<'a, T>(self) -> Copied<Self>
where\n T: 'a + Copy,\n Self: Sized + Iterator<Item = &'a T>,

Creates an iterator which copies all of its elements. Read more
1.0.0 · source§

fn cloned<'a, T>(self) -> Cloned<Self>
where\n T: 'a + Clone,\n Self: Sized + Iterator<Item = &'a T>,

Creates an iterator which clones all of its elements. Read more
source§

fn array_chunks<const N: usize>(self) -> ArrayChunks<Self, N>
where\n Self: Sized,

🔬This is a nightly-only experimental API. (iter_array_chunks)
Returns an iterator over N elements of the iterator at a time. Read more
1.11.0 · source§

fn sum<S>(self) -> S
where\n Self: Sized,\n S: Sum<Self::Item>,

Sums the elements of an iterator. Read more
1.11.0 · source§

fn product<P>(self) -> P
where\n Self: Sized,\n P: Product<Self::Item>,

Iterates over the entire iterator, multiplying all the elements Read more
source§

fn cmp_by<I, F>(self, other: I, cmp: F) -> Ordering
where\n Self: Sized,\n I: IntoIterator,\n F: FnMut(Self::Item, <I as IntoIterator>::Item) -> Ordering,

🔬This is a nightly-only experimental API. (iter_order_by)
Lexicographically compares the elements of this Iterator with those\nof another with respect to the specified comparison function. Read more
1.5.0 · source§

fn partial_cmp<I>(self, other: I) -> Option<Ordering>
where\n I: IntoIterator,\n Self::Item: PartialOrd<<I as IntoIterator>::Item>,\n Self: Sized,

Lexicographically compares the PartialOrd elements of\nthis Iterator with those of another. The comparison works like short-circuit\nevaluation, returning a result without comparing the remaining elements.\nAs soon as an order can be determined, the evaluation stops and a result is returned. Read more
source§

fn partial_cmp_by<I, F>(self, other: I, partial_cmp: F) -> Option<Ordering>
where\n Self: Sized,\n I: IntoIterator,\n F: FnMut(Self::Item, <I as IntoIterator>::Item) -> Option<Ordering>,

🔬This is a nightly-only experimental API. (iter_order_by)
Lexicographically compares the elements of this Iterator with those\nof another with respect to the specified comparison function. Read more
1.5.0 · source§

fn eq<I>(self, other: I) -> bool
where\n I: IntoIterator,\n Self::Item: PartialEq<<I as IntoIterator>::Item>,\n Self: Sized,

Determines if the elements of this Iterator are equal to those of\nanother. Read more
source§

fn eq_by<I, F>(self, other: I, eq: F) -> bool
where\n Self: Sized,\n I: IntoIterator,\n F: FnMut(Self::Item, <I as IntoIterator>::Item) -> bool,

🔬This is a nightly-only experimental API. (iter_order_by)
Determines if the elements of this Iterator are equal to those of\nanother with respect to the specified equality function. Read more
1.5.0 · source§

fn ne<I>(self, other: I) -> bool
where\n I: IntoIterator,\n Self::Item: PartialEq<<I as IntoIterator>::Item>,\n Self: Sized,

Determines if the elements of this Iterator are not equal to those of\nanother. Read more
1.5.0 · source§

fn lt<I>(self, other: I) -> bool
where\n I: IntoIterator,\n Self::Item: PartialOrd<<I as IntoIterator>::Item>,\n Self: Sized,

Determines if the elements of this Iterator are lexicographically\nless than those of another. Read more
1.5.0 · source§

fn le<I>(self, other: I) -> bool
where\n I: IntoIterator,\n Self::Item: PartialOrd<<I as IntoIterator>::Item>,\n Self: Sized,

Determines if the elements of this Iterator are lexicographically\nless or equal to those of another. Read more
1.5.0 · source§

fn gt<I>(self, other: I) -> bool
where\n I: IntoIterator,\n Self::Item: PartialOrd<<I as IntoIterator>::Item>,\n Self: Sized,

Determines if the elements of this Iterator are lexicographically\ngreater than those of another. Read more
1.5.0 · source§

fn ge<I>(self, other: I) -> bool
where\n I: IntoIterator,\n Self::Item: PartialOrd<<I as IntoIterator>::Item>,\n Self: Sized,

Determines if the elements of this Iterator are lexicographically\ngreater than or equal to those of another. Read more
source§

fn is_sorted_by<F>(self, compare: F) -> bool
where\n Self: Sized,\n F: FnMut(&Self::Item, &Self::Item) -> bool,

🔬This is a nightly-only experimental API. (is_sorted)
Checks if the elements of this iterator are sorted using the given comparator function. Read more
source§

fn is_sorted_by_key<F, K>(self, f: F) -> bool
where\n Self: Sized,\n F: FnMut(Self::Item) -> K,\n K: PartialOrd,

🔬This is a nightly-only experimental API. (is_sorted)
Checks if the elements of this iterator are sorted using the given key extraction\nfunction. Read more
","Iterator","avm_server::AVMDataStore","avm_server::HostExportedFunc"],["
§

impl<Sp> LocalSpawn for Box<Sp>
where\n Sp: LocalSpawn + ?Sized,

§

fn spawn_local_obj(\n &self,\n future: LocalFutureObj<'static, ()>,\n) -> Result<(), SpawnError>

Spawns a future that will be run to completion. Read more
§

fn status_local(&self) -> Result<(), SpawnError>

Determines whether the executor is able to spawn new tasks. Read more
","LocalSpawn","avm_server::AVMDataStore","avm_server::HostExportedFunc"],["
source§

impl<T> Log for Box<T>
where\n T: Log + ?Sized,

source§

fn enabled(&self, metadata: &Metadata<'_>) -> bool

Determines if a log message with the specified metadata would be\nlogged. Read more
source§

fn log(&self, record: &Record<'_>)

Logs the Record. Read more
source§

fn flush(&self)

Flushes any buffered records.
","Log","avm_server::AVMDataStore","avm_server::HostExportedFunc"],["
1.0.0 · source§

impl<T, A> Ord for Box<T, A>
where\n T: Ord + ?Sized,\n A: Allocator,

source§

fn cmp(&self, other: &Box<T, A>) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · source§

fn max(self, other: Self) -> Self
where\n Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · source§

fn min(self, other: Self) -> Self
where\n Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · source§

fn clamp(self, min: Self, max: Self) -> Self
where\n Self: Sized + PartialOrd,

Restrict a value to a certain interval. Read more
","Ord","avm_server::AVMDataStore","avm_server::HostExportedFunc"],["
§

impl<'a, T> Parse<'a> for Box<T>
where\n T: Parse<'a>,

§

fn parse(parser: Parser<'a>) -> Result<Box<T>, Error>

Attempts to parse Self from parser, returning an error if it could\nnot be parsed. Read more
","Parse<'a>","avm_server::AVMDataStore","avm_server::HostExportedFunc"],["
1.0.0 · source§

impl<T, A> PartialEq for Box<T, A>
where\n T: PartialEq + ?Sized,\n A: Allocator,

source§

fn eq(&self, other: &Box<T, A>) -> bool

This method tests for self and other values to be equal, and is used\nby ==.
source§

fn ne(&self, other: &Box<T, A>) -> bool

This method tests for !=. The default implementation is almost always\nsufficient, and should not be overridden without very good reason.
","PartialEq","avm_server::AVMDataStore","avm_server::HostExportedFunc"],["
1.0.0 · source§

impl<T, A> PartialOrd for Box<T, A>
where\n T: PartialOrd + ?Sized,\n A: Allocator,

source§

fn partial_cmp(&self, other: &Box<T, A>) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
source§

fn lt(&self, other: &Box<T, A>) -> bool

This method tests less than (for self and other) and is used by the < operator. Read more
source§

fn le(&self, other: &Box<T, A>) -> bool

This method tests less than or equal to (for self and other) and is used by the <=\noperator. Read more
source§

fn ge(&self, other: &Box<T, A>) -> bool

This method tests greater than or equal to (for self and other) and is used by the >=\noperator. Read more
source§

fn gt(&self, other: &Box<T, A>) -> bool

This method tests greater than (for self and other) and is used by the > operator. Read more
","PartialOrd","avm_server::AVMDataStore","avm_server::HostExportedFunc"],["
§

impl<B> Peek for Box<B>
where\n B: BufRead + ?Sized,

§

fn peek(&mut self, buf: &mut [u8]) -> Result<usize, Error>

Reads data from a stream without consuming it; subsequent reads will\nre-read the data. May return fewer bytes than requested; Ok(0)\nindicates that seeking is not possible (but reading may still be).
","Peek","avm_server::AVMDataStore","avm_server::HostExportedFunc"],["
1.0.0 · source§

impl<T, A> Pointer for Box<T, A>
where\n A: Allocator,\n T: ?Sized,

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
","Pointer","avm_server::AVMDataStore","avm_server::HostExportedFunc"],["
1.0.0 · source§

impl<R> Read for Box<R>
where\n R: Read + ?Sized,

source§

fn read(&mut self, buf: &mut [u8]) -> Result<usize, Error>

Pull some bytes from this source into the specified buffer, returning\nhow many bytes were read. Read more
source§

fn read_buf(&mut self, cursor: BorrowedCursor<'_>) -> Result<(), Error>

🔬This is a nightly-only experimental API. (read_buf)
Pull some bytes from this source into the specified buffer. Read more
source§

fn read_vectored(&mut self, bufs: &mut [IoSliceMut<'_>]) -> Result<usize, Error>

Like read, except that it reads into a slice of buffers. Read more
source§

fn is_read_vectored(&self) -> bool

🔬This is a nightly-only experimental API. (can_vector)
Determines if this Reader has an efficient read_vectored\nimplementation. Read more
source§

fn read_to_end(&mut self, buf: &mut Vec<u8>) -> Result<usize, Error>

Read all bytes until EOF in this source, placing them into buf. Read more
source§

fn read_to_string(&mut self, buf: &mut String) -> Result<usize, Error>

Read all bytes until EOF in this source, appending them to buf. Read more
source§

fn read_exact(&mut self, buf: &mut [u8]) -> Result<(), Error>

Read the exact number of bytes required to fill buf. Read more
source§

fn read_buf_exact(&mut self, cursor: BorrowedCursor<'_>) -> Result<(), Error>

🔬This is a nightly-only experimental API. (read_buf)
Read the exact number of bytes required to fill cursor. Read more
1.0.0 · source§

fn by_ref(&mut self) -> &mut Self
where\n Self: Sized,

Creates a “by reference” adaptor for this instance of Read. Read more
1.0.0 · source§

fn bytes(self) -> Bytes<Self>
where\n Self: Sized,

Transforms this Read instance to an Iterator over its bytes. Read more
1.0.0 · source§

fn chain<R>(self, next: R) -> Chain<Self, R>
where\n R: Read,\n Self: Sized,

Creates an adapter which will chain this stream with another. Read more
1.0.0 · source§

fn take(self, limit: u64) -> Take<Self>
where\n Self: Sized,

Creates an adapter which will read at most limit bytes from it. Read more
","Read","avm_server::AVMDataStore","avm_server::HostExportedFunc"],["
§

impl<R> ReadReady for Box<R>
where\n R: ReadReady,

Implement ReadReady for Box.

\n
§

fn num_ready_bytes(&self) -> Result<u64, Error>

Return the number of bytes which are ready to be read immediately. Read more
","ReadReady","avm_server::AVMDataStore","avm_server::HostExportedFunc"],["
source§

impl<R> RngCore for Box<R>
where\n R: RngCore + ?Sized,

source§

fn next_u32(&mut self) -> u32

Return the next random u32. Read more
source§

fn next_u64(&mut self) -> u64

Return the next random u64. Read more
source§

fn fill_bytes(&mut self, dest: &mut [u8])

Fill dest with random data. Read more
source§

fn try_fill_bytes(&mut self, dest: &mut [u8]) -> Result<(), Error>

Fill dest entirely with random data. Read more
","RngCore","avm_server::AVMDataStore","avm_server::HostExportedFunc"],["
1.0.0 · source§

impl<S> Seek for Box<S>
where\n S: Seek + ?Sized,

source§

fn seek(&mut self, pos: SeekFrom) -> Result<u64, Error>

Seek to an offset, in bytes, in a stream. Read more
source§

fn stream_position(&mut self) -> Result<u64, Error>

Returns the current seek position from the start of the stream. Read more
1.55.0 · source§

fn rewind(&mut self) -> Result<(), Error>

Rewind to the beginning of a stream. Read more
source§

fn stream_len(&mut self) -> Result<u64, Error>

🔬This is a nightly-only experimental API. (seek_stream_len)
Returns the length of this stream (in bytes). Read more
1.80.0 · source§

fn seek_relative(&mut self, offset: i64) -> Result<(), Error>

Seeks relative to the current position. Read more
","Seek","avm_server::AVMDataStore","avm_server::HostExportedFunc"],["
§

impl<T, S> Serialize<S> for Box<T>
where\n T: SerializeUnsized<S> + ?Sized,\n S: Fallible + ?Sized,

§

fn serialize(\n &self,\n serializer: &mut S,\n) -> Result<<Box<T> as Archive>::Resolver, <S as Fallible>::Error>

Writes the dependencies for the object and returns a resolver that can create the archived\ntype.
","Serialize","avm_server::AVMDataStore","avm_server::HostExportedFunc"],["
source§

impl<T> Serialize for Box<T>
where\n T: Serialize + ?Sized,

source§

fn serialize<S>(\n &self,\n serializer: S,\n) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error>
where\n S: Serializer,

Serialize this value into the given Serde serializer. Read more
","Serialize","avm_server::AVMDataStore","avm_server::HostExportedFunc"],["
source§

impl<T> Serialize for Box<T>
where\n T: Serialize + ?Sized,

source§

fn serialize<S>(\n &self,\n serializer: S,\n) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error>
where\n S: Serializer,

","Serialize","avm_server::AVMDataStore","avm_server::HostExportedFunc"],["
source§

impl<T, U> SerializeAs<Box<T>> for Box<U>
where\n U: SerializeAs<T>,

source§

fn serialize_as<S>(\n source: &Box<T>,\n serializer: S,\n) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error>
where\n S: Serializer,

Serialize this value into the given Serde serializer.
","SerializeAs>","avm_server::AVMDataStore","avm_server::HostExportedFunc"],["
§

impl<S, Item> Sink<Item> for Box<S>
where\n S: Sink<Item> + Unpin + ?Sized,

§

type Error = <S as Sink<Item>>::Error

The type of value produced by the sink when an error occurs.
§

fn poll_ready(\n self: Pin<&mut Box<S>>,\n cx: &mut Context<'_>,\n) -> Poll<Result<(), <Box<S> as Sink<Item>>::Error>>

Attempts to prepare the Sink to receive a value. Read more
§

fn start_send(\n self: Pin<&mut Box<S>>,\n item: Item,\n) -> Result<(), <Box<S> as Sink<Item>>::Error>

Begin the process of sending a value to the sink.\nEach call to this function must be preceded by a successful call to\npoll_ready which returned Poll::Ready(Ok(())). Read more
§

fn poll_flush(\n self: Pin<&mut Box<S>>,\n cx: &mut Context<'_>,\n) -> Poll<Result<(), <Box<S> as Sink<Item>>::Error>>

Flush any remaining output from this sink. Read more
§

fn poll_close(\n self: Pin<&mut Box<S>>,\n cx: &mut Context<'_>,\n) -> Poll<Result<(), <Box<S> as Sink<Item>>::Error>>

Flush any remaining output and close this sink, if necessary. Read more
","Sink","avm_server::AVMDataStore","avm_server::HostExportedFunc"],["
§

impl<T> Source for Box<T>
where\n T: Source + ?Sized,

§

fn register(\n &mut self,\n registry: &Registry,\n token: Token,\n interests: Interest,\n) -> Result<(), Error>

Register self with the given Registry instance. Read more
§

fn reregister(\n &mut self,\n registry: &Registry,\n token: Token,\n interests: Interest,\n) -> Result<(), Error>

Re-register self with the given Registry instance. Read more
§

fn deregister(&mut self, registry: &Registry) -> Result<(), Error>

Deregister self from the given Registry instance. Read more
","Source","avm_server::AVMDataStore","avm_server::HostExportedFunc"],["
§

impl<Sp> Spawn for Box<Sp>
where\n Sp: Spawn + ?Sized,

§

fn spawn_obj(&self, future: FutureObj<'static, ()>) -> Result<(), SpawnError>

Spawns a future that will be run to completion. Read more
§

fn status(&self) -> Result<(), SpawnError>

Determines whether the executor is able to spawn new tasks. Read more
","Spawn","avm_server::AVMDataStore","avm_server::HostExportedFunc"],["
§

impl<S> Stream for Box<S>
where\n S: Stream + Unpin + ?Sized,

§

type Item = <S as Stream>::Item

Values yielded by the stream.
§

fn poll_next(\n self: Pin<&mut Box<S>>,\n cx: &mut Context<'_>,\n) -> Poll<Option<<Box<S> as Stream>::Item>>

Attempt to pull out the next value of this stream, registering the\ncurrent task for wakeup if the value is not yet available, and returning\nNone if the stream is exhausted. Read more
§

fn size_hint(&self) -> (usize, Option<usize>)

Returns the bounds on the remaining length of the stream. Read more
","Stream","avm_server::AVMDataStore","avm_server::HostExportedFunc"],["
§

impl<S> Subscriber for Box<S>
where\n S: Subscriber + ?Sized,

§

fn register_callsite(&self, metadata: &'static Metadata<'static>) -> Interest

Registers a new callsite with this subscriber, returning whether or not\nthe subscriber is interested in being notified about the callsite. Read more
§

fn enabled(&self, metadata: &Metadata<'_>) -> bool

Returns true if a span or event with the specified metadata would be\nrecorded. Read more
§

fn max_level_hint(&self) -> Option<LevelFilter>

Returns the highest verbosity level that this Subscriber will\nenable, or None, if the subscriber does not implement level-based\nfiltering or chooses not to implement this method. Read more
§

fn new_span(&self, span: &Attributes<'_>) -> Id

Visit the construction of a new span, returning a new span ID for the\nspan being constructed. Read more
§

fn record(&self, span: &Id, values: &Record<'_>)

Record a set of values on a span. Read more
§

fn record_follows_from(&self, span: &Id, follows: &Id)

Adds an indication that span follows from the span with the id\nfollows. Read more
§

fn event_enabled(&self, event: &Event<'_>) -> bool

Determine if an [Event] should be recorded. Read more
§

fn event(&self, event: &Event<'_>)

Records that an Event has occurred. Read more
§

fn enter(&self, span: &Id)

Records that a span has been entered. Read more
§

fn exit(&self, span: &Id)

Records that a span has been exited. Read more
§

fn clone_span(&self, id: &Id) -> Id

Notifies the subscriber that a span ID has been cloned. Read more
§

fn try_close(&self, id: Id) -> bool

Notifies the subscriber that a span ID has been dropped, and returns\ntrue if there are now 0 IDs that refer to that span. Read more
§

fn drop_span(&self, id: Id)

👎Deprecated since 0.1.2: use Subscriber::try_close instead
This method is deprecated. Read more
§

fn current_span(&self) -> Current

Returns a type representing this subscriber’s view of the current span. Read more
§

unsafe fn downcast_raw(&self, id: TypeId) -> Option<*const ()>

If self is the same type as the provided TypeId, returns an untyped\n*const pointer to that type. Otherwise, returns None. Read more
§

fn on_register_dispatch(&self, subscriber: &Dispatch)

Invoked when this subscriber becomes a [Dispatch]. Read more
","Subscriber","avm_server::AVMDataStore","avm_server::HostExportedFunc"],["
§

impl<'a, T, F> UnsafeFutureObj<'a, T> for Box<F>
where\n F: Future<Output = T> + 'a,

§

fn into_raw(self) -> *mut dyn Future<Output = T> + 'a

Convert an owned instance into a (conceptually owned) fat pointer. Read more
§

unsafe fn drop(ptr: *mut dyn Future<Output = T> + 'a)

Drops the future represented by the given fat pointer. Read more
","UnsafeFutureObj<'a, T>","avm_server::AVMDataStore","avm_server::HostExportedFunc"],["
§

impl<T> Value for Box<T>
where\n T: Value + ?Sized,

§

fn record(&self, key: &Field, visitor: &mut dyn Visit)

Visits this value with the given Visitor.
","Value","avm_server::AVMDataStore","avm_server::HostExportedFunc"],["
§

impl<'a, V> VisitOperator<'a> for Box<V>
where\n V: VisitOperator<'a> + ?Sized,

§

type Output = <V as VisitOperator<'a>>::Output

The result type of the visitor.
§

fn visit_operator(\n &mut self,\n op: &Operator<'a>,\n) -> <Box<V> as VisitOperator<'a>>::Output

Visits the [Operator] op using the given offset. Read more
§

fn visit_unreachable(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_nop(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_block(\n &mut self,\n blockty: BlockType,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_loop(\n &mut self,\n blockty: BlockType,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_if(\n &mut self,\n blockty: BlockType,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_else(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_try(\n &mut self,\n blockty: BlockType,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_catch(\n &mut self,\n tag_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_throw(\n &mut self,\n tag_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_rethrow(\n &mut self,\n relative_depth: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_end(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_br(\n &mut self,\n relative_depth: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_br_if(\n &mut self,\n relative_depth: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_br_table(\n &mut self,\n targets: BrTable<'a>,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_return(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_call(\n &mut self,\n function_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_call_indirect(\n &mut self,\n type_index: u32,\n table_index: u32,\n table_byte: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_return_call(\n &mut self,\n function_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_return_call_indirect(\n &mut self,\n type_index: u32,\n table_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_delegate(\n &mut self,\n relative_depth: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_catch_all(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_drop(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_select(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_typed_select(\n &mut self,\n ty: ValType,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_local_get(\n &mut self,\n local_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_local_set(\n &mut self,\n local_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_local_tee(\n &mut self,\n local_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_global_get(\n &mut self,\n global_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_global_set(\n &mut self,\n global_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_load(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_load(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_load(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_load(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_load8_s(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_load8_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_load16_s(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_load16_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_load8_s(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_load8_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_load16_s(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_load16_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_load32_s(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_load32_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_store(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_store(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_store(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_store(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_store8(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_store16(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_store8(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_store16(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_store32(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_memory_size(\n &mut self,\n mem: u32,\n mem_byte: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_memory_grow(\n &mut self,\n mem: u32,\n mem_byte: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_const(\n &mut self,\n value: i32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_const(\n &mut self,\n value: i64,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_const(\n &mut self,\n value: Ieee32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_const(\n &mut self,\n value: Ieee64,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_ref_null(\n &mut self,\n hty: HeapType,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_ref_is_null(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_ref_func(\n &mut self,\n function_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_eqz(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_eq(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_ne(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_lt_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_lt_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_gt_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_gt_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_le_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_le_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_ge_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_ge_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_eqz(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_eq(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_ne(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_lt_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_lt_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_gt_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_gt_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_le_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_le_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_ge_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_ge_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_eq(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_ne(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_lt(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_gt(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_le(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_ge(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_eq(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_ne(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_lt(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_gt(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_le(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_ge(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_clz(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_ctz(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_popcnt(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_add(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_sub(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_mul(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_div_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_div_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_rem_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_rem_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_and(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_or(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_xor(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_shl(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_shr_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_shr_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_rotl(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_rotr(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_clz(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_ctz(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_popcnt(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_add(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_sub(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_mul(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_div_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_div_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_rem_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_rem_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_and(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_or(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_xor(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_shl(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_shr_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_shr_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_rotl(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_rotr(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_abs(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_neg(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_ceil(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_floor(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_trunc(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_nearest(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_sqrt(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_add(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_sub(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_mul(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_div(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_min(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_max(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_copysign(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_abs(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_neg(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_ceil(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_floor(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_trunc(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_nearest(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_sqrt(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_add(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_sub(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_mul(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_div(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_min(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_max(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_copysign(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_wrap_i64(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_trunc_f32_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_trunc_f32_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_trunc_f64_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_trunc_f64_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_extend_i32_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_extend_i32_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_trunc_f32_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_trunc_f32_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_trunc_f64_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_trunc_f64_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_convert_i32_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_convert_i32_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_convert_i64_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_convert_i64_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_demote_f64(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_convert_i32_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_convert_i32_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_convert_i64_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_convert_i64_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_promote_f32(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_reinterpret_f32(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_reinterpret_f64(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_reinterpret_i32(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_reinterpret_i64(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_extend8_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_extend16_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_extend8_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_extend16_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_extend32_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i31_new(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i31_get_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i31_get_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_trunc_sat_f32_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_trunc_sat_f32_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_trunc_sat_f64_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_trunc_sat_f64_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_trunc_sat_f32_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_trunc_sat_f32_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_trunc_sat_f64_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_trunc_sat_f64_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_memory_init(\n &mut self,\n data_index: u32,\n mem: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_data_drop(\n &mut self,\n data_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_memory_copy(\n &mut self,\n dst_mem: u32,\n src_mem: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_memory_fill(\n &mut self,\n mem: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_table_init(\n &mut self,\n elem_index: u32,\n table: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_elem_drop(\n &mut self,\n elem_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_table_copy(\n &mut self,\n dst_table: u32,\n src_table: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_table_fill(\n &mut self,\n table: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_table_get(\n &mut self,\n table: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_table_set(\n &mut self,\n table: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_table_grow(\n &mut self,\n table: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_table_size(\n &mut self,\n table: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_memory_discard(\n &mut self,\n mem: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_memory_atomic_notify(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_memory_atomic_wait32(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_memory_atomic_wait64(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_atomic_fence(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_load(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_load(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_load8_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_load16_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_load8_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_load16_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_load32_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_store(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_store(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_store8(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_store16(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_store8(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_store16(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_store32(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw_add(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw_add(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw8_add_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw16_add_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw8_add_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw16_add_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw32_add_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw_sub(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw_sub(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw8_sub_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw16_sub_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw8_sub_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw16_sub_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw32_sub_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw_and(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw_and(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw8_and_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw16_and_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw8_and_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw16_and_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw32_and_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw_or(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw_or(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw8_or_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw16_or_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw8_or_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw16_or_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw32_or_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw_xor(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw_xor(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw8_xor_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw16_xor_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw8_xor_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw16_xor_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw32_xor_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw_xchg(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw_xchg(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw8_xchg_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw16_xchg_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw8_xchg_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw16_xchg_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw32_xchg_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw_cmpxchg(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw_cmpxchg(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw8_cmpxchg_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw16_cmpxchg_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw8_cmpxchg_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw16_cmpxchg_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw32_cmpxchg_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_load(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_load8x8_s(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_load8x8_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_load16x4_s(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_load16x4_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_load32x2_s(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_load32x2_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_load8_splat(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_load16_splat(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_load32_splat(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_load64_splat(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_load32_zero(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_load64_zero(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_store(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_load8_lane(\n &mut self,\n memarg: MemArg,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_load16_lane(\n &mut self,\n memarg: MemArg,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_load32_lane(\n &mut self,\n memarg: MemArg,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_load64_lane(\n &mut self,\n memarg: MemArg,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_store8_lane(\n &mut self,\n memarg: MemArg,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_store16_lane(\n &mut self,\n memarg: MemArg,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_store32_lane(\n &mut self,\n memarg: MemArg,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_store64_lane(\n &mut self,\n memarg: MemArg,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_const(\n &mut self,\n value: V128,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_shuffle(\n &mut self,\n lanes: [u8; 16],\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_extract_lane_s(\n &mut self,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_extract_lane_u(\n &mut self,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_replace_lane(\n &mut self,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_extract_lane_s(\n &mut self,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_extract_lane_u(\n &mut self,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_replace_lane(\n &mut self,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_extract_lane(\n &mut self,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_replace_lane(\n &mut self,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_extract_lane(\n &mut self,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_replace_lane(\n &mut self,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_extract_lane(\n &mut self,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_replace_lane(\n &mut self,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_extract_lane(\n &mut self,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_replace_lane(\n &mut self,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_swizzle(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_splat(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_splat(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_splat(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_splat(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_splat(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_splat(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_eq(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_ne(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_lt_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_lt_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_gt_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_gt_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_le_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_le_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_ge_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_ge_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_eq(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_ne(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_lt_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_lt_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_gt_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_gt_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_le_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_le_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_ge_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_ge_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_eq(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_ne(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_lt_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_lt_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_gt_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_gt_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_le_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_le_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_ge_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_ge_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_eq(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_ne(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_lt_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_gt_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_le_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_ge_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_eq(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_ne(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_lt(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_gt(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_le(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_ge(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_eq(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_ne(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_lt(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_gt(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_le(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_ge(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_not(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_and(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_andnot(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_or(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_xor(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_bitselect(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_any_true(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_abs(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_neg(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_popcnt(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_all_true(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_bitmask(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_narrow_i16x8_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_narrow_i16x8_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_shl(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_shr_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_shr_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_add(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_add_sat_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_add_sat_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_sub(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_sub_sat_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_sub_sat_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_min_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_min_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_max_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_max_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_avgr_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_extadd_pairwise_i8x16_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_extadd_pairwise_i8x16_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_abs(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_neg(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_q15mulr_sat_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_all_true(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_bitmask(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_narrow_i32x4_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_narrow_i32x4_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_extend_low_i8x16_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_extend_high_i8x16_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_extend_low_i8x16_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_extend_high_i8x16_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_shl(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_shr_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_shr_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_add(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_add_sat_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_add_sat_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_sub(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_sub_sat_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_sub_sat_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_mul(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_min_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_min_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_max_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_max_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_avgr_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_extmul_low_i8x16_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_extmul_high_i8x16_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_extmul_low_i8x16_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_extmul_high_i8x16_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_extadd_pairwise_i16x8_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_extadd_pairwise_i16x8_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_abs(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_neg(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_all_true(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_bitmask(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_extend_low_i16x8_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_extend_high_i16x8_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_extend_low_i16x8_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_extend_high_i16x8_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_shl(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_shr_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_shr_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_add(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_sub(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_mul(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_min_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_min_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_max_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_max_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_dot_i16x8_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_extmul_low_i16x8_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_extmul_high_i16x8_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_extmul_low_i16x8_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_extmul_high_i16x8_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_abs(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_neg(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_all_true(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_bitmask(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_extend_low_i32x4_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_extend_high_i32x4_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_extend_low_i32x4_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_extend_high_i32x4_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_shl(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_shr_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_shr_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_add(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_sub(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_mul(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_extmul_low_i32x4_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_extmul_high_i32x4_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_extmul_low_i32x4_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_extmul_high_i32x4_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_ceil(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_floor(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_trunc(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_nearest(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_abs(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_neg(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_sqrt(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_add(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_sub(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_mul(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_div(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_min(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_max(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_pmin(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_pmax(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_ceil(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_floor(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_trunc(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_nearest(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_abs(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_neg(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_sqrt(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_add(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_sub(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_mul(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_div(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_min(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_max(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_pmin(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_pmax(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_trunc_sat_f32x4_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_trunc_sat_f32x4_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_convert_i32x4_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_convert_i32x4_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_trunc_sat_f64x2_s_zero(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_trunc_sat_f64x2_u_zero(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_convert_low_i32x4_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_convert_low_i32x4_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_demote_f64x2_zero(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_promote_low_f32x4(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_relaxed_swizzle(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_relaxed_trunc_f32x4_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_relaxed_trunc_f32x4_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_relaxed_trunc_f64x2_s_zero(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_relaxed_trunc_f64x2_u_zero(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_relaxed_madd(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_relaxed_nmadd(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_relaxed_madd(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_relaxed_nmadd(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_relaxed_laneselect(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_relaxed_laneselect(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_relaxed_laneselect(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_relaxed_laneselect(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_relaxed_min(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_relaxed_max(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_relaxed_min(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_relaxed_max(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_relaxed_q15mulr_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_relaxed_dot_i8x16_i7x16_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_relaxed_dot_i8x16_i7x16_add_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_call_ref(\n &mut self,\n type_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_return_call_ref(\n &mut self,\n type_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_ref_as_non_null(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_br_on_null(\n &mut self,\n relative_depth: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_br_on_non_null(\n &mut self,\n relative_depth: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

","VisitOperator<'a>","avm_server::AVMDataStore","avm_server::HostExportedFunc"],["
§

impl<'a, V> VisitOperator<'a> for Box<V>
where\n V: VisitOperator<'a> + ?Sized,

§

type Output = <V as VisitOperator<'a>>::Output

The result type of the visitor.
§

fn visit_operator(\n &mut self,\n op: &Operator<'a>,\n) -> <Box<V> as VisitOperator<'a>>::Output

Visits the [Operator] op using the given offset. Read more
§

fn visit_unreachable(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_nop(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_block(\n &mut self,\n blockty: BlockType,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_loop(\n &mut self,\n blockty: BlockType,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_if(\n &mut self,\n blockty: BlockType,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_else(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_try(\n &mut self,\n blockty: BlockType,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_catch(\n &mut self,\n tag_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_throw(\n &mut self,\n tag_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_rethrow(\n &mut self,\n relative_depth: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_end(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_br(\n &mut self,\n relative_depth: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_br_if(\n &mut self,\n relative_depth: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_br_table(\n &mut self,\n targets: BrTable<'a>,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_return(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_call(\n &mut self,\n function_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_call_indirect(\n &mut self,\n type_index: u32,\n table_index: u32,\n table_byte: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_return_call(\n &mut self,\n function_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_return_call_indirect(\n &mut self,\n type_index: u32,\n table_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_delegate(\n &mut self,\n relative_depth: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_catch_all(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_drop(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_select(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_typed_select(\n &mut self,\n ty: ValType,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_local_get(\n &mut self,\n local_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_local_set(\n &mut self,\n local_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_local_tee(\n &mut self,\n local_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_global_get(\n &mut self,\n global_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_global_set(\n &mut self,\n global_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_load(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_load(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_load(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_load(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_load8_s(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_load8_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_load16_s(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_load16_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_load8_s(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_load8_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_load16_s(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_load16_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_load32_s(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_load32_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_store(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_store(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_store(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_store(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_store8(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_store16(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_store8(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_store16(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_store32(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_memory_size(\n &mut self,\n mem: u32,\n mem_byte: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_memory_grow(\n &mut self,\n mem: u32,\n mem_byte: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_const(\n &mut self,\n value: i32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_const(\n &mut self,\n value: i64,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_const(\n &mut self,\n value: Ieee32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_const(\n &mut self,\n value: Ieee64,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_ref_null(\n &mut self,\n hty: HeapType,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_ref_is_null(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_ref_func(\n &mut self,\n function_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_eqz(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_eq(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_ne(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_lt_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_lt_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_gt_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_gt_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_le_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_le_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_ge_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_ge_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_eqz(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_eq(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_ne(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_lt_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_lt_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_gt_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_gt_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_le_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_le_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_ge_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_ge_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_eq(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_ne(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_lt(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_gt(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_le(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_ge(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_eq(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_ne(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_lt(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_gt(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_le(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_ge(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_clz(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_ctz(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_popcnt(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_add(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_sub(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_mul(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_div_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_div_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_rem_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_rem_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_and(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_or(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_xor(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_shl(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_shr_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_shr_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_rotl(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_rotr(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_clz(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_ctz(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_popcnt(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_add(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_sub(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_mul(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_div_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_div_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_rem_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_rem_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_and(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_or(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_xor(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_shl(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_shr_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_shr_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_rotl(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_rotr(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_abs(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_neg(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_ceil(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_floor(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_trunc(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_nearest(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_sqrt(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_add(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_sub(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_mul(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_div(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_min(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_max(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_copysign(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_abs(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_neg(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_ceil(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_floor(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_trunc(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_nearest(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_sqrt(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_add(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_sub(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_mul(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_div(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_min(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_max(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_copysign(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_wrap_i64(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_trunc_f32_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_trunc_f32_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_trunc_f64_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_trunc_f64_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_extend_i32_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_extend_i32_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_trunc_f32_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_trunc_f32_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_trunc_f64_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_trunc_f64_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_convert_i32_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_convert_i32_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_convert_i64_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_convert_i64_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_demote_f64(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_convert_i32_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_convert_i32_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_convert_i64_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_convert_i64_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_promote_f32(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_reinterpret_f32(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_reinterpret_f64(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_reinterpret_i32(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_reinterpret_i64(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_extend8_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_extend16_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_extend8_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_extend16_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_extend32_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_trunc_sat_f32_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_trunc_sat_f32_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_trunc_sat_f64_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_trunc_sat_f64_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_trunc_sat_f32_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_trunc_sat_f32_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_trunc_sat_f64_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_trunc_sat_f64_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_memory_init(\n &mut self,\n data_index: u32,\n mem: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_data_drop(\n &mut self,\n data_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_memory_copy(\n &mut self,\n dst_mem: u32,\n src_mem: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_memory_fill(\n &mut self,\n mem: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_table_init(\n &mut self,\n elem_index: u32,\n table: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_elem_drop(\n &mut self,\n elem_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_table_copy(\n &mut self,\n dst_table: u32,\n src_table: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_table_fill(\n &mut self,\n table: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_table_get(\n &mut self,\n table: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_table_set(\n &mut self,\n table: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_table_grow(\n &mut self,\n table: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_table_size(\n &mut self,\n table: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_memory_discard(\n &mut self,\n mem: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_memory_atomic_notify(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_memory_atomic_wait32(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_memory_atomic_wait64(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_atomic_fence(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_load(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_load(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_load8_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_load16_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_load8_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_load16_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_load32_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_store(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_store(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_store8(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_store16(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_store8(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_store16(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_store32(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw_add(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw_add(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw8_add_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw16_add_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw8_add_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw16_add_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw32_add_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw_sub(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw_sub(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw8_sub_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw16_sub_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw8_sub_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw16_sub_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw32_sub_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw_and(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw_and(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw8_and_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw16_and_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw8_and_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw16_and_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw32_and_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw_or(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw_or(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw8_or_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw16_or_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw8_or_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw16_or_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw32_or_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw_xor(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw_xor(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw8_xor_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw16_xor_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw8_xor_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw16_xor_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw32_xor_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw_xchg(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw_xchg(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw8_xchg_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw16_xchg_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw8_xchg_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw16_xchg_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw32_xchg_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw_cmpxchg(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw_cmpxchg(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw8_cmpxchg_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw16_cmpxchg_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw8_cmpxchg_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw16_cmpxchg_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw32_cmpxchg_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_load(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_load8x8_s(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_load8x8_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_load16x4_s(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_load16x4_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_load32x2_s(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_load32x2_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_load8_splat(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_load16_splat(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_load32_splat(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_load64_splat(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_load32_zero(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_load64_zero(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_store(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_load8_lane(\n &mut self,\n memarg: MemArg,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_load16_lane(\n &mut self,\n memarg: MemArg,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_load32_lane(\n &mut self,\n memarg: MemArg,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_load64_lane(\n &mut self,\n memarg: MemArg,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_store8_lane(\n &mut self,\n memarg: MemArg,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_store16_lane(\n &mut self,\n memarg: MemArg,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_store32_lane(\n &mut self,\n memarg: MemArg,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_store64_lane(\n &mut self,\n memarg: MemArg,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_const(\n &mut self,\n value: V128,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_shuffle(\n &mut self,\n lanes: [u8; 16],\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_extract_lane_s(\n &mut self,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_extract_lane_u(\n &mut self,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_replace_lane(\n &mut self,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_extract_lane_s(\n &mut self,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_extract_lane_u(\n &mut self,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_replace_lane(\n &mut self,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_extract_lane(\n &mut self,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_replace_lane(\n &mut self,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_extract_lane(\n &mut self,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_replace_lane(\n &mut self,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_extract_lane(\n &mut self,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_replace_lane(\n &mut self,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_extract_lane(\n &mut self,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_replace_lane(\n &mut self,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_swizzle(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_splat(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_splat(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_splat(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_splat(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_splat(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_splat(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_eq(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_ne(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_lt_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_lt_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_gt_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_gt_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_le_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_le_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_ge_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_ge_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_eq(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_ne(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_lt_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_lt_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_gt_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_gt_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_le_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_le_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_ge_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_ge_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_eq(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_ne(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_lt_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_lt_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_gt_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_gt_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_le_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_le_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_ge_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_ge_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_eq(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_ne(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_lt_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_gt_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_le_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_ge_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_eq(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_ne(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_lt(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_gt(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_le(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_ge(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_eq(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_ne(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_lt(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_gt(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_le(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_ge(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_not(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_and(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_andnot(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_or(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_xor(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_bitselect(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_any_true(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_abs(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_neg(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_popcnt(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_all_true(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_bitmask(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_narrow_i16x8_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_narrow_i16x8_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_shl(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_shr_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_shr_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_add(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_add_sat_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_add_sat_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_sub(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_sub_sat_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_sub_sat_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_min_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_min_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_max_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_max_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_avgr_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_extadd_pairwise_i8x16_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_extadd_pairwise_i8x16_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_abs(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_neg(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_q15mulr_sat_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_all_true(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_bitmask(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_narrow_i32x4_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_narrow_i32x4_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_extend_low_i8x16_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_extend_high_i8x16_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_extend_low_i8x16_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_extend_high_i8x16_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_shl(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_shr_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_shr_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_add(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_add_sat_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_add_sat_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_sub(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_sub_sat_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_sub_sat_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_mul(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_min_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_min_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_max_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_max_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_avgr_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_extmul_low_i8x16_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_extmul_high_i8x16_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_extmul_low_i8x16_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_extmul_high_i8x16_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_extadd_pairwise_i16x8_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_extadd_pairwise_i16x8_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_abs(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_neg(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_all_true(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_bitmask(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_extend_low_i16x8_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_extend_high_i16x8_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_extend_low_i16x8_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_extend_high_i16x8_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_shl(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_shr_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_shr_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_add(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_sub(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_mul(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_min_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_min_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_max_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_max_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_dot_i16x8_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_extmul_low_i16x8_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_extmul_high_i16x8_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_extmul_low_i16x8_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_extmul_high_i16x8_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_abs(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_neg(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_all_true(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_bitmask(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_extend_low_i32x4_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_extend_high_i32x4_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_extend_low_i32x4_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_extend_high_i32x4_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_shl(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_shr_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_shr_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_add(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_sub(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_mul(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_extmul_low_i32x4_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_extmul_high_i32x4_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_extmul_low_i32x4_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_extmul_high_i32x4_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_ceil(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_floor(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_trunc(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_nearest(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_abs(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_neg(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_sqrt(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_add(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_sub(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_mul(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_div(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_min(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_max(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_pmin(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_pmax(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_ceil(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_floor(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_trunc(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_nearest(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_abs(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_neg(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_sqrt(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_add(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_sub(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_mul(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_div(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_min(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_max(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_pmin(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_pmax(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_trunc_sat_f32x4_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_trunc_sat_f32x4_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_convert_i32x4_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_convert_i32x4_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_trunc_sat_f64x2_s_zero(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_trunc_sat_f64x2_u_zero(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_convert_low_i32x4_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_convert_low_i32x4_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_demote_f64x2_zero(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_promote_low_f32x4(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_relaxed_swizzle(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_relaxed_trunc_sat_f32x4_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_relaxed_trunc_sat_f32x4_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_relaxed_trunc_sat_f64x2_s_zero(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_relaxed_trunc_sat_f64x2_u_zero(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_relaxed_fma(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_relaxed_fnma(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_relaxed_fma(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_relaxed_fnma(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_relaxed_laneselect(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_relaxed_laneselect(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_relaxed_laneselect(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_relaxed_laneselect(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_relaxed_min(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_relaxed_max(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_relaxed_min(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_relaxed_max(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_relaxed_q15mulr_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_dot_i8x16_i7x16_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_dot_i8x16_i7x16_add_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_relaxed_dot_bf16x8_add_f32x4(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_call_ref(\n &mut self,\n hty: HeapType,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_return_call_ref(\n &mut self,\n hty: HeapType,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_ref_as_non_null(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_br_on_null(\n &mut self,\n relative_depth: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_br_on_non_null(\n &mut self,\n relative_depth: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

","VisitOperator<'a>","avm_server::AVMDataStore","avm_server::HostExportedFunc"],["
§

impl<'a, V> VisitOperator<'a> for Box<V>
where\n V: VisitOperator<'a> + ?Sized,

§

type Output = <V as VisitOperator<'a>>::Output

The result type of the visitor.
§

fn visit_operator(\n &mut self,\n op: &Operator<'a>,\n) -> <Box<V> as VisitOperator<'a>>::Output

Visits the [Operator] op using the given offset. Read more
§

fn visit_unreachable(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_nop(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_block(\n &mut self,\n blockty: BlockType,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_loop(\n &mut self,\n blockty: BlockType,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_if(\n &mut self,\n blockty: BlockType,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_else(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_try_table(\n &mut self,\n try_table: TryTable,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_throw(\n &mut self,\n tag_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_throw_ref(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_try(\n &mut self,\n blockty: BlockType,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_catch(\n &mut self,\n tag_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_rethrow(\n &mut self,\n relative_depth: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_delegate(\n &mut self,\n relative_depth: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_catch_all(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_end(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_br(\n &mut self,\n relative_depth: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_br_if(\n &mut self,\n relative_depth: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_br_table(\n &mut self,\n targets: BrTable<'a>,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_return(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_call(\n &mut self,\n function_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_call_indirect(\n &mut self,\n type_index: u32,\n table_index: u32,\n table_byte: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_return_call(\n &mut self,\n function_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_return_call_indirect(\n &mut self,\n type_index: u32,\n table_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_drop(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_select(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_typed_select(\n &mut self,\n ty: ValType,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_local_get(\n &mut self,\n local_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_local_set(\n &mut self,\n local_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_local_tee(\n &mut self,\n local_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_global_get(\n &mut self,\n global_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_global_set(\n &mut self,\n global_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_load(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_load(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_load(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_load(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_load8_s(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_load8_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_load16_s(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_load16_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_load8_s(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_load8_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_load16_s(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_load16_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_load32_s(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_load32_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_store(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_store(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_store(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_store(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_store8(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_store16(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_store8(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_store16(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_store32(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_memory_size(\n &mut self,\n mem: u32,\n mem_byte: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_memory_grow(\n &mut self,\n mem: u32,\n mem_byte: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_const(\n &mut self,\n value: i32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_const(\n &mut self,\n value: i64,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_const(\n &mut self,\n value: Ieee32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_const(\n &mut self,\n value: Ieee64,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_ref_null(\n &mut self,\n hty: HeapType,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_ref_is_null(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_ref_func(\n &mut self,\n function_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_ref_eq(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_eqz(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_eq(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_ne(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_lt_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_lt_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_gt_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_gt_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_le_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_le_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_ge_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_ge_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_eqz(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_eq(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_ne(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_lt_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_lt_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_gt_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_gt_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_le_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_le_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_ge_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_ge_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_eq(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_ne(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_lt(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_gt(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_le(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_ge(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_eq(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_ne(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_lt(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_gt(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_le(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_ge(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_clz(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_ctz(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_popcnt(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_add(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_sub(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_mul(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_div_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_div_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_rem_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_rem_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_and(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_or(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_xor(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_shl(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_shr_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_shr_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_rotl(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_rotr(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_clz(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_ctz(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_popcnt(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_add(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_sub(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_mul(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_div_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_div_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_rem_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_rem_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_and(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_or(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_xor(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_shl(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_shr_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_shr_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_rotl(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_rotr(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_abs(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_neg(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_ceil(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_floor(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_trunc(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_nearest(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_sqrt(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_add(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_sub(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_mul(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_div(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_min(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_max(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_copysign(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_abs(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_neg(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_ceil(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_floor(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_trunc(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_nearest(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_sqrt(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_add(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_sub(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_mul(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_div(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_min(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_max(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_copysign(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_wrap_i64(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_trunc_f32_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_trunc_f32_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_trunc_f64_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_trunc_f64_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_extend_i32_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_extend_i32_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_trunc_f32_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_trunc_f32_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_trunc_f64_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_trunc_f64_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_convert_i32_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_convert_i32_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_convert_i64_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_convert_i64_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_demote_f64(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_convert_i32_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_convert_i32_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_convert_i64_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_convert_i64_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_promote_f32(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_reinterpret_f32(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_reinterpret_f64(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32_reinterpret_i32(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64_reinterpret_i64(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_extend8_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_extend16_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_extend8_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_extend16_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_extend32_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_struct_new(\n &mut self,\n struct_type_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_struct_new_default(\n &mut self,\n struct_type_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_struct_get(\n &mut self,\n struct_type_index: u32,\n field_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_struct_get_s(\n &mut self,\n struct_type_index: u32,\n field_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_struct_get_u(\n &mut self,\n struct_type_index: u32,\n field_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_struct_set(\n &mut self,\n struct_type_index: u32,\n field_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_array_new(\n &mut self,\n array_type_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_array_new_default(\n &mut self,\n array_type_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_array_new_fixed(\n &mut self,\n array_type_index: u32,\n array_size: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_array_new_data(\n &mut self,\n array_type_index: u32,\n array_data_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_array_new_elem(\n &mut self,\n array_type_index: u32,\n array_elem_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_array_get(\n &mut self,\n array_type_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_array_get_s(\n &mut self,\n array_type_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_array_get_u(\n &mut self,\n array_type_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_array_set(\n &mut self,\n array_type_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_array_len(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_array_fill(\n &mut self,\n array_type_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_array_copy(\n &mut self,\n array_type_index_dst: u32,\n array_type_index_src: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_array_init_data(\n &mut self,\n array_type_index: u32,\n array_data_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_array_init_elem(\n &mut self,\n array_type_index: u32,\n array_elem_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_ref_test_non_null(\n &mut self,\n hty: HeapType,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_ref_test_nullable(\n &mut self,\n hty: HeapType,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_ref_cast_non_null(\n &mut self,\n hty: HeapType,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_ref_cast_nullable(\n &mut self,\n hty: HeapType,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_br_on_cast(\n &mut self,\n relative_depth: u32,\n from_ref_type: RefType,\n to_ref_type: RefType,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_br_on_cast_fail(\n &mut self,\n relative_depth: u32,\n from_ref_type: RefType,\n to_ref_type: RefType,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_any_convert_extern(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_extern_convert_any(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_ref_i31(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i31_get_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i31_get_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_trunc_sat_f32_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_trunc_sat_f32_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_trunc_sat_f64_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_trunc_sat_f64_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_trunc_sat_f32_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_trunc_sat_f32_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_trunc_sat_f64_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_trunc_sat_f64_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_memory_init(\n &mut self,\n data_index: u32,\n mem: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_data_drop(\n &mut self,\n data_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_memory_copy(\n &mut self,\n dst_mem: u32,\n src_mem: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_memory_fill(\n &mut self,\n mem: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_table_init(\n &mut self,\n elem_index: u32,\n table: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_elem_drop(\n &mut self,\n elem_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_table_copy(\n &mut self,\n dst_table: u32,\n src_table: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_table_fill(\n &mut self,\n table: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_table_get(\n &mut self,\n table: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_table_set(\n &mut self,\n table: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_table_grow(\n &mut self,\n table: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_table_size(\n &mut self,\n table: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_memory_discard(\n &mut self,\n mem: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_memory_atomic_notify(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_memory_atomic_wait32(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_memory_atomic_wait64(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_atomic_fence(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_load(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_load(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_load8_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_load16_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_load8_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_load16_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_load32_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_store(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_store(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_store8(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_store16(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_store8(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_store16(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_store32(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw_add(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw_add(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw8_add_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw16_add_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw8_add_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw16_add_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw32_add_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw_sub(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw_sub(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw8_sub_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw16_sub_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw8_sub_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw16_sub_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw32_sub_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw_and(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw_and(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw8_and_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw16_and_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw8_and_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw16_and_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw32_and_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw_or(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw_or(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw8_or_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw16_or_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw8_or_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw16_or_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw32_or_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw_xor(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw_xor(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw8_xor_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw16_xor_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw8_xor_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw16_xor_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw32_xor_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw_xchg(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw_xchg(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw8_xchg_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw16_xchg_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw8_xchg_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw16_xchg_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw32_xchg_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw_cmpxchg(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw_cmpxchg(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw8_cmpxchg_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32_atomic_rmw16_cmpxchg_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw8_cmpxchg_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw16_cmpxchg_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64_atomic_rmw32_cmpxchg_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_load(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_load8x8_s(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_load8x8_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_load16x4_s(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_load16x4_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_load32x2_s(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_load32x2_u(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_load8_splat(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_load16_splat(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_load32_splat(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_load64_splat(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_load32_zero(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_load64_zero(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_store(\n &mut self,\n memarg: MemArg,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_load8_lane(\n &mut self,\n memarg: MemArg,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_load16_lane(\n &mut self,\n memarg: MemArg,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_load32_lane(\n &mut self,\n memarg: MemArg,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_load64_lane(\n &mut self,\n memarg: MemArg,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_store8_lane(\n &mut self,\n memarg: MemArg,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_store16_lane(\n &mut self,\n memarg: MemArg,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_store32_lane(\n &mut self,\n memarg: MemArg,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_store64_lane(\n &mut self,\n memarg: MemArg,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_const(\n &mut self,\n value: V128,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_shuffle(\n &mut self,\n lanes: [u8; 16],\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_extract_lane_s(\n &mut self,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_extract_lane_u(\n &mut self,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_replace_lane(\n &mut self,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_extract_lane_s(\n &mut self,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_extract_lane_u(\n &mut self,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_replace_lane(\n &mut self,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_extract_lane(\n &mut self,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_replace_lane(\n &mut self,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_extract_lane(\n &mut self,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_replace_lane(\n &mut self,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_extract_lane(\n &mut self,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_replace_lane(\n &mut self,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_extract_lane(\n &mut self,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_replace_lane(\n &mut self,\n lane: u8,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_swizzle(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_splat(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_splat(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_splat(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_splat(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_splat(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_splat(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_eq(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_ne(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_lt_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_lt_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_gt_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_gt_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_le_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_le_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_ge_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_ge_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_eq(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_ne(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_lt_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_lt_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_gt_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_gt_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_le_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_le_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_ge_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_ge_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_eq(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_ne(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_lt_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_lt_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_gt_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_gt_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_le_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_le_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_ge_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_ge_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_eq(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_ne(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_lt_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_gt_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_le_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_ge_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_eq(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_ne(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_lt(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_gt(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_le(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_ge(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_eq(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_ne(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_lt(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_gt(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_le(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_ge(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_not(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_and(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_andnot(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_or(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_xor(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_bitselect(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_v128_any_true(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_abs(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_neg(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_popcnt(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_all_true(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_bitmask(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_narrow_i16x8_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_narrow_i16x8_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_shl(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_shr_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_shr_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_add(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_add_sat_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_add_sat_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_sub(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_sub_sat_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_sub_sat_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_min_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_min_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_max_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_max_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_avgr_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_extadd_pairwise_i8x16_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_extadd_pairwise_i8x16_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_abs(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_neg(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_q15mulr_sat_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_all_true(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_bitmask(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_narrow_i32x4_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_narrow_i32x4_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_extend_low_i8x16_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_extend_high_i8x16_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_extend_low_i8x16_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_extend_high_i8x16_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_shl(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_shr_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_shr_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_add(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_add_sat_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_add_sat_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_sub(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_sub_sat_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_sub_sat_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_mul(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_min_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_min_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_max_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_max_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_avgr_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_extmul_low_i8x16_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_extmul_high_i8x16_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_extmul_low_i8x16_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_extmul_high_i8x16_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_extadd_pairwise_i16x8_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_extadd_pairwise_i16x8_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_abs(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_neg(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_all_true(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_bitmask(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_extend_low_i16x8_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_extend_high_i16x8_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_extend_low_i16x8_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_extend_high_i16x8_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_shl(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_shr_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_shr_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_add(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_sub(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_mul(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_min_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_min_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_max_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_max_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_dot_i16x8_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_extmul_low_i16x8_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_extmul_high_i16x8_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_extmul_low_i16x8_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_extmul_high_i16x8_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_abs(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_neg(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_all_true(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_bitmask(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_extend_low_i32x4_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_extend_high_i32x4_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_extend_low_i32x4_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_extend_high_i32x4_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_shl(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_shr_s(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_shr_u(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_add(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_sub(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_mul(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_extmul_low_i32x4_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_extmul_high_i32x4_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_extmul_low_i32x4_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_extmul_high_i32x4_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_ceil(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_floor(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_trunc(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_nearest(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_abs(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_neg(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_sqrt(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_add(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_sub(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_mul(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_div(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_min(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_max(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_pmin(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_pmax(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_ceil(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_floor(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_trunc(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_nearest(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_abs(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_neg(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_sqrt(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_add(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_sub(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_mul(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_div(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_min(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_max(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_pmin(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_pmax(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_trunc_sat_f32x4_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_trunc_sat_f32x4_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_convert_i32x4_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_convert_i32x4_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_trunc_sat_f64x2_s_zero(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_trunc_sat_f64x2_u_zero(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_convert_low_i32x4_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_convert_low_i32x4_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_demote_f64x2_zero(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_promote_low_f32x4(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_relaxed_swizzle(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_relaxed_trunc_f32x4_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_relaxed_trunc_f32x4_u(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_relaxed_trunc_f64x2_s_zero(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_relaxed_trunc_f64x2_u_zero(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_relaxed_madd(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_relaxed_nmadd(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_relaxed_madd(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_relaxed_nmadd(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i8x16_relaxed_laneselect(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_relaxed_laneselect(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_relaxed_laneselect(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i64x2_relaxed_laneselect(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_relaxed_min(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f32x4_relaxed_max(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_relaxed_min(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_f64x2_relaxed_max(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_relaxed_q15mulr_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i16x8_relaxed_dot_i8x16_i7x16_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_i32x4_relaxed_dot_i8x16_i7x16_add_s(\n &mut self,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_call_ref(\n &mut self,\n type_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_return_call_ref(\n &mut self,\n type_index: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_ref_as_non_null(&mut self) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_br_on_null(\n &mut self,\n relative_depth: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

§

fn visit_br_on_non_null(\n &mut self,\n relative_depth: u32,\n) -> <Box<V> as VisitOperator<'a>>::Output

","VisitOperator<'a>","avm_server::AVMDataStore","avm_server::HostExportedFunc"],["
1.0.0 · source§

impl<W> Write for Box<W>
where\n W: Write + ?Sized,

source§

fn write(&mut self, buf: &[u8]) -> Result<usize, Error>

Write a buffer into this writer, returning how many bytes were written. Read more
source§

fn write_vectored(&mut self, bufs: &[IoSlice<'_>]) -> Result<usize, Error>

Like write, except that it writes from a slice of buffers. Read more
source§

fn is_write_vectored(&self) -> bool

🔬This is a nightly-only experimental API. (can_vector)
Determines if this Writer has an efficient write_vectored\nimplementation. Read more
source§

fn flush(&mut self) -> Result<(), Error>

Flush this output stream, ensuring that all intermediately buffered\ncontents reach their destination. Read more
source§

fn write_all(&mut self, buf: &[u8]) -> Result<(), Error>

Attempts to write an entire buffer into this writer. Read more
source§

fn write_fmt(&mut self, fmt: Arguments<'_>) -> Result<(), Error>

Writes a formatted string into this writer, returning any error\nencountered. Read more
source§

fn write_all_vectored(&mut self, bufs: &mut [IoSlice<'_>]) -> Result<(), Error>

🔬This is a nightly-only experimental API. (write_all_vectored)
Attempts to write multiple buffers into this writer. Read more
1.0.0 · source§

fn by_ref(&mut self) -> &mut Self
where\n Self: Sized,

Creates a “by reference” adapter for this instance of Write. Read more
","Write","avm_server::AVMDataStore","avm_server::HostExportedFunc"],["
source§

impl<T, U, A> CoerceUnsized<Box<U, A>> for Box<T, A>
where\n T: Unsize<U> + ?Sized,\n A: Allocator,\n U: ?Sized,

","CoerceUnsized>","avm_server::AVMDataStore","avm_server::HostExportedFunc"],["
§

impl<T> ComponentType for Box<T>
where\n T: ComponentType + ?Sized,

","ComponentType","avm_server::AVMDataStore","avm_server::HostExportedFunc"],["
source§

impl<R> CryptoRng for Box<R>
where\n R: CryptoRng + ?Sized,

","CryptoRng","avm_server::AVMDataStore","avm_server::HostExportedFunc"],["
source§

impl<T, A> DerefPure for Box<T, A>
where\n A: Allocator,\n T: ?Sized,

","DerefPure","avm_server::AVMDataStore","avm_server::HostExportedFunc"],["
source§

impl<T, U> DispatchFromDyn<Box<U>> for Box<T>
where\n T: Unsize<U> + ?Sized,\n U: ?Sized,

","DispatchFromDyn>","avm_server::AVMDataStore","avm_server::HostExportedFunc"],["
1.0.0 · source§

impl<T, A> Eq for Box<T, A>
where\n T: Eq + ?Sized,\n A: Allocator,

","Eq","avm_server::AVMDataStore","avm_server::HostExportedFunc"],["
1.26.0 · source§

impl<I, A> FusedIterator for Box<I, A>
where\n I: FusedIterator + ?Sized,\n A: Allocator,

","FusedIterator","avm_server::AVMDataStore","avm_server::HostExportedFunc"],["
§

impl<T> Lower for Box<T>
where\n T: Lower + ?Sized,

","Lower","avm_server::AVMDataStore","avm_server::HostExportedFunc"],["
§

impl<T> StableDeref for Box<T>
where\n T: ?Sized,

","StableDeref","avm_server::AVMDataStore","avm_server::HostExportedFunc"],["
1.33.0 · source§

impl<T, A> Unpin for Box<T, A>
where\n A: Allocator,\n T: ?Sized,

","Unpin","avm_server::AVMDataStore","avm_server::HostExportedFunc"]] +};if (window.register_type_impls) {window.register_type_impls(type_impls);} else {window.pending_type_impls = type_impls;}})() \ No newline at end of file diff --git a/type.impl/alloc/collections/btree/map/struct.BTreeMap.js b/type.impl/alloc/collections/btree/map/struct.BTreeMap.js new file mode 100644 index 00000000..93693ac8 --- /dev/null +++ b/type.impl/alloc/collections/btree/map/struct.BTreeMap.js @@ -0,0 +1,3 @@ +(function() {var type_impls = { +"air_interpreter_value":[["
source§

impl<K, V> BTreeMap<K, V>

1.0.0 (const: 1.66.0) · source

pub const fn new() -> BTreeMap<K, V>

Makes a new, empty BTreeMap.

\n

Does not allocate anything on its own.

\n
§Examples
\n
use std::collections::BTreeMap;\n\nlet mut map = BTreeMap::new();\n\n// entries can now be inserted into the empty map\nmap.insert(1, \"a\");
\n
",0,"air_interpreter_value::Map"],["
source§

impl<K, V, A> BTreeMap<K, V, A>
where\n A: Allocator + Clone,

1.0.0 · source

pub fn iter(&self) -> Iter<'_, K, V>

Gets an iterator over the entries of the map, sorted by key.

\n
§Examples
\n
use std::collections::BTreeMap;\n\nlet mut map = BTreeMap::new();\nmap.insert(3, \"c\");\nmap.insert(2, \"b\");\nmap.insert(1, \"a\");\n\nfor (key, value) in map.iter() {\n    println!(\"{key}: {value}\");\n}\n\nlet (first_key, first_value) = map.iter().next().unwrap();\nassert_eq!((*first_key, *first_value), (1, \"a\"));
\n
1.0.0 · source

pub fn iter_mut(&mut self) -> IterMut<'_, K, V>

Gets a mutable iterator over the entries of the map, sorted by key.

\n
§Examples
\n
use std::collections::BTreeMap;\n\nlet mut map = BTreeMap::from([\n   (\"a\", 1),\n   (\"b\", 2),\n   (\"c\", 3),\n]);\n\n// add 10 to the value if the key isn't \"a\"\nfor (key, value) in map.iter_mut() {\n    if key != &\"a\" {\n        *value += 10;\n    }\n}
\n
1.0.0 · source

pub fn keys(&self) -> Keys<'_, K, V>

Gets an iterator over the keys of the map, in sorted order.

\n
§Examples
\n
use std::collections::BTreeMap;\n\nlet mut a = BTreeMap::new();\na.insert(2, \"b\");\na.insert(1, \"a\");\n\nlet keys: Vec<_> = a.keys().cloned().collect();\nassert_eq!(keys, [1, 2]);
\n
1.0.0 · source

pub fn values(&self) -> Values<'_, K, V>

Gets an iterator over the values of the map, in order by key.

\n
§Examples
\n
use std::collections::BTreeMap;\n\nlet mut a = BTreeMap::new();\na.insert(1, \"hello\");\na.insert(2, \"goodbye\");\n\nlet values: Vec<&str> = a.values().cloned().collect();\nassert_eq!(values, [\"hello\", \"goodbye\"]);
\n
1.10.0 · source

pub fn values_mut(&mut self) -> ValuesMut<'_, K, V>

Gets a mutable iterator over the values of the map, in order by key.

\n
§Examples
\n
use std::collections::BTreeMap;\n\nlet mut a = BTreeMap::new();\na.insert(1, String::from(\"hello\"));\na.insert(2, String::from(\"goodbye\"));\n\nfor value in a.values_mut() {\n    value.push_str(\"!\");\n}\n\nlet values: Vec<String> = a.values().cloned().collect();\nassert_eq!(values, [String::from(\"hello!\"),\n                    String::from(\"goodbye!\")]);
\n
1.0.0 (const: unstable) · source

pub fn len(&self) -> usize

Returns the number of elements in the map.

\n
§Examples
\n
use std::collections::BTreeMap;\n\nlet mut a = BTreeMap::new();\nassert_eq!(a.len(), 0);\na.insert(1, \"a\");\nassert_eq!(a.len(), 1);
\n
1.0.0 (const: unstable) · source

pub fn is_empty(&self) -> bool

Returns true if the map contains no elements.

\n
§Examples
\n
use std::collections::BTreeMap;\n\nlet mut a = BTreeMap::new();\nassert!(a.is_empty());\na.insert(1, \"a\");\nassert!(!a.is_empty());
\n
source

pub fn lower_bound<Q>(&self, bound: Bound<&Q>) -> Cursor<'_, K, V>
where\n K: Borrow<Q> + Ord,\n Q: Ord + ?Sized,

🔬This is a nightly-only experimental API. (btree_cursors)

Returns a Cursor pointing at the gap before the smallest key\ngreater than the given bound.

\n

Passing Bound::Included(x) will return a cursor pointing to the\ngap before the smallest key greater than or equal to x.

\n

Passing Bound::Excluded(x) will return a cursor pointing to the\ngap before the smallest key greater than x.

\n

Passing Bound::Unbounded will return a cursor pointing to the\ngap before the smallest key in the map.

\n
§Examples
\n
#![feature(btree_cursors)]\n\nuse std::collections::BTreeMap;\nuse std::ops::Bound;\n\nlet map = BTreeMap::from([\n    (1, \"a\"),\n    (2, \"b\"),\n    (3, \"c\"),\n    (4, \"d\"),\n]);\n\nlet cursor = map.lower_bound(Bound::Included(&2));\nassert_eq!(cursor.peek_prev(), Some((&1, &\"a\")));\nassert_eq!(cursor.peek_next(), Some((&2, &\"b\")));\n\nlet cursor = map.lower_bound(Bound::Excluded(&2));\nassert_eq!(cursor.peek_prev(), Some((&2, &\"b\")));\nassert_eq!(cursor.peek_next(), Some((&3, &\"c\")));\n\nlet cursor = map.lower_bound(Bound::Unbounded);\nassert_eq!(cursor.peek_prev(), None);\nassert_eq!(cursor.peek_next(), Some((&1, &\"a\")));
\n
source

pub fn lower_bound_mut<Q>(&mut self, bound: Bound<&Q>) -> CursorMut<'_, K, V, A>
where\n K: Borrow<Q> + Ord,\n Q: Ord + ?Sized,

🔬This is a nightly-only experimental API. (btree_cursors)

Returns a CursorMut pointing at the gap before the smallest key\ngreater than the given bound.

\n

Passing Bound::Included(x) will return a cursor pointing to the\ngap before the smallest key greater than or equal to x.

\n

Passing Bound::Excluded(x) will return a cursor pointing to the\ngap before the smallest key greater than x.

\n

Passing Bound::Unbounded will return a cursor pointing to the\ngap before the smallest key in the map.

\n
§Examples
\n
#![feature(btree_cursors)]\n\nuse std::collections::BTreeMap;\nuse std::ops::Bound;\n\nlet mut map = BTreeMap::from([\n    (1, \"a\"),\n    (2, \"b\"),\n    (3, \"c\"),\n    (4, \"d\"),\n]);\n\nlet mut cursor = map.lower_bound_mut(Bound::Included(&2));\nassert_eq!(cursor.peek_prev(), Some((&1, &mut \"a\")));\nassert_eq!(cursor.peek_next(), Some((&2, &mut \"b\")));\n\nlet mut cursor = map.lower_bound_mut(Bound::Excluded(&2));\nassert_eq!(cursor.peek_prev(), Some((&2, &mut \"b\")));\nassert_eq!(cursor.peek_next(), Some((&3, &mut \"c\")));\n\nlet mut cursor = map.lower_bound_mut(Bound::Unbounded);\nassert_eq!(cursor.peek_prev(), None);\nassert_eq!(cursor.peek_next(), Some((&1, &mut \"a\")));
\n
source

pub fn upper_bound<Q>(&self, bound: Bound<&Q>) -> Cursor<'_, K, V>
where\n K: Borrow<Q> + Ord,\n Q: Ord + ?Sized,

🔬This is a nightly-only experimental API. (btree_cursors)

Returns a Cursor pointing at the gap after the greatest key\nsmaller than the given bound.

\n

Passing Bound::Included(x) will return a cursor pointing to the\ngap after the greatest key smaller than or equal to x.

\n

Passing Bound::Excluded(x) will return a cursor pointing to the\ngap after the greatest key smaller than x.

\n

Passing Bound::Unbounded will return a cursor pointing to the\ngap after the greatest key in the map.

\n
§Examples
\n
#![feature(btree_cursors)]\n\nuse std::collections::BTreeMap;\nuse std::ops::Bound;\n\nlet map = BTreeMap::from([\n    (1, \"a\"),\n    (2, \"b\"),\n    (3, \"c\"),\n    (4, \"d\"),\n]);\n\nlet cursor = map.upper_bound(Bound::Included(&3));\nassert_eq!(cursor.peek_prev(), Some((&3, &\"c\")));\nassert_eq!(cursor.peek_next(), Some((&4, &\"d\")));\n\nlet cursor = map.upper_bound(Bound::Excluded(&3));\nassert_eq!(cursor.peek_prev(), Some((&2, &\"b\")));\nassert_eq!(cursor.peek_next(), Some((&3, &\"c\")));\n\nlet cursor = map.upper_bound(Bound::Unbounded);\nassert_eq!(cursor.peek_prev(), Some((&4, &\"d\")));\nassert_eq!(cursor.peek_next(), None);
\n
source

pub fn upper_bound_mut<Q>(&mut self, bound: Bound<&Q>) -> CursorMut<'_, K, V, A>
where\n K: Borrow<Q> + Ord,\n Q: Ord + ?Sized,

🔬This is a nightly-only experimental API. (btree_cursors)

Returns a CursorMut pointing at the gap after the greatest key\nsmaller than the given bound.

\n

Passing Bound::Included(x) will return a cursor pointing to the\ngap after the greatest key smaller than or equal to x.

\n

Passing Bound::Excluded(x) will return a cursor pointing to the\ngap after the greatest key smaller than x.

\n

Passing Bound::Unbounded will return a cursor pointing to the\ngap after the greatest key in the map.

\n
§Examples
\n
#![feature(btree_cursors)]\n\nuse std::collections::BTreeMap;\nuse std::ops::Bound;\n\nlet mut map = BTreeMap::from([\n    (1, \"a\"),\n    (2, \"b\"),\n    (3, \"c\"),\n    (4, \"d\"),\n]);\n\nlet mut cursor = map.upper_bound_mut(Bound::Included(&3));\nassert_eq!(cursor.peek_prev(), Some((&3, &mut \"c\")));\nassert_eq!(cursor.peek_next(), Some((&4, &mut \"d\")));\n\nlet mut cursor = map.upper_bound_mut(Bound::Excluded(&3));\nassert_eq!(cursor.peek_prev(), Some((&2, &mut \"b\")));\nassert_eq!(cursor.peek_next(), Some((&3, &mut \"c\")));\n\nlet mut cursor = map.upper_bound_mut(Bound::Unbounded);\nassert_eq!(cursor.peek_prev(), Some((&4, &mut \"d\")));\nassert_eq!(cursor.peek_next(), None);
\n
",0,"air_interpreter_value::Map"],["
source§

impl<K, V, A> BTreeMap<K, V, A>
where\n A: Allocator + Clone,

1.0.0 · source

pub fn clear(&mut self)

Clears the map, removing all elements.

\n
§Examples
\n
use std::collections::BTreeMap;\n\nlet mut a = BTreeMap::new();\na.insert(1, \"a\");\na.clear();\nassert!(a.is_empty());
\n
source

pub const fn new_in(alloc: A) -> BTreeMap<K, V, A>

🔬This is a nightly-only experimental API. (btreemap_alloc)

Makes a new empty BTreeMap with a reasonable choice for B.

\n
§Examples
\n
use std::collections::BTreeMap;\nuse std::alloc::Global;\n\nlet mut map = BTreeMap::new_in(Global);\n\n// entries can now be inserted into the empty map\nmap.insert(1, \"a\");
\n
",0,"air_interpreter_value::Map"],["
source§

impl<K, V, A> BTreeMap<K, V, A>
where\n A: Allocator + Clone,

1.0.0 · source

pub fn get<Q>(&self, key: &Q) -> Option<&V>
where\n K: Borrow<Q> + Ord,\n Q: Ord + ?Sized,

Returns a reference to the value corresponding to the key.

\n

The key may be any borrowed form of the map’s key type, but the ordering\non the borrowed form must match the ordering on the key type.

\n
§Examples
\n
use std::collections::BTreeMap;\n\nlet mut map = BTreeMap::new();\nmap.insert(1, \"a\");\nassert_eq!(map.get(&1), Some(&\"a\"));\nassert_eq!(map.get(&2), None);
\n
1.40.0 · source

pub fn get_key_value<Q>(&self, k: &Q) -> Option<(&K, &V)>
where\n K: Borrow<Q> + Ord,\n Q: Ord + ?Sized,

Returns the key-value pair corresponding to the supplied key.

\n

The supplied key may be any borrowed form of the map’s key type, but the ordering\non the borrowed form must match the ordering on the key type.

\n
§Examples
\n
use std::collections::BTreeMap;\n\nlet mut map = BTreeMap::new();\nmap.insert(1, \"a\");\nassert_eq!(map.get_key_value(&1), Some((&1, &\"a\")));\nassert_eq!(map.get_key_value(&2), None);
\n
1.66.0 · source

pub fn first_key_value(&self) -> Option<(&K, &V)>
where\n K: Ord,

Returns the first key-value pair in the map.\nThe key in this pair is the minimum key in the map.

\n
§Examples
\n
use std::collections::BTreeMap;\n\nlet mut map = BTreeMap::new();\nassert_eq!(map.first_key_value(), None);\nmap.insert(1, \"b\");\nmap.insert(2, \"a\");\nassert_eq!(map.first_key_value(), Some((&1, &\"b\")));
\n
1.66.0 · source

pub fn first_entry(&mut self) -> Option<OccupiedEntry<'_, K, V, A>>
where\n K: Ord,

Returns the first entry in the map for in-place manipulation.\nThe key of this entry is the minimum key in the map.

\n
§Examples
\n
use std::collections::BTreeMap;\n\nlet mut map = BTreeMap::new();\nmap.insert(1, \"a\");\nmap.insert(2, \"b\");\nif let Some(mut entry) = map.first_entry() {\n    if *entry.key() > 0 {\n        entry.insert(\"first\");\n    }\n}\nassert_eq!(*map.get(&1).unwrap(), \"first\");\nassert_eq!(*map.get(&2).unwrap(), \"b\");
\n
1.66.0 · source

pub fn pop_first(&mut self) -> Option<(K, V)>
where\n K: Ord,

Removes and returns the first element in the map.\nThe key of this element is the minimum key that was in the map.

\n
§Examples
\n

Draining elements in ascending order, while keeping a usable map each iteration.

\n\n
use std::collections::BTreeMap;\n\nlet mut map = BTreeMap::new();\nmap.insert(1, \"a\");\nmap.insert(2, \"b\");\nwhile let Some((key, _val)) = map.pop_first() {\n    assert!(map.iter().all(|(k, _v)| *k > key));\n}\nassert!(map.is_empty());
\n
1.66.0 · source

pub fn last_key_value(&self) -> Option<(&K, &V)>
where\n K: Ord,

Returns the last key-value pair in the map.\nThe key in this pair is the maximum key in the map.

\n
§Examples
\n
use std::collections::BTreeMap;\n\nlet mut map = BTreeMap::new();\nmap.insert(1, \"b\");\nmap.insert(2, \"a\");\nassert_eq!(map.last_key_value(), Some((&2, &\"a\")));
\n
1.66.0 · source

pub fn last_entry(&mut self) -> Option<OccupiedEntry<'_, K, V, A>>
where\n K: Ord,

Returns the last entry in the map for in-place manipulation.\nThe key of this entry is the maximum key in the map.

\n
§Examples
\n
use std::collections::BTreeMap;\n\nlet mut map = BTreeMap::new();\nmap.insert(1, \"a\");\nmap.insert(2, \"b\");\nif let Some(mut entry) = map.last_entry() {\n    if *entry.key() > 0 {\n        entry.insert(\"last\");\n    }\n}\nassert_eq!(*map.get(&1).unwrap(), \"a\");\nassert_eq!(*map.get(&2).unwrap(), \"last\");
\n
1.66.0 · source

pub fn pop_last(&mut self) -> Option<(K, V)>
where\n K: Ord,

Removes and returns the last element in the map.\nThe key of this element is the maximum key that was in the map.

\n
§Examples
\n

Draining elements in descending order, while keeping a usable map each iteration.

\n\n
use std::collections::BTreeMap;\n\nlet mut map = BTreeMap::new();\nmap.insert(1, \"a\");\nmap.insert(2, \"b\");\nwhile let Some((key, _val)) = map.pop_last() {\n    assert!(map.iter().all(|(k, _v)| *k < key));\n}\nassert!(map.is_empty());
\n
1.0.0 · source

pub fn contains_key<Q>(&self, key: &Q) -> bool
where\n K: Borrow<Q> + Ord,\n Q: Ord + ?Sized,

Returns true if the map contains a value for the specified key.

\n

The key may be any borrowed form of the map’s key type, but the ordering\non the borrowed form must match the ordering on the key type.

\n
§Examples
\n
use std::collections::BTreeMap;\n\nlet mut map = BTreeMap::new();\nmap.insert(1, \"a\");\nassert_eq!(map.contains_key(&1), true);\nassert_eq!(map.contains_key(&2), false);
\n
1.0.0 · source

pub fn get_mut<Q>(&mut self, key: &Q) -> Option<&mut V>
where\n K: Borrow<Q> + Ord,\n Q: Ord + ?Sized,

Returns a mutable reference to the value corresponding to the key.

\n

The key may be any borrowed form of the map’s key type, but the ordering\non the borrowed form must match the ordering on the key type.

\n
§Examples
\n
use std::collections::BTreeMap;\n\nlet mut map = BTreeMap::new();\nmap.insert(1, \"a\");\nif let Some(x) = map.get_mut(&1) {\n    *x = \"b\";\n}\nassert_eq!(map[&1], \"b\");
\n
1.0.0 · source

pub fn insert(&mut self, key: K, value: V) -> Option<V>
where\n K: Ord,

Inserts a key-value pair into the map.

\n

If the map did not have this key present, None is returned.

\n

If the map did have this key present, the value is updated, and the old\nvalue is returned. The key is not updated, though; this matters for\ntypes that can be == without being identical. See the module-level\ndocumentation for more.

\n
§Examples
\n
use std::collections::BTreeMap;\n\nlet mut map = BTreeMap::new();\nassert_eq!(map.insert(37, \"a\"), None);\nassert_eq!(map.is_empty(), false);\n\nmap.insert(37, \"b\");\nassert_eq!(map.insert(37, \"c\"), Some(\"b\"));\nassert_eq!(map[&37], \"c\");
\n
source

pub fn try_insert(\n &mut self,\n key: K,\n value: V,\n) -> Result<&mut V, OccupiedError<'_, K, V, A>>
where\n K: Ord,

🔬This is a nightly-only experimental API. (map_try_insert)

Tries to insert a key-value pair into the map, and returns\na mutable reference to the value in the entry.

\n

If the map already had this key present, nothing is updated, and\nan error containing the occupied entry and the value is returned.

\n
§Examples
\n
#![feature(map_try_insert)]\n\nuse std::collections::BTreeMap;\n\nlet mut map = BTreeMap::new();\nassert_eq!(map.try_insert(37, \"a\").unwrap(), &\"a\");\n\nlet err = map.try_insert(37, \"b\").unwrap_err();\nassert_eq!(err.entry.key(), &37);\nassert_eq!(err.entry.get(), &\"a\");\nassert_eq!(err.value, \"b\");
\n
1.0.0 · source

pub fn remove<Q>(&mut self, key: &Q) -> Option<V>
where\n K: Borrow<Q> + Ord,\n Q: Ord + ?Sized,

Removes a key from the map, returning the value at the key if the key\nwas previously in the map.

\n

The key may be any borrowed form of the map’s key type, but the ordering\non the borrowed form must match the ordering on the key type.

\n
§Examples
\n
use std::collections::BTreeMap;\n\nlet mut map = BTreeMap::new();\nmap.insert(1, \"a\");\nassert_eq!(map.remove(&1), Some(\"a\"));\nassert_eq!(map.remove(&1), None);
\n
1.45.0 · source

pub fn remove_entry<Q>(&mut self, key: &Q) -> Option<(K, V)>
where\n K: Borrow<Q> + Ord,\n Q: Ord + ?Sized,

Removes a key from the map, returning the stored key and value if the key\nwas previously in the map.

\n

The key may be any borrowed form of the map’s key type, but the ordering\non the borrowed form must match the ordering on the key type.

\n
§Examples
\n
use std::collections::BTreeMap;\n\nlet mut map = BTreeMap::new();\nmap.insert(1, \"a\");\nassert_eq!(map.remove_entry(&1), Some((1, \"a\")));\nassert_eq!(map.remove_entry(&1), None);
\n
1.53.0 · source

pub fn retain<F>(&mut self, f: F)
where\n K: Ord,\n F: FnMut(&K, &mut V) -> bool,

Retains only the elements specified by the predicate.

\n

In other words, remove all pairs (k, v) for which f(&k, &mut v) returns false.\nThe elements are visited in ascending key order.

\n
§Examples
\n
use std::collections::BTreeMap;\n\nlet mut map: BTreeMap<i32, i32> = (0..8).map(|x| (x, x*10)).collect();\n// Keep only the elements with even-numbered keys.\nmap.retain(|&k, _| k % 2 == 0);\nassert!(map.into_iter().eq(vec![(0, 0), (2, 20), (4, 40), (6, 60)]));
\n
1.11.0 · source

pub fn append(&mut self, other: &mut BTreeMap<K, V, A>)
where\n K: Ord,\n A: Clone,

Moves all elements from other into self, leaving other empty.

\n

If a key from other is already present in self, the respective\nvalue from self will be overwritten with the respective value from other.

\n
§Examples
\n
use std::collections::BTreeMap;\n\nlet mut a = BTreeMap::new();\na.insert(1, \"a\");\na.insert(2, \"b\");\na.insert(3, \"c\"); // Note: Key (3) also present in b.\n\nlet mut b = BTreeMap::new();\nb.insert(3, \"d\"); // Note: Key (3) also present in a.\nb.insert(4, \"e\");\nb.insert(5, \"f\");\n\na.append(&mut b);\n\nassert_eq!(a.len(), 5);\nassert_eq!(b.len(), 0);\n\nassert_eq!(a[&1], \"a\");\nassert_eq!(a[&2], \"b\");\nassert_eq!(a[&3], \"d\"); // Note: \"c\" has been overwritten.\nassert_eq!(a[&4], \"e\");\nassert_eq!(a[&5], \"f\");
\n
1.17.0 · source

pub fn range<T, R>(&self, range: R) -> Range<'_, K, V>
where\n T: Ord + ?Sized,\n K: Borrow<T> + Ord,\n R: RangeBounds<T>,

Constructs a double-ended iterator over a sub-range of elements in the map.\nThe simplest way is to use the range syntax min..max, thus range(min..max) will\nyield elements from min (inclusive) to max (exclusive).\nThe range may also be entered as (Bound<T>, Bound<T>), so for example\nrange((Excluded(4), Included(10))) will yield a left-exclusive, right-inclusive\nrange from 4 to 10.

\n
§Panics
\n

Panics if range start > end.\nPanics if range start == end and both bounds are Excluded.

\n
§Examples
\n
use std::collections::BTreeMap;\nuse std::ops::Bound::Included;\n\nlet mut map = BTreeMap::new();\nmap.insert(3, \"a\");\nmap.insert(5, \"b\");\nmap.insert(8, \"c\");\nfor (&key, &value) in map.range((Included(&4), Included(&8))) {\n    println!(\"{key}: {value}\");\n}\nassert_eq!(Some((&5, &\"b\")), map.range(4..).next());
\n
1.17.0 · source

pub fn range_mut<T, R>(&mut self, range: R) -> RangeMut<'_, K, V>
where\n T: Ord + ?Sized,\n K: Borrow<T> + Ord,\n R: RangeBounds<T>,

Constructs a mutable double-ended iterator over a sub-range of elements in the map.\nThe simplest way is to use the range syntax min..max, thus range(min..max) will\nyield elements from min (inclusive) to max (exclusive).\nThe range may also be entered as (Bound<T>, Bound<T>), so for example\nrange((Excluded(4), Included(10))) will yield a left-exclusive, right-inclusive\nrange from 4 to 10.

\n
§Panics
\n

Panics if range start > end.\nPanics if range start == end and both bounds are Excluded.

\n
§Examples
\n
use std::collections::BTreeMap;\n\nlet mut map: BTreeMap<&str, i32> =\n    [(\"Alice\", 0), (\"Bob\", 0), (\"Carol\", 0), (\"Cheryl\", 0)].into();\nfor (_, balance) in map.range_mut(\"B\"..\"Cheryl\") {\n    *balance += 100;\n}\nfor (name, balance) in &map {\n    println!(\"{name} => {balance}\");\n}
\n
1.0.0 · source

pub fn entry(&mut self, key: K) -> Entry<'_, K, V, A>
where\n K: Ord,

Gets the given key’s corresponding entry in the map for in-place manipulation.

\n
§Examples
\n
use std::collections::BTreeMap;\n\nlet mut count: BTreeMap<&str, usize> = BTreeMap::new();\n\n// count the number of occurrences of letters in the vec\nfor x in [\"a\", \"b\", \"a\", \"c\", \"a\", \"b\"] {\n    count.entry(x).and_modify(|curr| *curr += 1).or_insert(1);\n}\n\nassert_eq!(count[\"a\"], 3);\nassert_eq!(count[\"b\"], 2);\nassert_eq!(count[\"c\"], 1);
\n
1.11.0 · source

pub fn split_off<Q>(&mut self, key: &Q) -> BTreeMap<K, V, A>
where\n Q: Ord + ?Sized,\n K: Borrow<Q> + Ord,\n A: Clone,

Splits the collection into two at the given key. Returns everything after the given key,\nincluding the key.

\n
§Examples
\n
use std::collections::BTreeMap;\n\nlet mut a = BTreeMap::new();\na.insert(1, \"a\");\na.insert(2, \"b\");\na.insert(3, \"c\");\na.insert(17, \"d\");\na.insert(41, \"e\");\n\nlet b = a.split_off(&3);\n\nassert_eq!(a.len(), 2);\nassert_eq!(b.len(), 3);\n\nassert_eq!(a[&1], \"a\");\nassert_eq!(a[&2], \"b\");\n\nassert_eq!(b[&3], \"c\");\nassert_eq!(b[&17], \"d\");\nassert_eq!(b[&41], \"e\");
\n
source

pub fn extract_if<F>(&mut self, pred: F) -> ExtractIf<'_, K, V, F, A>
where\n K: Ord,\n F: FnMut(&K, &mut V) -> bool,

🔬This is a nightly-only experimental API. (btree_extract_if)

Creates an iterator that visits all elements (key-value pairs) in\nascending key order and uses a closure to determine if an element should\nbe removed. If the closure returns true, the element is removed from\nthe map and yielded. If the closure returns false, or panics, the\nelement remains in the map and will not be yielded.

\n

The iterator also lets you mutate the value of each element in the\nclosure, regardless of whether you choose to keep or remove it.

\n

If the returned ExtractIf is not exhausted, e.g. because it is dropped without iterating\nor the iteration short-circuits, then the remaining elements will be retained.\nUse retain with a negated predicate if you do not need the returned iterator.

\n
§Examples
\n

Splitting a map into even and odd keys, reusing the original map:

\n\n
#![feature(btree_extract_if)]\nuse std::collections::BTreeMap;\n\nlet mut map: BTreeMap<i32, i32> = (0..8).map(|x| (x, x)).collect();\nlet evens: BTreeMap<_, _> = map.extract_if(|k, _v| k % 2 == 0).collect();\nlet odds = map;\nassert_eq!(evens.keys().copied().collect::<Vec<_>>(), [0, 2, 4, 6]);\nassert_eq!(odds.keys().copied().collect::<Vec<_>>(), [1, 3, 5, 7]);
\n
1.54.0 · source

pub fn into_keys(self) -> IntoKeys<K, V, A>

Creates a consuming iterator visiting all the keys, in sorted order.\nThe map cannot be used after calling this.\nThe iterator element type is K.

\n
§Examples
\n
use std::collections::BTreeMap;\n\nlet mut a = BTreeMap::new();\na.insert(2, \"b\");\na.insert(1, \"a\");\n\nlet keys: Vec<i32> = a.into_keys().collect();\nassert_eq!(keys, [1, 2]);
\n
1.54.0 · source

pub fn into_values(self) -> IntoValues<K, V, A>

Creates a consuming iterator visiting all the values, in order by key.\nThe map cannot be used after calling this.\nThe iterator element type is V.

\n
§Examples
\n
use std::collections::BTreeMap;\n\nlet mut a = BTreeMap::new();\na.insert(1, \"hello\");\na.insert(2, \"goodbye\");\n\nlet values: Vec<&str> = a.into_values().collect();\nassert_eq!(values, [\"hello\", \"goodbye\"]);
\n
",0,"air_interpreter_value::Map"],["
1.0.0 · source§

impl<K, V, A> Clone for BTreeMap<K, V, A>
where\n K: Clone,\n V: Clone,\n A: Allocator + Clone,

source§

fn clone(&self) -> BTreeMap<K, V, A>

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
","Clone","air_interpreter_value::Map"],["
1.0.0 · source§

impl<K, V, A> Debug for BTreeMap<K, V, A>
where\n K: Debug,\n V: Debug,\n A: Allocator + Clone,

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
","Debug","air_interpreter_value::Map"],["
1.0.0 · source§

impl<K, V> Default for BTreeMap<K, V>

source§

fn default() -> BTreeMap<K, V>

Creates an empty BTreeMap.

\n
","Default","air_interpreter_value::Map"],["
source§

impl<'de, K, V> Deserialize<'de> for BTreeMap<K, V>
where\n K: Deserialize<'de> + Ord,\n V: Deserialize<'de>,

source§

fn deserialize<D>(\n deserializer: D,\n) -> Result<BTreeMap<K, V>, <D as Deserializer<'de>>::Error>
where\n D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
","Deserialize<'de>","air_interpreter_value::Map"],["
1.7.0 · source§

impl<K, V, A> Drop for BTreeMap<K, V, A>
where\n A: Allocator + Clone,

source§

fn drop(&mut self)

Executes the destructor for this type. Read more
","Drop","air_interpreter_value::Map"],["
1.2.0 · source§

impl<'a, K, V, A> Extend<(&'a K, &'a V)> for BTreeMap<K, V, A>
where\n K: Ord + Copy,\n V: Copy,\n A: Allocator + Clone,

source§

fn extend<I>(&mut self, iter: I)
where\n I: IntoIterator<Item = (&'a K, &'a V)>,

Extends a collection with the contents of an iterator. Read more
source§

fn extend_one(&mut self, _: (&'a K, &'a V))

🔬This is a nightly-only experimental API. (extend_one)
Extends a collection with exactly one element.
source§

fn extend_reserve(&mut self, additional: usize)

🔬This is a nightly-only experimental API. (extend_one)
Reserves capacity in a collection for the given number of additional elements. Read more
","Extend<(&'a K, &'a V)>","air_interpreter_value::Map"],["
1.0.0 · source§

impl<K, V, A> Extend<(K, V)> for BTreeMap<K, V, A>
where\n K: Ord,\n A: Allocator + Clone,

source§

fn extend<T>(&mut self, iter: T)
where\n T: IntoIterator<Item = (K, V)>,

Extends a collection with the contents of an iterator. Read more
source§

fn extend_one(&mut self, _: (K, V))

🔬This is a nightly-only experimental API. (extend_one)
Extends a collection with exactly one element.
source§

fn extend_reserve(&mut self, additional: usize)

🔬This is a nightly-only experimental API. (extend_one)
Reserves capacity in a collection for the given number of additional elements. Read more
","Extend<(K, V)>","air_interpreter_value::Map"],["
1.56.0 · source§

impl<K, V, const N: usize> From<[(K, V); N]> for BTreeMap<K, V>
where\n K: Ord,

source§

fn from(arr: [(K, V); N]) -> BTreeMap<K, V>

Converts a [(K, V); N] into a BTreeMap<(K, V)>.

\n\n
use std::collections::BTreeMap;\n\nlet map1 = BTreeMap::from([(1, 2), (3, 4)]);\nlet map2: BTreeMap<_, _> = [(1, 2), (3, 4)].into();\nassert_eq!(map1, map2);
\n
","From<[(K, V); N]>","air_interpreter_value::Map"],["
1.0.0 · source§

impl<K, V> FromIterator<(K, V)> for BTreeMap<K, V>
where\n K: Ord,

source§

fn from_iter<T>(iter: T) -> BTreeMap<K, V>
where\n T: IntoIterator<Item = (K, V)>,

Creates a value from an iterator. Read more
","FromIterator<(K, V)>","air_interpreter_value::Map"],["
1.0.0 · source§

impl<K, V, A> Hash for BTreeMap<K, V, A>
where\n K: Hash,\n V: Hash,\n A: Allocator + Clone,

source§

fn hash<H>(&self, state: &mut H)
where\n H: Hasher,

Feeds this value into the given Hasher. Read more
1.3.0 · source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where\n H: Hasher,\n Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
","Hash","air_interpreter_value::Map"],["
1.0.0 · source§

impl<K, Q, V, A> Index<&Q> for BTreeMap<K, V, A>
where\n A: Allocator + Clone,\n K: Borrow<Q> + Ord,\n Q: Ord + ?Sized,

source§

fn index(&self, key: &Q) -> &V

Returns a reference to the value corresponding to the supplied key.

\n
§Panics
\n

Panics if the key is not present in the BTreeMap.

\n
§

type Output = V

The returned type after indexing.
","Index<&Q>","air_interpreter_value::Map"],["
source§

impl<'de, K, V, E> IntoDeserializer<'de, E> for BTreeMap<K, V>
where\n K: IntoDeserializer<'de, E> + Eq + Ord,\n V: IntoDeserializer<'de, E>,\n E: Error,

§

type Deserializer = MapDeserializer<'de, <BTreeMap<K, V> as IntoIterator>::IntoIter, E>

The type of the deserializer being converted into.
source§

fn into_deserializer(\n self,\n) -> <BTreeMap<K, V> as IntoDeserializer<'de, E>>::Deserializer

Convert this value into a deserializer.
","IntoDeserializer<'de, E>","air_interpreter_value::Map"],["
1.0.0 · source§

impl<K, V, A> IntoIterator for BTreeMap<K, V, A>
where\n A: Allocator + Clone,

source§

fn into_iter(self) -> IntoIter<K, V, A>

Gets an owning iterator over the entries of the map, sorted by key.

\n
§

type Item = (K, V)

The type of the elements being iterated over.
§

type IntoIter = IntoIter<K, V, A>

Which kind of iterator are we turning this into?
","IntoIterator","air_interpreter_value::Map"],["
1.0.0 · source§

impl<K, V, A> Ord for BTreeMap<K, V, A>
where\n K: Ord,\n V: Ord,\n A: Allocator + Clone,

source§

fn cmp(&self, other: &BTreeMap<K, V, A>) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · source§

fn max(self, other: Self) -> Self
where\n Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · source§

fn min(self, other: Self) -> Self
where\n Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · source§

fn clamp(self, min: Self, max: Self) -> Self
where\n Self: Sized + PartialOrd,

Restrict a value to a certain interval. Read more
","Ord","air_interpreter_value::Map"],["
1.0.0 · source§

impl<K, V, A> PartialEq for BTreeMap<K, V, A>
where\n K: PartialEq,\n V: PartialEq,\n A: Allocator + Clone,

source§

fn eq(&self, other: &BTreeMap<K, V, A>) -> bool

This method tests for self and other values to be equal, and is used\nby ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always\nsufficient, and should not be overridden without very good reason.
","PartialEq","air_interpreter_value::Map"],["
1.0.0 · source§

impl<K, V, A> PartialOrd for BTreeMap<K, V, A>
where\n K: PartialOrd,\n V: PartialOrd,\n A: Allocator + Clone,

source§

fn partial_cmp(&self, other: &BTreeMap<K, V, A>) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · source§

fn lt(&self, other: &Rhs) -> bool

This method tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · source§

fn le(&self, other: &Rhs) -> bool

This method tests less than or equal to (for self and other) and is used by the <=\noperator. Read more
1.0.0 · source§

fn gt(&self, other: &Rhs) -> bool

This method tests greater than (for self and other) and is used by the > operator. Read more
1.0.0 · source§

fn ge(&self, other: &Rhs) -> bool

This method tests greater than or equal to (for self and other) and is used by the >=\noperator. Read more
","PartialOrd","air_interpreter_value::Map"],["
source§

impl<K, V> Serialize for BTreeMap<K, V>
where\n K: Serialize,\n V: Serialize,

source§

fn serialize<S>(\n &self,\n serializer: S,\n) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error>
where\n S: Serializer,

Serialize this value into the given Serde serializer. Read more
","Serialize","air_interpreter_value::Map"],["
1.0.0 · source§

impl<K, V, A> Eq for BTreeMap<K, V, A>
where\n K: Eq,\n V: Eq,\n A: Allocator + Clone,

","Eq","air_interpreter_value::Map"],["
1.64.0 · source§

impl<K, V, A> UnwindSafe for BTreeMap<K, V, A>

","UnwindSafe","air_interpreter_value::Map"]] +};if (window.register_type_impls) {window.register_type_impls(type_impls);} else {window.pending_type_impls = type_impls;}})() \ No newline at end of file diff --git a/type.impl/alloc/rc/struct.Rc.js b/type.impl/alloc/rc/struct.Rc.js new file mode 100644 index 00000000..48947c4a --- /dev/null +++ b/type.impl/alloc/rc/struct.Rc.js @@ -0,0 +1,3 @@ +(function() {var type_impls = { +"air_interpreter_value":[["
1.69.0 · source§

impl<T> AsFd for Rc<T>
where\n T: AsFd + ?Sized,

source§

fn as_fd(&self) -> BorrowedFd<'_>

Borrows the file descriptor. Read more
","AsFd","air_interpreter_value::JsonString"],["
1.69.0 · source§

impl<T> AsRawFd for Rc<T>
where\n T: AsRawFd,

source§

fn as_raw_fd(&self) -> i32

Extracts the raw file descriptor. Read more
","AsRawFd","air_interpreter_value::JsonString"],["
1.5.0 · source§

impl<T, A> AsRef<T> for Rc<T, A>
where\n A: Allocator,\n T: ?Sized,

source§

fn as_ref(&self) -> &T

Converts this type into a shared reference of the (usually inferred) input type.
","AsRef","air_interpreter_value::JsonString"],["
1.0.0 · source§

impl<T, A> Borrow<T> for Rc<T, A>
where\n A: Allocator,\n T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
","Borrow","air_interpreter_value::JsonString"],["
1.0.0 · source§

impl<T, A> Clone for Rc<T, A>
where\n A: Allocator + Clone,\n T: ?Sized,

source§

fn clone(&self) -> Rc<T, A>

Makes a clone of the Rc pointer.

\n

This creates another pointer to the same allocation, increasing the\nstrong reference count.

\n
§Examples
\n
use std::rc::Rc;\n\nlet five = Rc::new(5);\n\nlet _ = Rc::clone(&five);
\n
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
","Clone","air_interpreter_value::JsonString"],["
1.0.0 · source§

impl<T, A> Debug for Rc<T, A>
where\n T: Debug + ?Sized,\n A: Allocator,

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
","Debug","air_interpreter_value::JsonString"],["
1.0.0 · source§

impl<T> Default for Rc<T>
where\n T: Default,

source§

fn default() -> Rc<T>

Creates a new Rc<T>, with the Default value for T.

\n
§Examples
\n
use std::rc::Rc;\n\nlet x: Rc<i32> = Default::default();\nassert_eq!(*x, 0);
\n
","Default","air_interpreter_value::JsonString"],["
1.80.0 · source§

impl Default for Rc<str>

source§

fn default() -> Rc<str>

Creates an empty str inside an Rc

\n

This may or may not share an allocation with other Rcs on the same thread.

\n
","Default","air_interpreter_value::JsonString"],["
1.0.0 · source§

impl<T, A> Deref for Rc<T, A>
where\n A: Allocator,\n T: ?Sized,

§

type Target = T

The resulting type after dereferencing.
source§

fn deref(&self) -> &T

Dereferences the value.
","Deref","air_interpreter_value::JsonString"],["
source§

impl<'de, T> Deserialize<'de> for Rc<T>
where\n Box<T>: Deserialize<'de>,\n T: ?Sized,

This impl requires the \"rc\" Cargo feature of Serde.

\n

Deserializing a data structure containing Rc will not attempt to\ndeduplicate Rc references to the same data. Every deserialized Rc\nwill end up with a strong count of 1.

\n
source§

fn deserialize<D>(\n deserializer: D,\n) -> Result<Rc<T>, <D as Deserializer<'de>>::Error>
where\n D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
","Deserialize<'de>","air_interpreter_value::JsonString"],["
1.0.0 · source§

impl<T, A> Display for Rc<T, A>
where\n T: Display + ?Sized,\n A: Allocator,

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
","Display","air_interpreter_value::JsonString"],["
1.0.0 · source§

impl<T, A> Drop for Rc<T, A>
where\n A: Allocator,\n T: ?Sized,

source§

fn drop(&mut self)

Drops the Rc.

\n

This will decrement the strong reference count. If the strong reference\ncount reaches zero then the only other references (if any) are\nWeak, so we drop the inner value.

\n
§Examples
\n
use std::rc::Rc;\n\nstruct Foo;\n\nimpl Drop for Foo {\n    fn drop(&mut self) {\n        println!(\"dropped!\");\n    }\n}\n\nlet foo  = Rc::new(Foo);\nlet foo2 = Rc::clone(&foo);\n\ndrop(foo);    // Doesn't print anything\ndrop(foo2);   // Prints \"dropped!\"
\n
","Drop","air_interpreter_value::JsonString"],["
1.21.0 · source§

impl From<&str> for Rc<str>

source§

fn from(v: &str) -> Rc<str>

Allocate a reference-counted string slice and copy v into it.

\n
§Example
\n
let shared: Rc<str> = Rc::from(\"statue\");\nassert_eq!(\"statue\", &shared[..]);
\n
","From<&str>","air_interpreter_value::JsonString"],["
1.21.0 · source§

impl<T, A> From<Box<T, A>> for Rc<T, A>
where\n A: Allocator,\n T: ?Sized,

source§

fn from(v: Box<T, A>) -> Rc<T, A>

Move a boxed object to a new, reference counted, allocation.

\n
§Example
\n
let original: Box<i32> = Box::new(1);\nlet shared: Rc<i32> = Rc::from(original);\nassert_eq!(1, *shared);
\n
","From>","air_interpreter_value::JsonString"],["
1.45.0 · source§

impl<'a, B> From<Cow<'a, B>> for Rc<B>
where\n B: ToOwned + ?Sized,\n Rc<B>: From<&'a B> + From<<B as ToOwned>::Owned>,

source§

fn from(cow: Cow<'a, B>) -> Rc<B>

Create a reference-counted pointer from\na clone-on-write pointer by copying its content.

\n
§Example
\n
let cow: Cow<'_, str> = Cow::Borrowed(\"eggplant\");\nlet shared: Rc<str> = Rc::from(cow);\nassert_eq!(\"eggplant\", &shared[..]);
\n
","From>","air_interpreter_value::JsonString"],["
1.21.0 · source§

impl From<String> for Rc<str>

source§

fn from(v: String) -> Rc<str>

Allocate a reference-counted string slice and copy v into it.

\n
§Example
\n
let original: String = \"statue\".to_owned();\nlet shared: Rc<str> = Rc::from(original);\nassert_eq!(\"statue\", &shared[..]);
\n
","From","air_interpreter_value::JsonString"],["
1.6.0 · source§

impl<T> From<T> for Rc<T>

source§

fn from(t: T) -> Rc<T>

Converts a generic type T into an Rc<T>

\n

The conversion allocates on the heap and moves t\nfrom the stack into it.

\n
§Example
\n
let x = 5;\nlet rc = Rc::new(5);\n\nassert_eq!(Rc::from(x), rc);
\n
","From","air_interpreter_value::JsonString"],["
1.0.0 · source§

impl<T, A> Hash for Rc<T, A>
where\n T: Hash + ?Sized,\n A: Allocator,

source§

fn hash<H>(&self, state: &mut H)
where\n H: Hasher,

Feeds this value into the given Hasher. Read more
1.3.0 · source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where\n H: Hasher,\n Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
","Hash","air_interpreter_value::JsonString"],["
1.0.0 · source§

impl<T, A> Ord for Rc<T, A>
where\n T: Ord + ?Sized,\n A: Allocator,

source§

fn cmp(&self, other: &Rc<T, A>) -> Ordering

Comparison for two Rcs.

\n

The two are compared by calling cmp() on their inner values.

\n
§Examples
\n
use std::rc::Rc;\nuse std::cmp::Ordering;\n\nlet five = Rc::new(5);\n\nassert_eq!(Ordering::Less, five.cmp(&Rc::new(6)));
\n
1.21.0 · source§

fn max(self, other: Self) -> Self
where\n Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · source§

fn min(self, other: Self) -> Self
where\n Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · source§

fn clamp(self, min: Self, max: Self) -> Self
where\n Self: Sized + PartialOrd,

Restrict a value to a certain interval. Read more
","Ord","air_interpreter_value::JsonString"],["
1.0.0 · source§

impl<T, A> PartialEq for Rc<T, A>
where\n T: PartialEq + ?Sized,\n A: Allocator,

source§

fn eq(&self, other: &Rc<T, A>) -> bool

Equality for two Rcs.

\n

Two Rcs are equal if their inner values are equal, even if they are\nstored in different allocation.

\n

If T also implements Eq (implying reflexivity of equality),\ntwo Rcs that point to the same allocation are\nalways equal.

\n
§Examples
\n
use std::rc::Rc;\n\nlet five = Rc::new(5);\n\nassert!(five == Rc::new(5));
\n
source§

fn ne(&self, other: &Rc<T, A>) -> bool

Inequality for two Rcs.

\n

Two Rcs are not equal if their inner values are not equal.

\n

If T also implements Eq (implying reflexivity of equality),\ntwo Rcs that point to the same allocation are\nalways equal.

\n
§Examples
\n
use std::rc::Rc;\n\nlet five = Rc::new(5);\n\nassert!(five != Rc::new(6));
\n
","PartialEq","air_interpreter_value::JsonString"],["
1.0.0 · source§

impl<T, A> PartialOrd for Rc<T, A>
where\n T: PartialOrd + ?Sized,\n A: Allocator,

source§

fn partial_cmp(&self, other: &Rc<T, A>) -> Option<Ordering>

Partial comparison for two Rcs.

\n

The two are compared by calling partial_cmp() on their inner values.

\n
§Examples
\n
use std::rc::Rc;\nuse std::cmp::Ordering;\n\nlet five = Rc::new(5);\n\nassert_eq!(Some(Ordering::Less), five.partial_cmp(&Rc::new(6)));
\n
source§

fn lt(&self, other: &Rc<T, A>) -> bool

Less-than comparison for two Rcs.

\n

The two are compared by calling < on their inner values.

\n
§Examples
\n
use std::rc::Rc;\n\nlet five = Rc::new(5);\n\nassert!(five < Rc::new(6));
\n
source§

fn le(&self, other: &Rc<T, A>) -> bool

‘Less than or equal to’ comparison for two Rcs.

\n

The two are compared by calling <= on their inner values.

\n
§Examples
\n
use std::rc::Rc;\n\nlet five = Rc::new(5);\n\nassert!(five <= Rc::new(5));
\n
source§

fn gt(&self, other: &Rc<T, A>) -> bool

Greater-than comparison for two Rcs.

\n

The two are compared by calling > on their inner values.

\n
§Examples
\n
use std::rc::Rc;\n\nlet five = Rc::new(5);\n\nassert!(five > Rc::new(4));
\n
source§

fn ge(&self, other: &Rc<T, A>) -> bool

‘Greater than or equal to’ comparison for two Rcs.

\n

The two are compared by calling >= on their inner values.

\n
§Examples
\n
use std::rc::Rc;\n\nlet five = Rc::new(5);\n\nassert!(five >= Rc::new(5));
\n
","PartialOrd","air_interpreter_value::JsonString"],["
1.0.0 · source§

impl<T, A> Pointer for Rc<T, A>
where\n A: Allocator,\n T: ?Sized,

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
","Pointer","air_interpreter_value::JsonString"],["
source§

impl<T> Rc<T>
where\n T: ?Sized,

1.17.0 · source

pub unsafe fn from_raw(ptr: *const T) -> Rc<T>

Constructs an Rc<T> from a raw pointer.

\n

The raw pointer must have been previously returned by a call to\nRc<U>::into_raw with the following requirements:

\n
    \n
  • If U is sized, it must have the same size and alignment as T. This\nis trivially true if U is T.
  • \n
  • If U is unsized, its data pointer must have the same size and\nalignment as T. This is trivially true if Rc<U> was constructed\nthrough Rc<T> and then converted to Rc<U> through an unsized\ncoercion.
  • \n
\n

Note that if U or U’s data pointer is not T but has the same size\nand alignment, this is basically like transmuting references of\ndifferent types. See mem::transmute for more information\non what restrictions apply in this case.

\n

The raw pointer must point to a block of memory allocated by the global allocator

\n

The user of from_raw has to make sure a specific value of T is only\ndropped once.

\n

This function is unsafe because improper use may lead to memory unsafety,\neven if the returned Rc<T> is never accessed.

\n
§Examples
\n
use std::rc::Rc;\n\nlet x = Rc::new(\"hello\".to_owned());\nlet x_ptr = Rc::into_raw(x);\n\nunsafe {\n    // Convert back to an `Rc` to prevent leak.\n    let x = Rc::from_raw(x_ptr);\n    assert_eq!(&*x, \"hello\");\n\n    // Further calls to `Rc::from_raw(x_ptr)` would be memory-unsafe.\n}\n\n// The memory was freed when `x` went out of scope above, so `x_ptr` is now dangling!
\n

Convert a slice back into its original array:

\n\n
use std::rc::Rc;\n\nlet x: Rc<[u32]> = Rc::new([1, 2, 3]);\nlet x_ptr: *const [u32] = Rc::into_raw(x);\n\nunsafe {\n    let x: Rc<[u32; 3]> = Rc::from_raw(x_ptr.cast::<[u32; 3]>());\n    assert_eq!(&*x, &[1, 2, 3]);\n}
\n
1.53.0 · source

pub unsafe fn increment_strong_count(ptr: *const T)

Increments the strong reference count on the Rc<T> associated with the\nprovided pointer by one.

\n
§Safety
\n

The pointer must have been obtained through Rc::into_raw, the\nassociated Rc instance must be valid (i.e. the strong count must be at\nleast 1) for the duration of this method, and ptr must point to a block of memory\nallocated by the global allocator.

\n
§Examples
\n
use std::rc::Rc;\n\nlet five = Rc::new(5);\n\nunsafe {\n    let ptr = Rc::into_raw(five);\n    Rc::increment_strong_count(ptr);\n\n    let five = Rc::from_raw(ptr);\n    assert_eq!(2, Rc::strong_count(&five));\n}
\n
1.53.0 · source

pub unsafe fn decrement_strong_count(ptr: *const T)

Decrements the strong reference count on the Rc<T> associated with the\nprovided pointer by one.

\n
§Safety
\n

The pointer must have been obtained through Rc::into_raw, the\nassociated Rc instance must be valid (i.e. the strong count must be at\nleast 1) when invoking this method, and ptr must point to a block of memory\nallocated by the global allocator. This method can be used to release the final Rc and\nbacking storage, but should not be called after the final Rc has been released.

\n
§Examples
\n
use std::rc::Rc;\n\nlet five = Rc::new(5);\n\nunsafe {\n    let ptr = Rc::into_raw(five);\n    Rc::increment_strong_count(ptr);\n\n    let five = Rc::from_raw(ptr);\n    assert_eq!(2, Rc::strong_count(&five));\n    Rc::decrement_strong_count(ptr);\n    assert_eq!(1, Rc::strong_count(&five));\n}
\n
",0,"air_interpreter_value::JsonString"],["
source§

impl<T> Rc<T>

1.0.0 · source

pub fn new(value: T) -> Rc<T>

Constructs a new Rc<T>.

\n
§Examples
\n
use std::rc::Rc;\n\nlet five = Rc::new(5);
\n
1.60.0 · source

pub fn new_cyclic<F>(data_fn: F) -> Rc<T>
where\n F: FnOnce(&Weak<T>) -> T,

Constructs a new Rc<T> while giving you a Weak<T> to the allocation,\nto allow you to construct a T which holds a weak pointer to itself.

\n

Generally, a structure circularly referencing itself, either directly or\nindirectly, should not hold a strong reference to itself to prevent a memory leak.\nUsing this function, you get access to the weak pointer during the\ninitialization of T, before the Rc<T> is created, such that you can\nclone and store it inside the T.

\n

new_cyclic first allocates the managed allocation for the Rc<T>,\nthen calls your closure, giving it a Weak<T> to this allocation,\nand only afterwards completes the construction of the Rc<T> by placing\nthe T returned from your closure into the allocation.

\n

Since the new Rc<T> is not fully-constructed until Rc<T>::new_cyclic\nreturns, calling upgrade on the weak reference inside your closure will\nfail and result in a None value.

\n
§Panics
\n

If data_fn panics, the panic is propagated to the caller, and the\ntemporary Weak<T> is dropped normally.

\n
§Examples
\n
use std::rc::{Rc, Weak};\n\nstruct Gadget {\n    me: Weak<Gadget>,\n}\n\nimpl Gadget {\n    /// Construct a reference counted Gadget.\n    fn new() -> Rc<Self> {\n        // `me` is a `Weak<Gadget>` pointing at the new allocation of the\n        // `Rc` we're constructing.\n        Rc::new_cyclic(|me| {\n            // Create the actual struct here.\n            Gadget { me: me.clone() }\n        })\n    }\n\n    /// Return a reference counted pointer to Self.\n    fn me(&self) -> Rc<Self> {\n        self.me.upgrade().unwrap()\n    }\n}
\n
source

pub fn new_uninit() -> Rc<MaybeUninit<T>>

🔬This is a nightly-only experimental API. (new_uninit)

Constructs a new Rc with uninitialized contents.

\n
§Examples
\n
#![feature(new_uninit)]\n#![feature(get_mut_unchecked)]\n\nuse std::rc::Rc;\n\nlet mut five = Rc::<u32>::new_uninit();\n\n// Deferred initialization:\nRc::get_mut(&mut five).unwrap().write(5);\n\nlet five = unsafe { five.assume_init() };\n\nassert_eq!(*five, 5)
\n
source

pub fn new_zeroed() -> Rc<MaybeUninit<T>>

🔬This is a nightly-only experimental API. (new_uninit)

Constructs a new Rc with uninitialized contents, with the memory\nbeing filled with 0 bytes.

\n

See MaybeUninit::zeroed for examples of correct and\nincorrect usage of this method.

\n
§Examples
\n
#![feature(new_uninit)]\n\nuse std::rc::Rc;\n\nlet zero = Rc::<u32>::new_zeroed();\nlet zero = unsafe { zero.assume_init() };\n\nassert_eq!(*zero, 0)
\n
source

pub fn try_new(value: T) -> Result<Rc<T>, AllocError>

🔬This is a nightly-only experimental API. (allocator_api)

Constructs a new Rc<T>, returning an error if the allocation fails

\n
§Examples
\n
#![feature(allocator_api)]\nuse std::rc::Rc;\n\nlet five = Rc::try_new(5);
\n
source

pub fn try_new_uninit() -> Result<Rc<MaybeUninit<T>>, AllocError>

🔬This is a nightly-only experimental API. (allocator_api)

Constructs a new Rc with uninitialized contents, returning an error if the allocation fails

\n
§Examples
\n
#![feature(allocator_api, new_uninit)]\n#![feature(get_mut_unchecked)]\n\nuse std::rc::Rc;\n\nlet mut five = Rc::<u32>::try_new_uninit()?;\n\n// Deferred initialization:\nRc::get_mut(&mut five).unwrap().write(5);\n\nlet five = unsafe { five.assume_init() };\n\nassert_eq!(*five, 5);
\n
source

pub fn try_new_zeroed() -> Result<Rc<MaybeUninit<T>>, AllocError>

🔬This is a nightly-only experimental API. (allocator_api)

Constructs a new Rc with uninitialized contents, with the memory\nbeing filled with 0 bytes, returning an error if the allocation fails

\n

See MaybeUninit::zeroed for examples of correct and\nincorrect usage of this method.

\n
§Examples
\n
#![feature(allocator_api, new_uninit)]\n\nuse std::rc::Rc;\n\nlet zero = Rc::<u32>::try_new_zeroed()?;\nlet zero = unsafe { zero.assume_init() };\n\nassert_eq!(*zero, 0);
\n
1.33.0 · source

pub fn pin(value: T) -> Pin<Rc<T>>

Constructs a new Pin<Rc<T>>. If T does not implement Unpin, then\nvalue will be pinned in memory and unable to be moved.

\n
",0,"air_interpreter_value::JsonString"],["
source§

impl<T, A> Rc<T, A>
where\n A: Allocator,\n T: ?Sized,

source

pub fn allocator(this: &Rc<T, A>) -> &A

🔬This is a nightly-only experimental API. (allocator_api)

Returns a reference to the underlying allocator.

\n

Note: this is an associated function, which means that you have\nto call it as Rc::allocator(&r) instead of r.allocator(). This\nis so that there is no conflict with a method on the inner type.

\n
1.17.0 · source

pub fn into_raw(this: Rc<T, A>) -> *const T

Consumes the Rc, returning the wrapped pointer.

\n

To avoid a memory leak the pointer must be converted back to an Rc using\nRc::from_raw.

\n
§Examples
\n
use std::rc::Rc;\n\nlet x = Rc::new(\"hello\".to_owned());\nlet x_ptr = Rc::into_raw(x);\nassert_eq!(unsafe { &*x_ptr }, \"hello\");
\n
source

pub fn into_raw_with_allocator(this: Rc<T, A>) -> (*const T, A)

🔬This is a nightly-only experimental API. (allocator_api)

Consumes the Rc, returning the wrapped pointer and allocator.

\n

To avoid a memory leak the pointer must be converted back to an Rc using\nRc::from_raw_in.

\n
§Examples
\n
#![feature(allocator_api)]\nuse std::rc::Rc;\nuse std::alloc::System;\n\nlet x = Rc::new_in(\"hello\".to_owned(), System);\nlet (ptr, alloc) = Rc::into_raw_with_allocator(x);\nassert_eq!(unsafe { &*ptr }, \"hello\");\nlet x = unsafe { Rc::from_raw_in(ptr, alloc) };\nassert_eq!(&*x, \"hello\");
\n
1.45.0 · source

pub fn as_ptr(this: &Rc<T, A>) -> *const T

Provides a raw pointer to the data.

\n

The counts are not affected in any way and the Rc is not consumed. The pointer is valid\nfor as long there are strong counts in the Rc.

\n
§Examples
\n
use std::rc::Rc;\n\nlet x = Rc::new(\"hello\".to_owned());\nlet y = Rc::clone(&x);\nlet x_ptr = Rc::as_ptr(&x);\nassert_eq!(x_ptr, Rc::as_ptr(&y));\nassert_eq!(unsafe { &*x_ptr }, \"hello\");
\n
source

pub unsafe fn from_raw_in(ptr: *const T, alloc: A) -> Rc<T, A>

🔬This is a nightly-only experimental API. (allocator_api)

Constructs an Rc<T, A> from a raw pointer in the provided allocator.

\n

The raw pointer must have been previously returned by a call to Rc<U, A>::into_raw with the following requirements:

\n
    \n
  • If U is sized, it must have the same size and alignment as T. This\nis trivially true if U is T.
  • \n
  • If U is unsized, its data pointer must have the same size and\nalignment as T. This is trivially true if Rc<U> was constructed\nthrough Rc<T> and then converted to Rc<U> through an unsized\ncoercion.
  • \n
\n

Note that if U or U’s data pointer is not T but has the same size\nand alignment, this is basically like transmuting references of\ndifferent types. See mem::transmute for more information\non what restrictions apply in this case.

\n

The raw pointer must point to a block of memory allocated by alloc

\n

The user of from_raw has to make sure a specific value of T is only\ndropped once.

\n

This function is unsafe because improper use may lead to memory unsafety,\neven if the returned Rc<T> is never accessed.

\n
§Examples
\n
#![feature(allocator_api)]\n\nuse std::rc::Rc;\nuse std::alloc::System;\n\nlet x = Rc::new_in(\"hello\".to_owned(), System);\nlet x_ptr = Rc::into_raw(x);\n\nunsafe {\n    // Convert back to an `Rc` to prevent leak.\n    let x = Rc::from_raw_in(x_ptr, System);\n    assert_eq!(&*x, \"hello\");\n\n    // Further calls to `Rc::from_raw(x_ptr)` would be memory-unsafe.\n}\n\n// The memory was freed when `x` went out of scope above, so `x_ptr` is now dangling!
\n

Convert a slice back into its original array:

\n\n
#![feature(allocator_api)]\n\nuse std::rc::Rc;\nuse std::alloc::System;\n\nlet x: Rc<[u32], _> = Rc::new_in([1, 2, 3], System);\nlet x_ptr: *const [u32] = Rc::into_raw(x);\n\nunsafe {\n    let x: Rc<[u32; 3], _> = Rc::from_raw_in(x_ptr.cast::<[u32; 3]>(), System);\n    assert_eq!(&*x, &[1, 2, 3]);\n}
\n
1.4.0 · source

pub fn downgrade(this: &Rc<T, A>) -> Weak<T, A>
where\n A: Clone,

Creates a new Weak pointer to this allocation.

\n
§Examples
\n
use std::rc::Rc;\n\nlet five = Rc::new(5);\n\nlet weak_five = Rc::downgrade(&five);
\n
1.15.0 · source

pub fn weak_count(this: &Rc<T, A>) -> usize

Gets the number of Weak pointers to this allocation.

\n
§Examples
\n
use std::rc::Rc;\n\nlet five = Rc::new(5);\nlet _weak_five = Rc::downgrade(&five);\n\nassert_eq!(1, Rc::weak_count(&five));
\n
1.15.0 · source

pub fn strong_count(this: &Rc<T, A>) -> usize

Gets the number of strong (Rc) pointers to this allocation.

\n
§Examples
\n
use std::rc::Rc;\n\nlet five = Rc::new(5);\nlet _also_five = Rc::clone(&five);\n\nassert_eq!(2, Rc::strong_count(&five));
\n
source

pub unsafe fn increment_strong_count_in(ptr: *const T, alloc: A)
where\n A: Clone,

🔬This is a nightly-only experimental API. (allocator_api)

Increments the strong reference count on the Rc<T> associated with the\nprovided pointer by one.

\n
§Safety
\n

The pointer must have been obtained through Rc::into_raw, the\nassociated Rc instance must be valid (i.e. the strong count must be at\nleast 1) for the duration of this method, and ptr must point to a block of memory\nallocated by alloc

\n
§Examples
\n
#![feature(allocator_api)]\n\nuse std::rc::Rc;\nuse std::alloc::System;\n\nlet five = Rc::new_in(5, System);\n\nunsafe {\n    let ptr = Rc::into_raw(five);\n    Rc::increment_strong_count_in(ptr, System);\n\n    let five = Rc::from_raw_in(ptr, System);\n    assert_eq!(2, Rc::strong_count(&five));\n}
\n
source

pub unsafe fn decrement_strong_count_in(ptr: *const T, alloc: A)

🔬This is a nightly-only experimental API. (allocator_api)

Decrements the strong reference count on the Rc<T> associated with the\nprovided pointer by one.

\n
§Safety
\n

The pointer must have been obtained through Rc::into_raw, the\nassociated Rc instance must be valid (i.e. the strong count must be at\nleast 1) when invoking this method, and ptr must point to a block of memory\nallocated by alloc. This method can be used to release the final Rc and backing storage,\nbut should not be called after the final Rc has been released.

\n
§Examples
\n
#![feature(allocator_api)]\n\nuse std::rc::Rc;\nuse std::alloc::System;\n\nlet five = Rc::new_in(5, System);\n\nunsafe {\n    let ptr = Rc::into_raw(five);\n    Rc::increment_strong_count_in(ptr, System);\n\n    let five = Rc::from_raw_in(ptr, System);\n    assert_eq!(2, Rc::strong_count(&five));\n    Rc::decrement_strong_count_in(ptr, System);\n    assert_eq!(1, Rc::strong_count(&five));\n}
\n
1.4.0 · source

pub fn get_mut(this: &mut Rc<T, A>) -> Option<&mut T>

Returns a mutable reference into the given Rc, if there are\nno other Rc or Weak pointers to the same allocation.

\n

Returns None otherwise, because it is not safe to\nmutate a shared value.

\n

See also make_mut, which will clone\nthe inner value when there are other Rc pointers.

\n
§Examples
\n
use std::rc::Rc;\n\nlet mut x = Rc::new(3);\n*Rc::get_mut(&mut x).unwrap() = 4;\nassert_eq!(*x, 4);\n\nlet _y = Rc::clone(&x);\nassert!(Rc::get_mut(&mut x).is_none());
\n
source

pub unsafe fn get_mut_unchecked(this: &mut Rc<T, A>) -> &mut T

🔬This is a nightly-only experimental API. (get_mut_unchecked)

Returns a mutable reference into the given Rc,\nwithout any check.

\n

See also get_mut, which is safe and does appropriate checks.

\n
§Safety
\n

If any other Rc or Weak pointers to the same allocation exist, then\nthey must not be dereferenced or have active borrows for the duration\nof the returned borrow, and their inner type must be exactly the same as the\ninner type of this Rc (including lifetimes). This is trivially the case if no\nsuch pointers exist, for example immediately after Rc::new.

\n
§Examples
\n
#![feature(get_mut_unchecked)]\n\nuse std::rc::Rc;\n\nlet mut x = Rc::new(String::new());\nunsafe {\n    Rc::get_mut_unchecked(&mut x).push_str(\"foo\")\n}\nassert_eq!(*x, \"foo\");
\n

Other Rc pointers to the same allocation must be to the same type.

\n\n
#![feature(get_mut_unchecked)]\n\nuse std::rc::Rc;\n\nlet x: Rc<str> = Rc::from(\"Hello, world!\");\nlet mut y: Rc<[u8]> = x.clone().into();\nunsafe {\n    // this is Undefined Behavior, because x's inner type is str, not [u8]\n    Rc::get_mut_unchecked(&mut y).fill(0xff); // 0xff is invalid in UTF-8\n}\nprintln!(\"{}\", &*x); // Invalid UTF-8 in a str
\n

Other Rc pointers to the same allocation must be to the exact same type, including lifetimes.

\n\n
#![feature(get_mut_unchecked)]\n\nuse std::rc::Rc;\n\nlet x: Rc<&str> = Rc::new(\"Hello, world!\");\n{\n    let s = String::from(\"Oh, no!\");\n    let mut y: Rc<&str> = x.clone().into();\n    unsafe {\n        // this is Undefined Behavior, because x's inner type\n        // is &'long str, not &'short str\n        *Rc::get_mut_unchecked(&mut y) = &s;\n    }\n}\nprintln!(\"{}\", &*x); // Use-after-free
\n
1.17.0 · source

pub fn ptr_eq(this: &Rc<T, A>, other: &Rc<T, A>) -> bool

Returns true if the two Rcs point to the same allocation in a vein similar to\nptr::eq. This function ignores the metadata of dyn Trait pointers.

\n
§Examples
\n
use std::rc::Rc;\n\nlet five = Rc::new(5);\nlet same_five = Rc::clone(&five);\nlet other_five = Rc::new(5);\n\nassert!(Rc::ptr_eq(&five, &same_five));\nassert!(!Rc::ptr_eq(&five, &other_five));
\n
",0,"air_interpreter_value::JsonString"],["
source§

impl<T, A> Rc<T, A>
where\n T: CloneToUninit + ?Sized,\n A: Allocator + Clone,

1.4.0 · source

pub fn make_mut(this: &mut Rc<T, A>) -> &mut T

Makes a mutable reference into the given Rc.

\n

If there are other Rc pointers to the same allocation, then make_mut will\nclone the inner value to a new allocation to ensure unique ownership. This is also\nreferred to as clone-on-write.

\n

However, if there are no other Rc pointers to this allocation, but some Weak\npointers, then the Weak pointers will be disassociated and the inner value will not\nbe cloned.

\n

See also get_mut, which will fail rather than cloning the inner value\nor disassociating Weak pointers.

\n
§Examples
\n
use std::rc::Rc;\n\nlet mut data = Rc::new(5);\n\n*Rc::make_mut(&mut data) += 1;         // Won't clone anything\nlet mut other_data = Rc::clone(&data); // Won't clone inner data\n*Rc::make_mut(&mut data) += 1;         // Clones inner data\n*Rc::make_mut(&mut data) += 1;         // Won't clone anything\n*Rc::make_mut(&mut other_data) *= 2;   // Won't clone anything\n\n// Now `data` and `other_data` point to different allocations.\nassert_eq!(*data, 8);\nassert_eq!(*other_data, 12);
\n

Weak pointers will be disassociated:

\n\n
use std::rc::Rc;\n\nlet mut data = Rc::new(75);\nlet weak = Rc::downgrade(&data);\n\nassert!(75 == *data);\nassert!(75 == *weak.upgrade().unwrap());\n\n*Rc::make_mut(&mut data) += 1;\n\nassert!(76 == *data);\nassert!(weak.upgrade().is_none());
\n
",0,"air_interpreter_value::JsonString"],["
source§

impl<T, A> Rc<T, A>
where\n T: Clone,\n A: Allocator,

1.76.0 · source

pub fn unwrap_or_clone(this: Rc<T, A>) -> T

If we have the only reference to T then unwrap it. Otherwise, clone T and return the\nclone.

\n

Assuming rc_t is of type Rc<T>, this function is functionally equivalent to\n(*rc_t).clone(), but will avoid cloning the inner value where possible.

\n
§Examples
\n
let inner = String::from(\"test\");\nlet ptr = inner.as_ptr();\n\nlet rc = Rc::new(inner);\nlet inner = Rc::unwrap_or_clone(rc);\n// The inner value was not cloned\nassert!(ptr::eq(ptr, inner.as_ptr()));\n\nlet rc = Rc::new(inner);\nlet rc2 = rc.clone();\nlet inner = Rc::unwrap_or_clone(rc);\n// Because there were 2 references, we had to clone the inner value.\nassert!(!ptr::eq(ptr, inner.as_ptr()));\n// `rc2` is the last reference, so when we unwrap it we get back\n// the original `String`.\nlet inner = Rc::unwrap_or_clone(rc2);\nassert!(ptr::eq(ptr, inner.as_ptr()));
\n
",0,"air_interpreter_value::JsonString"],["
source§

impl<T, A> Rc<T, A>
where\n A: Allocator,

source

pub fn new_in(value: T, alloc: A) -> Rc<T, A>

🔬This is a nightly-only experimental API. (allocator_api)

Constructs a new Rc in the provided allocator.

\n
§Examples
\n
#![feature(allocator_api)]\nuse std::rc::Rc;\nuse std::alloc::System;\n\nlet five = Rc::new_in(5, System);
\n
source

pub fn new_uninit_in(alloc: A) -> Rc<MaybeUninit<T>, A>

🔬This is a nightly-only experimental API. (allocator_api)

Constructs a new Rc with uninitialized contents in the provided allocator.

\n
§Examples
\n
#![feature(new_uninit)]\n#![feature(get_mut_unchecked)]\n#![feature(allocator_api)]\n\nuse std::rc::Rc;\nuse std::alloc::System;\n\nlet mut five = Rc::<u32, _>::new_uninit_in(System);\n\nlet five = unsafe {\n    // Deferred initialization:\n    Rc::get_mut_unchecked(&mut five).as_mut_ptr().write(5);\n\n    five.assume_init()\n};\n\nassert_eq!(*five, 5)
\n
source

pub fn new_zeroed_in(alloc: A) -> Rc<MaybeUninit<T>, A>

🔬This is a nightly-only experimental API. (allocator_api)

Constructs a new Rc with uninitialized contents, with the memory\nbeing filled with 0 bytes, in the provided allocator.

\n

See MaybeUninit::zeroed for examples of correct and\nincorrect usage of this method.

\n
§Examples
\n
#![feature(new_uninit)]\n#![feature(allocator_api)]\n\nuse std::rc::Rc;\nuse std::alloc::System;\n\nlet zero = Rc::<u32, _>::new_zeroed_in(System);\nlet zero = unsafe { zero.assume_init() };\n\nassert_eq!(*zero, 0)
\n
source

pub fn try_new_in(value: T, alloc: A) -> Result<Rc<T, A>, AllocError>

🔬This is a nightly-only experimental API. (allocator_api)

Constructs a new Rc<T> in the provided allocator, returning an error if the allocation\nfails

\n
§Examples
\n
#![feature(allocator_api)]\nuse std::rc::Rc;\nuse std::alloc::System;\n\nlet five = Rc::try_new_in(5, System);
\n
source

pub fn try_new_uninit_in(alloc: A) -> Result<Rc<MaybeUninit<T>, A>, AllocError>

🔬This is a nightly-only experimental API. (allocator_api)

Constructs a new Rc with uninitialized contents, in the provided allocator, returning an\nerror if the allocation fails

\n
§Examples
\n
#![feature(allocator_api, new_uninit)]\n#![feature(get_mut_unchecked)]\n\nuse std::rc::Rc;\nuse std::alloc::System;\n\nlet mut five = Rc::<u32, _>::try_new_uninit_in(System)?;\n\nlet five = unsafe {\n    // Deferred initialization:\n    Rc::get_mut_unchecked(&mut five).as_mut_ptr().write(5);\n\n    five.assume_init()\n};\n\nassert_eq!(*five, 5);
\n
source

pub fn try_new_zeroed_in(alloc: A) -> Result<Rc<MaybeUninit<T>, A>, AllocError>

🔬This is a nightly-only experimental API. (allocator_api)

Constructs a new Rc with uninitialized contents, with the memory\nbeing filled with 0 bytes, in the provided allocator, returning an error if the allocation\nfails

\n

See MaybeUninit::zeroed for examples of correct and\nincorrect usage of this method.

\n
§Examples
\n
#![feature(allocator_api, new_uninit)]\n\nuse std::rc::Rc;\nuse std::alloc::System;\n\nlet zero = Rc::<u32, _>::try_new_zeroed_in(System)?;\nlet zero = unsafe { zero.assume_init() };\n\nassert_eq!(*zero, 0);
\n
source

pub fn pin_in(value: T, alloc: A) -> Pin<Rc<T, A>>
where\n A: 'static,

🔬This is a nightly-only experimental API. (allocator_api)

Constructs a new Pin<Rc<T>> in the provided allocator. If T does not implement Unpin, then\nvalue will be pinned in memory and unable to be moved.

\n
1.4.0 · source

pub fn try_unwrap(this: Rc<T, A>) -> Result<T, Rc<T, A>>

Returns the inner value, if the Rc has exactly one strong reference.

\n

Otherwise, an Err is returned with the same Rc that was\npassed in.

\n

This will succeed even if there are outstanding weak references.

\n
§Examples
\n
use std::rc::Rc;\n\nlet x = Rc::new(3);\nassert_eq!(Rc::try_unwrap(x), Ok(3));\n\nlet x = Rc::new(4);\nlet _y = Rc::clone(&x);\nassert_eq!(*Rc::try_unwrap(x).unwrap_err(), 4);
\n
1.70.0 · source

pub fn into_inner(this: Rc<T, A>) -> Option<T>

Returns the inner value, if the Rc has exactly one strong reference.

\n

Otherwise, None is returned and the Rc is dropped.

\n

This will succeed even if there are outstanding weak references.

\n

If Rc::into_inner is called on every clone of this Rc,\nit is guaranteed that exactly one of the calls returns the inner value.\nThis means in particular that the inner value is not dropped.

\n

Rc::try_unwrap is conceptually similar to Rc::into_inner.\nAnd while they are meant for different use-cases, Rc::into_inner(this)\nis in fact equivalent to Rc::try_unwrap(this).ok().\n(Note that the same kind of equivalence does not hold true for\nArc, due to race conditions that do not apply to Rc!)

\n
§Examples
\n
use std::rc::Rc;\n\nlet x = Rc::new(3);\nassert_eq!(Rc::into_inner(x), Some(3));\n\nlet x = Rc::new(4);\nlet y = Rc::clone(&x);\n\nassert_eq!(Rc::into_inner(y), None);\nassert_eq!(Rc::into_inner(x), Some(4));
\n
",0,"air_interpreter_value::JsonString"],["
source§

impl<T> Serialize for Rc<T>
where\n T: Serialize + ?Sized,

This impl requires the \"rc\" Cargo feature of Serde.

\n

Serializing a data structure containing Rc will serialize a copy of\nthe contents of the Rc each time the Rc is referenced within the\ndata structure. Serialization will not attempt to deduplicate these\nrepeated data.

\n
source§

fn serialize<S>(\n &self,\n serializer: S,\n) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error>
where\n S: Serializer,

Serialize this value into the given Serde serializer. Read more
","Serialize","air_interpreter_value::JsonString"],["
source§

impl<T, U, A> CoerceUnsized<Rc<U, A>> for Rc<T, A>
where\n T: Unsize<U> + ?Sized,\n A: Allocator,\n U: ?Sized,

","CoerceUnsized>","air_interpreter_value::JsonString"],["
source§

impl<T, A> DerefPure for Rc<T, A>
where\n A: Allocator,\n T: ?Sized,

","DerefPure","air_interpreter_value::JsonString"],["
source§

impl<T, U> DispatchFromDyn<Rc<U>> for Rc<T>
where\n T: Unsize<U> + ?Sized,\n U: ?Sized,

","DispatchFromDyn>","air_interpreter_value::JsonString"],["
1.0.0 · source§

impl<T, A> Eq for Rc<T, A>
where\n T: Eq + ?Sized,\n A: Allocator,

","Eq","air_interpreter_value::JsonString"],["
1.58.0 · source§

impl<T, A> RefUnwindSafe for Rc<T, A>
where\n T: RefUnwindSafe + ?Sized,\n A: Allocator + UnwindSafe,

","RefUnwindSafe","air_interpreter_value::JsonString"],["
1.0.0 · source§

impl<T, A> !Send for Rc<T, A>
where\n A: Allocator,\n T: ?Sized,

","Send","air_interpreter_value::JsonString"],["
1.0.0 · source§

impl<T, A> !Sync for Rc<T, A>
where\n A: Allocator,\n T: ?Sized,

","Sync","air_interpreter_value::JsonString"],["
1.33.0 · source§

impl<T, A> Unpin for Rc<T, A>
where\n A: Allocator,\n T: ?Sized,

","Unpin","air_interpreter_value::JsonString"],["
1.9.0 · source§

impl<T, A> UnwindSafe for Rc<T, A>
where\n T: RefUnwindSafe + ?Sized,\n A: Allocator + UnwindSafe,

","UnwindSafe","air_interpreter_value::JsonString"]] +};if (window.register_type_impls) {window.register_type_impls(type_impls);} else {window.pending_type_impls = type_impls;}})() \ No newline at end of file diff --git a/type.impl/alloc/vec/struct.Vec.js b/type.impl/alloc/vec/struct.Vec.js new file mode 100644 index 00000000..fc767bcf --- /dev/null +++ b/type.impl/alloc/vec/struct.Vec.js @@ -0,0 +1,6 @@ +(function() {var type_impls = { +"air":[["
§

impl<T> Archive for Vec<T>
where\n T: Archive,

§

type Archived = ArchivedVec<<T as Archive>::Archived>

The archived representation of this type. Read more
§

type Resolver = VecResolver

The resolver for this type. It must contain all the additional information from serializing\nneeded to make the archived type from the normal type.
§

unsafe fn resolve(\n &self,\n pos: usize,\n resolver: <Vec<T> as Archive>::Resolver,\n out: *mut <Vec<T> as Archive>::Archived,\n)

Creates the archived version of this value at the given position and writes it to the given\noutput. Read more
","Archive","air::interpreter_data::FoldLore"],["
1.5.0 · source§

impl<T, A> AsMut<[T]> for Vec<T, A>
where\n A: Allocator,

source§

fn as_mut(&mut self) -> &mut [T]

Converts this type into a mutable reference of the (usually inferred) input type.
","AsMut<[T]>","air::interpreter_data::FoldLore"],["
§

impl<K, V> AsMut<TiVec<K, V>> for Vec<V>

§

fn as_mut(&mut self) -> &mut TiVec<K, V>

Converts this type into a mutable reference of the (usually inferred) input type.
","AsMut>","air::interpreter_data::FoldLore"],["
1.5.0 · source§

impl<T, A> AsMut<Vec<T, A>> for Vec<T, A>
where\n A: Allocator,

source§

fn as_mut(&mut self) -> &mut Vec<T, A>

Converts this type into a mutable reference of the (usually inferred) input type.
","AsMut>","air::interpreter_data::FoldLore"],["
1.0.0 · source§

impl<T, A> AsRef<[T]> for Vec<T, A>
where\n A: Allocator,

source§

fn as_ref(&self) -> &[T]

Converts this type into a shared reference of the (usually inferred) input type.
","AsRef<[T]>","air::interpreter_data::FoldLore"],["
§

impl<K, V> AsRef<TiVec<K, V>> for Vec<V>

§

fn as_ref(&self) -> &TiVec<K, V>

Converts this type into a shared reference of the (usually inferred) input type.
","AsRef>","air::interpreter_data::FoldLore"],["
1.0.0 · source§

impl<T, A> AsRef<Vec<T, A>> for Vec<T, A>
where\n A: Allocator,

source§

fn as_ref(&self) -> &Vec<T, A>

Converts this type into a shared reference of the (usually inferred) input type.
","AsRef>","air::interpreter_data::FoldLore"],["
1.0.0 · source§

impl<T, A> Borrow<[T]> for Vec<T, A>
where\n A: Allocator,

source§

fn borrow(&self) -> &[T]

Immutably borrows from an owned value. Read more
","Borrow<[T]>","air::interpreter_data::FoldLore"],["
1.0.0 · source§

impl<T, A> BorrowMut<[T]> for Vec<T, A>
where\n A: Allocator,

source§

fn borrow_mut(&mut self) -> &mut [T]

Mutably borrows from an owned value. Read more
","BorrowMut<[T]>","air::interpreter_data::FoldLore"],["
§

impl<T> BorshDeserialize for Vec<T>
where\n T: BorshDeserialize,

§

fn deserialize_reader<R>(reader: &mut R) -> Result<Vec<T>, Error>
where\n R: Read,

§

fn deserialize(buf: &mut &[u8]) -> Result<Self, Error>

Deserializes this instance from a given slice of bytes.\nUpdates the buffer to point at the remaining bytes.
§

fn try_from_slice(v: &[u8]) -> Result<Self, Error>

Deserialize this instance from a slice of bytes.
§

fn try_from_reader<R>(reader: &mut R) -> Result<Self, Error>
where\n R: Read,

","BorshDeserialize","air::interpreter_data::FoldLore"],["
§

impl<T> BorshSerialize for Vec<T>
where\n T: BorshSerialize,

§

fn serialize<W>(&self, writer: &mut W) -> Result<(), Error>
where\n W: Write,

","BorshSerialize","air::interpreter_data::FoldLore"],["
1.0.0 · source§

impl<T, A> Clone for Vec<T, A>
where\n T: Clone,\n A: Allocator + Clone,

source§

fn clone_from(&mut self, source: &Vec<T, A>)

Overwrites the contents of self with a clone of the contents of source.

\n

This method is preferred over simply assigning source.clone() to self,\nas it avoids reallocation if possible. Additionally, if the element type\nT overrides clone_from(), this will reuse the resources of self’s\nelements as well.

\n
§Examples
\n
let x = vec![5, 6, 7];\nlet mut y = vec![8, 9, 10];\nlet yp: *const i32 = y.as_ptr();\n\ny.clone_from(&x);\n\n// The value is the same\nassert_eq!(x, y);\n\n// And no reallocation occurred\nassert_eq!(yp, y.as_ptr());
\n
source§

fn clone(&self) -> Vec<T, A>

Returns a copy of the value. Read more
","Clone","air::interpreter_data::FoldLore"],["
1.0.0 · source§

impl<T, A> Debug for Vec<T, A>
where\n T: Debug,\n A: Allocator,

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
","Debug","air::interpreter_data::FoldLore"],["
1.0.0 · source§

impl<T> Default for Vec<T>

source§

fn default() -> Vec<T>

Creates an empty Vec<T>.

\n

The vector will not allocate until elements are pushed onto it.

\n
","Default","air::interpreter_data::FoldLore"],["
1.0.0 · source§

impl<T, A> Deref for Vec<T, A>
where\n A: Allocator,

§

type Target = [T]

The resulting type after dereferencing.
source§

fn deref(&self) -> &[T]

Dereferences the value.
","Deref","air::interpreter_data::FoldLore"],["
1.0.0 · source§

impl<T, A> DerefMut for Vec<T, A>
where\n A: Allocator,

source§

fn deref_mut(&mut self) -> &mut [T]

Mutably dereferences the value.
","DerefMut","air::interpreter_data::FoldLore"],["
source§

impl<'de, T> Deserialize<'de> for Vec<T>
where\n T: Deserialize<'de>,

source§

fn deserialize<D>(\n deserializer: D,\n) -> Result<Vec<T>, <D as Deserializer<'de>>::Error>
where\n D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
","Deserialize<'de>","air::interpreter_data::FoldLore"],["
1.0.0 · source§

impl<T, A> Drop for Vec<T, A>
where\n A: Allocator,

source§

fn drop(&mut self)

Executes the destructor for this type. Read more
","Drop","air::interpreter_data::FoldLore"],["
1.2.0 · source§

impl<'a, T, A> Extend<&'a T> for Vec<T, A>
where\n T: Copy + 'a,\n A: Allocator,

Extend implementation that copies elements out of references before pushing them onto the Vec.

\n

This implementation is specialized for slice iterators, where it uses copy_from_slice to\nappend the entire slice at once.

\n
source§

fn extend<I>(&mut self, iter: I)
where\n I: IntoIterator<Item = &'a T>,

Extends a collection with the contents of an iterator. Read more
source§

fn extend_one(&mut self, _: &'a T)

🔬This is a nightly-only experimental API. (extend_one)
Extends a collection with exactly one element.
source§

fn extend_reserve(&mut self, additional: usize)

🔬This is a nightly-only experimental API. (extend_one)
Reserves capacity in a collection for the given number of additional elements. Read more
","Extend<&'a T>","air::interpreter_data::FoldLore"],["
1.0.0 · source§

impl<T, A> Extend<T> for Vec<T, A>
where\n A: Allocator,

source§

fn extend<I>(&mut self, iter: I)
where\n I: IntoIterator<Item = T>,

Extends a collection with the contents of an iterator. Read more
source§

fn extend_one(&mut self, item: T)

🔬This is a nightly-only experimental API. (extend_one)
Extends a collection with exactly one element.
source§

fn extend_reserve(&mut self, additional: usize)

🔬This is a nightly-only experimental API. (extend_one)
Reserves capacity in a collection for the given number of additional elements. Read more
","Extend","air::interpreter_data::FoldLore"],["
1.0.0 · source§

impl<T> From<&[T]> for Vec<T>
where\n T: Clone,

source§

fn from(s: &[T]) -> Vec<T>

Allocate a Vec<T> and fill it by cloning s’s items.

\n
§Examples
\n
assert_eq!(Vec::from(&[1, 2, 3][..]), vec![1, 2, 3]);
\n
","From<&[T]>","air::interpreter_data::FoldLore"],["
1.74.0 · source§

impl<T, const N: usize> From<&[T; N]> for Vec<T>
where\n T: Clone,

source§

fn from(s: &[T; N]) -> Vec<T>

Allocate a Vec<T> and fill it by cloning s’s items.

\n
§Examples
\n
assert_eq!(Vec::from(&[1, 2, 3]), vec![1, 2, 3]);
\n
","From<&[T; N]>","air::interpreter_data::FoldLore"],["
1.19.0 · source§

impl<T> From<&mut [T]> for Vec<T>
where\n T: Clone,

source§

fn from(s: &mut [T]) -> Vec<T>

Allocate a Vec<T> and fill it by cloning s’s items.

\n
§Examples
\n
assert_eq!(Vec::from(&mut [1, 2, 3][..]), vec![1, 2, 3]);
\n
","From<&mut [T]>","air::interpreter_data::FoldLore"],["
1.74.0 · source§

impl<T, const N: usize> From<&mut [T; N]> for Vec<T>
where\n T: Clone,

source§

fn from(s: &mut [T; N]) -> Vec<T>

Allocate a Vec<T> and fill it by cloning s’s items.

\n
§Examples
\n
assert_eq!(Vec::from(&mut [1, 2, 3]), vec![1, 2, 3]);
\n
","From<&mut [T; N]>","air::interpreter_data::FoldLore"],["
1.44.0 · source§

impl<T, const N: usize> From<[T; N]> for Vec<T>

source§

fn from(s: [T; N]) -> Vec<T>

Allocate a Vec<T> and move s’s items into it.

\n
§Examples
\n
assert_eq!(Vec::from([1, 2, 3]), vec![1, 2, 3]);
\n
","From<[T; N]>","air::interpreter_data::FoldLore"],["
1.5.0 · source§

impl<T, A> From<BinaryHeap<T, A>> for Vec<T, A>
where\n A: Allocator,

source§

fn from(heap: BinaryHeap<T, A>) -> Vec<T, A>

Converts a BinaryHeap<T> into a Vec<T>.

\n

This conversion requires no data movement or allocation, and has\nconstant time complexity.

\n
","From>","air::interpreter_data::FoldLore"],["
1.18.0 · source§

impl<T, A> From<Box<[T], A>> for Vec<T, A>
where\n A: Allocator,

source§

fn from(s: Box<[T], A>) -> Vec<T, A>

Convert a boxed slice into a vector by transferring ownership of\nthe existing heap allocation.

\n
§Examples
\n
let b: Box<[i32]> = vec![1, 2, 3].into_boxed_slice();\nassert_eq!(Vec::from(b), vec![1, 2, 3]);
\n
","From>","air::interpreter_data::FoldLore"],["
1.14.0 · source§

impl<'a, T> From<Cow<'a, [T]>> for Vec<T>
where\n [T]: ToOwned<Owned = Vec<T>>,

source§

fn from(s: Cow<'a, [T]>) -> Vec<T>

Convert a clone-on-write slice into a vector.

\n

If s already owns a Vec<T>, it will be returned directly.\nIf s is borrowing a slice, a new Vec<T> will be allocated and\nfilled by cloning s’s items into it.

\n
§Examples
\n
let o: Cow<'_, [i32]> = Cow::Owned(vec![1, 2, 3]);\nlet b: Cow<'_, [i32]> = Cow::Borrowed(&[1, 2, 3]);\nassert_eq!(Vec::from(o), Vec::from(b));
\n
","From>","air::interpreter_data::FoldLore"],["
§

impl<T> From<NonEmpty<T>> for Vec<T>

§

fn from(v: NonEmpty<T>) -> Vec<T>

Converts to this type from the input type.
","From>","air::interpreter_data::FoldLore"],["
§

impl<K, V> From<TiVec<K, V>> for Vec<V>

§

fn from(vec: TiVec<K, V>) -> Vec<V>

Converts to this type from the input type.
","From>","air::interpreter_data::FoldLore"],["
1.10.0 · source§

impl<T, A> From<VecDeque<T, A>> for Vec<T, A>
where\n A: Allocator,

source§

fn from(other: VecDeque<T, A>) -> Vec<T, A>

Turn a VecDeque<T> into a Vec<T>.

\n

This never needs to re-allocate, but does need to do O(n) data movement if\nthe circular buffer doesn’t happen to be at the beginning of the allocation.

\n
§Examples
\n
use std::collections::VecDeque;\n\n// This one is *O*(1).\nlet deque: VecDeque<_> = (1..5).collect();\nlet ptr = deque.as_slices().0.as_ptr();\nlet vec = Vec::from(deque);\nassert_eq!(vec, [1, 2, 3, 4]);\nassert_eq!(vec.as_ptr(), ptr);\n\n// This one needs data rearranging.\nlet mut deque: VecDeque<_> = (1..5).collect();\ndeque.push_front(9);\ndeque.push_front(8);\nlet ptr = deque.as_slices().1.as_ptr();\nlet vec = Vec::from(deque);\nassert_eq!(vec, [8, 9, 1, 2, 3, 4]);\nassert_eq!(vec.as_ptr(), ptr);
\n
","From>","air::interpreter_data::FoldLore"],["
§

impl<T> FromDerObject for Vec<T>
where\n T: FromDerObject,

§

fn from_der_object(der_object: DerObject) -> Result<Vec<T>, Asn1DerError>

Converts der_object into Self
§

fn deserialize<'a>(\n source: impl Iterator<Item = &'a u8>,\n) -> Result<Self, Asn1DerError>

DER-deserializes the data from source
","FromDerObject","air::interpreter_data::FoldLore"],["
1.0.0 · source§

impl<T> FromIterator<T> for Vec<T>

Collects an iterator into a Vec, commonly called via Iterator::collect()

\n

§Allocation behavior

\n

In general Vec does not guarantee any particular growth or allocation strategy.\nThat also applies to this trait impl.

\n

Note: This section covers implementation details and is therefore exempt from\nstability guarantees.

\n

Vec may use any or none of the following strategies,\ndepending on the supplied iterator:

\n
    \n
  • preallocate based on Iterator::size_hint()\n
      \n
    • and panic if the number of items is outside the provided lower/upper bounds
    • \n
    \n
  • \n
  • use an amortized growth strategy similar to pushing one item at a time
  • \n
  • perform the iteration in-place on the original allocation backing the iterator
  • \n
\n

The last case warrants some attention. It is an optimization that in many cases reduces peak memory\nconsumption and improves cache locality. But when big, short-lived allocations are created,\nonly a small fraction of their items get collected, no further use is made of the spare capacity\nand the resulting Vec is moved into a longer-lived structure, then this can lead to the large\nallocations having their lifetimes unnecessarily extended which can result in increased memory\nfootprint.

\n

In cases where this is an issue, the excess capacity can be discarded with Vec::shrink_to(),\nVec::shrink_to_fit() or by collecting into Box<[T]> instead, which additionally reduces\nthe size of the long-lived struct.

\n\n
static LONG_LIVED: Mutex<Vec<Vec<u16>>> = Mutex::new(Vec::new());\n\nfor i in 0..10 {\n    let big_temporary: Vec<u16> = (0..1024).collect();\n    // discard most items\n    let mut result: Vec<_> = big_temporary.into_iter().filter(|i| i % 100 == 0).collect();\n    // without this a lot of unused capacity might be moved into the global\n    result.shrink_to_fit();\n    LONG_LIVED.lock().unwrap().push(result);\n}
\n
source§

fn from_iter<I>(iter: I) -> Vec<T>
where\n I: IntoIterator<Item = T>,

Creates a value from an iterator. Read more
","FromIterator","air::interpreter_data::FoldLore"],["
1.0.0 · source§

impl<T, A> Hash for Vec<T, A>
where\n T: Hash,\n A: Allocator,

The hash of a vector is the same as that of the corresponding slice,\nas required by the core::borrow::Borrow implementation.

\n\n
use std::hash::BuildHasher;\n\nlet b = std::hash::RandomState::new();\nlet v: Vec<u8> = vec![0xa8, 0x3c, 0x09];\nlet s: &[u8] = &[0xa8, 0x3c, 0x09];\nassert_eq!(b.hash_one(v), b.hash_one(s));
\n
source§

fn hash<H>(&self, state: &mut H)
where\n H: Hasher,

Feeds this value into the given Hasher. Read more
1.3.0 · source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where\n H: Hasher,\n Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
","Hash","air::interpreter_data::FoldLore"],["
1.0.0 · source§

impl<T, I, A> Index<I> for Vec<T, A>
where\n I: SliceIndex<[T]>,\n A: Allocator,

§

type Output = <I as SliceIndex<[T]>>::Output

The returned type after indexing.
source§

fn index(&self, index: I) -> &<Vec<T, A> as Index<I>>::Output

Performs the indexing (container[index]) operation. Read more
","Index","air::interpreter_data::FoldLore"],["
1.0.0 · source§

impl<T, I, A> IndexMut<I> for Vec<T, A>
where\n I: SliceIndex<[T]>,\n A: Allocator,

source§

fn index_mut(&mut self, index: I) -> &mut <Vec<T, A> as Index<I>>::Output

Performs the mutable indexing (container[index]) operation. Read more
","IndexMut","air::interpreter_data::FoldLore"],["
§

impl<T> IntoDerObject for Vec<T>
where\n T: IntoDerObject,

§

fn into_der_object(self) -> DerObject

Converts self into a DER object
§

fn serialized_len(&self) -> usize

Efficiently computes the length of the DER-serialized representation of self
§

fn serialize<'a>(\n self,\n buf: impl Iterator<Item = &'a mut u8>,\n) -> Result<usize, Asn1DerError>

DER-serializes self into buf and returns the amount of bytes written
","IntoDerObject","air::interpreter_data::FoldLore"],["
source§

impl<'de, T, E> IntoDeserializer<'de, E> for Vec<T>
where\n T: IntoDeserializer<'de, E>,\n E: Error,

§

type Deserializer = SeqDeserializer<<Vec<T> as IntoIterator>::IntoIter, E>

The type of the deserializer being converted into.
source§

fn into_deserializer(self) -> <Vec<T> as IntoDeserializer<'de, E>>::Deserializer

Convert this value into a deserializer.
","IntoDeserializer<'de, E>","air::interpreter_data::FoldLore"],["
1.0.0 · source§

impl<T, A> IntoIterator for Vec<T, A>
where\n A: Allocator,

source§

fn into_iter(self) -> <Vec<T, A> as IntoIterator>::IntoIter

Creates a consuming iterator, that is, one that moves each value out of\nthe vector (from start to end). The vector cannot be used after calling\nthis.

\n
§Examples
\n
let v = vec![\"a\".to_string(), \"b\".to_string()];\nlet mut v_iter = v.into_iter();\n\nlet first_element: Option<String> = v_iter.next();\n\nassert_eq!(first_element, Some(\"a\".to_string()));\nassert_eq!(v_iter.next(), Some(\"b\".to_string()));\nassert_eq!(v_iter.next(), None);
\n
§

type Item = T

The type of the elements being iterated over.
§

type IntoIter = IntoIter<T, A>

Which kind of iterator are we turning this into?
","IntoIterator","air::interpreter_data::FoldLore"],["
1.0.0 · source§

impl<T, A> Ord for Vec<T, A>
where\n T: Ord,\n A: Allocator,

Implements ordering of vectors, lexicographically.

\n
source§

fn cmp(&self, other: &Vec<T, A>) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · source§

fn max(self, other: Self) -> Self
where\n Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · source§

fn min(self, other: Self) -> Self
where\n Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · source§

fn clamp(self, min: Self, max: Self) -> Self
where\n Self: Sized + PartialOrd,

Restrict a value to a certain interval. Read more
","Ord","air::interpreter_data::FoldLore"],["
1.0.0 · source§

impl<T, U, A> PartialEq<&[U]> for Vec<T, A>
where\n A: Allocator,\n T: PartialEq<U>,

source§

fn eq(&self, other: &&[U]) -> bool

This method tests for self and other values to be equal, and is used\nby ==.
source§

fn ne(&self, other: &&[U]) -> bool

This method tests for !=. The default implementation is almost always\nsufficient, and should not be overridden without very good reason.
","PartialEq<&[U]>","air::interpreter_data::FoldLore"],["
1.0.0 · source§

impl<T, U, A, const N: usize> PartialEq<&[U; N]> for Vec<T, A>
where\n A: Allocator,\n T: PartialEq<U>,

source§

fn eq(&self, other: &&[U; N]) -> bool

This method tests for self and other values to be equal, and is used\nby ==.
source§

fn ne(&self, other: &&[U; N]) -> bool

This method tests for !=. The default implementation is almost always\nsufficient, and should not be overridden without very good reason.
","PartialEq<&[U; N]>","air::interpreter_data::FoldLore"],["
1.0.0 · source§

impl<T, U, A> PartialEq<&mut [U]> for Vec<T, A>
where\n A: Allocator,\n T: PartialEq<U>,

source§

fn eq(&self, other: &&mut [U]) -> bool

This method tests for self and other values to be equal, and is used\nby ==.
source§

fn ne(&self, other: &&mut [U]) -> bool

This method tests for !=. The default implementation is almost always\nsufficient, and should not be overridden without very good reason.
","PartialEq<&mut [U]>","air::interpreter_data::FoldLore"],["
1.48.0 · source§

impl<T, U, A> PartialEq<[U]> for Vec<T, A>
where\n A: Allocator,\n T: PartialEq<U>,

source§

fn eq(&self, other: &[U]) -> bool

This method tests for self and other values to be equal, and is used\nby ==.
source§

fn ne(&self, other: &[U]) -> bool

This method tests for !=. The default implementation is almost always\nsufficient, and should not be overridden without very good reason.
","PartialEq<[U]>","air::interpreter_data::FoldLore"],["
1.0.0 · source§

impl<T, U, A, const N: usize> PartialEq<[U; N]> for Vec<T, A>
where\n A: Allocator,\n T: PartialEq<U>,

source§

fn eq(&self, other: &[U; N]) -> bool

This method tests for self and other values to be equal, and is used\nby ==.
source§

fn ne(&self, other: &[U; N]) -> bool

This method tests for !=. The default implementation is almost always\nsufficient, and should not be overridden without very good reason.
","PartialEq<[U; N]>","air::interpreter_data::FoldLore"],["
§

impl<T, U> PartialEq<ArchivedVec<U>> for Vec<T>
where\n T: PartialEq<U>,

§

fn eq(&self, other: &ArchivedVec<U>) -> bool

This method tests for self and other values to be equal, and is used\nby ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always\nsufficient, and should not be overridden without very good reason.
","PartialEq>","air::interpreter_data::FoldLore"],["
1.0.0 · source§

impl<T, U, A1, A2> PartialEq<Vec<U, A2>> for Vec<T, A1>
where\n A1: Allocator,\n A2: Allocator,\n T: PartialEq<U>,

source§

fn eq(&self, other: &Vec<U, A2>) -> bool

This method tests for self and other values to be equal, and is used\nby ==.
source§

fn ne(&self, other: &Vec<U, A2>) -> bool

This method tests for !=. The default implementation is almost always\nsufficient, and should not be overridden without very good reason.
","PartialEq>","air::interpreter_data::FoldLore"],["
§

impl<T> PartialOrd<ArchivedVec<T>> for Vec<T>
where\n T: PartialOrd,

§

fn partial_cmp(&self, other: &ArchivedVec<T>) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · source§

fn lt(&self, other: &Rhs) -> bool

This method tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · source§

fn le(&self, other: &Rhs) -> bool

This method tests less than or equal to (for self and other) and is used by the <=\noperator. Read more
1.0.0 · source§

fn gt(&self, other: &Rhs) -> bool

This method tests greater than (for self and other) and is used by the > operator. Read more
1.0.0 · source§

fn ge(&self, other: &Rhs) -> bool

This method tests greater than or equal to (for self and other) and is used by the >=\noperator. Read more
","PartialOrd>","air::interpreter_data::FoldLore"],["
1.0.0 · source§

impl<T, A1, A2> PartialOrd<Vec<T, A2>> for Vec<T, A1>
where\n T: PartialOrd,\n A1: Allocator,\n A2: Allocator,

Implements comparison of vectors, lexicographically.

\n
source§

fn partial_cmp(&self, other: &Vec<T, A2>) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · source§

fn lt(&self, other: &Rhs) -> bool

This method tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · source§

fn le(&self, other: &Rhs) -> bool

This method tests less than or equal to (for self and other) and is used by the <=\noperator. Read more
1.0.0 · source§

fn gt(&self, other: &Rhs) -> bool

This method tests greater than (for self and other) and is used by the > operator. Read more
1.0.0 · source§

fn ge(&self, other: &Rhs) -> bool

This method tests greater than or equal to (for self and other) and is used by the >=\noperator. Read more
","PartialOrd>","air::interpreter_data::FoldLore"],["
§

impl<T, S> Serialize<S> for Vec<T>
where\n T: Serialize<S>,\n S: ScratchSpace + Serializer + ?Sized,

§

fn serialize(\n &self,\n serializer: &mut S,\n) -> Result<<Vec<T> as Archive>::Resolver, <S as Fallible>::Error>

Writes the dependencies for the object and returns a resolver that can create the archived\ntype.
","Serialize","air::interpreter_data::FoldLore"],["
source§

impl<T> Serialize for Vec<T>
where\n T: Serialize,

source§

fn serialize<S>(\n &self,\n serializer: S,\n) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error>
where\n S: Serializer,

Serialize this value into the given Serde serializer. Read more
","Serialize","air::interpreter_data::FoldLore"],["
§

impl<W, I> ToBytes<W> for Vec<I>
where\n W: Write,\n I: ToBytes<W>,

Encode a vector into bytes.

\n

Decoder is decoders::binary::list.

\n
§

fn to_bytes(&self, writer: &mut W) -> Result<(), Error>

Converts the given value into &[u8] in the given writer.
","ToBytes","air::interpreter_data::FoldLore"],["
source§

impl<T> Vec<T>

1.0.0 (const: 1.39.0) · source

pub const fn new() -> Vec<T>

Constructs a new, empty Vec<T>.

\n

The vector will not allocate until elements are pushed onto it.

\n
§Examples
\n
let mut vec: Vec<i32> = Vec::new();
\n
1.0.0 · source

pub fn with_capacity(capacity: usize) -> Vec<T>

Constructs a new, empty Vec<T> with at least the specified capacity.

\n

The vector will be able to hold at least capacity elements without\nreallocating. This method is allowed to allocate for more elements than\ncapacity. If capacity is 0, the vector will not allocate.

\n

It is important to note that although the returned vector has the\nminimum capacity specified, the vector will have a zero length. For\nan explanation of the difference between length and capacity, see\nCapacity and reallocation.

\n

If it is important to know the exact allocated capacity of a Vec,\nalways use the capacity method after construction.

\n

For Vec<T> where T is a zero-sized type, there will be no allocation\nand the capacity will always be usize::MAX.

\n
§Panics
\n

Panics if the new capacity exceeds isize::MAX bytes.

\n
§Examples
\n
let mut vec = Vec::with_capacity(10);\n\n// The vector contains no items, even though it has capacity for more\nassert_eq!(vec.len(), 0);\nassert!(vec.capacity() >= 10);\n\n// These are all done without reallocating...\nfor i in 0..10 {\n    vec.push(i);\n}\nassert_eq!(vec.len(), 10);\nassert!(vec.capacity() >= 10);\n\n// ...but this may make the vector reallocate\nvec.push(11);\nassert_eq!(vec.len(), 11);\nassert!(vec.capacity() >= 11);\n\n// A vector of a zero-sized type will always over-allocate, since no\n// allocation is necessary\nlet vec_units = Vec::<()>::with_capacity(10);\nassert_eq!(vec_units.capacity(), usize::MAX);
\n
source

pub fn try_with_capacity(capacity: usize) -> Result<Vec<T>, TryReserveError>

🔬This is a nightly-only experimental API. (try_with_capacity)

Constructs a new, empty Vec<T> with at least the specified capacity.

\n

The vector will be able to hold at least capacity elements without\nreallocating. This method is allowed to allocate for more elements than\ncapacity. If capacity is 0, the vector will not allocate.

\n
§Errors
\n

Returns an error if the capacity exceeds isize::MAX bytes,\nor if the allocator reports allocation failure.

\n
1.0.0 · source

pub unsafe fn from_raw_parts(\n ptr: *mut T,\n length: usize,\n capacity: usize,\n) -> Vec<T>

Creates a Vec<T> directly from a pointer, a length, and a capacity.

\n
§Safety
\n

This is highly unsafe, due to the number of invariants that aren’t\nchecked:

\n
    \n
  • ptr must have been allocated using the global allocator, such as via\nthe alloc::alloc function.
  • \n
  • T needs to have the same alignment as what ptr was allocated with.\n(T having a less strict alignment is not sufficient, the alignment really\nneeds to be equal to satisfy the dealloc requirement that memory must be\nallocated and deallocated with the same layout.)
  • \n
  • The size of T times the capacity (ie. the allocated size in bytes) needs\nto be the same size as the pointer was allocated with. (Because similar to\nalignment, dealloc must be called with the same layout size.)
  • \n
  • length needs to be less than or equal to capacity.
  • \n
  • The first length values must be properly initialized values of type T.
  • \n
  • capacity needs to be the capacity that the pointer was allocated with.
  • \n
  • The allocated size in bytes must be no larger than isize::MAX.\nSee the safety documentation of pointer::offset.
  • \n
\n

These requirements are always upheld by any ptr that has been allocated\nvia Vec<T>. Other allocation sources are allowed if the invariants are\nupheld.

\n

Violating these may cause problems like corrupting the allocator’s\ninternal data structures. For example it is normally not safe\nto build a Vec<u8> from a pointer to a C char array with length\nsize_t, doing so is only safe if the array was initially allocated by\na Vec or String.\nIt’s also not safe to build one from a Vec<u16> and its length, because\nthe allocator cares about the alignment, and these two types have different\nalignments. The buffer was allocated with alignment 2 (for u16), but after\nturning it into a Vec<u8> it’ll be deallocated with alignment 1. To avoid\nthese issues, it is often preferable to do casting/transmuting using\nslice::from_raw_parts instead.

\n

The ownership of ptr is effectively transferred to the\nVec<T> which may then deallocate, reallocate or change the\ncontents of memory pointed to by the pointer at will. Ensure\nthat nothing else uses the pointer after calling this\nfunction.

\n
§Examples
\n
use std::ptr;\nuse std::mem;\n\nlet v = vec![1, 2, 3];\n\n// Prevent running `v`'s destructor so we are in complete control\n// of the allocation.\nlet mut v = mem::ManuallyDrop::new(v);\n\n// Pull out the various important pieces of information about `v`\nlet p = v.as_mut_ptr();\nlet len = v.len();\nlet cap = v.capacity();\n\nunsafe {\n    // Overwrite memory with 4, 5, 6\n    for i in 0..len {\n        ptr::write(p.add(i), 4 + i);\n    }\n\n    // Put everything back together into a Vec\n    let rebuilt = Vec::from_raw_parts(p, len, cap);\n    assert_eq!(rebuilt, [4, 5, 6]);\n}
\n

Using memory that was allocated elsewhere:

\n\n
use std::alloc::{alloc, Layout};\n\nfn main() {\n    let layout = Layout::array::<u32>(16).expect(\"overflow cannot happen\");\n\n    let vec = unsafe {\n        let mem = alloc(layout).cast::<u32>();\n        if mem.is_null() {\n            return;\n        }\n\n        mem.write(1_000_000);\n\n        Vec::from_raw_parts(mem, 1, 16)\n    };\n\n    assert_eq!(vec, &[1_000_000]);\n    assert_eq!(vec.capacity(), 16);\n}
\n
",0,"air::interpreter_data::FoldLore"],["
source§

impl<T, A> Vec<T, A>
where\n T: Clone,\n A: Allocator,

1.5.0 · source

pub fn resize(&mut self, new_len: usize, value: T)

Resizes the Vec in-place so that len is equal to new_len.

\n

If new_len is greater than len, the Vec is extended by the\ndifference, with each additional slot filled with value.\nIf new_len is less than len, the Vec is simply truncated.

\n

This method requires T to implement Clone,\nin order to be able to clone the passed value.\nIf you need more flexibility (or want to rely on Default instead of\nClone), use Vec::resize_with.\nIf you only need to resize to a smaller size, use Vec::truncate.

\n
§Examples
\n
let mut vec = vec![\"hello\"];\nvec.resize(3, \"world\");\nassert_eq!(vec, [\"hello\", \"world\", \"world\"]);\n\nlet mut vec = vec![1, 2, 3, 4];\nvec.resize(2, 0);\nassert_eq!(vec, [1, 2]);
\n
1.6.0 · source

pub fn extend_from_slice(&mut self, other: &[T])

Clones and appends all elements in a slice to the Vec.

\n

Iterates over the slice other, clones each element, and then appends\nit to this Vec. The other slice is traversed in-order.

\n

Note that this function is same as extend except that it is\nspecialized to work with slices instead. If and when Rust gets\nspecialization this function will likely be deprecated (but still\navailable).

\n
§Examples
\n
let mut vec = vec![1];\nvec.extend_from_slice(&[2, 3, 4]);\nassert_eq!(vec, [1, 2, 3, 4]);
\n
1.53.0 · source

pub fn extend_from_within<R>(&mut self, src: R)
where\n R: RangeBounds<usize>,

Copies elements from src range to the end of the vector.

\n
§Panics
\n

Panics if the starting point is greater than the end point or if\nthe end point is greater than the length of the vector.

\n
§Examples
\n
let mut vec = vec![0, 1, 2, 3, 4];\n\nvec.extend_from_within(2..);\nassert_eq!(vec, [0, 1, 2, 3, 4, 2, 3, 4]);\n\nvec.extend_from_within(..2);\nassert_eq!(vec, [0, 1, 2, 3, 4, 2, 3, 4, 0, 1]);\n\nvec.extend_from_within(4..8);\nassert_eq!(vec, [0, 1, 2, 3, 4, 2, 3, 4, 0, 1, 4, 2, 3, 4]);
\n
",0,"air::interpreter_data::FoldLore"],["
source§

impl<T, A> Vec<T, A>
where\n T: PartialEq,\n A: Allocator,

1.0.0 · source

pub fn dedup(&mut self)

Removes consecutive repeated elements in the vector according to the\nPartialEq trait implementation.

\n

If the vector is sorted, this removes all duplicates.

\n
§Examples
\n
let mut vec = vec![1, 2, 2, 3, 2];\n\nvec.dedup();\n\nassert_eq!(vec, [1, 2, 3, 2]);
\n
",0,"air::interpreter_data::FoldLore"],["
source§

impl<T, A> Vec<T, A>
where\n A: Allocator,

1.21.0 · source

pub fn splice<R, I>(\n &mut self,\n range: R,\n replace_with: I,\n) -> Splice<'_, <I as IntoIterator>::IntoIter, A>
where\n R: RangeBounds<usize>,\n I: IntoIterator<Item = T>,

Creates a splicing iterator that replaces the specified range in the vector\nwith the given replace_with iterator and yields the removed items.\nreplace_with does not need to be the same length as range.

\n

range is removed even if the iterator is not consumed until the end.

\n

It is unspecified how many elements are removed from the vector\nif the Splice value is leaked.

\n

The input iterator replace_with is only consumed when the Splice value is dropped.

\n

This is optimal if:

\n
    \n
  • The tail (elements in the vector after range) is empty,
  • \n
  • or replace_with yields fewer or equal elements than range’s length
  • \n
  • or the lower bound of its size_hint() is exact.
  • \n
\n

Otherwise, a temporary vector is allocated and the tail is moved twice.

\n
§Panics
\n

Panics if the starting point is greater than the end point or if\nthe end point is greater than the length of the vector.

\n
§Examples
\n
let mut v = vec![1, 2, 3, 4];\nlet new = [7, 8, 9];\nlet u: Vec<_> = v.splice(1..3, new).collect();\nassert_eq!(v, &[1, 7, 8, 9, 4]);\nassert_eq!(u, &[2, 3]);
\n
source

pub fn extract_if<F>(&mut self, filter: F) -> ExtractIf<'_, T, F, A>
where\n F: FnMut(&mut T) -> bool,

🔬This is a nightly-only experimental API. (extract_if)

Creates an iterator which uses a closure to determine if an element should be removed.

\n

If the closure returns true, then the element is removed and yielded.\nIf the closure returns false, the element will remain in the vector and will not be yielded\nby the iterator.

\n

If the returned ExtractIf is not exhausted, e.g. because it is dropped without iterating\nor the iteration short-circuits, then the remaining elements will be retained.\nUse retain with a negated predicate if you do not need the returned iterator.

\n

Using this method is equivalent to the following code:

\n\n
let mut i = 0;\nwhile i < vec.len() {\n    if some_predicate(&mut vec[i]) {\n        let val = vec.remove(i);\n        // your code here\n    } else {\n        i += 1;\n    }\n}\n
\n

But extract_if is easier to use. extract_if is also more efficient,\nbecause it can backshift the elements of the array in bulk.

\n

Note that extract_if also lets you mutate every element in the filter closure,\nregardless of whether you choose to keep or remove it.

\n
§Examples
\n

Splitting an array into evens and odds, reusing the original allocation:

\n\n
#![feature(extract_if)]\nlet mut numbers = vec![1, 2, 3, 4, 5, 6, 8, 9, 11, 13, 14, 15];\n\nlet evens = numbers.extract_if(|x| *x % 2 == 0).collect::<Vec<_>>();\nlet odds = numbers;\n\nassert_eq!(evens, vec![2, 4, 6, 8, 14]);\nassert_eq!(odds, vec![1, 3, 5, 9, 11, 13, 15]);
\n
",0,"air::interpreter_data::FoldLore"],["
source§

impl<T, A> Vec<T, A>
where\n A: Allocator,

source

pub const fn new_in(alloc: A) -> Vec<T, A>

🔬This is a nightly-only experimental API. (allocator_api)

Constructs a new, empty Vec<T, A>.

\n

The vector will not allocate until elements are pushed onto it.

\n
§Examples
\n
#![feature(allocator_api)]\n\nuse std::alloc::System;\n\nlet mut vec: Vec<i32, _> = Vec::new_in(System);
\n
source

pub fn with_capacity_in(capacity: usize, alloc: A) -> Vec<T, A>

🔬This is a nightly-only experimental API. (allocator_api)

Constructs a new, empty Vec<T, A> with at least the specified capacity\nwith the provided allocator.

\n

The vector will be able to hold at least capacity elements without\nreallocating. This method is allowed to allocate for more elements than\ncapacity. If capacity is 0, the vector will not allocate.

\n

It is important to note that although the returned vector has the\nminimum capacity specified, the vector will have a zero length. For\nan explanation of the difference between length and capacity, see\nCapacity and reallocation.

\n

If it is important to know the exact allocated capacity of a Vec,\nalways use the capacity method after construction.

\n

For Vec<T, A> where T is a zero-sized type, there will be no allocation\nand the capacity will always be usize::MAX.

\n
§Panics
\n

Panics if the new capacity exceeds isize::MAX bytes.

\n
§Examples
\n
#![feature(allocator_api)]\n\nuse std::alloc::System;\n\nlet mut vec = Vec::with_capacity_in(10, System);\n\n// The vector contains no items, even though it has capacity for more\nassert_eq!(vec.len(), 0);\nassert!(vec.capacity() >= 10);\n\n// These are all done without reallocating...\nfor i in 0..10 {\n    vec.push(i);\n}\nassert_eq!(vec.len(), 10);\nassert!(vec.capacity() >= 10);\n\n// ...but this may make the vector reallocate\nvec.push(11);\nassert_eq!(vec.len(), 11);\nassert!(vec.capacity() >= 11);\n\n// A vector of a zero-sized type will always over-allocate, since no\n// allocation is necessary\nlet vec_units = Vec::<(), System>::with_capacity_in(10, System);\nassert_eq!(vec_units.capacity(), usize::MAX);
\n
source

pub fn try_with_capacity_in(\n capacity: usize,\n alloc: A,\n) -> Result<Vec<T, A>, TryReserveError>

🔬This is a nightly-only experimental API. (allocator_api)

Constructs a new, empty Vec<T, A> with at least the specified capacity\nwith the provided allocator.

\n

The vector will be able to hold at least capacity elements without\nreallocating. This method is allowed to allocate for more elements than\ncapacity. If capacity is 0, the vector will not allocate.

\n
§Errors
\n

Returns an error if the capacity exceeds isize::MAX bytes,\nor if the allocator reports allocation failure.

\n
source

pub unsafe fn from_raw_parts_in(\n ptr: *mut T,\n length: usize,\n capacity: usize,\n alloc: A,\n) -> Vec<T, A>

🔬This is a nightly-only experimental API. (allocator_api)

Creates a Vec<T, A> directly from a pointer, a length, a capacity,\nand an allocator.

\n
§Safety
\n

This is highly unsafe, due to the number of invariants that aren’t\nchecked:

\n
    \n
  • ptr must be currently allocated via the given allocator alloc.
  • \n
  • T needs to have the same alignment as what ptr was allocated with.\n(T having a less strict alignment is not sufficient, the alignment really\nneeds to be equal to satisfy the dealloc requirement that memory must be\nallocated and deallocated with the same layout.)
  • \n
  • The size of T times the capacity (ie. the allocated size in bytes) needs\nto be the same size as the pointer was allocated with. (Because similar to\nalignment, dealloc must be called with the same layout size.)
  • \n
  • length needs to be less than or equal to capacity.
  • \n
  • The first length values must be properly initialized values of type T.
  • \n
  • capacity needs to fit the layout size that the pointer was allocated with.
  • \n
  • The allocated size in bytes must be no larger than isize::MAX.\nSee the safety documentation of pointer::offset.
  • \n
\n

These requirements are always upheld by any ptr that has been allocated\nvia Vec<T, A>. Other allocation sources are allowed if the invariants are\nupheld.

\n

Violating these may cause problems like corrupting the allocator’s\ninternal data structures. For example it is not safe\nto build a Vec<u8> from a pointer to a C char array with length size_t.\nIt’s also not safe to build one from a Vec<u16> and its length, because\nthe allocator cares about the alignment, and these two types have different\nalignments. The buffer was allocated with alignment 2 (for u16), but after\nturning it into a Vec<u8> it’ll be deallocated with alignment 1.

\n

The ownership of ptr is effectively transferred to the\nVec<T> which may then deallocate, reallocate or change the\ncontents of memory pointed to by the pointer at will. Ensure\nthat nothing else uses the pointer after calling this\nfunction.

\n
§Examples
\n
#![feature(allocator_api)]\n\nuse std::alloc::System;\n\nuse std::ptr;\nuse std::mem;\n\nlet mut v = Vec::with_capacity_in(3, System);\nv.push(1);\nv.push(2);\nv.push(3);\n\n// Prevent running `v`'s destructor so we are in complete control\n// of the allocation.\nlet mut v = mem::ManuallyDrop::new(v);\n\n// Pull out the various important pieces of information about `v`\nlet p = v.as_mut_ptr();\nlet len = v.len();\nlet cap = v.capacity();\nlet alloc = v.allocator();\n\nunsafe {\n    // Overwrite memory with 4, 5, 6\n    for i in 0..len {\n        ptr::write(p.add(i), 4 + i);\n    }\n\n    // Put everything back together into a Vec\n    let rebuilt = Vec::from_raw_parts_in(p, len, cap, alloc.clone());\n    assert_eq!(rebuilt, [4, 5, 6]);\n}
\n

Using memory that was allocated elsewhere:

\n\n
#![feature(allocator_api)]\n\nuse std::alloc::{AllocError, Allocator, Global, Layout};\n\nfn main() {\n    let layout = Layout::array::<u32>(16).expect(\"overflow cannot happen\");\n\n    let vec = unsafe {\n        let mem = match Global.allocate(layout) {\n            Ok(mem) => mem.cast::<u32>().as_ptr(),\n            Err(AllocError) => return,\n        };\n\n        mem.write(1_000_000);\n\n        Vec::from_raw_parts_in(mem, 1, 16, Global)\n    };\n\n    assert_eq!(vec, &[1_000_000]);\n    assert_eq!(vec.capacity(), 16);\n}
\n
source

pub fn into_raw_parts(self) -> (*mut T, usize, usize)

🔬This is a nightly-only experimental API. (vec_into_raw_parts)

Decomposes a Vec<T> into its raw components: (pointer, length, capacity).

\n

Returns the raw pointer to the underlying data, the length of\nthe vector (in elements), and the allocated capacity of the\ndata (in elements). These are the same arguments in the same\norder as the arguments to from_raw_parts.

\n

After calling this function, the caller is responsible for the\nmemory previously managed by the Vec. The only way to do\nthis is to convert the raw pointer, length, and capacity back\ninto a Vec with the from_raw_parts function, allowing\nthe destructor to perform the cleanup.

\n
§Examples
\n
#![feature(vec_into_raw_parts)]\nlet v: Vec<i32> = vec![-1, 0, 1];\n\nlet (ptr, len, cap) = v.into_raw_parts();\n\nlet rebuilt = unsafe {\n    // We can now make changes to the components, such as\n    // transmuting the raw pointer to a compatible type.\n    let ptr = ptr as *mut u32;\n\n    Vec::from_raw_parts(ptr, len, cap)\n};\nassert_eq!(rebuilt, [4294967295, 0, 1]);
\n
source

pub fn into_raw_parts_with_alloc(self) -> (*mut T, usize, usize, A)

🔬This is a nightly-only experimental API. (allocator_api)

Decomposes a Vec<T> into its raw components: (pointer, length, capacity, allocator).

\n

Returns the raw pointer to the underlying data, the length of the vector (in elements),\nthe allocated capacity of the data (in elements), and the allocator. These are the same\narguments in the same order as the arguments to from_raw_parts_in.

\n

After calling this function, the caller is responsible for the\nmemory previously managed by the Vec. The only way to do\nthis is to convert the raw pointer, length, and capacity back\ninto a Vec with the from_raw_parts_in function, allowing\nthe destructor to perform the cleanup.

\n
§Examples
\n
#![feature(allocator_api, vec_into_raw_parts)]\n\nuse std::alloc::System;\n\nlet mut v: Vec<i32, System> = Vec::new_in(System);\nv.push(-1);\nv.push(0);\nv.push(1);\n\nlet (ptr, len, cap, alloc) = v.into_raw_parts_with_alloc();\n\nlet rebuilt = unsafe {\n    // We can now make changes to the components, such as\n    // transmuting the raw pointer to a compatible type.\n    let ptr = ptr as *mut u32;\n\n    Vec::from_raw_parts_in(ptr, len, cap, alloc)\n};\nassert_eq!(rebuilt, [4294967295, 0, 1]);
\n
1.0.0 · source

pub fn capacity(&self) -> usize

Returns the total number of elements the vector can hold without\nreallocating.

\n
§Examples
\n
let mut vec: Vec<i32> = Vec::with_capacity(10);\nvec.push(42);\nassert!(vec.capacity() >= 10);
\n
1.0.0 · source

pub fn reserve(&mut self, additional: usize)

Reserves capacity for at least additional more elements to be inserted\nin the given Vec<T>. The collection may reserve more space to\nspeculatively avoid frequent reallocations. After calling reserve,\ncapacity will be greater than or equal to self.len() + additional.\nDoes nothing if capacity is already sufficient.

\n
§Panics
\n

Panics if the new capacity exceeds isize::MAX bytes.

\n
§Examples
\n
let mut vec = vec![1];\nvec.reserve(10);\nassert!(vec.capacity() >= 11);
\n
1.0.0 · source

pub fn reserve_exact(&mut self, additional: usize)

Reserves the minimum capacity for at least additional more elements to\nbe inserted in the given Vec<T>. Unlike reserve, this will not\ndeliberately over-allocate to speculatively avoid frequent allocations.\nAfter calling reserve_exact, capacity will be greater than or equal to\nself.len() + additional. Does nothing if the capacity is already\nsufficient.

\n

Note that the allocator may give the collection more space than it\nrequests. Therefore, capacity can not be relied upon to be precisely\nminimal. Prefer reserve if future insertions are expected.

\n
§Panics
\n

Panics if the new capacity exceeds isize::MAX bytes.

\n
§Examples
\n
let mut vec = vec![1];\nvec.reserve_exact(10);\nassert!(vec.capacity() >= 11);
\n
1.57.0 · source

pub fn try_reserve(&mut self, additional: usize) -> Result<(), TryReserveError>

Tries to reserve capacity for at least additional more elements to be inserted\nin the given Vec<T>. The collection may reserve more space to speculatively avoid\nfrequent reallocations. After calling try_reserve, capacity will be\ngreater than or equal to self.len() + additional if it returns\nOk(()). Does nothing if capacity is already sufficient. This method\npreserves the contents even if an error occurs.

\n
§Errors
\n

If the capacity overflows, or the allocator reports a failure, then an error\nis returned.

\n
§Examples
\n
use std::collections::TryReserveError;\n\nfn process_data(data: &[u32]) -> Result<Vec<u32>, TryReserveError> {\n    let mut output = Vec::new();\n\n    // Pre-reserve the memory, exiting if we can't\n    output.try_reserve(data.len())?;\n\n    // Now we know this can't OOM in the middle of our complex work\n    output.extend(data.iter().map(|&val| {\n        val * 2 + 5 // very complicated\n    }));\n\n    Ok(output)\n}
\n
1.57.0 · source

pub fn try_reserve_exact(\n &mut self,\n additional: usize,\n) -> Result<(), TryReserveError>

Tries to reserve the minimum capacity for at least additional\nelements to be inserted in the given Vec<T>. Unlike try_reserve,\nthis will not deliberately over-allocate to speculatively avoid frequent\nallocations. After calling try_reserve_exact, capacity will be greater\nthan or equal to self.len() + additional if it returns Ok(()).\nDoes nothing if the capacity is already sufficient.

\n

Note that the allocator may give the collection more space than it\nrequests. Therefore, capacity can not be relied upon to be precisely\nminimal. Prefer try_reserve if future insertions are expected.

\n
§Errors
\n

If the capacity overflows, or the allocator reports a failure, then an error\nis returned.

\n
§Examples
\n
use std::collections::TryReserveError;\n\nfn process_data(data: &[u32]) -> Result<Vec<u32>, TryReserveError> {\n    let mut output = Vec::new();\n\n    // Pre-reserve the memory, exiting if we can't\n    output.try_reserve_exact(data.len())?;\n\n    // Now we know this can't OOM in the middle of our complex work\n    output.extend(data.iter().map(|&val| {\n        val * 2 + 5 // very complicated\n    }));\n\n    Ok(output)\n}
\n
1.0.0 · source

pub fn shrink_to_fit(&mut self)

Shrinks the capacity of the vector as much as possible.

\n

The behavior of this method depends on the allocator, which may either shrink the vector\nin-place or reallocate. The resulting vector might still have some excess capacity, just as\nis the case for with_capacity. See Allocator::shrink for more details.

\n
§Examples
\n
let mut vec = Vec::with_capacity(10);\nvec.extend([1, 2, 3]);\nassert!(vec.capacity() >= 10);\nvec.shrink_to_fit();\nassert!(vec.capacity() >= 3);
\n
1.56.0 · source

pub fn shrink_to(&mut self, min_capacity: usize)

Shrinks the capacity of the vector with a lower bound.

\n

The capacity will remain at least as large as both the length\nand the supplied value.

\n

If the current capacity is less than the lower limit, this is a no-op.

\n
§Examples
\n
let mut vec = Vec::with_capacity(10);\nvec.extend([1, 2, 3]);\nassert!(vec.capacity() >= 10);\nvec.shrink_to(4);\nassert!(vec.capacity() >= 4);\nvec.shrink_to(0);\nassert!(vec.capacity() >= 3);
\n
1.0.0 · source

pub fn into_boxed_slice(self) -> Box<[T], A>

Converts the vector into Box<[T]>.

\n

Before doing the conversion, this method discards excess capacity like shrink_to_fit.

\n
§Examples
\n
let v = vec![1, 2, 3];\n\nlet slice = v.into_boxed_slice();
\n

Any excess capacity is removed:

\n\n
let mut vec = Vec::with_capacity(10);\nvec.extend([1, 2, 3]);\n\nassert!(vec.capacity() >= 10);\nlet slice = vec.into_boxed_slice();\nassert_eq!(slice.into_vec().capacity(), 3);
\n
1.0.0 · source

pub fn truncate(&mut self, len: usize)

Shortens the vector, keeping the first len elements and dropping\nthe rest.

\n

If len is greater or equal to the vector’s current length, this has\nno effect.

\n

The drain method can emulate truncate, but causes the excess\nelements to be returned instead of dropped.

\n

Note that this method has no effect on the allocated capacity\nof the vector.

\n
§Examples
\n

Truncating a five element vector to two elements:

\n\n
let mut vec = vec![1, 2, 3, 4, 5];\nvec.truncate(2);\nassert_eq!(vec, [1, 2]);
\n

No truncation occurs when len is greater than the vector’s current\nlength:

\n\n
let mut vec = vec![1, 2, 3];\nvec.truncate(8);\nassert_eq!(vec, [1, 2, 3]);
\n

Truncating when len == 0 is equivalent to calling the clear\nmethod.

\n\n
let mut vec = vec![1, 2, 3];\nvec.truncate(0);\nassert_eq!(vec, []);
\n
1.7.0 · source

pub fn as_slice(&self) -> &[T]

Extracts a slice containing the entire vector.

\n

Equivalent to &s[..].

\n
§Examples
\n
use std::io::{self, Write};\nlet buffer = vec![1, 2, 3, 5, 8];\nio::sink().write(buffer.as_slice()).unwrap();
\n
1.7.0 · source

pub fn as_mut_slice(&mut self) -> &mut [T]

Extracts a mutable slice of the entire vector.

\n

Equivalent to &mut s[..].

\n
§Examples
\n
use std::io::{self, Read};\nlet mut buffer = vec![0; 3];\nio::repeat(0b101).read_exact(buffer.as_mut_slice()).unwrap();
\n
1.37.0 · source

pub fn as_ptr(&self) -> *const T

Returns a raw pointer to the vector’s buffer, or a dangling raw pointer\nvalid for zero sized reads if the vector didn’t allocate.

\n

The caller must ensure that the vector outlives the pointer this\nfunction returns, or else it will end up pointing to garbage.\nModifying the vector may cause its buffer to be reallocated,\nwhich would also make any pointers to it invalid.

\n

The caller must also ensure that the memory the pointer (non-transitively) points to\nis never written to (except inside an UnsafeCell) using this pointer or any pointer\nderived from it. If you need to mutate the contents of the slice, use as_mut_ptr.

\n

This method guarantees that for the purpose of the aliasing model, this method\ndoes not materialize a reference to the underlying slice, and thus the returned pointer\nwill remain valid when mixed with other calls to as_ptr and as_mut_ptr.\nNote that calling other methods that materialize mutable references to the slice,\nor mutable references to specific elements you are planning on accessing through this pointer,\nas well as writing to those elements, may still invalidate this pointer.\nSee the second example below for how this guarantee can be used.

\n
§Examples
\n
let x = vec![1, 2, 4];\nlet x_ptr = x.as_ptr();\n\nunsafe {\n    for i in 0..x.len() {\n        assert_eq!(*x_ptr.add(i), 1 << i);\n    }\n}
\n

Due to the aliasing guarantee, the following code is legal:

\n\n
unsafe {\n    let mut v = vec![0, 1, 2];\n    let ptr1 = v.as_ptr();\n    let _ = ptr1.read();\n    let ptr2 = v.as_mut_ptr().offset(2);\n    ptr2.write(2);\n    // Notably, the write to `ptr2` did *not* invalidate `ptr1`\n    // because it mutated a different element:\n    let _ = ptr1.read();\n}
\n
1.37.0 · source

pub fn as_mut_ptr(&mut self) -> *mut T

Returns an unsafe mutable pointer to the vector’s buffer, or a dangling\nraw pointer valid for zero sized reads if the vector didn’t allocate.

\n

The caller must ensure that the vector outlives the pointer this\nfunction returns, or else it will end up pointing to garbage.\nModifying the vector may cause its buffer to be reallocated,\nwhich would also make any pointers to it invalid.

\n

This method guarantees that for the purpose of the aliasing model, this method\ndoes not materialize a reference to the underlying slice, and thus the returned pointer\nwill remain valid when mixed with other calls to as_ptr and as_mut_ptr.\nNote that calling other methods that materialize references to the slice,\nor references to specific elements you are planning on accessing through this pointer,\nmay still invalidate this pointer.\nSee the second example below for how this guarantee can be used.

\n
§Examples
\n
// Allocate vector big enough for 4 elements.\nlet size = 4;\nlet mut x: Vec<i32> = Vec::with_capacity(size);\nlet x_ptr = x.as_mut_ptr();\n\n// Initialize elements via raw pointer writes, then set length.\nunsafe {\n    for i in 0..size {\n        *x_ptr.add(i) = i as i32;\n    }\n    x.set_len(size);\n}\nassert_eq!(&*x, &[0, 1, 2, 3]);
\n

Due to the aliasing guarantee, the following code is legal:

\n\n
unsafe {\n    let mut v = vec![0];\n    let ptr1 = v.as_mut_ptr();\n    ptr1.write(1);\n    let ptr2 = v.as_mut_ptr();\n    ptr2.write(2);\n    // Notably, the write to `ptr2` did *not* invalidate `ptr1`:\n    ptr1.write(3);\n}
\n
source

pub fn allocator(&self) -> &A

🔬This is a nightly-only experimental API. (allocator_api)

Returns a reference to the underlying allocator.

\n
1.0.0 · source

pub unsafe fn set_len(&mut self, new_len: usize)

Forces the length of the vector to new_len.

\n

This is a low-level operation that maintains none of the normal\ninvariants of the type. Normally changing the length of a vector\nis done using one of the safe operations instead, such as\ntruncate, resize, extend, or clear.

\n
§Safety
\n
    \n
  • new_len must be less than or equal to capacity().
  • \n
  • The elements at old_len..new_len must be initialized.
  • \n
\n
§Examples
\n

This method can be useful for situations in which the vector\nis serving as a buffer for other code, particularly over FFI:

\n\n
pub fn get_dictionary(&self) -> Option<Vec<u8>> {\n    // Per the FFI method's docs, \"32768 bytes is always enough\".\n    let mut dict = Vec::with_capacity(32_768);\n    let mut dict_length = 0;\n    // SAFETY: When `deflateGetDictionary` returns `Z_OK`, it holds that:\n    // 1. `dict_length` elements were initialized.\n    // 2. `dict_length` <= the capacity (32_768)\n    // which makes `set_len` safe to call.\n    unsafe {\n        // Make the FFI call...\n        let r = deflateGetDictionary(self.strm, dict.as_mut_ptr(), &mut dict_length);\n        if r == Z_OK {\n            // ...and update the length to what was initialized.\n            dict.set_len(dict_length);\n            Some(dict)\n        } else {\n            None\n        }\n    }\n}
\n

While the following example is sound, there is a memory leak since\nthe inner vectors were not freed prior to the set_len call:

\n\n
let mut vec = vec![vec![1, 0, 0],\n                   vec![0, 1, 0],\n                   vec![0, 0, 1]];\n// SAFETY:\n// 1. `old_len..0` is empty so no elements need to be initialized.\n// 2. `0 <= capacity` always holds whatever `capacity` is.\nunsafe {\n    vec.set_len(0);\n}
\n

Normally, here, one would use clear instead to correctly drop\nthe contents and thus not leak memory.

\n
1.0.0 · source

pub fn swap_remove(&mut self, index: usize) -> T

Removes an element from the vector and returns it.

\n

The removed element is replaced by the last element of the vector.

\n

This does not preserve ordering of the remaining elements, but is O(1).\nIf you need to preserve the element order, use remove instead.

\n
§Panics
\n

Panics if index is out of bounds.

\n
§Examples
\n
let mut v = vec![\"foo\", \"bar\", \"baz\", \"qux\"];\n\nassert_eq!(v.swap_remove(1), \"bar\");\nassert_eq!(v, [\"foo\", \"qux\", \"baz\"]);\n\nassert_eq!(v.swap_remove(0), \"foo\");\nassert_eq!(v, [\"baz\", \"qux\"]);
\n
1.0.0 · source

pub fn insert(&mut self, index: usize, element: T)

Inserts an element at position index within the vector, shifting all\nelements after it to the right.

\n
§Panics
\n

Panics if index > len.

\n
§Examples
\n
let mut vec = vec![1, 2, 3];\nvec.insert(1, 4);\nassert_eq!(vec, [1, 4, 2, 3]);\nvec.insert(4, 5);\nassert_eq!(vec, [1, 4, 2, 3, 5]);
\n
§Time complexity
\n

Takes O(Vec::len) time. All items after the insertion index must be\nshifted to the right. In the worst case, all elements are shifted when\nthe insertion index is 0.

\n
1.0.0 · source

pub fn remove(&mut self, index: usize) -> T

Removes and returns the element at position index within the vector,\nshifting all elements after it to the left.

\n

Note: Because this shifts over the remaining elements, it has a\nworst-case performance of O(n). If you don’t need the order of elements\nto be preserved, use swap_remove instead. If you’d like to remove\nelements from the beginning of the Vec, consider using\nVecDeque::pop_front instead.

\n
§Panics
\n

Panics if index is out of bounds.

\n
§Examples
\n
let mut v = vec![1, 2, 3];\nassert_eq!(v.remove(1), 2);\nassert_eq!(v, [1, 3]);
\n
1.0.0 · source

pub fn retain<F>(&mut self, f: F)
where\n F: FnMut(&T) -> bool,

Retains only the elements specified by the predicate.

\n

In other words, remove all elements e for which f(&e) returns false.\nThis method operates in place, visiting each element exactly once in the\noriginal order, and preserves the order of the retained elements.

\n
§Examples
\n
let mut vec = vec![1, 2, 3, 4];\nvec.retain(|&x| x % 2 == 0);\nassert_eq!(vec, [2, 4]);
\n

Because the elements are visited exactly once in the original order,\nexternal state may be used to decide which elements to keep.

\n\n
let mut vec = vec![1, 2, 3, 4, 5];\nlet keep = [false, true, true, false, true];\nlet mut iter = keep.iter();\nvec.retain(|_| *iter.next().unwrap());\nassert_eq!(vec, [2, 3, 5]);
\n
1.61.0 · source

pub fn retain_mut<F>(&mut self, f: F)
where\n F: FnMut(&mut T) -> bool,

Retains only the elements specified by the predicate, passing a mutable reference to it.

\n

In other words, remove all elements e such that f(&mut e) returns false.\nThis method operates in place, visiting each element exactly once in the\noriginal order, and preserves the order of the retained elements.

\n
§Examples
\n
let mut vec = vec![1, 2, 3, 4];\nvec.retain_mut(|x| if *x <= 3 {\n    *x += 1;\n    true\n} else {\n    false\n});\nassert_eq!(vec, [2, 3, 4]);
\n
1.16.0 · source

pub fn dedup_by_key<F, K>(&mut self, key: F)
where\n F: FnMut(&mut T) -> K,\n K: PartialEq,

Removes all but the first of consecutive elements in the vector that resolve to the same\nkey.

\n

If the vector is sorted, this removes all duplicates.

\n
§Examples
\n
let mut vec = vec![10, 20, 21, 30, 20];\n\nvec.dedup_by_key(|i| *i / 10);\n\nassert_eq!(vec, [10, 20, 30, 20]);
\n
1.16.0 · source

pub fn dedup_by<F>(&mut self, same_bucket: F)
where\n F: FnMut(&mut T, &mut T) -> bool,

Removes all but the first of consecutive elements in the vector satisfying a given equality\nrelation.

\n

The same_bucket function is passed references to two elements from the vector and\nmust determine if the elements compare equal. The elements are passed in opposite order\nfrom their order in the slice, so if same_bucket(a, b) returns true, a is removed.

\n

If the vector is sorted, this removes all duplicates.

\n
§Examples
\n
let mut vec = vec![\"foo\", \"bar\", \"Bar\", \"baz\", \"bar\"];\n\nvec.dedup_by(|a, b| a.eq_ignore_ascii_case(b));\n\nassert_eq!(vec, [\"foo\", \"bar\", \"baz\", \"bar\"]);
\n
1.0.0 · source

pub fn push(&mut self, value: T)

Appends an element to the back of a collection.

\n
§Panics
\n

Panics if the new capacity exceeds isize::MAX bytes.

\n
§Examples
\n
let mut vec = vec![1, 2];\nvec.push(3);\nassert_eq!(vec, [1, 2, 3]);
\n
§Time complexity
\n

Takes amortized O(1) time. If the vector’s length would exceed its\ncapacity after the push, O(capacity) time is taken to copy the\nvector’s elements to a larger allocation. This expensive operation is\noffset by the capacity O(1) insertions it allows.

\n
source

pub fn push_within_capacity(&mut self, value: T) -> Result<(), T>

🔬This is a nightly-only experimental API. (vec_push_within_capacity)

Appends an element if there is sufficient spare capacity, otherwise an error is returned\nwith the element.

\n

Unlike push this method will not reallocate when there’s insufficient capacity.\nThe caller should use reserve or try_reserve to ensure that there is enough capacity.

\n
§Examples
\n

A manual, panic-free alternative to FromIterator:

\n\n
#![feature(vec_push_within_capacity)]\n\nuse std::collections::TryReserveError;\nfn from_iter_fallible<T>(iter: impl Iterator<Item=T>) -> Result<Vec<T>, TryReserveError> {\n    let mut vec = Vec::new();\n    for value in iter {\n        if let Err(value) = vec.push_within_capacity(value) {\n            vec.try_reserve(1)?;\n            // this cannot fail, the previous line either returned or added at least 1 free slot\n            let _ = vec.push_within_capacity(value);\n        }\n    }\n    Ok(vec)\n}\nassert_eq!(from_iter_fallible(0..100), Ok(Vec::from_iter(0..100)));
\n
§Time complexity
\n

Takes O(1) time.

\n
1.0.0 · source

pub fn pop(&mut self) -> Option<T>

Removes the last element from a vector and returns it, or None if it\nis empty.

\n

If you’d like to pop the first element, consider using\nVecDeque::pop_front instead.

\n
§Examples
\n
let mut vec = vec![1, 2, 3];\nassert_eq!(vec.pop(), Some(3));\nassert_eq!(vec, [1, 2]);
\n
§Time complexity
\n

Takes O(1) time.

\n
source

pub fn pop_if<F>(&mut self, f: F) -> Option<T>
where\n F: FnOnce(&mut T) -> bool,

🔬This is a nightly-only experimental API. (vec_pop_if)

Removes and returns the last element in a vector if the predicate\nreturns true, or None if the predicate returns false or the vector\nis empty.

\n
§Examples
\n
#![feature(vec_pop_if)]\n\nlet mut vec = vec![1, 2, 3, 4];\nlet pred = |x: &mut i32| *x % 2 == 0;\n\nassert_eq!(vec.pop_if(pred), Some(4));\nassert_eq!(vec, [1, 2, 3]);\nassert_eq!(vec.pop_if(pred), None);
\n
1.4.0 · source

pub fn append(&mut self, other: &mut Vec<T, A>)

Moves all the elements of other into self, leaving other empty.

\n
§Panics
\n

Panics if the new capacity exceeds isize::MAX bytes.

\n
§Examples
\n
let mut vec = vec![1, 2, 3];\nlet mut vec2 = vec![4, 5, 6];\nvec.append(&mut vec2);\nassert_eq!(vec, [1, 2, 3, 4, 5, 6]);\nassert_eq!(vec2, []);
\n
1.6.0 · source

pub fn drain<R>(&mut self, range: R) -> Drain<'_, T, A>
where\n R: RangeBounds<usize>,

Removes the specified range from the vector in bulk, returning all\nremoved elements as an iterator. If the iterator is dropped before\nbeing fully consumed, it drops the remaining removed elements.

\n

The returned iterator keeps a mutable borrow on the vector to optimize\nits implementation.

\n
§Panics
\n

Panics if the starting point is greater than the end point or if\nthe end point is greater than the length of the vector.

\n
§Leaking
\n

If the returned iterator goes out of scope without being dropped (due to\nmem::forget, for example), the vector may have lost and leaked\nelements arbitrarily, including elements outside the range.

\n
§Examples
\n
let mut v = vec![1, 2, 3];\nlet u: Vec<_> = v.drain(1..).collect();\nassert_eq!(v, &[1]);\nassert_eq!(u, &[2, 3]);\n\n// A full range clears the vector, like `clear()` does\nv.drain(..);\nassert_eq!(v, &[]);
\n
1.0.0 · source

pub fn clear(&mut self)

Clears the vector, removing all values.

\n

Note that this method has no effect on the allocated capacity\nof the vector.

\n
§Examples
\n
let mut v = vec![1, 2, 3];\n\nv.clear();\n\nassert!(v.is_empty());
\n
1.0.0 · source

pub fn len(&self) -> usize

Returns the number of elements in the vector, also referred to\nas its ‘length’.

\n
§Examples
\n
let a = vec![1, 2, 3];\nassert_eq!(a.len(), 3);
\n
1.0.0 · source

pub fn is_empty(&self) -> bool

Returns true if the vector contains no elements.

\n
§Examples
\n
let mut v = Vec::new();\nassert!(v.is_empty());\n\nv.push(1);\nassert!(!v.is_empty());
\n
1.4.0 · source

pub fn split_off(&mut self, at: usize) -> Vec<T, A>
where\n A: Clone,

Splits the collection into two at the given index.

\n

Returns a newly allocated vector containing the elements in the range\n[at, len). After the call, the original vector will be left containing\nthe elements [0, at) with its previous capacity unchanged.

\n
    \n
  • If you want to take ownership of the entire contents and capacity of\nthe vector, see mem::take or mem::replace.
  • \n
  • If you don’t need the returned vector at all, see Vec::truncate.
  • \n
  • If you want to take ownership of an arbitrary subslice, or you don’t\nnecessarily want to store the removed items in a vector, see Vec::drain.
  • \n
\n
§Panics
\n

Panics if at > len.

\n
§Examples
\n
let mut vec = vec![1, 2, 3];\nlet vec2 = vec.split_off(1);\nassert_eq!(vec, [1]);\nassert_eq!(vec2, [2, 3]);
\n
1.33.0 · source

pub fn resize_with<F>(&mut self, new_len: usize, f: F)
where\n F: FnMut() -> T,

Resizes the Vec in-place so that len is equal to new_len.

\n

If new_len is greater than len, the Vec is extended by the\ndifference, with each additional slot filled with the result of\ncalling the closure f. The return values from f will end up\nin the Vec in the order they have been generated.

\n

If new_len is less than len, the Vec is simply truncated.

\n

This method uses a closure to create new values on every push. If\nyou’d rather Clone a given value, use Vec::resize. If you\nwant to use the Default trait to generate values, you can\npass Default::default as the second argument.

\n
§Examples
\n
let mut vec = vec![1, 2, 3];\nvec.resize_with(5, Default::default);\nassert_eq!(vec, [1, 2, 3, 0, 0]);\n\nlet mut vec = vec![];\nlet mut p = 1;\nvec.resize_with(4, || { p *= 2; p });\nassert_eq!(vec, [2, 4, 8, 16]);
\n
1.47.0 · source

pub fn leak<'a>(self) -> &'a mut [T]
where\n A: 'a,

Consumes and leaks the Vec, returning a mutable reference to the contents,\n&'a mut [T]. Note that the type T must outlive the chosen lifetime\n'a. If the type has only static references, or none at all, then this\nmay be chosen to be 'static.

\n

As of Rust 1.57, this method does not reallocate or shrink the Vec,\nso the leaked allocation may include unused capacity that is not part\nof the returned slice.

\n

This function is mainly useful for data that lives for the remainder of\nthe program’s life. Dropping the returned reference will cause a memory\nleak.

\n
§Examples
\n

Simple usage:

\n\n
let x = vec![1, 2, 3];\nlet static_ref: &'static mut [usize] = x.leak();\nstatic_ref[0] += 1;\nassert_eq!(static_ref, &[2, 2, 3]);
\n
1.60.0 · source

pub fn spare_capacity_mut(&mut self) -> &mut [MaybeUninit<T>]

Returns the remaining spare capacity of the vector as a slice of\nMaybeUninit<T>.

\n

The returned slice can be used to fill the vector with data (e.g. by\nreading from a file) before marking the data as initialized using the\nset_len method.

\n
§Examples
\n
// Allocate vector big enough for 10 elements.\nlet mut v = Vec::with_capacity(10);\n\n// Fill in the first 3 elements.\nlet uninit = v.spare_capacity_mut();\nuninit[0].write(0);\nuninit[1].write(1);\nuninit[2].write(2);\n\n// Mark the first 3 elements of the vector as being initialized.\nunsafe {\n    v.set_len(3);\n}\n\nassert_eq!(&v, &[0, 1, 2]);
\n
source

pub fn split_at_spare_mut(&mut self) -> (&mut [T], &mut [MaybeUninit<T>])

🔬This is a nightly-only experimental API. (vec_split_at_spare)

Returns vector content as a slice of T, along with the remaining spare\ncapacity of the vector as a slice of MaybeUninit<T>.

\n

The returned spare capacity slice can be used to fill the vector with data\n(e.g. by reading from a file) before marking the data as initialized using\nthe set_len method.

\n

Note that this is a low-level API, which should be used with care for\noptimization purposes. If you need to append data to a Vec\nyou can use push, extend, extend_from_slice,\nextend_from_within, insert, append, resize or\nresize_with, depending on your exact needs.

\n
§Examples
\n
#![feature(vec_split_at_spare)]\n\nlet mut v = vec![1, 1, 2];\n\n// Reserve additional space big enough for 10 elements.\nv.reserve(10);\n\nlet (init, uninit) = v.split_at_spare_mut();\nlet sum = init.iter().copied().sum::<u32>();\n\n// Fill in the next 4 elements.\nuninit[0].write(sum);\nuninit[1].write(sum * 2);\nuninit[2].write(sum * 3);\nuninit[3].write(sum * 4);\n\n// Mark the 4 elements of the vector as being initialized.\nunsafe {\n    let len = v.len();\n    v.set_len(len + 4);\n}\n\nassert_eq!(&v, &[1, 1, 2, 4, 8, 12, 16]);
\n
",0,"air::interpreter_data::FoldLore"],["
§

impl<Z> Zeroize for Vec<Z>
where\n Z: Zeroize,

§

fn zeroize(&mut self)

“Best effort” zeroization for Vec.

\n

Ensures the entire capacity of the Vec is zeroed. Cannot ensure that\nprevious reallocations did not leave values on the heap.

\n
","Zeroize","air::interpreter_data::FoldLore"],["
source§

impl<T, A> DerefPure for Vec<T, A>
where\n A: Allocator,

","DerefPure","air::interpreter_data::FoldLore"],["
1.0.0 · source§

impl<T, A> Eq for Vec<T, A>
where\n T: Eq,\n A: Allocator,

","Eq","air::interpreter_data::FoldLore"],["
§

impl<Z> ZeroizeOnDrop for Vec<Z>
where\n Z: ZeroizeOnDrop,

","ZeroizeOnDrop","air::interpreter_data::FoldLore"]], +"air_interpreter_data":[["
§

impl<T> Archive for Vec<T>
where\n T: Archive,

§

type Archived = ArchivedVec<<T as Archive>::Archived>

The archived representation of this type. Read more
§

type Resolver = VecResolver

The resolver for this type. It must contain all the additional information from serializing\nneeded to make the archived type from the normal type.
§

unsafe fn resolve(\n &self,\n pos: usize,\n resolver: <Vec<T> as Archive>::Resolver,\n out: *mut <Vec<T> as Archive>::Archived,\n)

Creates the archived version of this value at the given position and writes it to the given\noutput. Read more
","Archive","air_interpreter_data::executed_state::FoldLore"],["
1.5.0 · source§

impl<T, A> AsMut<[T]> for Vec<T, A>
where\n A: Allocator,

source§

fn as_mut(&mut self) -> &mut [T]

Converts this type into a mutable reference of the (usually inferred) input type.
","AsMut<[T]>","air_interpreter_data::executed_state::FoldLore"],["
1.5.0 · source§

impl<T, A> AsMut<Vec<T, A>> for Vec<T, A>
where\n A: Allocator,

source§

fn as_mut(&mut self) -> &mut Vec<T, A>

Converts this type into a mutable reference of the (usually inferred) input type.
","AsMut>","air_interpreter_data::executed_state::FoldLore"],["
1.0.0 · source§

impl<T, A> AsRef<[T]> for Vec<T, A>
where\n A: Allocator,

source§

fn as_ref(&self) -> &[T]

Converts this type into a shared reference of the (usually inferred) input type.
","AsRef<[T]>","air_interpreter_data::executed_state::FoldLore"],["
1.0.0 · source§

impl<T, A> AsRef<Vec<T, A>> for Vec<T, A>
where\n A: Allocator,

source§

fn as_ref(&self) -> &Vec<T, A>

Converts this type into a shared reference of the (usually inferred) input type.
","AsRef>","air_interpreter_data::executed_state::FoldLore"],["
1.0.0 · source§

impl<T, A> Borrow<[T]> for Vec<T, A>
where\n A: Allocator,

source§

fn borrow(&self) -> &[T]

Immutably borrows from an owned value. Read more
","Borrow<[T]>","air_interpreter_data::executed_state::FoldLore"],["
1.0.0 · source§

impl<T, A> BorrowMut<[T]> for Vec<T, A>
where\n A: Allocator,

source§

fn borrow_mut(&mut self) -> &mut [T]

Mutably borrows from an owned value. Read more
","BorrowMut<[T]>","air_interpreter_data::executed_state::FoldLore"],["
§

impl<T> BorshDeserialize for Vec<T>
where\n T: BorshDeserialize,

§

fn deserialize_reader<R>(reader: &mut R) -> Result<Vec<T>, Error>
where\n R: Read,

§

fn deserialize(buf: &mut &[u8]) -> Result<Self, Error>

Deserializes this instance from a given slice of bytes.\nUpdates the buffer to point at the remaining bytes.
§

fn try_from_slice(v: &[u8]) -> Result<Self, Error>

Deserialize this instance from a slice of bytes.
§

fn try_from_reader<R>(reader: &mut R) -> Result<Self, Error>
where\n R: Read,

","BorshDeserialize","air_interpreter_data::executed_state::FoldLore"],["
§

impl<T> BorshSerialize for Vec<T>
where\n T: BorshSerialize,

§

fn serialize<W>(&self, writer: &mut W) -> Result<(), Error>
where\n W: Write,

","BorshSerialize","air_interpreter_data::executed_state::FoldLore"],["
1.0.0 · source§

impl<T, A> Clone for Vec<T, A>
where\n T: Clone,\n A: Allocator + Clone,

source§

fn clone_from(&mut self, source: &Vec<T, A>)

Overwrites the contents of self with a clone of the contents of source.

\n

This method is preferred over simply assigning source.clone() to self,\nas it avoids reallocation if possible. Additionally, if the element type\nT overrides clone_from(), this will reuse the resources of self’s\nelements as well.

\n
§Examples
\n
let x = vec![5, 6, 7];\nlet mut y = vec![8, 9, 10];\nlet yp: *const i32 = y.as_ptr();\n\ny.clone_from(&x);\n\n// The value is the same\nassert_eq!(x, y);\n\n// And no reallocation occurred\nassert_eq!(yp, y.as_ptr());
\n
source§

fn clone(&self) -> Vec<T, A>

Returns a copy of the value. Read more
","Clone","air_interpreter_data::executed_state::FoldLore"],["
1.0.0 · source§

impl<T, A> Debug for Vec<T, A>
where\n T: Debug,\n A: Allocator,

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
","Debug","air_interpreter_data::executed_state::FoldLore"],["
1.0.0 · source§

impl<T> Default for Vec<T>

source§

fn default() -> Vec<T>

Creates an empty Vec<T>.

\n

The vector will not allocate until elements are pushed onto it.

\n
","Default","air_interpreter_data::executed_state::FoldLore"],["
1.0.0 · source§

impl<T, A> Deref for Vec<T, A>
where\n A: Allocator,

§

type Target = [T]

The resulting type after dereferencing.
source§

fn deref(&self) -> &[T]

Dereferences the value.
","Deref","air_interpreter_data::executed_state::FoldLore"],["
1.0.0 · source§

impl<T, A> DerefMut for Vec<T, A>
where\n A: Allocator,

source§

fn deref_mut(&mut self) -> &mut [T]

Mutably dereferences the value.
","DerefMut","air_interpreter_data::executed_state::FoldLore"],["
source§

impl<'de, T> Deserialize<'de> for Vec<T>
where\n T: Deserialize<'de>,

source§

fn deserialize<D>(\n deserializer: D,\n) -> Result<Vec<T>, <D as Deserializer<'de>>::Error>
where\n D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
","Deserialize<'de>","air_interpreter_data::executed_state::FoldLore"],["
1.0.0 · source§

impl<T, A> Drop for Vec<T, A>
where\n A: Allocator,

source§

fn drop(&mut self)

Executes the destructor for this type. Read more
","Drop","air_interpreter_data::executed_state::FoldLore"],["
1.2.0 · source§

impl<'a, T, A> Extend<&'a T> for Vec<T, A>
where\n T: Copy + 'a,\n A: Allocator,

Extend implementation that copies elements out of references before pushing them onto the Vec.

\n

This implementation is specialized for slice iterators, where it uses copy_from_slice to\nappend the entire slice at once.

\n
source§

fn extend<I>(&mut self, iter: I)
where\n I: IntoIterator<Item = &'a T>,

Extends a collection with the contents of an iterator. Read more
source§

fn extend_one(&mut self, _: &'a T)

🔬This is a nightly-only experimental API. (extend_one)
Extends a collection with exactly one element.
source§

fn extend_reserve(&mut self, additional: usize)

🔬This is a nightly-only experimental API. (extend_one)
Reserves capacity in a collection for the given number of additional elements. Read more
","Extend<&'a T>","air_interpreter_data::executed_state::FoldLore"],["
1.0.0 · source§

impl<T, A> Extend<T> for Vec<T, A>
where\n A: Allocator,

source§

fn extend<I>(&mut self, iter: I)
where\n I: IntoIterator<Item = T>,

Extends a collection with the contents of an iterator. Read more
source§

fn extend_one(&mut self, item: T)

🔬This is a nightly-only experimental API. (extend_one)
Extends a collection with exactly one element.
source§

fn extend_reserve(&mut self, additional: usize)

🔬This is a nightly-only experimental API. (extend_one)
Reserves capacity in a collection for the given number of additional elements. Read more
","Extend","air_interpreter_data::executed_state::FoldLore"],["
1.0.0 · source§

impl<T> From<&[T]> for Vec<T>
where\n T: Clone,

source§

fn from(s: &[T]) -> Vec<T>

Allocate a Vec<T> and fill it by cloning s’s items.

\n
§Examples
\n
assert_eq!(Vec::from(&[1, 2, 3][..]), vec![1, 2, 3]);
\n
","From<&[T]>","air_interpreter_data::executed_state::FoldLore"],["
1.74.0 · source§

impl<T, const N: usize> From<&[T; N]> for Vec<T>
where\n T: Clone,

source§

fn from(s: &[T; N]) -> Vec<T>

Allocate a Vec<T> and fill it by cloning s’s items.

\n
§Examples
\n
assert_eq!(Vec::from(&[1, 2, 3]), vec![1, 2, 3]);
\n
","From<&[T; N]>","air_interpreter_data::executed_state::FoldLore"],["
1.19.0 · source§

impl<T> From<&mut [T]> for Vec<T>
where\n T: Clone,

source§

fn from(s: &mut [T]) -> Vec<T>

Allocate a Vec<T> and fill it by cloning s’s items.

\n
§Examples
\n
assert_eq!(Vec::from(&mut [1, 2, 3][..]), vec![1, 2, 3]);
\n
","From<&mut [T]>","air_interpreter_data::executed_state::FoldLore"],["
1.74.0 · source§

impl<T, const N: usize> From<&mut [T; N]> for Vec<T>
where\n T: Clone,

source§

fn from(s: &mut [T; N]) -> Vec<T>

Allocate a Vec<T> and fill it by cloning s’s items.

\n
§Examples
\n
assert_eq!(Vec::from(&mut [1, 2, 3]), vec![1, 2, 3]);
\n
","From<&mut [T; N]>","air_interpreter_data::executed_state::FoldLore"],["
1.44.0 · source§

impl<T, const N: usize> From<[T; N]> for Vec<T>

source§

fn from(s: [T; N]) -> Vec<T>

Allocate a Vec<T> and move s’s items into it.

\n
§Examples
\n
assert_eq!(Vec::from([1, 2, 3]), vec![1, 2, 3]);
\n
","From<[T; N]>","air_interpreter_data::executed_state::FoldLore"],["
1.5.0 · source§

impl<T, A> From<BinaryHeap<T, A>> for Vec<T, A>
where\n A: Allocator,

source§

fn from(heap: BinaryHeap<T, A>) -> Vec<T, A>

Converts a BinaryHeap<T> into a Vec<T>.

\n

This conversion requires no data movement or allocation, and has\nconstant time complexity.

\n
","From>","air_interpreter_data::executed_state::FoldLore"],["
1.18.0 · source§

impl<T, A> From<Box<[T], A>> for Vec<T, A>
where\n A: Allocator,

source§

fn from(s: Box<[T], A>) -> Vec<T, A>

Convert a boxed slice into a vector by transferring ownership of\nthe existing heap allocation.

\n
§Examples
\n
let b: Box<[i32]> = vec![1, 2, 3].into_boxed_slice();\nassert_eq!(Vec::from(b), vec![1, 2, 3]);
\n
","From>","air_interpreter_data::executed_state::FoldLore"],["
1.14.0 · source§

impl<'a, T> From<Cow<'a, [T]>> for Vec<T>
where\n [T]: ToOwned<Owned = Vec<T>>,

source§

fn from(s: Cow<'a, [T]>) -> Vec<T>

Convert a clone-on-write slice into a vector.

\n

If s already owns a Vec<T>, it will be returned directly.\nIf s is borrowing a slice, a new Vec<T> will be allocated and\nfilled by cloning s’s items into it.

\n
§Examples
\n
let o: Cow<'_, [i32]> = Cow::Owned(vec![1, 2, 3]);\nlet b: Cow<'_, [i32]> = Cow::Borrowed(&[1, 2, 3]);\nassert_eq!(Vec::from(o), Vec::from(b));
\n
","From>","air_interpreter_data::executed_state::FoldLore"],["
1.10.0 · source§

impl<T, A> From<VecDeque<T, A>> for Vec<T, A>
where\n A: Allocator,

source§

fn from(other: VecDeque<T, A>) -> Vec<T, A>

Turn a VecDeque<T> into a Vec<T>.

\n

This never needs to re-allocate, but does need to do O(n) data movement if\nthe circular buffer doesn’t happen to be at the beginning of the allocation.

\n
§Examples
\n
use std::collections::VecDeque;\n\n// This one is *O*(1).\nlet deque: VecDeque<_> = (1..5).collect();\nlet ptr = deque.as_slices().0.as_ptr();\nlet vec = Vec::from(deque);\nassert_eq!(vec, [1, 2, 3, 4]);\nassert_eq!(vec.as_ptr(), ptr);\n\n// This one needs data rearranging.\nlet mut deque: VecDeque<_> = (1..5).collect();\ndeque.push_front(9);\ndeque.push_front(8);\nlet ptr = deque.as_slices().1.as_ptr();\nlet vec = Vec::from(deque);\nassert_eq!(vec, [8, 9, 1, 2, 3, 4]);\nassert_eq!(vec.as_ptr(), ptr);
\n
","From>","air_interpreter_data::executed_state::FoldLore"],["
§

impl<T> FromDerObject for Vec<T>
where\n T: FromDerObject,

§

fn from_der_object(der_object: DerObject) -> Result<Vec<T>, Asn1DerError>

Converts der_object into Self
§

fn deserialize<'a>(\n source: impl Iterator<Item = &'a u8>,\n) -> Result<Self, Asn1DerError>

DER-deserializes the data from source
","FromDerObject","air_interpreter_data::executed_state::FoldLore"],["
1.0.0 · source§

impl<T> FromIterator<T> for Vec<T>

Collects an iterator into a Vec, commonly called via Iterator::collect()

\n

§Allocation behavior

\n

In general Vec does not guarantee any particular growth or allocation strategy.\nThat also applies to this trait impl.

\n

Note: This section covers implementation details and is therefore exempt from\nstability guarantees.

\n

Vec may use any or none of the following strategies,\ndepending on the supplied iterator:

\n
    \n
  • preallocate based on Iterator::size_hint()\n
      \n
    • and panic if the number of items is outside the provided lower/upper bounds
    • \n
    \n
  • \n
  • use an amortized growth strategy similar to pushing one item at a time
  • \n
  • perform the iteration in-place on the original allocation backing the iterator
  • \n
\n

The last case warrants some attention. It is an optimization that in many cases reduces peak memory\nconsumption and improves cache locality. But when big, short-lived allocations are created,\nonly a small fraction of their items get collected, no further use is made of the spare capacity\nand the resulting Vec is moved into a longer-lived structure, then this can lead to the large\nallocations having their lifetimes unnecessarily extended which can result in increased memory\nfootprint.

\n

In cases where this is an issue, the excess capacity can be discarded with Vec::shrink_to(),\nVec::shrink_to_fit() or by collecting into Box<[T]> instead, which additionally reduces\nthe size of the long-lived struct.

\n\n
static LONG_LIVED: Mutex<Vec<Vec<u16>>> = Mutex::new(Vec::new());\n\nfor i in 0..10 {\n    let big_temporary: Vec<u16> = (0..1024).collect();\n    // discard most items\n    let mut result: Vec<_> = big_temporary.into_iter().filter(|i| i % 100 == 0).collect();\n    // without this a lot of unused capacity might be moved into the global\n    result.shrink_to_fit();\n    LONG_LIVED.lock().unwrap().push(result);\n}
\n
source§

fn from_iter<I>(iter: I) -> Vec<T>
where\n I: IntoIterator<Item = T>,

Creates a value from an iterator. Read more
","FromIterator","air_interpreter_data::executed_state::FoldLore"],["
1.0.0 · source§

impl<T, A> Hash for Vec<T, A>
where\n T: Hash,\n A: Allocator,

The hash of a vector is the same as that of the corresponding slice,\nas required by the core::borrow::Borrow implementation.

\n\n
use std::hash::BuildHasher;\n\nlet b = std::hash::RandomState::new();\nlet v: Vec<u8> = vec![0xa8, 0x3c, 0x09];\nlet s: &[u8] = &[0xa8, 0x3c, 0x09];\nassert_eq!(b.hash_one(v), b.hash_one(s));
\n
source§

fn hash<H>(&self, state: &mut H)
where\n H: Hasher,

Feeds this value into the given Hasher. Read more
1.3.0 · source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where\n H: Hasher,\n Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
","Hash","air_interpreter_data::executed_state::FoldLore"],["
1.0.0 · source§

impl<T, I, A> Index<I> for Vec<T, A>
where\n I: SliceIndex<[T]>,\n A: Allocator,

§

type Output = <I as SliceIndex<[T]>>::Output

The returned type after indexing.
source§

fn index(&self, index: I) -> &<Vec<T, A> as Index<I>>::Output

Performs the indexing (container[index]) operation. Read more
","Index","air_interpreter_data::executed_state::FoldLore"],["
1.0.0 · source§

impl<T, I, A> IndexMut<I> for Vec<T, A>
where\n I: SliceIndex<[T]>,\n A: Allocator,

source§

fn index_mut(&mut self, index: I) -> &mut <Vec<T, A> as Index<I>>::Output

Performs the mutable indexing (container[index]) operation. Read more
","IndexMut","air_interpreter_data::executed_state::FoldLore"],["
§

impl<T> IntoDerObject for Vec<T>
where\n T: IntoDerObject,

§

fn into_der_object(self) -> DerObject

Converts self into a DER object
§

fn serialized_len(&self) -> usize

Efficiently computes the length of the DER-serialized representation of self
§

fn serialize<'a>(\n self,\n buf: impl Iterator<Item = &'a mut u8>,\n) -> Result<usize, Asn1DerError>

DER-serializes self into buf and returns the amount of bytes written
","IntoDerObject","air_interpreter_data::executed_state::FoldLore"],["
source§

impl<'de, T, E> IntoDeserializer<'de, E> for Vec<T>
where\n T: IntoDeserializer<'de, E>,\n E: Error,

§

type Deserializer = SeqDeserializer<<Vec<T> as IntoIterator>::IntoIter, E>

The type of the deserializer being converted into.
source§

fn into_deserializer(self) -> <Vec<T> as IntoDeserializer<'de, E>>::Deserializer

Convert this value into a deserializer.
","IntoDeserializer<'de, E>","air_interpreter_data::executed_state::FoldLore"],["
1.0.0 · source§

impl<T, A> IntoIterator for Vec<T, A>
where\n A: Allocator,

source§

fn into_iter(self) -> <Vec<T, A> as IntoIterator>::IntoIter

Creates a consuming iterator, that is, one that moves each value out of\nthe vector (from start to end). The vector cannot be used after calling\nthis.

\n
§Examples
\n
let v = vec![\"a\".to_string(), \"b\".to_string()];\nlet mut v_iter = v.into_iter();\n\nlet first_element: Option<String> = v_iter.next();\n\nassert_eq!(first_element, Some(\"a\".to_string()));\nassert_eq!(v_iter.next(), Some(\"b\".to_string()));\nassert_eq!(v_iter.next(), None);
\n
§

type Item = T

The type of the elements being iterated over.
§

type IntoIter = IntoIter<T, A>

Which kind of iterator are we turning this into?
","IntoIterator","air_interpreter_data::executed_state::FoldLore"],["
1.0.0 · source§

impl<T, A> Ord for Vec<T, A>
where\n T: Ord,\n A: Allocator,

Implements ordering of vectors, lexicographically.

\n
source§

fn cmp(&self, other: &Vec<T, A>) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · source§

fn max(self, other: Self) -> Self
where\n Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · source§

fn min(self, other: Self) -> Self
where\n Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · source§

fn clamp(self, min: Self, max: Self) -> Self
where\n Self: Sized + PartialOrd,

Restrict a value to a certain interval. Read more
","Ord","air_interpreter_data::executed_state::FoldLore"],["
1.0.0 · source§

impl<T, U, A> PartialEq<&[U]> for Vec<T, A>
where\n A: Allocator,\n T: PartialEq<U>,

source§

fn eq(&self, other: &&[U]) -> bool

This method tests for self and other values to be equal, and is used\nby ==.
source§

fn ne(&self, other: &&[U]) -> bool

This method tests for !=. The default implementation is almost always\nsufficient, and should not be overridden without very good reason.
","PartialEq<&[U]>","air_interpreter_data::executed_state::FoldLore"],["
1.0.0 · source§

impl<T, U, A, const N: usize> PartialEq<&[U; N]> for Vec<T, A>
where\n A: Allocator,\n T: PartialEq<U>,

source§

fn eq(&self, other: &&[U; N]) -> bool

This method tests for self and other values to be equal, and is used\nby ==.
source§

fn ne(&self, other: &&[U; N]) -> bool

This method tests for !=. The default implementation is almost always\nsufficient, and should not be overridden without very good reason.
","PartialEq<&[U; N]>","air_interpreter_data::executed_state::FoldLore"],["
1.0.0 · source§

impl<T, U, A> PartialEq<&mut [U]> for Vec<T, A>
where\n A: Allocator,\n T: PartialEq<U>,

source§

fn eq(&self, other: &&mut [U]) -> bool

This method tests for self and other values to be equal, and is used\nby ==.
source§

fn ne(&self, other: &&mut [U]) -> bool

This method tests for !=. The default implementation is almost always\nsufficient, and should not be overridden without very good reason.
","PartialEq<&mut [U]>","air_interpreter_data::executed_state::FoldLore"],["
1.48.0 · source§

impl<T, U, A> PartialEq<[U]> for Vec<T, A>
where\n A: Allocator,\n T: PartialEq<U>,

source§

fn eq(&self, other: &[U]) -> bool

This method tests for self and other values to be equal, and is used\nby ==.
source§

fn ne(&self, other: &[U]) -> bool

This method tests for !=. The default implementation is almost always\nsufficient, and should not be overridden without very good reason.
","PartialEq<[U]>","air_interpreter_data::executed_state::FoldLore"],["
1.0.0 · source§

impl<T, U, A, const N: usize> PartialEq<[U; N]> for Vec<T, A>
where\n A: Allocator,\n T: PartialEq<U>,

source§

fn eq(&self, other: &[U; N]) -> bool

This method tests for self and other values to be equal, and is used\nby ==.
source§

fn ne(&self, other: &[U; N]) -> bool

This method tests for !=. The default implementation is almost always\nsufficient, and should not be overridden without very good reason.
","PartialEq<[U; N]>","air_interpreter_data::executed_state::FoldLore"],["
§

impl<T, U> PartialEq<ArchivedVec<U>> for Vec<T>
where\n T: PartialEq<U>,

§

fn eq(&self, other: &ArchivedVec<U>) -> bool

This method tests for self and other values to be equal, and is used\nby ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always\nsufficient, and should not be overridden without very good reason.
","PartialEq>","air_interpreter_data::executed_state::FoldLore"],["
1.0.0 · source§

impl<T, U, A1, A2> PartialEq<Vec<U, A2>> for Vec<T, A1>
where\n A1: Allocator,\n A2: Allocator,\n T: PartialEq<U>,

source§

fn eq(&self, other: &Vec<U, A2>) -> bool

This method tests for self and other values to be equal, and is used\nby ==.
source§

fn ne(&self, other: &Vec<U, A2>) -> bool

This method tests for !=. The default implementation is almost always\nsufficient, and should not be overridden without very good reason.
","PartialEq>","air_interpreter_data::executed_state::FoldLore"],["
§

impl<T> PartialOrd<ArchivedVec<T>> for Vec<T>
where\n T: PartialOrd,

§

fn partial_cmp(&self, other: &ArchivedVec<T>) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · source§

fn lt(&self, other: &Rhs) -> bool

This method tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · source§

fn le(&self, other: &Rhs) -> bool

This method tests less than or equal to (for self and other) and is used by the <=\noperator. Read more
1.0.0 · source§

fn gt(&self, other: &Rhs) -> bool

This method tests greater than (for self and other) and is used by the > operator. Read more
1.0.0 · source§

fn ge(&self, other: &Rhs) -> bool

This method tests greater than or equal to (for self and other) and is used by the >=\noperator. Read more
","PartialOrd>","air_interpreter_data::executed_state::FoldLore"],["
1.0.0 · source§

impl<T, A1, A2> PartialOrd<Vec<T, A2>> for Vec<T, A1>
where\n T: PartialOrd,\n A1: Allocator,\n A2: Allocator,

Implements comparison of vectors, lexicographically.

\n
source§

fn partial_cmp(&self, other: &Vec<T, A2>) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · source§

fn lt(&self, other: &Rhs) -> bool

This method tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · source§

fn le(&self, other: &Rhs) -> bool

This method tests less than or equal to (for self and other) and is used by the <=\noperator. Read more
1.0.0 · source§

fn gt(&self, other: &Rhs) -> bool

This method tests greater than (for self and other) and is used by the > operator. Read more
1.0.0 · source§

fn ge(&self, other: &Rhs) -> bool

This method tests greater than or equal to (for self and other) and is used by the >=\noperator. Read more
","PartialOrd>","air_interpreter_data::executed_state::FoldLore"],["
§

impl<T, S> Serialize<S> for Vec<T>
where\n T: Serialize<S>,\n S: ScratchSpace + Serializer + ?Sized,

§

fn serialize(\n &self,\n serializer: &mut S,\n) -> Result<<Vec<T> as Archive>::Resolver, <S as Fallible>::Error>

Writes the dependencies for the object and returns a resolver that can create the archived\ntype.
","Serialize","air_interpreter_data::executed_state::FoldLore"],["
source§

impl<T> Serialize for Vec<T>
where\n T: Serialize,

source§

fn serialize<S>(\n &self,\n serializer: S,\n) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error>
where\n S: Serializer,

Serialize this value into the given Serde serializer. Read more
","Serialize","air_interpreter_data::executed_state::FoldLore"],["
source§

impl<T> Vec<T>

1.0.0 (const: 1.39.0) · source

pub const fn new() -> Vec<T>

Constructs a new, empty Vec<T>.

\n

The vector will not allocate until elements are pushed onto it.

\n
§Examples
\n
let mut vec: Vec<i32> = Vec::new();
\n
1.0.0 · source

pub fn with_capacity(capacity: usize) -> Vec<T>

Constructs a new, empty Vec<T> with at least the specified capacity.

\n

The vector will be able to hold at least capacity elements without\nreallocating. This method is allowed to allocate for more elements than\ncapacity. If capacity is 0, the vector will not allocate.

\n

It is important to note that although the returned vector has the\nminimum capacity specified, the vector will have a zero length. For\nan explanation of the difference between length and capacity, see\nCapacity and reallocation.

\n

If it is important to know the exact allocated capacity of a Vec,\nalways use the capacity method after construction.

\n

For Vec<T> where T is a zero-sized type, there will be no allocation\nand the capacity will always be usize::MAX.

\n
§Panics
\n

Panics if the new capacity exceeds isize::MAX bytes.

\n
§Examples
\n
let mut vec = Vec::with_capacity(10);\n\n// The vector contains no items, even though it has capacity for more\nassert_eq!(vec.len(), 0);\nassert!(vec.capacity() >= 10);\n\n// These are all done without reallocating...\nfor i in 0..10 {\n    vec.push(i);\n}\nassert_eq!(vec.len(), 10);\nassert!(vec.capacity() >= 10);\n\n// ...but this may make the vector reallocate\nvec.push(11);\nassert_eq!(vec.len(), 11);\nassert!(vec.capacity() >= 11);\n\n// A vector of a zero-sized type will always over-allocate, since no\n// allocation is necessary\nlet vec_units = Vec::<()>::with_capacity(10);\nassert_eq!(vec_units.capacity(), usize::MAX);
\n
source

pub fn try_with_capacity(capacity: usize) -> Result<Vec<T>, TryReserveError>

🔬This is a nightly-only experimental API. (try_with_capacity)

Constructs a new, empty Vec<T> with at least the specified capacity.

\n

The vector will be able to hold at least capacity elements without\nreallocating. This method is allowed to allocate for more elements than\ncapacity. If capacity is 0, the vector will not allocate.

\n
§Errors
\n

Returns an error if the capacity exceeds isize::MAX bytes,\nor if the allocator reports allocation failure.

\n
1.0.0 · source

pub unsafe fn from_raw_parts(\n ptr: *mut T,\n length: usize,\n capacity: usize,\n) -> Vec<T>

Creates a Vec<T> directly from a pointer, a length, and a capacity.

\n
§Safety
\n

This is highly unsafe, due to the number of invariants that aren’t\nchecked:

\n
    \n
  • ptr must have been allocated using the global allocator, such as via\nthe alloc::alloc function.
  • \n
  • T needs to have the same alignment as what ptr was allocated with.\n(T having a less strict alignment is not sufficient, the alignment really\nneeds to be equal to satisfy the dealloc requirement that memory must be\nallocated and deallocated with the same layout.)
  • \n
  • The size of T times the capacity (ie. the allocated size in bytes) needs\nto be the same size as the pointer was allocated with. (Because similar to\nalignment, dealloc must be called with the same layout size.)
  • \n
  • length needs to be less than or equal to capacity.
  • \n
  • The first length values must be properly initialized values of type T.
  • \n
  • capacity needs to be the capacity that the pointer was allocated with.
  • \n
  • The allocated size in bytes must be no larger than isize::MAX.\nSee the safety documentation of pointer::offset.
  • \n
\n

These requirements are always upheld by any ptr that has been allocated\nvia Vec<T>. Other allocation sources are allowed if the invariants are\nupheld.

\n

Violating these may cause problems like corrupting the allocator’s\ninternal data structures. For example it is normally not safe\nto build a Vec<u8> from a pointer to a C char array with length\nsize_t, doing so is only safe if the array was initially allocated by\na Vec or String.\nIt’s also not safe to build one from a Vec<u16> and its length, because\nthe allocator cares about the alignment, and these two types have different\nalignments. The buffer was allocated with alignment 2 (for u16), but after\nturning it into a Vec<u8> it’ll be deallocated with alignment 1. To avoid\nthese issues, it is often preferable to do casting/transmuting using\nslice::from_raw_parts instead.

\n

The ownership of ptr is effectively transferred to the\nVec<T> which may then deallocate, reallocate or change the\ncontents of memory pointed to by the pointer at will. Ensure\nthat nothing else uses the pointer after calling this\nfunction.

\n
§Examples
\n
use std::ptr;\nuse std::mem;\n\nlet v = vec![1, 2, 3];\n\n// Prevent running `v`'s destructor so we are in complete control\n// of the allocation.\nlet mut v = mem::ManuallyDrop::new(v);\n\n// Pull out the various important pieces of information about `v`\nlet p = v.as_mut_ptr();\nlet len = v.len();\nlet cap = v.capacity();\n\nunsafe {\n    // Overwrite memory with 4, 5, 6\n    for i in 0..len {\n        ptr::write(p.add(i), 4 + i);\n    }\n\n    // Put everything back together into a Vec\n    let rebuilt = Vec::from_raw_parts(p, len, cap);\n    assert_eq!(rebuilt, [4, 5, 6]);\n}
\n

Using memory that was allocated elsewhere:

\n\n
use std::alloc::{alloc, Layout};\n\nfn main() {\n    let layout = Layout::array::<u32>(16).expect(\"overflow cannot happen\");\n\n    let vec = unsafe {\n        let mem = alloc(layout).cast::<u32>();\n        if mem.is_null() {\n            return;\n        }\n\n        mem.write(1_000_000);\n\n        Vec::from_raw_parts(mem, 1, 16)\n    };\n\n    assert_eq!(vec, &[1_000_000]);\n    assert_eq!(vec.capacity(), 16);\n}
\n
",0,"air_interpreter_data::executed_state::FoldLore"],["
source§

impl<T, A> Vec<T, A>
where\n T: Clone,\n A: Allocator,

1.5.0 · source

pub fn resize(&mut self, new_len: usize, value: T)

Resizes the Vec in-place so that len is equal to new_len.

\n

If new_len is greater than len, the Vec is extended by the\ndifference, with each additional slot filled with value.\nIf new_len is less than len, the Vec is simply truncated.

\n

This method requires T to implement Clone,\nin order to be able to clone the passed value.\nIf you need more flexibility (or want to rely on Default instead of\nClone), use Vec::resize_with.\nIf you only need to resize to a smaller size, use Vec::truncate.

\n
§Examples
\n
let mut vec = vec![\"hello\"];\nvec.resize(3, \"world\");\nassert_eq!(vec, [\"hello\", \"world\", \"world\"]);\n\nlet mut vec = vec![1, 2, 3, 4];\nvec.resize(2, 0);\nassert_eq!(vec, [1, 2]);
\n
1.6.0 · source

pub fn extend_from_slice(&mut self, other: &[T])

Clones and appends all elements in a slice to the Vec.

\n

Iterates over the slice other, clones each element, and then appends\nit to this Vec. The other slice is traversed in-order.

\n

Note that this function is same as extend except that it is\nspecialized to work with slices instead. If and when Rust gets\nspecialization this function will likely be deprecated (but still\navailable).

\n
§Examples
\n
let mut vec = vec![1];\nvec.extend_from_slice(&[2, 3, 4]);\nassert_eq!(vec, [1, 2, 3, 4]);
\n
1.53.0 · source

pub fn extend_from_within<R>(&mut self, src: R)
where\n R: RangeBounds<usize>,

Copies elements from src range to the end of the vector.

\n
§Panics
\n

Panics if the starting point is greater than the end point or if\nthe end point is greater than the length of the vector.

\n
§Examples
\n
let mut vec = vec![0, 1, 2, 3, 4];\n\nvec.extend_from_within(2..);\nassert_eq!(vec, [0, 1, 2, 3, 4, 2, 3, 4]);\n\nvec.extend_from_within(..2);\nassert_eq!(vec, [0, 1, 2, 3, 4, 2, 3, 4, 0, 1]);\n\nvec.extend_from_within(4..8);\nassert_eq!(vec, [0, 1, 2, 3, 4, 2, 3, 4, 0, 1, 4, 2, 3, 4]);
\n
",0,"air_interpreter_data::executed_state::FoldLore"],["
source§

impl<T, A> Vec<T, A>
where\n T: PartialEq,\n A: Allocator,

1.0.0 · source

pub fn dedup(&mut self)

Removes consecutive repeated elements in the vector according to the\nPartialEq trait implementation.

\n

If the vector is sorted, this removes all duplicates.

\n
§Examples
\n
let mut vec = vec![1, 2, 2, 3, 2];\n\nvec.dedup();\n\nassert_eq!(vec, [1, 2, 3, 2]);
\n
",0,"air_interpreter_data::executed_state::FoldLore"],["
source§

impl<T, A> Vec<T, A>
where\n A: Allocator,

1.21.0 · source

pub fn splice<R, I>(\n &mut self,\n range: R,\n replace_with: I,\n) -> Splice<'_, <I as IntoIterator>::IntoIter, A>
where\n R: RangeBounds<usize>,\n I: IntoIterator<Item = T>,

Creates a splicing iterator that replaces the specified range in the vector\nwith the given replace_with iterator and yields the removed items.\nreplace_with does not need to be the same length as range.

\n

range is removed even if the iterator is not consumed until the end.

\n

It is unspecified how many elements are removed from the vector\nif the Splice value is leaked.

\n

The input iterator replace_with is only consumed when the Splice value is dropped.

\n

This is optimal if:

\n
    \n
  • The tail (elements in the vector after range) is empty,
  • \n
  • or replace_with yields fewer or equal elements than range’s length
  • \n
  • or the lower bound of its size_hint() is exact.
  • \n
\n

Otherwise, a temporary vector is allocated and the tail is moved twice.

\n
§Panics
\n

Panics if the starting point is greater than the end point or if\nthe end point is greater than the length of the vector.

\n
§Examples
\n
let mut v = vec![1, 2, 3, 4];\nlet new = [7, 8, 9];\nlet u: Vec<_> = v.splice(1..3, new).collect();\nassert_eq!(v, &[1, 7, 8, 9, 4]);\nassert_eq!(u, &[2, 3]);
\n
source

pub fn extract_if<F>(&mut self, filter: F) -> ExtractIf<'_, T, F, A>
where\n F: FnMut(&mut T) -> bool,

🔬This is a nightly-only experimental API. (extract_if)

Creates an iterator which uses a closure to determine if an element should be removed.

\n

If the closure returns true, then the element is removed and yielded.\nIf the closure returns false, the element will remain in the vector and will not be yielded\nby the iterator.

\n

If the returned ExtractIf is not exhausted, e.g. because it is dropped without iterating\nor the iteration short-circuits, then the remaining elements will be retained.\nUse retain with a negated predicate if you do not need the returned iterator.

\n

Using this method is equivalent to the following code:

\n\n
let mut i = 0;\nwhile i < vec.len() {\n    if some_predicate(&mut vec[i]) {\n        let val = vec.remove(i);\n        // your code here\n    } else {\n        i += 1;\n    }\n}\n
\n

But extract_if is easier to use. extract_if is also more efficient,\nbecause it can backshift the elements of the array in bulk.

\n

Note that extract_if also lets you mutate every element in the filter closure,\nregardless of whether you choose to keep or remove it.

\n
§Examples
\n

Splitting an array into evens and odds, reusing the original allocation:

\n\n
#![feature(extract_if)]\nlet mut numbers = vec![1, 2, 3, 4, 5, 6, 8, 9, 11, 13, 14, 15];\n\nlet evens = numbers.extract_if(|x| *x % 2 == 0).collect::<Vec<_>>();\nlet odds = numbers;\n\nassert_eq!(evens, vec![2, 4, 6, 8, 14]);\nassert_eq!(odds, vec![1, 3, 5, 9, 11, 13, 15]);
\n
",0,"air_interpreter_data::executed_state::FoldLore"],["
source§

impl<T, A> Vec<T, A>
where\n A: Allocator,

source

pub const fn new_in(alloc: A) -> Vec<T, A>

🔬This is a nightly-only experimental API. (allocator_api)

Constructs a new, empty Vec<T, A>.

\n

The vector will not allocate until elements are pushed onto it.

\n
§Examples
\n
#![feature(allocator_api)]\n\nuse std::alloc::System;\n\nlet mut vec: Vec<i32, _> = Vec::new_in(System);
\n
source

pub fn with_capacity_in(capacity: usize, alloc: A) -> Vec<T, A>

🔬This is a nightly-only experimental API. (allocator_api)

Constructs a new, empty Vec<T, A> with at least the specified capacity\nwith the provided allocator.

\n

The vector will be able to hold at least capacity elements without\nreallocating. This method is allowed to allocate for more elements than\ncapacity. If capacity is 0, the vector will not allocate.

\n

It is important to note that although the returned vector has the\nminimum capacity specified, the vector will have a zero length. For\nan explanation of the difference between length and capacity, see\nCapacity and reallocation.

\n

If it is important to know the exact allocated capacity of a Vec,\nalways use the capacity method after construction.

\n

For Vec<T, A> where T is a zero-sized type, there will be no allocation\nand the capacity will always be usize::MAX.

\n
§Panics
\n

Panics if the new capacity exceeds isize::MAX bytes.

\n
§Examples
\n
#![feature(allocator_api)]\n\nuse std::alloc::System;\n\nlet mut vec = Vec::with_capacity_in(10, System);\n\n// The vector contains no items, even though it has capacity for more\nassert_eq!(vec.len(), 0);\nassert!(vec.capacity() >= 10);\n\n// These are all done without reallocating...\nfor i in 0..10 {\n    vec.push(i);\n}\nassert_eq!(vec.len(), 10);\nassert!(vec.capacity() >= 10);\n\n// ...but this may make the vector reallocate\nvec.push(11);\nassert_eq!(vec.len(), 11);\nassert!(vec.capacity() >= 11);\n\n// A vector of a zero-sized type will always over-allocate, since no\n// allocation is necessary\nlet vec_units = Vec::<(), System>::with_capacity_in(10, System);\nassert_eq!(vec_units.capacity(), usize::MAX);
\n
source

pub fn try_with_capacity_in(\n capacity: usize,\n alloc: A,\n) -> Result<Vec<T, A>, TryReserveError>

🔬This is a nightly-only experimental API. (allocator_api)

Constructs a new, empty Vec<T, A> with at least the specified capacity\nwith the provided allocator.

\n

The vector will be able to hold at least capacity elements without\nreallocating. This method is allowed to allocate for more elements than\ncapacity. If capacity is 0, the vector will not allocate.

\n
§Errors
\n

Returns an error if the capacity exceeds isize::MAX bytes,\nor if the allocator reports allocation failure.

\n
source

pub unsafe fn from_raw_parts_in(\n ptr: *mut T,\n length: usize,\n capacity: usize,\n alloc: A,\n) -> Vec<T, A>

🔬This is a nightly-only experimental API. (allocator_api)

Creates a Vec<T, A> directly from a pointer, a length, a capacity,\nand an allocator.

\n
§Safety
\n

This is highly unsafe, due to the number of invariants that aren’t\nchecked:

\n
    \n
  • ptr must be currently allocated via the given allocator alloc.
  • \n
  • T needs to have the same alignment as what ptr was allocated with.\n(T having a less strict alignment is not sufficient, the alignment really\nneeds to be equal to satisfy the dealloc requirement that memory must be\nallocated and deallocated with the same layout.)
  • \n
  • The size of T times the capacity (ie. the allocated size in bytes) needs\nto be the same size as the pointer was allocated with. (Because similar to\nalignment, dealloc must be called with the same layout size.)
  • \n
  • length needs to be less than or equal to capacity.
  • \n
  • The first length values must be properly initialized values of type T.
  • \n
  • capacity needs to fit the layout size that the pointer was allocated with.
  • \n
  • The allocated size in bytes must be no larger than isize::MAX.\nSee the safety documentation of pointer::offset.
  • \n
\n

These requirements are always upheld by any ptr that has been allocated\nvia Vec<T, A>. Other allocation sources are allowed if the invariants are\nupheld.

\n

Violating these may cause problems like corrupting the allocator’s\ninternal data structures. For example it is not safe\nto build a Vec<u8> from a pointer to a C char array with length size_t.\nIt’s also not safe to build one from a Vec<u16> and its length, because\nthe allocator cares about the alignment, and these two types have different\nalignments. The buffer was allocated with alignment 2 (for u16), but after\nturning it into a Vec<u8> it’ll be deallocated with alignment 1.

\n

The ownership of ptr is effectively transferred to the\nVec<T> which may then deallocate, reallocate or change the\ncontents of memory pointed to by the pointer at will. Ensure\nthat nothing else uses the pointer after calling this\nfunction.

\n
§Examples
\n
#![feature(allocator_api)]\n\nuse std::alloc::System;\n\nuse std::ptr;\nuse std::mem;\n\nlet mut v = Vec::with_capacity_in(3, System);\nv.push(1);\nv.push(2);\nv.push(3);\n\n// Prevent running `v`'s destructor so we are in complete control\n// of the allocation.\nlet mut v = mem::ManuallyDrop::new(v);\n\n// Pull out the various important pieces of information about `v`\nlet p = v.as_mut_ptr();\nlet len = v.len();\nlet cap = v.capacity();\nlet alloc = v.allocator();\n\nunsafe {\n    // Overwrite memory with 4, 5, 6\n    for i in 0..len {\n        ptr::write(p.add(i), 4 + i);\n    }\n\n    // Put everything back together into a Vec\n    let rebuilt = Vec::from_raw_parts_in(p, len, cap, alloc.clone());\n    assert_eq!(rebuilt, [4, 5, 6]);\n}
\n

Using memory that was allocated elsewhere:

\n\n
#![feature(allocator_api)]\n\nuse std::alloc::{AllocError, Allocator, Global, Layout};\n\nfn main() {\n    let layout = Layout::array::<u32>(16).expect(\"overflow cannot happen\");\n\n    let vec = unsafe {\n        let mem = match Global.allocate(layout) {\n            Ok(mem) => mem.cast::<u32>().as_ptr(),\n            Err(AllocError) => return,\n        };\n\n        mem.write(1_000_000);\n\n        Vec::from_raw_parts_in(mem, 1, 16, Global)\n    };\n\n    assert_eq!(vec, &[1_000_000]);\n    assert_eq!(vec.capacity(), 16);\n}
\n
source

pub fn into_raw_parts(self) -> (*mut T, usize, usize)

🔬This is a nightly-only experimental API. (vec_into_raw_parts)

Decomposes a Vec<T> into its raw components: (pointer, length, capacity).

\n

Returns the raw pointer to the underlying data, the length of\nthe vector (in elements), and the allocated capacity of the\ndata (in elements). These are the same arguments in the same\norder as the arguments to from_raw_parts.

\n

After calling this function, the caller is responsible for the\nmemory previously managed by the Vec. The only way to do\nthis is to convert the raw pointer, length, and capacity back\ninto a Vec with the from_raw_parts function, allowing\nthe destructor to perform the cleanup.

\n
§Examples
\n
#![feature(vec_into_raw_parts)]\nlet v: Vec<i32> = vec![-1, 0, 1];\n\nlet (ptr, len, cap) = v.into_raw_parts();\n\nlet rebuilt = unsafe {\n    // We can now make changes to the components, such as\n    // transmuting the raw pointer to a compatible type.\n    let ptr = ptr as *mut u32;\n\n    Vec::from_raw_parts(ptr, len, cap)\n};\nassert_eq!(rebuilt, [4294967295, 0, 1]);
\n
source

pub fn into_raw_parts_with_alloc(self) -> (*mut T, usize, usize, A)

🔬This is a nightly-only experimental API. (allocator_api)

Decomposes a Vec<T> into its raw components: (pointer, length, capacity, allocator).

\n

Returns the raw pointer to the underlying data, the length of the vector (in elements),\nthe allocated capacity of the data (in elements), and the allocator. These are the same\narguments in the same order as the arguments to from_raw_parts_in.

\n

After calling this function, the caller is responsible for the\nmemory previously managed by the Vec. The only way to do\nthis is to convert the raw pointer, length, and capacity back\ninto a Vec with the from_raw_parts_in function, allowing\nthe destructor to perform the cleanup.

\n
§Examples
\n
#![feature(allocator_api, vec_into_raw_parts)]\n\nuse std::alloc::System;\n\nlet mut v: Vec<i32, System> = Vec::new_in(System);\nv.push(-1);\nv.push(0);\nv.push(1);\n\nlet (ptr, len, cap, alloc) = v.into_raw_parts_with_alloc();\n\nlet rebuilt = unsafe {\n    // We can now make changes to the components, such as\n    // transmuting the raw pointer to a compatible type.\n    let ptr = ptr as *mut u32;\n\n    Vec::from_raw_parts_in(ptr, len, cap, alloc)\n};\nassert_eq!(rebuilt, [4294967295, 0, 1]);
\n
1.0.0 · source

pub fn capacity(&self) -> usize

Returns the total number of elements the vector can hold without\nreallocating.

\n
§Examples
\n
let mut vec: Vec<i32> = Vec::with_capacity(10);\nvec.push(42);\nassert!(vec.capacity() >= 10);
\n
1.0.0 · source

pub fn reserve(&mut self, additional: usize)

Reserves capacity for at least additional more elements to be inserted\nin the given Vec<T>. The collection may reserve more space to\nspeculatively avoid frequent reallocations. After calling reserve,\ncapacity will be greater than or equal to self.len() + additional.\nDoes nothing if capacity is already sufficient.

\n
§Panics
\n

Panics if the new capacity exceeds isize::MAX bytes.

\n
§Examples
\n
let mut vec = vec![1];\nvec.reserve(10);\nassert!(vec.capacity() >= 11);
\n
1.0.0 · source

pub fn reserve_exact(&mut self, additional: usize)

Reserves the minimum capacity for at least additional more elements to\nbe inserted in the given Vec<T>. Unlike reserve, this will not\ndeliberately over-allocate to speculatively avoid frequent allocations.\nAfter calling reserve_exact, capacity will be greater than or equal to\nself.len() + additional. Does nothing if the capacity is already\nsufficient.

\n

Note that the allocator may give the collection more space than it\nrequests. Therefore, capacity can not be relied upon to be precisely\nminimal. Prefer reserve if future insertions are expected.

\n
§Panics
\n

Panics if the new capacity exceeds isize::MAX bytes.

\n
§Examples
\n
let mut vec = vec![1];\nvec.reserve_exact(10);\nassert!(vec.capacity() >= 11);
\n
1.57.0 · source

pub fn try_reserve(&mut self, additional: usize) -> Result<(), TryReserveError>

Tries to reserve capacity for at least additional more elements to be inserted\nin the given Vec<T>. The collection may reserve more space to speculatively avoid\nfrequent reallocations. After calling try_reserve, capacity will be\ngreater than or equal to self.len() + additional if it returns\nOk(()). Does nothing if capacity is already sufficient. This method\npreserves the contents even if an error occurs.

\n
§Errors
\n

If the capacity overflows, or the allocator reports a failure, then an error\nis returned.

\n
§Examples
\n
use std::collections::TryReserveError;\n\nfn process_data(data: &[u32]) -> Result<Vec<u32>, TryReserveError> {\n    let mut output = Vec::new();\n\n    // Pre-reserve the memory, exiting if we can't\n    output.try_reserve(data.len())?;\n\n    // Now we know this can't OOM in the middle of our complex work\n    output.extend(data.iter().map(|&val| {\n        val * 2 + 5 // very complicated\n    }));\n\n    Ok(output)\n}
\n
1.57.0 · source

pub fn try_reserve_exact(\n &mut self,\n additional: usize,\n) -> Result<(), TryReserveError>

Tries to reserve the minimum capacity for at least additional\nelements to be inserted in the given Vec<T>. Unlike try_reserve,\nthis will not deliberately over-allocate to speculatively avoid frequent\nallocations. After calling try_reserve_exact, capacity will be greater\nthan or equal to self.len() + additional if it returns Ok(()).\nDoes nothing if the capacity is already sufficient.

\n

Note that the allocator may give the collection more space than it\nrequests. Therefore, capacity can not be relied upon to be precisely\nminimal. Prefer try_reserve if future insertions are expected.

\n
§Errors
\n

If the capacity overflows, or the allocator reports a failure, then an error\nis returned.

\n
§Examples
\n
use std::collections::TryReserveError;\n\nfn process_data(data: &[u32]) -> Result<Vec<u32>, TryReserveError> {\n    let mut output = Vec::new();\n\n    // Pre-reserve the memory, exiting if we can't\n    output.try_reserve_exact(data.len())?;\n\n    // Now we know this can't OOM in the middle of our complex work\n    output.extend(data.iter().map(|&val| {\n        val * 2 + 5 // very complicated\n    }));\n\n    Ok(output)\n}
\n
1.0.0 · source

pub fn shrink_to_fit(&mut self)

Shrinks the capacity of the vector as much as possible.

\n

The behavior of this method depends on the allocator, which may either shrink the vector\nin-place or reallocate. The resulting vector might still have some excess capacity, just as\nis the case for with_capacity. See Allocator::shrink for more details.

\n
§Examples
\n
let mut vec = Vec::with_capacity(10);\nvec.extend([1, 2, 3]);\nassert!(vec.capacity() >= 10);\nvec.shrink_to_fit();\nassert!(vec.capacity() >= 3);
\n
1.56.0 · source

pub fn shrink_to(&mut self, min_capacity: usize)

Shrinks the capacity of the vector with a lower bound.

\n

The capacity will remain at least as large as both the length\nand the supplied value.

\n

If the current capacity is less than the lower limit, this is a no-op.

\n
§Examples
\n
let mut vec = Vec::with_capacity(10);\nvec.extend([1, 2, 3]);\nassert!(vec.capacity() >= 10);\nvec.shrink_to(4);\nassert!(vec.capacity() >= 4);\nvec.shrink_to(0);\nassert!(vec.capacity() >= 3);
\n
1.0.0 · source

pub fn into_boxed_slice(self) -> Box<[T], A>

Converts the vector into Box<[T]>.

\n

Before doing the conversion, this method discards excess capacity like shrink_to_fit.

\n
§Examples
\n
let v = vec![1, 2, 3];\n\nlet slice = v.into_boxed_slice();
\n

Any excess capacity is removed:

\n\n
let mut vec = Vec::with_capacity(10);\nvec.extend([1, 2, 3]);\n\nassert!(vec.capacity() >= 10);\nlet slice = vec.into_boxed_slice();\nassert_eq!(slice.into_vec().capacity(), 3);
\n
1.0.0 · source

pub fn truncate(&mut self, len: usize)

Shortens the vector, keeping the first len elements and dropping\nthe rest.

\n

If len is greater or equal to the vector’s current length, this has\nno effect.

\n

The drain method can emulate truncate, but causes the excess\nelements to be returned instead of dropped.

\n

Note that this method has no effect on the allocated capacity\nof the vector.

\n
§Examples
\n

Truncating a five element vector to two elements:

\n\n
let mut vec = vec![1, 2, 3, 4, 5];\nvec.truncate(2);\nassert_eq!(vec, [1, 2]);
\n

No truncation occurs when len is greater than the vector’s current\nlength:

\n\n
let mut vec = vec![1, 2, 3];\nvec.truncate(8);\nassert_eq!(vec, [1, 2, 3]);
\n

Truncating when len == 0 is equivalent to calling the clear\nmethod.

\n\n
let mut vec = vec![1, 2, 3];\nvec.truncate(0);\nassert_eq!(vec, []);
\n
1.7.0 · source

pub fn as_slice(&self) -> &[T]

Extracts a slice containing the entire vector.

\n

Equivalent to &s[..].

\n
§Examples
\n
use std::io::{self, Write};\nlet buffer = vec![1, 2, 3, 5, 8];\nio::sink().write(buffer.as_slice()).unwrap();
\n
1.7.0 · source

pub fn as_mut_slice(&mut self) -> &mut [T]

Extracts a mutable slice of the entire vector.

\n

Equivalent to &mut s[..].

\n
§Examples
\n
use std::io::{self, Read};\nlet mut buffer = vec![0; 3];\nio::repeat(0b101).read_exact(buffer.as_mut_slice()).unwrap();
\n
1.37.0 · source

pub fn as_ptr(&self) -> *const T

Returns a raw pointer to the vector’s buffer, or a dangling raw pointer\nvalid for zero sized reads if the vector didn’t allocate.

\n

The caller must ensure that the vector outlives the pointer this\nfunction returns, or else it will end up pointing to garbage.\nModifying the vector may cause its buffer to be reallocated,\nwhich would also make any pointers to it invalid.

\n

The caller must also ensure that the memory the pointer (non-transitively) points to\nis never written to (except inside an UnsafeCell) using this pointer or any pointer\nderived from it. If you need to mutate the contents of the slice, use as_mut_ptr.

\n

This method guarantees that for the purpose of the aliasing model, this method\ndoes not materialize a reference to the underlying slice, and thus the returned pointer\nwill remain valid when mixed with other calls to as_ptr and as_mut_ptr.\nNote that calling other methods that materialize mutable references to the slice,\nor mutable references to specific elements you are planning on accessing through this pointer,\nas well as writing to those elements, may still invalidate this pointer.\nSee the second example below for how this guarantee can be used.

\n
§Examples
\n
let x = vec![1, 2, 4];\nlet x_ptr = x.as_ptr();\n\nunsafe {\n    for i in 0..x.len() {\n        assert_eq!(*x_ptr.add(i), 1 << i);\n    }\n}
\n

Due to the aliasing guarantee, the following code is legal:

\n\n
unsafe {\n    let mut v = vec![0, 1, 2];\n    let ptr1 = v.as_ptr();\n    let _ = ptr1.read();\n    let ptr2 = v.as_mut_ptr().offset(2);\n    ptr2.write(2);\n    // Notably, the write to `ptr2` did *not* invalidate `ptr1`\n    // because it mutated a different element:\n    let _ = ptr1.read();\n}
\n
1.37.0 · source

pub fn as_mut_ptr(&mut self) -> *mut T

Returns an unsafe mutable pointer to the vector’s buffer, or a dangling\nraw pointer valid for zero sized reads if the vector didn’t allocate.

\n

The caller must ensure that the vector outlives the pointer this\nfunction returns, or else it will end up pointing to garbage.\nModifying the vector may cause its buffer to be reallocated,\nwhich would also make any pointers to it invalid.

\n

This method guarantees that for the purpose of the aliasing model, this method\ndoes not materialize a reference to the underlying slice, and thus the returned pointer\nwill remain valid when mixed with other calls to as_ptr and as_mut_ptr.\nNote that calling other methods that materialize references to the slice,\nor references to specific elements you are planning on accessing through this pointer,\nmay still invalidate this pointer.\nSee the second example below for how this guarantee can be used.

\n
§Examples
\n
// Allocate vector big enough for 4 elements.\nlet size = 4;\nlet mut x: Vec<i32> = Vec::with_capacity(size);\nlet x_ptr = x.as_mut_ptr();\n\n// Initialize elements via raw pointer writes, then set length.\nunsafe {\n    for i in 0..size {\n        *x_ptr.add(i) = i as i32;\n    }\n    x.set_len(size);\n}\nassert_eq!(&*x, &[0, 1, 2, 3]);
\n

Due to the aliasing guarantee, the following code is legal:

\n\n
unsafe {\n    let mut v = vec![0];\n    let ptr1 = v.as_mut_ptr();\n    ptr1.write(1);\n    let ptr2 = v.as_mut_ptr();\n    ptr2.write(2);\n    // Notably, the write to `ptr2` did *not* invalidate `ptr1`:\n    ptr1.write(3);\n}
\n
source

pub fn allocator(&self) -> &A

🔬This is a nightly-only experimental API. (allocator_api)

Returns a reference to the underlying allocator.

\n
1.0.0 · source

pub unsafe fn set_len(&mut self, new_len: usize)

Forces the length of the vector to new_len.

\n

This is a low-level operation that maintains none of the normal\ninvariants of the type. Normally changing the length of a vector\nis done using one of the safe operations instead, such as\ntruncate, resize, extend, or clear.

\n
§Safety
\n
    \n
  • new_len must be less than or equal to capacity().
  • \n
  • The elements at old_len..new_len must be initialized.
  • \n
\n
§Examples
\n

This method can be useful for situations in which the vector\nis serving as a buffer for other code, particularly over FFI:

\n\n
pub fn get_dictionary(&self) -> Option<Vec<u8>> {\n    // Per the FFI method's docs, \"32768 bytes is always enough\".\n    let mut dict = Vec::with_capacity(32_768);\n    let mut dict_length = 0;\n    // SAFETY: When `deflateGetDictionary` returns `Z_OK`, it holds that:\n    // 1. `dict_length` elements were initialized.\n    // 2. `dict_length` <= the capacity (32_768)\n    // which makes `set_len` safe to call.\n    unsafe {\n        // Make the FFI call...\n        let r = deflateGetDictionary(self.strm, dict.as_mut_ptr(), &mut dict_length);\n        if r == Z_OK {\n            // ...and update the length to what was initialized.\n            dict.set_len(dict_length);\n            Some(dict)\n        } else {\n            None\n        }\n    }\n}
\n

While the following example is sound, there is a memory leak since\nthe inner vectors were not freed prior to the set_len call:

\n\n
let mut vec = vec![vec![1, 0, 0],\n                   vec![0, 1, 0],\n                   vec![0, 0, 1]];\n// SAFETY:\n// 1. `old_len..0` is empty so no elements need to be initialized.\n// 2. `0 <= capacity` always holds whatever `capacity` is.\nunsafe {\n    vec.set_len(0);\n}
\n

Normally, here, one would use clear instead to correctly drop\nthe contents and thus not leak memory.

\n
1.0.0 · source

pub fn swap_remove(&mut self, index: usize) -> T

Removes an element from the vector and returns it.

\n

The removed element is replaced by the last element of the vector.

\n

This does not preserve ordering of the remaining elements, but is O(1).\nIf you need to preserve the element order, use remove instead.

\n
§Panics
\n

Panics if index is out of bounds.

\n
§Examples
\n
let mut v = vec![\"foo\", \"bar\", \"baz\", \"qux\"];\n\nassert_eq!(v.swap_remove(1), \"bar\");\nassert_eq!(v, [\"foo\", \"qux\", \"baz\"]);\n\nassert_eq!(v.swap_remove(0), \"foo\");\nassert_eq!(v, [\"baz\", \"qux\"]);
\n
1.0.0 · source

pub fn insert(&mut self, index: usize, element: T)

Inserts an element at position index within the vector, shifting all\nelements after it to the right.

\n
§Panics
\n

Panics if index > len.

\n
§Examples
\n
let mut vec = vec![1, 2, 3];\nvec.insert(1, 4);\nassert_eq!(vec, [1, 4, 2, 3]);\nvec.insert(4, 5);\nassert_eq!(vec, [1, 4, 2, 3, 5]);
\n
§Time complexity
\n

Takes O(Vec::len) time. All items after the insertion index must be\nshifted to the right. In the worst case, all elements are shifted when\nthe insertion index is 0.

\n
1.0.0 · source

pub fn remove(&mut self, index: usize) -> T

Removes and returns the element at position index within the vector,\nshifting all elements after it to the left.

\n

Note: Because this shifts over the remaining elements, it has a\nworst-case performance of O(n). If you don’t need the order of elements\nto be preserved, use swap_remove instead. If you’d like to remove\nelements from the beginning of the Vec, consider using\nVecDeque::pop_front instead.

\n
§Panics
\n

Panics if index is out of bounds.

\n
§Examples
\n
let mut v = vec![1, 2, 3];\nassert_eq!(v.remove(1), 2);\nassert_eq!(v, [1, 3]);
\n
1.0.0 · source

pub fn retain<F>(&mut self, f: F)
where\n F: FnMut(&T) -> bool,

Retains only the elements specified by the predicate.

\n

In other words, remove all elements e for which f(&e) returns false.\nThis method operates in place, visiting each element exactly once in the\noriginal order, and preserves the order of the retained elements.

\n
§Examples
\n
let mut vec = vec![1, 2, 3, 4];\nvec.retain(|&x| x % 2 == 0);\nassert_eq!(vec, [2, 4]);
\n

Because the elements are visited exactly once in the original order,\nexternal state may be used to decide which elements to keep.

\n\n
let mut vec = vec![1, 2, 3, 4, 5];\nlet keep = [false, true, true, false, true];\nlet mut iter = keep.iter();\nvec.retain(|_| *iter.next().unwrap());\nassert_eq!(vec, [2, 3, 5]);
\n
1.61.0 · source

pub fn retain_mut<F>(&mut self, f: F)
where\n F: FnMut(&mut T) -> bool,

Retains only the elements specified by the predicate, passing a mutable reference to it.

\n

In other words, remove all elements e such that f(&mut e) returns false.\nThis method operates in place, visiting each element exactly once in the\noriginal order, and preserves the order of the retained elements.

\n
§Examples
\n
let mut vec = vec![1, 2, 3, 4];\nvec.retain_mut(|x| if *x <= 3 {\n    *x += 1;\n    true\n} else {\n    false\n});\nassert_eq!(vec, [2, 3, 4]);
\n
1.16.0 · source

pub fn dedup_by_key<F, K>(&mut self, key: F)
where\n F: FnMut(&mut T) -> K,\n K: PartialEq,

Removes all but the first of consecutive elements in the vector that resolve to the same\nkey.

\n

If the vector is sorted, this removes all duplicates.

\n
§Examples
\n
let mut vec = vec![10, 20, 21, 30, 20];\n\nvec.dedup_by_key(|i| *i / 10);\n\nassert_eq!(vec, [10, 20, 30, 20]);
\n
1.16.0 · source

pub fn dedup_by<F>(&mut self, same_bucket: F)
where\n F: FnMut(&mut T, &mut T) -> bool,

Removes all but the first of consecutive elements in the vector satisfying a given equality\nrelation.

\n

The same_bucket function is passed references to two elements from the vector and\nmust determine if the elements compare equal. The elements are passed in opposite order\nfrom their order in the slice, so if same_bucket(a, b) returns true, a is removed.

\n

If the vector is sorted, this removes all duplicates.

\n
§Examples
\n
let mut vec = vec![\"foo\", \"bar\", \"Bar\", \"baz\", \"bar\"];\n\nvec.dedup_by(|a, b| a.eq_ignore_ascii_case(b));\n\nassert_eq!(vec, [\"foo\", \"bar\", \"baz\", \"bar\"]);
\n
1.0.0 · source

pub fn push(&mut self, value: T)

Appends an element to the back of a collection.

\n
§Panics
\n

Panics if the new capacity exceeds isize::MAX bytes.

\n
§Examples
\n
let mut vec = vec![1, 2];\nvec.push(3);\nassert_eq!(vec, [1, 2, 3]);
\n
§Time complexity
\n

Takes amortized O(1) time. If the vector’s length would exceed its\ncapacity after the push, O(capacity) time is taken to copy the\nvector’s elements to a larger allocation. This expensive operation is\noffset by the capacity O(1) insertions it allows.

\n
source

pub fn push_within_capacity(&mut self, value: T) -> Result<(), T>

🔬This is a nightly-only experimental API. (vec_push_within_capacity)

Appends an element if there is sufficient spare capacity, otherwise an error is returned\nwith the element.

\n

Unlike push this method will not reallocate when there’s insufficient capacity.\nThe caller should use reserve or try_reserve to ensure that there is enough capacity.

\n
§Examples
\n

A manual, panic-free alternative to FromIterator:

\n\n
#![feature(vec_push_within_capacity)]\n\nuse std::collections::TryReserveError;\nfn from_iter_fallible<T>(iter: impl Iterator<Item=T>) -> Result<Vec<T>, TryReserveError> {\n    let mut vec = Vec::new();\n    for value in iter {\n        if let Err(value) = vec.push_within_capacity(value) {\n            vec.try_reserve(1)?;\n            // this cannot fail, the previous line either returned or added at least 1 free slot\n            let _ = vec.push_within_capacity(value);\n        }\n    }\n    Ok(vec)\n}\nassert_eq!(from_iter_fallible(0..100), Ok(Vec::from_iter(0..100)));
\n
§Time complexity
\n

Takes O(1) time.

\n
1.0.0 · source

pub fn pop(&mut self) -> Option<T>

Removes the last element from a vector and returns it, or None if it\nis empty.

\n

If you’d like to pop the first element, consider using\nVecDeque::pop_front instead.

\n
§Examples
\n
let mut vec = vec![1, 2, 3];\nassert_eq!(vec.pop(), Some(3));\nassert_eq!(vec, [1, 2]);
\n
§Time complexity
\n

Takes O(1) time.

\n
source

pub fn pop_if<F>(&mut self, f: F) -> Option<T>
where\n F: FnOnce(&mut T) -> bool,

🔬This is a nightly-only experimental API. (vec_pop_if)

Removes and returns the last element in a vector if the predicate\nreturns true, or None if the predicate returns false or the vector\nis empty.

\n
§Examples
\n
#![feature(vec_pop_if)]\n\nlet mut vec = vec![1, 2, 3, 4];\nlet pred = |x: &mut i32| *x % 2 == 0;\n\nassert_eq!(vec.pop_if(pred), Some(4));\nassert_eq!(vec, [1, 2, 3]);\nassert_eq!(vec.pop_if(pred), None);
\n
1.4.0 · source

pub fn append(&mut self, other: &mut Vec<T, A>)

Moves all the elements of other into self, leaving other empty.

\n
§Panics
\n

Panics if the new capacity exceeds isize::MAX bytes.

\n
§Examples
\n
let mut vec = vec![1, 2, 3];\nlet mut vec2 = vec![4, 5, 6];\nvec.append(&mut vec2);\nassert_eq!(vec, [1, 2, 3, 4, 5, 6]);\nassert_eq!(vec2, []);
\n
1.6.0 · source

pub fn drain<R>(&mut self, range: R) -> Drain<'_, T, A>
where\n R: RangeBounds<usize>,

Removes the specified range from the vector in bulk, returning all\nremoved elements as an iterator. If the iterator is dropped before\nbeing fully consumed, it drops the remaining removed elements.

\n

The returned iterator keeps a mutable borrow on the vector to optimize\nits implementation.

\n
§Panics
\n

Panics if the starting point is greater than the end point or if\nthe end point is greater than the length of the vector.

\n
§Leaking
\n

If the returned iterator goes out of scope without being dropped (due to\nmem::forget, for example), the vector may have lost and leaked\nelements arbitrarily, including elements outside the range.

\n
§Examples
\n
let mut v = vec![1, 2, 3];\nlet u: Vec<_> = v.drain(1..).collect();\nassert_eq!(v, &[1]);\nassert_eq!(u, &[2, 3]);\n\n// A full range clears the vector, like `clear()` does\nv.drain(..);\nassert_eq!(v, &[]);
\n
1.0.0 · source

pub fn clear(&mut self)

Clears the vector, removing all values.

\n

Note that this method has no effect on the allocated capacity\nof the vector.

\n
§Examples
\n
let mut v = vec![1, 2, 3];\n\nv.clear();\n\nassert!(v.is_empty());
\n
1.0.0 · source

pub fn len(&self) -> usize

Returns the number of elements in the vector, also referred to\nas its ‘length’.

\n
§Examples
\n
let a = vec![1, 2, 3];\nassert_eq!(a.len(), 3);
\n
1.0.0 · source

pub fn is_empty(&self) -> bool

Returns true if the vector contains no elements.

\n
§Examples
\n
let mut v = Vec::new();\nassert!(v.is_empty());\n\nv.push(1);\nassert!(!v.is_empty());
\n
1.4.0 · source

pub fn split_off(&mut self, at: usize) -> Vec<T, A>
where\n A: Clone,

Splits the collection into two at the given index.

\n

Returns a newly allocated vector containing the elements in the range\n[at, len). After the call, the original vector will be left containing\nthe elements [0, at) with its previous capacity unchanged.

\n
    \n
  • If you want to take ownership of the entire contents and capacity of\nthe vector, see mem::take or mem::replace.
  • \n
  • If you don’t need the returned vector at all, see Vec::truncate.
  • \n
  • If you want to take ownership of an arbitrary subslice, or you don’t\nnecessarily want to store the removed items in a vector, see Vec::drain.
  • \n
\n
§Panics
\n

Panics if at > len.

\n
§Examples
\n
let mut vec = vec![1, 2, 3];\nlet vec2 = vec.split_off(1);\nassert_eq!(vec, [1]);\nassert_eq!(vec2, [2, 3]);
\n
1.33.0 · source

pub fn resize_with<F>(&mut self, new_len: usize, f: F)
where\n F: FnMut() -> T,

Resizes the Vec in-place so that len is equal to new_len.

\n

If new_len is greater than len, the Vec is extended by the\ndifference, with each additional slot filled with the result of\ncalling the closure f. The return values from f will end up\nin the Vec in the order they have been generated.

\n

If new_len is less than len, the Vec is simply truncated.

\n

This method uses a closure to create new values on every push. If\nyou’d rather Clone a given value, use Vec::resize. If you\nwant to use the Default trait to generate values, you can\npass Default::default as the second argument.

\n
§Examples
\n
let mut vec = vec![1, 2, 3];\nvec.resize_with(5, Default::default);\nassert_eq!(vec, [1, 2, 3, 0, 0]);\n\nlet mut vec = vec![];\nlet mut p = 1;\nvec.resize_with(4, || { p *= 2; p });\nassert_eq!(vec, [2, 4, 8, 16]);
\n
1.47.0 · source

pub fn leak<'a>(self) -> &'a mut [T]
where\n A: 'a,

Consumes and leaks the Vec, returning a mutable reference to the contents,\n&'a mut [T]. Note that the type T must outlive the chosen lifetime\n'a. If the type has only static references, or none at all, then this\nmay be chosen to be 'static.

\n

As of Rust 1.57, this method does not reallocate or shrink the Vec,\nso the leaked allocation may include unused capacity that is not part\nof the returned slice.

\n

This function is mainly useful for data that lives for the remainder of\nthe program’s life. Dropping the returned reference will cause a memory\nleak.

\n
§Examples
\n

Simple usage:

\n\n
let x = vec![1, 2, 3];\nlet static_ref: &'static mut [usize] = x.leak();\nstatic_ref[0] += 1;\nassert_eq!(static_ref, &[2, 2, 3]);
\n
1.60.0 · source

pub fn spare_capacity_mut(&mut self) -> &mut [MaybeUninit<T>]

Returns the remaining spare capacity of the vector as a slice of\nMaybeUninit<T>.

\n

The returned slice can be used to fill the vector with data (e.g. by\nreading from a file) before marking the data as initialized using the\nset_len method.

\n
§Examples
\n
// Allocate vector big enough for 10 elements.\nlet mut v = Vec::with_capacity(10);\n\n// Fill in the first 3 elements.\nlet uninit = v.spare_capacity_mut();\nuninit[0].write(0);\nuninit[1].write(1);\nuninit[2].write(2);\n\n// Mark the first 3 elements of the vector as being initialized.\nunsafe {\n    v.set_len(3);\n}\n\nassert_eq!(&v, &[0, 1, 2]);
\n
source

pub fn split_at_spare_mut(&mut self) -> (&mut [T], &mut [MaybeUninit<T>])

🔬This is a nightly-only experimental API. (vec_split_at_spare)

Returns vector content as a slice of T, along with the remaining spare\ncapacity of the vector as a slice of MaybeUninit<T>.

\n

The returned spare capacity slice can be used to fill the vector with data\n(e.g. by reading from a file) before marking the data as initialized using\nthe set_len method.

\n

Note that this is a low-level API, which should be used with care for\noptimization purposes. If you need to append data to a Vec\nyou can use push, extend, extend_from_slice,\nextend_from_within, insert, append, resize or\nresize_with, depending on your exact needs.

\n
§Examples
\n
#![feature(vec_split_at_spare)]\n\nlet mut v = vec![1, 1, 2];\n\n// Reserve additional space big enough for 10 elements.\nv.reserve(10);\n\nlet (init, uninit) = v.split_at_spare_mut();\nlet sum = init.iter().copied().sum::<u32>();\n\n// Fill in the next 4 elements.\nuninit[0].write(sum);\nuninit[1].write(sum * 2);\nuninit[2].write(sum * 3);\nuninit[3].write(sum * 4);\n\n// Mark the 4 elements of the vector as being initialized.\nunsafe {\n    let len = v.len();\n    v.set_len(len + 4);\n}\n\nassert_eq!(&v, &[1, 1, 2, 4, 8, 12, 16]);
\n
",0,"air_interpreter_data::executed_state::FoldLore"],["
§

impl<Z> Zeroize for Vec<Z>
where\n Z: Zeroize,

§

fn zeroize(&mut self)

“Best effort” zeroization for Vec.

\n

Ensures the entire capacity of the Vec is zeroed. Cannot ensure that\nprevious reallocations did not leave values on the heap.

\n
","Zeroize","air_interpreter_data::executed_state::FoldLore"],["
source§

impl<T, A> DerefPure for Vec<T, A>
where\n A: Allocator,

","DerefPure","air_interpreter_data::executed_state::FoldLore"],["
1.0.0 · source§

impl<T, A> Eq for Vec<T, A>
where\n T: Eq,\n A: Allocator,

","Eq","air_interpreter_data::executed_state::FoldLore"],["
§

impl<Z> ZeroizeOnDrop for Vec<Z>
where\n Z: ZeroizeOnDrop,

","ZeroizeOnDrop","air_interpreter_data::executed_state::FoldLore"]], +"air_test_framework":[["
§

impl<'a, A> Arbitrary<'a> for Vec<A>
where\n A: Arbitrary<'a>,

§

fn arbitrary(u: &mut Unstructured<'a>) -> Result<Vec<A>, Error>

Generate an arbitrary value of Self from the given unstructured data. Read more
§

fn arbitrary_take_rest(u: Unstructured<'a>) -> Result<Vec<A>, Error>

Generate an arbitrary value of Self from the entirety of the given\nunstructured data. Read more
§

fn size_hint(_depth: usize) -> (usize, Option<usize>)

Get a size hint for how many bytes out of an Unstructured this type\nneeds to construct itself. Read more
","Arbitrary<'a>","air_test_framework::ephemeral::Data"],["
§

impl<T> Archive for Vec<T>
where\n T: Archive,

§

type Archived = ArchivedVec<<T as Archive>::Archived>

The archived representation of this type. Read more
§

type Resolver = VecResolver

The resolver for this type. It must contain all the additional information from serializing\nneeded to make the archived type from the normal type.
§

unsafe fn resolve(\n &self,\n pos: usize,\n resolver: <Vec<T> as Archive>::Resolver,\n out: *mut <Vec<T> as Archive>::Archived,\n)

Creates the archived version of this value at the given position and writes it to the given\noutput. Read more
","Archive","air_test_framework::ephemeral::Data"],["
§

impl Arg for Vec<u8>

§

fn as_str(&self) -> Result<&str, Errno>

Returns a view of this string as a string slice.
§

fn to_string_lossy(&self) -> Cow<'_, str>

Returns a potentially-lossy rendering of this string as a\nCow<'_, str>.
§

fn as_cow_c_str(&self) -> Result<Cow<'_, CStr>, Errno>

Returns a view of this string as a maybe-owned CStr.
§

fn into_c_str<'b>(self) -> Result<Cow<'b, CStr>, Errno>
where\n Vec<u8>: 'b,

Consumes self and returns a view of this string as a maybe-owned\nCStr.
§

fn into_with_c_str<T, F>(self, f: F) -> Result<T, Errno>
where\n Vec<u8>: Sized,\n F: FnOnce(&CStr) -> Result<T, Errno>,

Runs a closure with self passed in as a &CStr.
","Arg","air_test_framework::ephemeral::Data"],["
§

impl<T> ArrayLike for Vec<T>

§

type Item = T

Type of the elements being stored.
","ArrayLike","air_test_framework::ephemeral::Data"],["
§

impl<T> ArrayLike for Vec<T>

§

type Item = T

Type of the elements being stored.
","ArrayLike","air_test_framework::ephemeral::Data"],["
1.5.0 · source§

impl<T, A> AsMut<[T]> for Vec<T, A>
where\n A: Allocator,

source§

fn as_mut(&mut self) -> &mut [T]

Converts this type into a mutable reference of the (usually inferred) input type.
","AsMut<[T]>","air_test_framework::ephemeral::Data"],["
§

impl<K, V> AsMut<TiVec<K, V>> for Vec<V>

§

fn as_mut(&mut self) -> &mut TiVec<K, V>

Converts this type into a mutable reference of the (usually inferred) input type.
","AsMut>","air_test_framework::ephemeral::Data"],["
1.5.0 · source§

impl<T, A> AsMut<Vec<T, A>> for Vec<T, A>
where\n A: Allocator,

source§

fn as_mut(&mut self) -> &mut Vec<T, A>

Converts this type into a mutable reference of the (usually inferred) input type.
","AsMut>","air_test_framework::ephemeral::Data"],["
1.0.0 · source§

impl<T, A> AsRef<[T]> for Vec<T, A>
where\n A: Allocator,

source§

fn as_ref(&self) -> &[T]

Converts this type into a shared reference of the (usually inferred) input type.
","AsRef<[T]>","air_test_framework::ephemeral::Data"],["
§

impl<K, V> AsRef<TiVec<K, V>> for Vec<V>

§

fn as_ref(&self) -> &TiVec<K, V>

Converts this type into a shared reference of the (usually inferred) input type.
","AsRef>","air_test_framework::ephemeral::Data"],["
1.0.0 · source§

impl<T, A> AsRef<Vec<T, A>> for Vec<T, A>
where\n A: Allocator,

source§

fn as_ref(&self) -> &Vec<T, A>

Converts this type into a shared reference of the (usually inferred) input type.
","AsRef>","air_test_framework::ephemeral::Data"],["
§

impl AsyncWrite for Vec<u8>

§

fn poll_write(\n self: Pin<&mut Vec<u8>>,\n _: &mut Context<'_>,\n buf: &[u8],\n) -> Poll<Result<usize, Error>>

Attempt to write bytes from buf into the object. Read more
§

fn poll_write_vectored(\n self: Pin<&mut Vec<u8>>,\n _: &mut Context<'_>,\n bufs: &[IoSlice<'_>],\n) -> Poll<Result<usize, Error>>

Attempt to write bytes from bufs into the object using vectored\nIO operations. Read more
§

fn poll_flush(\n self: Pin<&mut Vec<u8>>,\n _: &mut Context<'_>,\n) -> Poll<Result<(), Error>>

Attempt to flush the object, ensuring that any buffered data reach\ntheir destination. Read more
§

fn poll_close(\n self: Pin<&mut Vec<u8>>,\n cx: &mut Context<'_>,\n) -> Poll<Result<(), Error>>

Attempt to close the object. Read more
","AsyncWrite","air_test_framework::ephemeral::Data"],["
§

impl AsyncWrite for Vec<u8>

§

fn poll_write(\n self: Pin<&mut Vec<u8>>,\n _cx: &mut Context<'_>,\n buf: &[u8],\n) -> Poll<Result<usize, Error>>

Attempt to write bytes from buf into the object. Read more
§

fn poll_write_vectored(\n self: Pin<&mut Vec<u8>>,\n _: &mut Context<'_>,\n bufs: &[IoSlice<'_>],\n) -> Poll<Result<usize, Error>>

Like poll_write, except that it writes from a slice of buffers. Read more
§

fn is_write_vectored(&self) -> bool

Determines if this writer has an efficient poll_write_vectored\nimplementation. Read more
§

fn poll_flush(\n self: Pin<&mut Vec<u8>>,\n _cx: &mut Context<'_>,\n) -> Poll<Result<(), Error>>

Attempts to flush the object, ensuring that any buffered data reach\ntheir destination. Read more
§

fn poll_shutdown(\n self: Pin<&mut Vec<u8>>,\n _cx: &mut Context<'_>,\n) -> Poll<Result<(), Error>>

Initiates or attempts to shut down this writer, returning success when\nthe I/O connection has completely shut down. Read more
","AsyncWrite","air_test_framework::ephemeral::Data"],["
1.0.0 · source§

impl<T, A> Borrow<[T]> for Vec<T, A>
where\n A: Allocator,

source§

fn borrow(&self) -> &[T]

Immutably borrows from an owned value. Read more
","Borrow<[T]>","air_test_framework::ephemeral::Data"],["
1.0.0 · source§

impl<T, A> BorrowMut<[T]> for Vec<T, A>
where\n A: Allocator,

source§

fn borrow_mut(&mut self) -> &mut [T]

Mutably borrows from an owned value. Read more
","BorrowMut<[T]>","air_test_framework::ephemeral::Data"],["
§

impl<T> BorshDeserialize for Vec<T>
where\n T: BorshDeserialize,

§

fn deserialize_reader<R>(reader: &mut R) -> Result<Vec<T>, Error>
where\n R: Read,

§

fn deserialize(buf: &mut &[u8]) -> Result<Self, Error>

Deserializes this instance from a given slice of bytes.\nUpdates the buffer to point at the remaining bytes.
§

fn try_from_slice(v: &[u8]) -> Result<Self, Error>

Deserialize this instance from a slice of bytes.
§

fn try_from_reader<R>(reader: &mut R) -> Result<Self, Error>
where\n R: Read,

","BorshDeserialize","air_test_framework::ephemeral::Data"],["
§

impl<T> BorshSerialize for Vec<T>
where\n T: BorshSerialize,

§

fn serialize<W>(&self, writer: &mut W) -> Result<(), Error>
where\n W: Write,

","BorshSerialize","air_test_framework::ephemeral::Data"],["
§

impl BufMut for Vec<u8>

§

fn remaining_mut(&self) -> usize

Returns the number of bytes that can be written from the current\nposition until the end of the buffer is reached. Read more
§

unsafe fn advance_mut(&mut self, cnt: usize)

Advance the internal cursor of the BufMut Read more
§

fn chunk_mut(&mut self) -> &mut UninitSlice

Returns a mutable slice starting at the current BufMut position and of\nlength between 0 and BufMut::remaining_mut(). Note that this can be shorter than the\nwhole remainder of the buffer (this allows non-continuous implementation). Read more
§

fn put<T>(&mut self, src: T)
where\n T: Buf,\n Vec<u8>: Sized,

Transfer bytes into self from src and advance the cursor by the\nnumber of bytes written. Read more
§

fn put_slice(&mut self, src: &[u8])

Transfer bytes into self from src and advance the cursor by the\nnumber of bytes written. Read more
§

fn put_bytes(&mut self, val: u8, cnt: usize)

Put cnt bytes val into self. Read more
§

fn has_remaining_mut(&self) -> bool

Returns true if there is space in self for more bytes. Read more
§

fn put_u8(&mut self, n: u8)

Writes an unsigned 8 bit integer to self. Read more
§

fn put_i8(&mut self, n: i8)

Writes a signed 8 bit integer to self. Read more
§

fn put_u16(&mut self, n: u16)

Writes an unsigned 16 bit integer to self in big-endian byte order. Read more
§

fn put_u16_le(&mut self, n: u16)

Writes an unsigned 16 bit integer to self in little-endian byte order. Read more
§

fn put_u16_ne(&mut self, n: u16)

Writes an unsigned 16 bit integer to self in native-endian byte order. Read more
§

fn put_i16(&mut self, n: i16)

Writes a signed 16 bit integer to self in big-endian byte order. Read more
§

fn put_i16_le(&mut self, n: i16)

Writes a signed 16 bit integer to self in little-endian byte order. Read more
§

fn put_i16_ne(&mut self, n: i16)

Writes a signed 16 bit integer to self in native-endian byte order. Read more
§

fn put_u32(&mut self, n: u32)

Writes an unsigned 32 bit integer to self in big-endian byte order. Read more
§

fn put_u32_le(&mut self, n: u32)

Writes an unsigned 32 bit integer to self in little-endian byte order. Read more
§

fn put_u32_ne(&mut self, n: u32)

Writes an unsigned 32 bit integer to self in native-endian byte order. Read more
§

fn put_i32(&mut self, n: i32)

Writes a signed 32 bit integer to self in big-endian byte order. Read more
§

fn put_i32_le(&mut self, n: i32)

Writes a signed 32 bit integer to self in little-endian byte order. Read more
§

fn put_i32_ne(&mut self, n: i32)

Writes a signed 32 bit integer to self in native-endian byte order. Read more
§

fn put_u64(&mut self, n: u64)

Writes an unsigned 64 bit integer to self in the big-endian byte order. Read more
§

fn put_u64_le(&mut self, n: u64)

Writes an unsigned 64 bit integer to self in little-endian byte order. Read more
§

fn put_u64_ne(&mut self, n: u64)

Writes an unsigned 64 bit integer to self in native-endian byte order. Read more
§

fn put_i64(&mut self, n: i64)

Writes a signed 64 bit integer to self in the big-endian byte order. Read more
§

fn put_i64_le(&mut self, n: i64)

Writes a signed 64 bit integer to self in little-endian byte order. Read more
§

fn put_i64_ne(&mut self, n: i64)

Writes a signed 64 bit integer to self in native-endian byte order. Read more
§

fn put_u128(&mut self, n: u128)

Writes an unsigned 128 bit integer to self in the big-endian byte order. Read more
§

fn put_u128_le(&mut self, n: u128)

Writes an unsigned 128 bit integer to self in little-endian byte order. Read more
§

fn put_u128_ne(&mut self, n: u128)

Writes an unsigned 128 bit integer to self in native-endian byte order. Read more
§

fn put_i128(&mut self, n: i128)

Writes a signed 128 bit integer to self in the big-endian byte order. Read more
§

fn put_i128_le(&mut self, n: i128)

Writes a signed 128 bit integer to self in little-endian byte order. Read more
§

fn put_i128_ne(&mut self, n: i128)

Writes a signed 128 bit integer to self in native-endian byte order. Read more
§

fn put_uint(&mut self, n: u64, nbytes: usize)

Writes an unsigned n-byte integer to self in big-endian byte order. Read more
§

fn put_uint_le(&mut self, n: u64, nbytes: usize)

Writes an unsigned n-byte integer to self in the little-endian byte order. Read more
§

fn put_uint_ne(&mut self, n: u64, nbytes: usize)

Writes an unsigned n-byte integer to self in the native-endian byte order. Read more
§

fn put_int(&mut self, n: i64, nbytes: usize)

Writes low nbytes of a signed integer to self in big-endian byte order. Read more
§

fn put_int_le(&mut self, n: i64, nbytes: usize)

Writes low nbytes of a signed integer to self in little-endian byte order. Read more
§

fn put_int_ne(&mut self, n: i64, nbytes: usize)

Writes low nbytes of a signed integer to self in native-endian byte order. Read more
§

fn put_f32(&mut self, n: f32)

Writes an IEEE754 single-precision (4 bytes) floating point number to\nself in big-endian byte order. Read more
§

fn put_f32_le(&mut self, n: f32)

Writes an IEEE754 single-precision (4 bytes) floating point number to\nself in little-endian byte order. Read more
§

fn put_f32_ne(&mut self, n: f32)

Writes an IEEE754 single-precision (4 bytes) floating point number to\nself in native-endian byte order. Read more
§

fn put_f64(&mut self, n: f64)

Writes an IEEE754 double-precision (8 bytes) floating point number to\nself in big-endian byte order. Read more
§

fn put_f64_le(&mut self, n: f64)

Writes an IEEE754 double-precision (8 bytes) floating point number to\nself in little-endian byte order. Read more
§

fn put_f64_ne(&mut self, n: f64)

Writes an IEEE754 double-precision (8 bytes) floating point number to\nself in native-endian byte order. Read more
§

fn limit(self, limit: usize) -> Limit<Self>
where\n Self: Sized,

Creates an adaptor which can write at most limit bytes to self. Read more
§

fn writer(self) -> Writer<Self>
where\n Self: Sized,

Creates an adaptor which implements the Write trait for self. Read more
§

fn chain_mut<U>(self, next: U) -> Chain<Self, U>
where\n U: BufMut,\n Self: Sized,

Creates an adapter which will chain this buffer with another. Read more
","BufMut","air_test_framework::ephemeral::Data"],["
§

impl ByteSink for Vec<u8>

Provide a convenient implementation for testing.

\n
§

fn put1(&mut self, v: u8)

Add 1 byte to the code section.
§

fn put2(&mut self, v: u16)

Add 2 bytes to the code section.
§

fn put4(&mut self, v: u32)

Add 4 bytes to the code section.
§

fn put8(&mut self, v: u64)

Add 8 bytes to the code section.
","ByteSink","air_test_framework::ephemeral::Data"],["
§

impl CallHasher for Vec<u8>

§

fn get_hash<H, B>(value: &H, build_hasher: &B) -> u64
where\n H: Hash + ?Sized,\n B: BuildHasher,

","CallHasher","air_test_framework::ephemeral::Data"],["
1.0.0 · source§

impl<T, A> Clone for Vec<T, A>
where\n T: Clone,\n A: Allocator + Clone,

source§

fn clone_from(&mut self, source: &Vec<T, A>)

Overwrites the contents of self with a clone of the contents of source.

\n

This method is preferred over simply assigning source.clone() to self,\nas it avoids reallocation if possible. Additionally, if the element type\nT overrides clone_from(), this will reuse the resources of self’s\nelements as well.

\n
§Examples
\n
let x = vec![5, 6, 7];\nlet mut y = vec![8, 9, 10];\nlet yp: *const i32 = y.as_ptr();\n\ny.clone_from(&x);\n\n// The value is the same\nassert_eq!(x, y);\n\n// And no reallocation occurred\nassert_eq!(yp, y.as_ptr());
\n
source§

fn clone(&self) -> Vec<T, A>

Returns a copy of the value. Read more
","Clone","air_test_framework::ephemeral::Data"],["
1.0.0 · source§

impl<T, A> Debug for Vec<T, A>
where\n T: Debug,\n A: Allocator,

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
","Debug","air_test_framework::ephemeral::Data"],["
§

impl DecodeTarget for Vec<u8>

§

fn decode_with(\n &mut self,\n max_len: usize,\n f: impl for<'a> FnOnce(&'a mut [u8]) -> Result<usize, Error>,\n) -> Result<usize, Error>

Decodes into this buffer, provides the maximum length for implementations that wish to\npreallocate space, along with a function that will write bytes into the buffer and return\nthe length written to it.
","DecodeTarget","air_test_framework::ephemeral::Data"],["
1.0.0 · source§

impl<T> Default for Vec<T>

source§

fn default() -> Vec<T>

Creates an empty Vec<T>.

\n

The vector will not allocate until elements are pushed onto it.

\n
","Default","air_test_framework::ephemeral::Data"],["
§

impl<'a> DerDecodable<'a> for Vec<u8>

§

fn load(object: DerObject<'a>) -> Result<Vec<u8>, Asn1DerError>

Loads object as Self
§

fn decode(raw: &'a [u8]) -> Result<Self, Asn1DerError>

Decodes an object as Self
§

fn decode_at(raw: &'a [u8], header_start: usize) -> Result<Self, Asn1DerError>

Decodes an object as Self
§

fn decode_from_source<A, B>(\n source: &mut A,\n sink: B,\n) -> Result<Self, Asn1DerError>
where\n A: Source,\n B: Sink + Into<&'a [u8]>,

Reads an object from source by parsing the length field and copying the necessary bytes\ninto sink and decoding it from sink
","DerDecodable<'a>","air_test_framework::ephemeral::Data"],["
§

impl DerEncodable for Vec<u8>

§

fn encode<S>(&self, sink: &mut S) -> Result<(), Asn1DerError>
where\n S: Sink,

Encodes self into sink
§

fn der_object<'a, S>(&self, sink: S) -> Result<DerObject<'a>, Asn1DerError>
where\n S: Sink + Into<&'a [u8]>,

Creates an DER object from an encodable type
","DerEncodable","air_test_framework::ephemeral::Data"],["
1.0.0 · source§

impl<T, A> Deref for Vec<T, A>
where\n A: Allocator,

§

type Target = [T]

The resulting type after dereferencing.
source§

fn deref(&self) -> &[T]

Dereferences the value.
","Deref","air_test_framework::ephemeral::Data"],["
1.0.0 · source§

impl<T, A> DerefMut for Vec<T, A>
where\n A: Allocator,

source§

fn deref_mut(&mut self) -> &mut [T]

Mutably dereferences the value.
","DerefMut","air_test_framework::ephemeral::Data"],["
source§

impl<'de, T> Deserialize<'de> for Vec<T>
where\n T: Deserialize<'de>,

source§

fn deserialize<D>(\n deserializer: D,\n) -> Result<Vec<T>, <D as Deserializer<'de>>::Error>
where\n D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
","Deserialize<'de>","air_test_framework::ephemeral::Data"],["
source§

impl<'de> Deserialize<'de> for Vec<u8>

source§

fn deserialize<D>(\n deserializer: D,\n) -> Result<Vec<u8>, <D as Deserializer<'de>>::Error>
where\n D: Deserializer<'de>,

","Deserialize<'de>","air_test_framework::ephemeral::Data"],["
source§

impl<'de, T, U> DeserializeAs<'de, Vec<T>> for Vec<U>
where\n U: DeserializeAs<'de, T>,

source§

fn deserialize_as<D>(\n deserializer: D,\n) -> Result<Vec<T>, <D as Deserializer<'de>>::Error>
where\n D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer.
","DeserializeAs<'de, Vec>","air_test_framework::ephemeral::Data"],["
1.0.0 · source§

impl<T, A> Drop for Vec<T, A>
where\n A: Allocator,

source§

fn drop(&mut self)

Executes the destructor for this type. Read more
","Drop","air_test_framework::ephemeral::Data"],["
§

impl EncodeTarget for Vec<u8>

§

fn encode_with(\n &mut self,\n max_len: usize,\n f: impl for<'a> FnOnce(&'a mut [u8]) -> Result<usize, Error>,\n) -> Result<usize, Error>

Encodes into this buffer, provides the maximum length for implementations that wish to\npreallocate space, along with a function that will encode ASCII bytes into the buffer and\nreturn the length written to it.
","EncodeTarget","air_test_framework::ephemeral::Data"],["
1.2.0 · source§

impl<'a, T, A> Extend<&'a T> for Vec<T, A>
where\n T: Copy + 'a,\n A: Allocator,

Extend implementation that copies elements out of references before pushing them onto the Vec.

\n

This implementation is specialized for slice iterators, where it uses copy_from_slice to\nappend the entire slice at once.

\n
source§

fn extend<I>(&mut self, iter: I)
where\n I: IntoIterator<Item = &'a T>,

Extends a collection with the contents of an iterator. Read more
source§

fn extend_one(&mut self, _: &'a T)

🔬This is a nightly-only experimental API. (extend_one)
Extends a collection with exactly one element.
source§

fn extend_reserve(&mut self, additional: usize)

🔬This is a nightly-only experimental API. (extend_one)
Reserves capacity in a collection for the given number of additional elements. Read more
","Extend<&'a T>","air_test_framework::ephemeral::Data"],["
1.0.0 · source§

impl<T, A> Extend<T> for Vec<T, A>
where\n A: Allocator,

source§

fn extend<I>(&mut self, iter: I)
where\n I: IntoIterator<Item = T>,

Extends a collection with the contents of an iterator. Read more
source§

fn extend_one(&mut self, item: T)

🔬This is a nightly-only experimental API. (extend_one)
Extends a collection with exactly one element.
source§

fn extend_reserve(&mut self, additional: usize)

🔬This is a nightly-only experimental API. (extend_one)
Reserves capacity in a collection for the given number of additional elements. Read more
","Extend","air_test_framework::ephemeral::Data"],["
1.0.0 · source§

impl<T> From<&[T]> for Vec<T>
where\n T: Clone,

source§

fn from(s: &[T]) -> Vec<T>

Allocate a Vec<T> and fill it by cloning s’s items.

\n
§Examples
\n
assert_eq!(Vec::from(&[1, 2, 3][..]), vec![1, 2, 3]);
\n
","From<&[T]>","air_test_framework::ephemeral::Data"],["
1.74.0 · source§

impl<T, const N: usize> From<&[T; N]> for Vec<T>
where\n T: Clone,

source§

fn from(s: &[T; N]) -> Vec<T>

Allocate a Vec<T> and fill it by cloning s’s items.

\n
§Examples
\n
assert_eq!(Vec::from(&[1, 2, 3]), vec![1, 2, 3]);
\n
","From<&[T; N]>","air_test_framework::ephemeral::Data"],["
1.19.0 · source§

impl<T> From<&mut [T]> for Vec<T>
where\n T: Clone,

source§

fn from(s: &mut [T]) -> Vec<T>

Allocate a Vec<T> and fill it by cloning s’s items.

\n
§Examples
\n
assert_eq!(Vec::from(&mut [1, 2, 3][..]), vec![1, 2, 3]);
\n
","From<&mut [T]>","air_test_framework::ephemeral::Data"],["
1.74.0 · source§

impl<T, const N: usize> From<&mut [T; N]> for Vec<T>
where\n T: Clone,

source§

fn from(s: &mut [T; N]) -> Vec<T>

Allocate a Vec<T> and fill it by cloning s’s items.

\n
§Examples
\n
assert_eq!(Vec::from(&mut [1, 2, 3]), vec![1, 2, 3]);
\n
","From<&mut [T; N]>","air_test_framework::ephemeral::Data"],["
1.0.0 · source§

impl From<&str> for Vec<u8>

source§

fn from(s: &str) -> Vec<u8>

Allocate a Vec<u8> and fill it with a UTF-8 string.

\n
§Examples
\n
assert_eq!(Vec::from(\"123\"), vec![b'1', b'2', b'3']);
\n
","From<&str>","air_test_framework::ephemeral::Data"],["
1.44.0 · source§

impl<T, const N: usize> From<[T; N]> for Vec<T>

source§

fn from(s: [T; N]) -> Vec<T>

Allocate a Vec<T> and move s’s items into it.

\n
§Examples
\n
assert_eq!(Vec::from([1, 2, 3]), vec![1, 2, 3]);
\n
","From<[T; N]>","air_test_framework::ephemeral::Data"],["
§

impl From<AlignedVec> for Vec<u8>

§

fn from(aligned: AlignedVec) -> Vec<u8>

Converts to this type from the input type.
","From","air_test_framework::ephemeral::Data"],["
1.5.0 · source§

impl<T, A> From<BinaryHeap<T, A>> for Vec<T, A>
where\n A: Allocator,

source§

fn from(heap: BinaryHeap<T, A>) -> Vec<T, A>

Converts a BinaryHeap<T> into a Vec<T>.

\n

This conversion requires no data movement or allocation, and has\nconstant time complexity.

\n
","From>","air_test_framework::ephemeral::Data"],["
1.18.0 · source§

impl<T, A> From<Box<[T], A>> for Vec<T, A>
where\n A: Allocator,

source§

fn from(s: Box<[T], A>) -> Vec<T, A>

Convert a boxed slice into a vector by transferring ownership of\nthe existing heap allocation.

\n
§Examples
\n
let b: Box<[i32]> = vec![1, 2, 3].into_boxed_slice();\nassert_eq!(Vec::from(b), vec![1, 2, 3]);
\n
","From>","air_test_framework::ephemeral::Data"],["
§

impl From<ByteBuf> for Vec<u8>

§

fn from(buf: ByteBuf) -> Vec<u8>

Converts to this type from the input type.
","From","air_test_framework::ephemeral::Data"],["
§

impl From<Bytes> for Vec<u8>

§

fn from(bytes: Bytes) -> Vec<u8>

Converts to this type from the input type.
","From","air_test_framework::ephemeral::Data"],["
§

impl From<BytesMut> for Vec<u8>

§

fn from(bytes: BytesMut) -> Vec<u8>

Converts to this type from the input type.
","From","air_test_framework::ephemeral::Data"],["
1.7.0 · source§

impl From<CString> for Vec<u8>

source§

fn from(s: CString) -> Vec<u8>

Converts a CString into a Vec<u8>.

\n

The conversion consumes the CString, and removes the terminating NUL byte.

\n
","From","air_test_framework::ephemeral::Data"],["
§

impl<const S: usize> From<Cid<S>> for Vec<u8>

§

fn from(cid: Cid<S>) -> Vec<u8>

Converts to this type from the input type.
","From>","air_test_framework::ephemeral::Data"],["
1.14.0 · source§

impl<'a, T> From<Cow<'a, [T]>> for Vec<T>
where\n [T]: ToOwned<Owned = Vec<T>>,

source§

fn from(s: Cow<'a, [T]>) -> Vec<T>

Convert a clone-on-write slice into a vector.

\n

If s already owns a Vec<T>, it will be returned directly.\nIf s is borrowing a slice, a new Vec<T> will be allocated and\nfilled by cloning s’s items into it.

\n
§Examples
\n
let o: Cow<'_, [i32]> = Cow::Owned(vec![1, 2, 3]);\nlet b: Cow<'_, [i32]> = Cow::Borrowed(&[1, 2, 3]);\nassert_eq!(Vec::from(o), Vec::from(b));
\n
","From>","air_test_framework::ephemeral::Data"],["
§

impl From<DerValue> for Vec<u8>

§

fn from(value: DerValue) -> Vec<u8>

Converts to this type from the input type.
","From","air_test_framework::ephemeral::Data"],["
§

impl<const S: usize> From<Multihash<S>> for Vec<u8>

§

fn from(multihash: Multihash<S>) -> Vec<u8>

Converts to this type from the input type.
","From>","air_test_framework::ephemeral::Data"],["
§

impl<const S: usize> From<Multihash<S>> for Vec<u8>

§

fn from(multihash: Multihash<S>) -> Vec<u8>

Converts to this type from the input type.
","From>","air_test_framework::ephemeral::Data"],["
§

impl<T> From<NonEmpty<T>> for Vec<T>

§

fn from(v: NonEmpty<T>) -> Vec<T>

Converts to this type from the input type.
","From>","air_test_framework::ephemeral::Data"],["
§

impl From<PeerId> for Vec<u8>

§

fn from(peer_id: PeerId) -> Vec<u8>

Converts to this type from the input type.
","From","air_test_framework::ephemeral::Data"],["
source§

impl From<SerializedCallArguments> for Vec<u8>

source§

fn from(value: SerializedCallArguments) -> Vec<u8>

Converts to this type from the input type.
","From","air_test_framework::ephemeral::Data"],["
source§

impl From<SerializedCallRequests> for Vec<u8>

source§

fn from(value: SerializedCallRequests) -> Vec<u8>

Converts to this type from the input type.
","From","air_test_framework::ephemeral::Data"],["
source§

impl From<SerializedCallResults> for Vec<u8>

source§

fn from(value: SerializedCallResults) -> Vec<u8>

Converts to this type from the input type.
","From","air_test_framework::ephemeral::Data"],["
source§

impl From<SerializedTetraplets> for Vec<u8>

source§

fn from(value: SerializedTetraplets) -> Vec<u8>

Converts to this type from the input type.
","From","air_test_framework::ephemeral::Data"],["
1.14.0 · source§

impl From<String> for Vec<u8>

source§

fn from(string: String) -> Vec<u8>

Converts the given String to a vector Vec that holds values of type u8.

\n
§Examples
\n
let s1 = String::from(\"hello world\");\nlet v1 = Vec::from(s1);\n\nfor b in v1 {\n    println!(\"{b}\");\n}
\n
","From","air_test_framework::ephemeral::Data"],["
§

impl<K, V> From<TiVec<K, V>> for Vec<V>

§

fn from(vec: TiVec<K, V>) -> Vec<V>

Converts to this type from the input type.
","From>","air_test_framework::ephemeral::Data"],["
source§

impl From<Uuid> for Vec<u8>

source§

fn from(value: Uuid) -> Vec<u8>

Converts to this type from the input type.
","From","air_test_framework::ephemeral::Data"],["
1.10.0 · source§

impl<T, A> From<VecDeque<T, A>> for Vec<T, A>
where\n A: Allocator,

source§

fn from(other: VecDeque<T, A>) -> Vec<T, A>

Turn a VecDeque<T> into a Vec<T>.

\n

This never needs to re-allocate, but does need to do O(n) data movement if\nthe circular buffer doesn’t happen to be at the beginning of the allocation.

\n
§Examples
\n
use std::collections::VecDeque;\n\n// This one is *O*(1).\nlet deque: VecDeque<_> = (1..5).collect();\nlet ptr = deque.as_slices().0.as_ptr();\nlet vec = Vec::from(deque);\nassert_eq!(vec, [1, 2, 3, 4]);\nassert_eq!(vec.as_ptr(), ptr);\n\n// This one needs data rearranging.\nlet mut deque: VecDeque<_> = (1..5).collect();\ndeque.push_front(9);\ndeque.push_front(8);\nlet ptr = deque.as_slices().1.as_ptr();\nlet vec = Vec::from(deque);\nassert_eq!(vec, [8, 9, 1, 2, 3, 4]);\nassert_eq!(vec.as_ptr(), ptr);
\n
","From>","air_test_framework::ephemeral::Data"],["
§

impl<T> FromDerObject for Vec<T>
where\n T: FromDerObject,

§

fn from_der_object(der_object: DerObject) -> Result<Vec<T>, Asn1DerError>

Converts der_object into Self
§

fn deserialize<'a>(\n source: impl Iterator<Item = &'a u8>,\n) -> Result<Self, Asn1DerError>

DER-deserializes the data from source
","FromDerObject","air_test_framework::ephemeral::Data"],["
§

impl FromDerObject for Vec<u8>

§

fn from_der_object(der_object: DerObject) -> Result<Vec<u8>, Asn1DerError>

Converts der_object into Self
§

fn deserialize<'a>(\n source: impl Iterator<Item = &'a u8>,\n) -> Result<Self, Asn1DerError>

DER-deserializes the data from source
","FromDerObject","air_test_framework::ephemeral::Data"],["
source§

impl<T> FromFallibleIterator<T> for Vec<T>

source§

fn from_fallible_iter<I>(\n it: I,\n) -> Result<Vec<T>, <I as IntoFallibleIterator>::Error>
where\n I: IntoFallibleIterator<Item = T>,

Creates a value from a fallible iterator.
","FromFallibleIterator","air_test_framework::ephemeral::Data"],["
1.0.0 · source§

impl<T> FromIterator<T> for Vec<T>

Collects an iterator into a Vec, commonly called via Iterator::collect()

\n

§Allocation behavior

\n

In general Vec does not guarantee any particular growth or allocation strategy.\nThat also applies to this trait impl.

\n

Note: This section covers implementation details and is therefore exempt from\nstability guarantees.

\n

Vec may use any or none of the following strategies,\ndepending on the supplied iterator:

\n
    \n
  • preallocate based on Iterator::size_hint()\n
      \n
    • and panic if the number of items is outside the provided lower/upper bounds
    • \n
    \n
  • \n
  • use an amortized growth strategy similar to pushing one item at a time
  • \n
  • perform the iteration in-place on the original allocation backing the iterator
  • \n
\n

The last case warrants some attention. It is an optimization that in many cases reduces peak memory\nconsumption and improves cache locality. But when big, short-lived allocations are created,\nonly a small fraction of their items get collected, no further use is made of the spare capacity\nand the resulting Vec is moved into a longer-lived structure, then this can lead to the large\nallocations having their lifetimes unnecessarily extended which can result in increased memory\nfootprint.

\n

In cases where this is an issue, the excess capacity can be discarded with Vec::shrink_to(),\nVec::shrink_to_fit() or by collecting into Box<[T]> instead, which additionally reduces\nthe size of the long-lived struct.

\n\n
static LONG_LIVED: Mutex<Vec<Vec<u16>>> = Mutex::new(Vec::new());\n\nfor i in 0..10 {\n    let big_temporary: Vec<u16> = (0..1024).collect();\n    // discard most items\n    let mut result: Vec<_> = big_temporary.into_iter().filter(|i| i % 100 == 0).collect();\n    // without this a lot of unused capacity might be moved into the global\n    result.shrink_to_fit();\n    LONG_LIVED.lock().unwrap().push(result);\n}
\n
source§

fn from_iter<I>(iter: I) -> Vec<T>
where\n I: IntoIterator<Item = T>,

Creates a value from an iterator. Read more
","FromIterator","air_test_framework::ephemeral::Data"],["
§

impl<T> FromParallelIterator<T> for Vec<T>
where\n T: Send,

Collects items from a parallel iterator into a vector.

\n
§

fn from_par_iter<I>(par_iter: I) -> Vec<T>
where\n I: IntoParallelIterator<Item = T>,

Creates an instance of the collection from the parallel iterator par_iter. Read more
","FromParallelIterator","air_test_framework::ephemeral::Data"],["
1.0.0 · source§

impl<T, A> Hash for Vec<T, A>
where\n T: Hash,\n A: Allocator,

The hash of a vector is the same as that of the corresponding slice,\nas required by the core::borrow::Borrow implementation.

\n\n
use std::hash::BuildHasher;\n\nlet b = std::hash::RandomState::new();\nlet v: Vec<u8> = vec![0xa8, 0x3c, 0x09];\nlet s: &[u8] = &[0xa8, 0x3c, 0x09];\nassert_eq!(b.hash_one(v), b.hash_one(s));
\n
source§

fn hash<H>(&self, state: &mut H)
where\n H: Hasher,

Feeds this value into the given Hasher. Read more
1.3.0 · source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where\n H: Hasher,\n Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
","Hash","air_test_framework::ephemeral::Data"],["
1.0.0 · source§

impl<T, I, A> Index<I> for Vec<T, A>
where\n I: SliceIndex<[T]>,\n A: Allocator,

§

type Output = <I as SliceIndex<[T]>>::Output

The returned type after indexing.
source§

fn index(&self, index: I) -> &<Vec<T, A> as Index<I>>::Output

Performs the indexing (container[index]) operation. Read more
","Index","air_test_framework::ephemeral::Data"],["
§

impl<T> Index<PatternID> for Vec<T>

§

type Output = T

The returned type after indexing.
§

fn index(&self, index: PatternID) -> &T

Performs the indexing (container[index]) operation. Read more
","Index","air_test_framework::ephemeral::Data"],["
§

impl<T> Index<PatternID> for Vec<T>

§

type Output = T

The returned type after indexing.
§

fn index(&self, index: PatternID) -> &T

Performs the indexing (container[index]) operation. Read more
","Index","air_test_framework::ephemeral::Data"],["
§

impl<T> Index<SmallIndex> for Vec<T>

§

type Output = T

The returned type after indexing.
§

fn index(&self, index: SmallIndex) -> &T

Performs the indexing (container[index]) operation. Read more
","Index","air_test_framework::ephemeral::Data"],["
§

impl<T> Index<SmallIndex> for Vec<T>

§

type Output = T

The returned type after indexing.
§

fn index(&self, index: SmallIndex) -> &T

Performs the indexing (container[index]) operation. Read more
","Index","air_test_framework::ephemeral::Data"],["
§

impl<T> Index<StateID> for Vec<T>

§

type Output = T

The returned type after indexing.
§

fn index(&self, index: StateID) -> &T

Performs the indexing (container[index]) operation. Read more
","Index","air_test_framework::ephemeral::Data"],["
§

impl<T> Index<StateID> for Vec<T>

§

type Output = T

The returned type after indexing.
§

fn index(&self, index: StateID) -> &T

Performs the indexing (container[index]) operation. Read more
","Index","air_test_framework::ephemeral::Data"],["
1.0.0 · source§

impl<T, I, A> IndexMut<I> for Vec<T, A>
where\n I: SliceIndex<[T]>,\n A: Allocator,

source§

fn index_mut(&mut self, index: I) -> &mut <Vec<T, A> as Index<I>>::Output

Performs the mutable indexing (container[index]) operation. Read more
","IndexMut","air_test_framework::ephemeral::Data"],["
§

impl<T> IndexMut<PatternID> for Vec<T>

§

fn index_mut(&mut self, index: PatternID) -> &mut T

Performs the mutable indexing (container[index]) operation. Read more
","IndexMut","air_test_framework::ephemeral::Data"],["
§

impl<T> IndexMut<PatternID> for Vec<T>

§

fn index_mut(&mut self, index: PatternID) -> &mut T

Performs the mutable indexing (container[index]) operation. Read more
","IndexMut","air_test_framework::ephemeral::Data"],["
§

impl<T> IndexMut<SmallIndex> for Vec<T>

§

fn index_mut(&mut self, index: SmallIndex) -> &mut T

Performs the mutable indexing (container[index]) operation. Read more
","IndexMut","air_test_framework::ephemeral::Data"],["
§

impl<T> IndexMut<SmallIndex> for Vec<T>

§

fn index_mut(&mut self, index: SmallIndex) -> &mut T

Performs the mutable indexing (container[index]) operation. Read more
","IndexMut","air_test_framework::ephemeral::Data"],["
§

impl<T> IndexMut<StateID> for Vec<T>

§

fn index_mut(&mut self, index: StateID) -> &mut T

Performs the mutable indexing (container[index]) operation. Read more
","IndexMut","air_test_framework::ephemeral::Data"],["
§

impl<T> IndexMut<StateID> for Vec<T>

§

fn index_mut(&mut self, index: StateID) -> &mut T

Performs the mutable indexing (container[index]) operation. Read more
","IndexMut","air_test_framework::ephemeral::Data"],["
§

impl IntoBytes for Vec<u8>

§

fn into_bytes(self) -> Vec<u8>

Return the little-endian byte representation of the implementing type.
","IntoBytes","air_test_framework::ephemeral::Data"],["
§

impl<T> IntoDerObject for Vec<T>
where\n T: IntoDerObject,

§

fn into_der_object(self) -> DerObject

Converts self into a DER object
§

fn serialized_len(&self) -> usize

Efficiently computes the length of the DER-serialized representation of self
§

fn serialize<'a>(\n self,\n buf: impl Iterator<Item = &'a mut u8>,\n) -> Result<usize, Asn1DerError>

DER-serializes self into buf and returns the amount of bytes written
","IntoDerObject","air_test_framework::ephemeral::Data"],["
§

impl IntoDerObject for Vec<u8>

§

fn into_der_object(self) -> DerObject

Converts self into a DER object
§

fn serialized_len(&self) -> usize

Efficiently computes the length of the DER-serialized representation of self
§

fn serialize<'a>(\n self,\n buf: impl Iterator<Item = &'a mut u8>,\n) -> Result<usize, Asn1DerError>

DER-serializes self into buf and returns the amount of bytes written
","IntoDerObject","air_test_framework::ephemeral::Data"],["
source§

impl<'de, T, E> IntoDeserializer<'de, E> for Vec<T>
where\n T: IntoDeserializer<'de, E>,\n E: Error,

§

type Deserializer = SeqDeserializer<<Vec<T> as IntoIterator>::IntoIter, E>

The type of the deserializer being converted into.
source§

fn into_deserializer(self) -> <Vec<T> as IntoDeserializer<'de, E>>::Deserializer

Convert this value into a deserializer.
","IntoDeserializer<'de, E>","air_test_framework::ephemeral::Data"],["
1.0.0 · source§

impl<T, A> IntoIterator for Vec<T, A>
where\n A: Allocator,

source§

fn into_iter(self) -> <Vec<T, A> as IntoIterator>::IntoIter

Creates a consuming iterator, that is, one that moves each value out of\nthe vector (from start to end). The vector cannot be used after calling\nthis.

\n
§Examples
\n
let v = vec![\"a\".to_string(), \"b\".to_string()];\nlet mut v_iter = v.into_iter();\n\nlet first_element: Option<String> = v_iter.next();\n\nassert_eq!(first_element, Some(\"a\".to_string()));\nassert_eq!(v_iter.next(), Some(\"b\".to_string()));\nassert_eq!(v_iter.next(), None);
\n
§

type Item = T

The type of the elements being iterated over.
§

type IntoIter = IntoIter<T, A>

Which kind of iterator are we turning this into?
","IntoIterator","air_test_framework::ephemeral::Data"],["
§

impl<T> IntoParallelIterator for Vec<T>
where\n T: Send,

§

type Item = T

The type of item that the parallel iterator will produce.
§

type Iter = IntoIter<T>

The parallel iterator type that will be created.
§

fn into_par_iter(self) -> <Vec<T> as IntoParallelIterator>::Iter

Converts self into a parallel iterator. Read more
","IntoParallelIterator","air_test_framework::ephemeral::Data"],["
§

impl NativeType for Vec<u8>

§

const INTERFACE_TYPE: IType = IType::ByteArray

The associated interface type that maps to the native type.
","NativeType","air_test_framework::ephemeral::Data"],["
1.0.0 · source§

impl<T, A> Ord for Vec<T, A>
where\n T: Ord,\n A: Allocator,

Implements ordering of vectors, lexicographically.

\n
source§

fn cmp(&self, other: &Vec<T, A>) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · source§

fn max(self, other: Self) -> Self
where\n Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · source§

fn min(self, other: Self) -> Self
where\n Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · source§

fn clamp(self, min: Self, max: Self) -> Self
where\n Self: Sized + PartialOrd,

Restrict a value to a certain interval. Read more
","Ord","air_test_framework::ephemeral::Data"],["
§

impl<'a, T> ParallelExtend<&'a T> for Vec<T>
where\n T: 'a + Copy + Send + Sync,

Extends a vector with copied items from a parallel iterator.

\n
§

fn par_extend<I>(&mut self, par_iter: I)
where\n I: IntoParallelIterator<Item = &'a T>,

Extends an instance of the collection with the elements drawn\nfrom the parallel iterator par_iter. Read more
","ParallelExtend<&'a T>","air_test_framework::ephemeral::Data"],["
§

impl<T> ParallelExtend<T> for Vec<T>
where\n T: Send,

Extends a vector with items from a parallel iterator.

\n
§

fn par_extend<I>(&mut self, par_iter: I)
where\n I: IntoParallelIterator<Item = T>,

Extends an instance of the collection with the elements drawn\nfrom the parallel iterator par_iter. Read more
","ParallelExtend","air_test_framework::ephemeral::Data"],["
1.0.0 · source§

impl<T, U, A> PartialEq<&[U]> for Vec<T, A>
where\n A: Allocator,\n T: PartialEq<U>,

source§

fn eq(&self, other: &&[U]) -> bool

This method tests for self and other values to be equal, and is used\nby ==.
source§

fn ne(&self, other: &&[U]) -> bool

This method tests for !=. The default implementation is almost always\nsufficient, and should not be overridden without very good reason.
","PartialEq<&[U]>","air_test_framework::ephemeral::Data"],["
1.0.0 · source§

impl<T, U, A, const N: usize> PartialEq<&[U; N]> for Vec<T, A>
where\n A: Allocator,\n T: PartialEq<U>,

source§

fn eq(&self, other: &&[U; N]) -> bool

This method tests for self and other values to be equal, and is used\nby ==.
source§

fn ne(&self, other: &&[U; N]) -> bool

This method tests for !=. The default implementation is almost always\nsufficient, and should not be overridden without very good reason.
","PartialEq<&[U; N]>","air_test_framework::ephemeral::Data"],["
1.0.0 · source§

impl<T, U, A> PartialEq<&mut [U]> for Vec<T, A>
where\n A: Allocator,\n T: PartialEq<U>,

source§

fn eq(&self, other: &&mut [U]) -> bool

This method tests for self and other values to be equal, and is used\nby ==.
source§

fn ne(&self, other: &&mut [U]) -> bool

This method tests for !=. The default implementation is almost always\nsufficient, and should not be overridden without very good reason.
","PartialEq<&mut [U]>","air_test_framework::ephemeral::Data"],["
1.48.0 · source§

impl<T, U, A> PartialEq<[U]> for Vec<T, A>
where\n A: Allocator,\n T: PartialEq<U>,

source§

fn eq(&self, other: &[U]) -> bool

This method tests for self and other values to be equal, and is used\nby ==.
source§

fn ne(&self, other: &[U]) -> bool

This method tests for !=. The default implementation is almost always\nsufficient, and should not be overridden without very good reason.
","PartialEq<[U]>","air_test_framework::ephemeral::Data"],["
1.0.0 · source§

impl<T, U, A, const N: usize> PartialEq<[U; N]> for Vec<T, A>
where\n A: Allocator,\n T: PartialEq<U>,

source§

fn eq(&self, other: &[U; N]) -> bool

This method tests for self and other values to be equal, and is used\nby ==.
source§

fn ne(&self, other: &[U; N]) -> bool

This method tests for !=. The default implementation is almost always\nsufficient, and should not be overridden without very good reason.
","PartialEq<[U; N]>","air_test_framework::ephemeral::Data"],["
§

impl<T, U> PartialEq<ArchivedVec<U>> for Vec<T>
where\n T: PartialEq<U>,

§

fn eq(&self, other: &ArchivedVec<U>) -> bool

This method tests for self and other values to be equal, and is used\nby ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always\nsufficient, and should not be overridden without very good reason.
","PartialEq>","air_test_framework::ephemeral::Data"],["
§

impl PartialEq<Bytes> for Vec<u8>

§

fn eq(&self, other: &Bytes) -> bool

This method tests for self and other values to be equal, and is used\nby ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always\nsufficient, and should not be overridden without very good reason.
","PartialEq","air_test_framework::ephemeral::Data"],["
§

impl PartialEq<BytesMut> for Vec<u8>

§

fn eq(&self, other: &BytesMut) -> bool

This method tests for self and other values to be equal, and is used\nby ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always\nsufficient, and should not be overridden without very good reason.
","PartialEq","air_test_framework::ephemeral::Data"],["
1.0.0 · source§

impl<T, U, A1, A2> PartialEq<Vec<U, A2>> for Vec<T, A1>
where\n A1: Allocator,\n A2: Allocator,\n T: PartialEq<U>,

source§

fn eq(&self, other: &Vec<U, A2>) -> bool

This method tests for self and other values to be equal, and is used\nby ==.
source§

fn ne(&self, other: &Vec<U, A2>) -> bool

This method tests for !=. The default implementation is almost always\nsufficient, and should not be overridden without very good reason.
","PartialEq>","air_test_framework::ephemeral::Data"],["
§

impl<T> PartialOrd<ArchivedVec<T>> for Vec<T>
where\n T: PartialOrd,

§

fn partial_cmp(&self, other: &ArchivedVec<T>) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · source§

fn lt(&self, other: &Rhs) -> bool

This method tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · source§

fn le(&self, other: &Rhs) -> bool

This method tests less than or equal to (for self and other) and is used by the <=\noperator. Read more
1.0.0 · source§

fn gt(&self, other: &Rhs) -> bool

This method tests greater than (for self and other) and is used by the > operator. Read more
1.0.0 · source§

fn ge(&self, other: &Rhs) -> bool

This method tests greater than or equal to (for self and other) and is used by the >=\noperator. Read more
","PartialOrd>","air_test_framework::ephemeral::Data"],["
§

impl PartialOrd<Bytes> for Vec<u8>

§

fn partial_cmp(&self, other: &Bytes) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · source§

fn lt(&self, other: &Rhs) -> bool

This method tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · source§

fn le(&self, other: &Rhs) -> bool

This method tests less than or equal to (for self and other) and is used by the <=\noperator. Read more
1.0.0 · source§

fn gt(&self, other: &Rhs) -> bool

This method tests greater than (for self and other) and is used by the > operator. Read more
1.0.0 · source§

fn ge(&self, other: &Rhs) -> bool

This method tests greater than or equal to (for self and other) and is used by the >=\noperator. Read more
","PartialOrd","air_test_framework::ephemeral::Data"],["
§

impl PartialOrd<BytesMut> for Vec<u8>

§

fn partial_cmp(&self, other: &BytesMut) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · source§

fn lt(&self, other: &Rhs) -> bool

This method tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · source§

fn le(&self, other: &Rhs) -> bool

This method tests less than or equal to (for self and other) and is used by the <=\noperator. Read more
1.0.0 · source§

fn gt(&self, other: &Rhs) -> bool

This method tests greater than (for self and other) and is used by the > operator. Read more
1.0.0 · source§

fn ge(&self, other: &Rhs) -> bool

This method tests greater than or equal to (for self and other) and is used by the >=\noperator. Read more
","PartialOrd","air_test_framework::ephemeral::Data"],["
1.0.0 · source§

impl<T, A1, A2> PartialOrd<Vec<T, A2>> for Vec<T, A1>
where\n T: PartialOrd,\n A1: Allocator,\n A2: Allocator,

Implements comparison of vectors, lexicographically.

\n
source§

fn partial_cmp(&self, other: &Vec<T, A2>) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · source§

fn lt(&self, other: &Rhs) -> bool

This method tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · source§

fn le(&self, other: &Rhs) -> bool

This method tests less than or equal to (for self and other) and is used by the <=\noperator. Read more
1.0.0 · source§

fn gt(&self, other: &Rhs) -> bool

This method tests greater than (for self and other) and is used by the > operator. Read more
1.0.0 · source§

fn ge(&self, other: &Rhs) -> bool

This method tests greater than or equal to (for self and other) and is used by the >=\noperator. Read more
","PartialOrd>","air_test_framework::ephemeral::Data"],["
§

impl Replacer for Vec<u8>

§

fn replace_append(&mut self, caps: &Captures<'_>, dst: &mut Vec<u8>)

Appends possibly empty data to dst to replace the current match. Read more
§

fn no_expansion(&mut self) -> Option<Cow<'_, [u8]>>

Return a fixed unchanging replacement byte string. Read more
§

fn by_ref<'r>(&'r mut self) -> ReplacerRef<'r, Self>

Returns a type that implements Replacer, but that borrows and wraps\nthis Replacer. Read more
","Replacer","air_test_framework::ephemeral::Data"],["
§

impl<T, S> Serialize<S> for Vec<T>
where\n T: Serialize<S>,\n S: ScratchSpace + Serializer + ?Sized,

§

fn serialize(\n &self,\n serializer: &mut S,\n) -> Result<<Vec<T> as Archive>::Resolver, <S as Fallible>::Error>

Writes the dependencies for the object and returns a resolver that can create the archived\ntype.
","Serialize","air_test_framework::ephemeral::Data"],["
source§

impl<T> Serialize for Vec<T>
where\n T: Serialize,

source§

fn serialize<S>(\n &self,\n serializer: S,\n) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error>
where\n S: Serializer,

Serialize this value into the given Serde serializer. Read more
","Serialize","air_test_framework::ephemeral::Data"],["
source§

impl Serialize for Vec<u8>

source§

fn serialize<S>(\n &self,\n serializer: S,\n) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error>
where\n S: Serializer,

","Serialize","air_test_framework::ephemeral::Data"],["
source§

impl<T, U> SerializeAs<Vec<T>> for Vec<U>
where\n U: SerializeAs<T>,

source§

fn serialize_as<S>(\n source: &Vec<T>,\n serializer: S,\n) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error>
where\n S: Serializer,

Serialize this value into the given Serde serializer.
","SerializeAs>","air_test_framework::ephemeral::Data"],["
§

impl<T> Sink<T> for Vec<T>

§

type Error = Infallible

The type of value produced by the sink when an error occurs.
§

fn poll_ready(\n self: Pin<&mut Vec<T>>,\n _: &mut Context<'_>,\n) -> Poll<Result<(), <Vec<T> as Sink<T>>::Error>>

Attempts to prepare the Sink to receive a value. Read more
§

fn start_send(\n self: Pin<&mut Vec<T>>,\n item: T,\n) -> Result<(), <Vec<T> as Sink<T>>::Error>

Begin the process of sending a value to the sink.\nEach call to this function must be preceded by a successful call to\npoll_ready which returned Poll::Ready(Ok(())). Read more
§

fn poll_flush(\n self: Pin<&mut Vec<T>>,\n _: &mut Context<'_>,\n) -> Poll<Result<(), <Vec<T> as Sink<T>>::Error>>

Flush any remaining output from this sink. Read more
§

fn poll_close(\n self: Pin<&mut Vec<T>>,\n _: &mut Context<'_>,\n) -> Poll<Result<(), <Vec<T> as Sink<T>>::Error>>

Flush any remaining output and close this sink, if necessary. Read more
","Sink","air_test_framework::ephemeral::Data"],["
§

impl Sink for Vec<u8>

§

fn write(&mut self, e: u8) -> Result<(), Asn1DerError>

Writes e to self
§

fn counting_sink(self, ctr: &mut usize) -> CountingSink<'_, Self>

Creates a counting sink
","Sink","air_test_framework::ephemeral::Data"],["
§

impl<W, I> ToBytes<W> for Vec<I>
where\n W: Write,\n I: ToBytes<W>,

Encode a vector into bytes.

\n

Decoder is decoders::binary::list.

\n
§

fn to_bytes(&self, writer: &mut W) -> Result<(), Error>

Converts the given value into &[u8] in the given writer.
","ToBytes","air_test_framework::ephemeral::Data"],["
§

impl TryFrom<IValue> for Vec<u8>

§

type Error = WasmValueNativeCastError

The type returned in the event of a conversion error.
§

fn try_from(w: IValue) -> Result<Vec<u8>, <Vec<u8> as TryFrom<IValue>>::Error>

Performs the conversion.
","TryFrom","air_test_framework::ephemeral::Data"],["
source§

impl<T> Vec<T>

1.0.0 (const: 1.39.0) · source

pub const fn new() -> Vec<T>

Constructs a new, empty Vec<T>.

\n

The vector will not allocate until elements are pushed onto it.

\n
§Examples
\n
let mut vec: Vec<i32> = Vec::new();
\n
1.0.0 · source

pub fn with_capacity(capacity: usize) -> Vec<T>

Constructs a new, empty Vec<T> with at least the specified capacity.

\n

The vector will be able to hold at least capacity elements without\nreallocating. This method is allowed to allocate for more elements than\ncapacity. If capacity is 0, the vector will not allocate.

\n

It is important to note that although the returned vector has the\nminimum capacity specified, the vector will have a zero length. For\nan explanation of the difference between length and capacity, see\nCapacity and reallocation.

\n

If it is important to know the exact allocated capacity of a Vec,\nalways use the capacity method after construction.

\n

For Vec<T> where T is a zero-sized type, there will be no allocation\nand the capacity will always be usize::MAX.

\n
§Panics
\n

Panics if the new capacity exceeds isize::MAX bytes.

\n
§Examples
\n
let mut vec = Vec::with_capacity(10);\n\n// The vector contains no items, even though it has capacity for more\nassert_eq!(vec.len(), 0);\nassert!(vec.capacity() >= 10);\n\n// These are all done without reallocating...\nfor i in 0..10 {\n    vec.push(i);\n}\nassert_eq!(vec.len(), 10);\nassert!(vec.capacity() >= 10);\n\n// ...but this may make the vector reallocate\nvec.push(11);\nassert_eq!(vec.len(), 11);\nassert!(vec.capacity() >= 11);\n\n// A vector of a zero-sized type will always over-allocate, since no\n// allocation is necessary\nlet vec_units = Vec::<()>::with_capacity(10);\nassert_eq!(vec_units.capacity(), usize::MAX);
\n
source

pub fn try_with_capacity(capacity: usize) -> Result<Vec<T>, TryReserveError>

🔬This is a nightly-only experimental API. (try_with_capacity)

Constructs a new, empty Vec<T> with at least the specified capacity.

\n

The vector will be able to hold at least capacity elements without\nreallocating. This method is allowed to allocate for more elements than\ncapacity. If capacity is 0, the vector will not allocate.

\n
§Errors
\n

Returns an error if the capacity exceeds isize::MAX bytes,\nor if the allocator reports allocation failure.

\n
1.0.0 · source

pub unsafe fn from_raw_parts(\n ptr: *mut T,\n length: usize,\n capacity: usize,\n) -> Vec<T>

Creates a Vec<T> directly from a pointer, a length, and a capacity.

\n
§Safety
\n

This is highly unsafe, due to the number of invariants that aren’t\nchecked:

\n
    \n
  • ptr must have been allocated using the global allocator, such as via\nthe alloc::alloc function.
  • \n
  • T needs to have the same alignment as what ptr was allocated with.\n(T having a less strict alignment is not sufficient, the alignment really\nneeds to be equal to satisfy the dealloc requirement that memory must be\nallocated and deallocated with the same layout.)
  • \n
  • The size of T times the capacity (ie. the allocated size in bytes) needs\nto be the same size as the pointer was allocated with. (Because similar to\nalignment, dealloc must be called with the same layout size.)
  • \n
  • length needs to be less than or equal to capacity.
  • \n
  • The first length values must be properly initialized values of type T.
  • \n
  • capacity needs to be the capacity that the pointer was allocated with.
  • \n
  • The allocated size in bytes must be no larger than isize::MAX.\nSee the safety documentation of pointer::offset.
  • \n
\n

These requirements are always upheld by any ptr that has been allocated\nvia Vec<T>. Other allocation sources are allowed if the invariants are\nupheld.

\n

Violating these may cause problems like corrupting the allocator’s\ninternal data structures. For example it is normally not safe\nto build a Vec<u8> from a pointer to a C char array with length\nsize_t, doing so is only safe if the array was initially allocated by\na Vec or String.\nIt’s also not safe to build one from a Vec<u16> and its length, because\nthe allocator cares about the alignment, and these two types have different\nalignments. The buffer was allocated with alignment 2 (for u16), but after\nturning it into a Vec<u8> it’ll be deallocated with alignment 1. To avoid\nthese issues, it is often preferable to do casting/transmuting using\nslice::from_raw_parts instead.

\n

The ownership of ptr is effectively transferred to the\nVec<T> which may then deallocate, reallocate or change the\ncontents of memory pointed to by the pointer at will. Ensure\nthat nothing else uses the pointer after calling this\nfunction.

\n
§Examples
\n
use std::ptr;\nuse std::mem;\n\nlet v = vec![1, 2, 3];\n\n// Prevent running `v`'s destructor so we are in complete control\n// of the allocation.\nlet mut v = mem::ManuallyDrop::new(v);\n\n// Pull out the various important pieces of information about `v`\nlet p = v.as_mut_ptr();\nlet len = v.len();\nlet cap = v.capacity();\n\nunsafe {\n    // Overwrite memory with 4, 5, 6\n    for i in 0..len {\n        ptr::write(p.add(i), 4 + i);\n    }\n\n    // Put everything back together into a Vec\n    let rebuilt = Vec::from_raw_parts(p, len, cap);\n    assert_eq!(rebuilt, [4, 5, 6]);\n}
\n

Using memory that was allocated elsewhere:

\n\n
use std::alloc::{alloc, Layout};\n\nfn main() {\n    let layout = Layout::array::<u32>(16).expect(\"overflow cannot happen\");\n\n    let vec = unsafe {\n        let mem = alloc(layout).cast::<u32>();\n        if mem.is_null() {\n            return;\n        }\n\n        mem.write(1_000_000);\n\n        Vec::from_raw_parts(mem, 1, 16)\n    };\n\n    assert_eq!(vec, &[1_000_000]);\n    assert_eq!(vec.capacity(), 16);\n}
\n
",0,"air_test_framework::ephemeral::Data"],["
source§

impl<T, A> Vec<T, A>
where\n T: Clone,\n A: Allocator,

1.5.0 · source

pub fn resize(&mut self, new_len: usize, value: T)

Resizes the Vec in-place so that len is equal to new_len.

\n

If new_len is greater than len, the Vec is extended by the\ndifference, with each additional slot filled with value.\nIf new_len is less than len, the Vec is simply truncated.

\n

This method requires T to implement Clone,\nin order to be able to clone the passed value.\nIf you need more flexibility (or want to rely on Default instead of\nClone), use Vec::resize_with.\nIf you only need to resize to a smaller size, use Vec::truncate.

\n
§Examples
\n
let mut vec = vec![\"hello\"];\nvec.resize(3, \"world\");\nassert_eq!(vec, [\"hello\", \"world\", \"world\"]);\n\nlet mut vec = vec![1, 2, 3, 4];\nvec.resize(2, 0);\nassert_eq!(vec, [1, 2]);
\n
1.6.0 · source

pub fn extend_from_slice(&mut self, other: &[T])

Clones and appends all elements in a slice to the Vec.

\n

Iterates over the slice other, clones each element, and then appends\nit to this Vec. The other slice is traversed in-order.

\n

Note that this function is same as extend except that it is\nspecialized to work with slices instead. If and when Rust gets\nspecialization this function will likely be deprecated (but still\navailable).

\n
§Examples
\n
let mut vec = vec![1];\nvec.extend_from_slice(&[2, 3, 4]);\nassert_eq!(vec, [1, 2, 3, 4]);
\n
1.53.0 · source

pub fn extend_from_within<R>(&mut self, src: R)
where\n R: RangeBounds<usize>,

Copies elements from src range to the end of the vector.

\n
§Panics
\n

Panics if the starting point is greater than the end point or if\nthe end point is greater than the length of the vector.

\n
§Examples
\n
let mut vec = vec![0, 1, 2, 3, 4];\n\nvec.extend_from_within(2..);\nassert_eq!(vec, [0, 1, 2, 3, 4, 2, 3, 4]);\n\nvec.extend_from_within(..2);\nassert_eq!(vec, [0, 1, 2, 3, 4, 2, 3, 4, 0, 1]);\n\nvec.extend_from_within(4..8);\nassert_eq!(vec, [0, 1, 2, 3, 4, 2, 3, 4, 0, 1, 4, 2, 3, 4]);
\n
",0,"air_test_framework::ephemeral::Data"],["
source§

impl<T, A> Vec<T, A>
where\n T: PartialEq,\n A: Allocator,

1.0.0 · source

pub fn dedup(&mut self)

Removes consecutive repeated elements in the vector according to the\nPartialEq trait implementation.

\n

If the vector is sorted, this removes all duplicates.

\n
§Examples
\n
let mut vec = vec![1, 2, 2, 3, 2];\n\nvec.dedup();\n\nassert_eq!(vec, [1, 2, 3, 2]);
\n
",0,"air_test_framework::ephemeral::Data"],["
source§

impl<T, A> Vec<T, A>
where\n A: Allocator,

1.21.0 · source

pub fn splice<R, I>(\n &mut self,\n range: R,\n replace_with: I,\n) -> Splice<'_, <I as IntoIterator>::IntoIter, A>
where\n R: RangeBounds<usize>,\n I: IntoIterator<Item = T>,

Creates a splicing iterator that replaces the specified range in the vector\nwith the given replace_with iterator and yields the removed items.\nreplace_with does not need to be the same length as range.

\n

range is removed even if the iterator is not consumed until the end.

\n

It is unspecified how many elements are removed from the vector\nif the Splice value is leaked.

\n

The input iterator replace_with is only consumed when the Splice value is dropped.

\n

This is optimal if:

\n
    \n
  • The tail (elements in the vector after range) is empty,
  • \n
  • or replace_with yields fewer or equal elements than range’s length
  • \n
  • or the lower bound of its size_hint() is exact.
  • \n
\n

Otherwise, a temporary vector is allocated and the tail is moved twice.

\n
§Panics
\n

Panics if the starting point is greater than the end point or if\nthe end point is greater than the length of the vector.

\n
§Examples
\n
let mut v = vec![1, 2, 3, 4];\nlet new = [7, 8, 9];\nlet u: Vec<_> = v.splice(1..3, new).collect();\nassert_eq!(v, &[1, 7, 8, 9, 4]);\nassert_eq!(u, &[2, 3]);
\n
source

pub fn extract_if<F>(&mut self, filter: F) -> ExtractIf<'_, T, F, A>
where\n F: FnMut(&mut T) -> bool,

🔬This is a nightly-only experimental API. (extract_if)

Creates an iterator which uses a closure to determine if an element should be removed.

\n

If the closure returns true, then the element is removed and yielded.\nIf the closure returns false, the element will remain in the vector and will not be yielded\nby the iterator.

\n

If the returned ExtractIf is not exhausted, e.g. because it is dropped without iterating\nor the iteration short-circuits, then the remaining elements will be retained.\nUse retain with a negated predicate if you do not need the returned iterator.

\n

Using this method is equivalent to the following code:

\n\n
let mut i = 0;\nwhile i < vec.len() {\n    if some_predicate(&mut vec[i]) {\n        let val = vec.remove(i);\n        // your code here\n    } else {\n        i += 1;\n    }\n}\n
\n

But extract_if is easier to use. extract_if is also more efficient,\nbecause it can backshift the elements of the array in bulk.

\n

Note that extract_if also lets you mutate every element in the filter closure,\nregardless of whether you choose to keep or remove it.

\n
§Examples
\n

Splitting an array into evens and odds, reusing the original allocation:

\n\n
#![feature(extract_if)]\nlet mut numbers = vec![1, 2, 3, 4, 5, 6, 8, 9, 11, 13, 14, 15];\n\nlet evens = numbers.extract_if(|x| *x % 2 == 0).collect::<Vec<_>>();\nlet odds = numbers;\n\nassert_eq!(evens, vec![2, 4, 6, 8, 14]);\nassert_eq!(odds, vec![1, 3, 5, 9, 11, 13, 15]);
\n
",0,"air_test_framework::ephemeral::Data"],["
source§

impl<T, A> Vec<T, A>
where\n A: Allocator,

source

pub const fn new_in(alloc: A) -> Vec<T, A>

🔬This is a nightly-only experimental API. (allocator_api)

Constructs a new, empty Vec<T, A>.

\n

The vector will not allocate until elements are pushed onto it.

\n
§Examples
\n
#![feature(allocator_api)]\n\nuse std::alloc::System;\n\nlet mut vec: Vec<i32, _> = Vec::new_in(System);
\n
source

pub fn with_capacity_in(capacity: usize, alloc: A) -> Vec<T, A>

🔬This is a nightly-only experimental API. (allocator_api)

Constructs a new, empty Vec<T, A> with at least the specified capacity\nwith the provided allocator.

\n

The vector will be able to hold at least capacity elements without\nreallocating. This method is allowed to allocate for more elements than\ncapacity. If capacity is 0, the vector will not allocate.

\n

It is important to note that although the returned vector has the\nminimum capacity specified, the vector will have a zero length. For\nan explanation of the difference between length and capacity, see\nCapacity and reallocation.

\n

If it is important to know the exact allocated capacity of a Vec,\nalways use the capacity method after construction.

\n

For Vec<T, A> where T is a zero-sized type, there will be no allocation\nand the capacity will always be usize::MAX.

\n
§Panics
\n

Panics if the new capacity exceeds isize::MAX bytes.

\n
§Examples
\n
#![feature(allocator_api)]\n\nuse std::alloc::System;\n\nlet mut vec = Vec::with_capacity_in(10, System);\n\n// The vector contains no items, even though it has capacity for more\nassert_eq!(vec.len(), 0);\nassert!(vec.capacity() >= 10);\n\n// These are all done without reallocating...\nfor i in 0..10 {\n    vec.push(i);\n}\nassert_eq!(vec.len(), 10);\nassert!(vec.capacity() >= 10);\n\n// ...but this may make the vector reallocate\nvec.push(11);\nassert_eq!(vec.len(), 11);\nassert!(vec.capacity() >= 11);\n\n// A vector of a zero-sized type will always over-allocate, since no\n// allocation is necessary\nlet vec_units = Vec::<(), System>::with_capacity_in(10, System);\nassert_eq!(vec_units.capacity(), usize::MAX);
\n
source

pub fn try_with_capacity_in(\n capacity: usize,\n alloc: A,\n) -> Result<Vec<T, A>, TryReserveError>

🔬This is a nightly-only experimental API. (allocator_api)

Constructs a new, empty Vec<T, A> with at least the specified capacity\nwith the provided allocator.

\n

The vector will be able to hold at least capacity elements without\nreallocating. This method is allowed to allocate for more elements than\ncapacity. If capacity is 0, the vector will not allocate.

\n
§Errors
\n

Returns an error if the capacity exceeds isize::MAX bytes,\nor if the allocator reports allocation failure.

\n
source

pub unsafe fn from_raw_parts_in(\n ptr: *mut T,\n length: usize,\n capacity: usize,\n alloc: A,\n) -> Vec<T, A>

🔬This is a nightly-only experimental API. (allocator_api)

Creates a Vec<T, A> directly from a pointer, a length, a capacity,\nand an allocator.

\n
§Safety
\n

This is highly unsafe, due to the number of invariants that aren’t\nchecked:

\n
    \n
  • ptr must be currently allocated via the given allocator alloc.
  • \n
  • T needs to have the same alignment as what ptr was allocated with.\n(T having a less strict alignment is not sufficient, the alignment really\nneeds to be equal to satisfy the dealloc requirement that memory must be\nallocated and deallocated with the same layout.)
  • \n
  • The size of T times the capacity (ie. the allocated size in bytes) needs\nto be the same size as the pointer was allocated with. (Because similar to\nalignment, dealloc must be called with the same layout size.)
  • \n
  • length needs to be less than or equal to capacity.
  • \n
  • The first length values must be properly initialized values of type T.
  • \n
  • capacity needs to fit the layout size that the pointer was allocated with.
  • \n
  • The allocated size in bytes must be no larger than isize::MAX.\nSee the safety documentation of pointer::offset.
  • \n
\n

These requirements are always upheld by any ptr that has been allocated\nvia Vec<T, A>. Other allocation sources are allowed if the invariants are\nupheld.

\n

Violating these may cause problems like corrupting the allocator’s\ninternal data structures. For example it is not safe\nto build a Vec<u8> from a pointer to a C char array with length size_t.\nIt’s also not safe to build one from a Vec<u16> and its length, because\nthe allocator cares about the alignment, and these two types have different\nalignments. The buffer was allocated with alignment 2 (for u16), but after\nturning it into a Vec<u8> it’ll be deallocated with alignment 1.

\n

The ownership of ptr is effectively transferred to the\nVec<T> which may then deallocate, reallocate or change the\ncontents of memory pointed to by the pointer at will. Ensure\nthat nothing else uses the pointer after calling this\nfunction.

\n
§Examples
\n
#![feature(allocator_api)]\n\nuse std::alloc::System;\n\nuse std::ptr;\nuse std::mem;\n\nlet mut v = Vec::with_capacity_in(3, System);\nv.push(1);\nv.push(2);\nv.push(3);\n\n// Prevent running `v`'s destructor so we are in complete control\n// of the allocation.\nlet mut v = mem::ManuallyDrop::new(v);\n\n// Pull out the various important pieces of information about `v`\nlet p = v.as_mut_ptr();\nlet len = v.len();\nlet cap = v.capacity();\nlet alloc = v.allocator();\n\nunsafe {\n    // Overwrite memory with 4, 5, 6\n    for i in 0..len {\n        ptr::write(p.add(i), 4 + i);\n    }\n\n    // Put everything back together into a Vec\n    let rebuilt = Vec::from_raw_parts_in(p, len, cap, alloc.clone());\n    assert_eq!(rebuilt, [4, 5, 6]);\n}
\n

Using memory that was allocated elsewhere:

\n\n
#![feature(allocator_api)]\n\nuse std::alloc::{AllocError, Allocator, Global, Layout};\n\nfn main() {\n    let layout = Layout::array::<u32>(16).expect(\"overflow cannot happen\");\n\n    let vec = unsafe {\n        let mem = match Global.allocate(layout) {\n            Ok(mem) => mem.cast::<u32>().as_ptr(),\n            Err(AllocError) => return,\n        };\n\n        mem.write(1_000_000);\n\n        Vec::from_raw_parts_in(mem, 1, 16, Global)\n    };\n\n    assert_eq!(vec, &[1_000_000]);\n    assert_eq!(vec.capacity(), 16);\n}
\n
source

pub fn into_raw_parts(self) -> (*mut T, usize, usize)

🔬This is a nightly-only experimental API. (vec_into_raw_parts)

Decomposes a Vec<T> into its raw components: (pointer, length, capacity).

\n

Returns the raw pointer to the underlying data, the length of\nthe vector (in elements), and the allocated capacity of the\ndata (in elements). These are the same arguments in the same\norder as the arguments to from_raw_parts.

\n

After calling this function, the caller is responsible for the\nmemory previously managed by the Vec. The only way to do\nthis is to convert the raw pointer, length, and capacity back\ninto a Vec with the from_raw_parts function, allowing\nthe destructor to perform the cleanup.

\n
§Examples
\n
#![feature(vec_into_raw_parts)]\nlet v: Vec<i32> = vec![-1, 0, 1];\n\nlet (ptr, len, cap) = v.into_raw_parts();\n\nlet rebuilt = unsafe {\n    // We can now make changes to the components, such as\n    // transmuting the raw pointer to a compatible type.\n    let ptr = ptr as *mut u32;\n\n    Vec::from_raw_parts(ptr, len, cap)\n};\nassert_eq!(rebuilt, [4294967295, 0, 1]);
\n
source

pub fn into_raw_parts_with_alloc(self) -> (*mut T, usize, usize, A)

🔬This is a nightly-only experimental API. (allocator_api)

Decomposes a Vec<T> into its raw components: (pointer, length, capacity, allocator).

\n

Returns the raw pointer to the underlying data, the length of the vector (in elements),\nthe allocated capacity of the data (in elements), and the allocator. These are the same\narguments in the same order as the arguments to from_raw_parts_in.

\n

After calling this function, the caller is responsible for the\nmemory previously managed by the Vec. The only way to do\nthis is to convert the raw pointer, length, and capacity back\ninto a Vec with the from_raw_parts_in function, allowing\nthe destructor to perform the cleanup.

\n
§Examples
\n
#![feature(allocator_api, vec_into_raw_parts)]\n\nuse std::alloc::System;\n\nlet mut v: Vec<i32, System> = Vec::new_in(System);\nv.push(-1);\nv.push(0);\nv.push(1);\n\nlet (ptr, len, cap, alloc) = v.into_raw_parts_with_alloc();\n\nlet rebuilt = unsafe {\n    // We can now make changes to the components, such as\n    // transmuting the raw pointer to a compatible type.\n    let ptr = ptr as *mut u32;\n\n    Vec::from_raw_parts_in(ptr, len, cap, alloc)\n};\nassert_eq!(rebuilt, [4294967295, 0, 1]);
\n
1.0.0 · source

pub fn capacity(&self) -> usize

Returns the total number of elements the vector can hold without\nreallocating.

\n
§Examples
\n
let mut vec: Vec<i32> = Vec::with_capacity(10);\nvec.push(42);\nassert!(vec.capacity() >= 10);
\n
1.0.0 · source

pub fn reserve(&mut self, additional: usize)

Reserves capacity for at least additional more elements to be inserted\nin the given Vec<T>. The collection may reserve more space to\nspeculatively avoid frequent reallocations. After calling reserve,\ncapacity will be greater than or equal to self.len() + additional.\nDoes nothing if capacity is already sufficient.

\n
§Panics
\n

Panics if the new capacity exceeds isize::MAX bytes.

\n
§Examples
\n
let mut vec = vec![1];\nvec.reserve(10);\nassert!(vec.capacity() >= 11);
\n
1.0.0 · source

pub fn reserve_exact(&mut self, additional: usize)

Reserves the minimum capacity for at least additional more elements to\nbe inserted in the given Vec<T>. Unlike reserve, this will not\ndeliberately over-allocate to speculatively avoid frequent allocations.\nAfter calling reserve_exact, capacity will be greater than or equal to\nself.len() + additional. Does nothing if the capacity is already\nsufficient.

\n

Note that the allocator may give the collection more space than it\nrequests. Therefore, capacity can not be relied upon to be precisely\nminimal. Prefer reserve if future insertions are expected.

\n
§Panics
\n

Panics if the new capacity exceeds isize::MAX bytes.

\n
§Examples
\n
let mut vec = vec![1];\nvec.reserve_exact(10);\nassert!(vec.capacity() >= 11);
\n
1.57.0 · source

pub fn try_reserve(&mut self, additional: usize) -> Result<(), TryReserveError>

Tries to reserve capacity for at least additional more elements to be inserted\nin the given Vec<T>. The collection may reserve more space to speculatively avoid\nfrequent reallocations. After calling try_reserve, capacity will be\ngreater than or equal to self.len() + additional if it returns\nOk(()). Does nothing if capacity is already sufficient. This method\npreserves the contents even if an error occurs.

\n
§Errors
\n

If the capacity overflows, or the allocator reports a failure, then an error\nis returned.

\n
§Examples
\n
use std::collections::TryReserveError;\n\nfn process_data(data: &[u32]) -> Result<Vec<u32>, TryReserveError> {\n    let mut output = Vec::new();\n\n    // Pre-reserve the memory, exiting if we can't\n    output.try_reserve(data.len())?;\n\n    // Now we know this can't OOM in the middle of our complex work\n    output.extend(data.iter().map(|&val| {\n        val * 2 + 5 // very complicated\n    }));\n\n    Ok(output)\n}
\n
1.57.0 · source

pub fn try_reserve_exact(\n &mut self,\n additional: usize,\n) -> Result<(), TryReserveError>

Tries to reserve the minimum capacity for at least additional\nelements to be inserted in the given Vec<T>. Unlike try_reserve,\nthis will not deliberately over-allocate to speculatively avoid frequent\nallocations. After calling try_reserve_exact, capacity will be greater\nthan or equal to self.len() + additional if it returns Ok(()).\nDoes nothing if the capacity is already sufficient.

\n

Note that the allocator may give the collection more space than it\nrequests. Therefore, capacity can not be relied upon to be precisely\nminimal. Prefer try_reserve if future insertions are expected.

\n
§Errors
\n

If the capacity overflows, or the allocator reports a failure, then an error\nis returned.

\n
§Examples
\n
use std::collections::TryReserveError;\n\nfn process_data(data: &[u32]) -> Result<Vec<u32>, TryReserveError> {\n    let mut output = Vec::new();\n\n    // Pre-reserve the memory, exiting if we can't\n    output.try_reserve_exact(data.len())?;\n\n    // Now we know this can't OOM in the middle of our complex work\n    output.extend(data.iter().map(|&val| {\n        val * 2 + 5 // very complicated\n    }));\n\n    Ok(output)\n}
\n
1.0.0 · source

pub fn shrink_to_fit(&mut self)

Shrinks the capacity of the vector as much as possible.

\n

The behavior of this method depends on the allocator, which may either shrink the vector\nin-place or reallocate. The resulting vector might still have some excess capacity, just as\nis the case for with_capacity. See Allocator::shrink for more details.

\n
§Examples
\n
let mut vec = Vec::with_capacity(10);\nvec.extend([1, 2, 3]);\nassert!(vec.capacity() >= 10);\nvec.shrink_to_fit();\nassert!(vec.capacity() >= 3);
\n
1.56.0 · source

pub fn shrink_to(&mut self, min_capacity: usize)

Shrinks the capacity of the vector with a lower bound.

\n

The capacity will remain at least as large as both the length\nand the supplied value.

\n

If the current capacity is less than the lower limit, this is a no-op.

\n
§Examples
\n
let mut vec = Vec::with_capacity(10);\nvec.extend([1, 2, 3]);\nassert!(vec.capacity() >= 10);\nvec.shrink_to(4);\nassert!(vec.capacity() >= 4);\nvec.shrink_to(0);\nassert!(vec.capacity() >= 3);
\n
1.0.0 · source

pub fn into_boxed_slice(self) -> Box<[T], A>

Converts the vector into Box<[T]>.

\n

Before doing the conversion, this method discards excess capacity like shrink_to_fit.

\n
§Examples
\n
let v = vec![1, 2, 3];\n\nlet slice = v.into_boxed_slice();
\n

Any excess capacity is removed:

\n\n
let mut vec = Vec::with_capacity(10);\nvec.extend([1, 2, 3]);\n\nassert!(vec.capacity() >= 10);\nlet slice = vec.into_boxed_slice();\nassert_eq!(slice.into_vec().capacity(), 3);
\n
1.0.0 · source

pub fn truncate(&mut self, len: usize)

Shortens the vector, keeping the first len elements and dropping\nthe rest.

\n

If len is greater or equal to the vector’s current length, this has\nno effect.

\n

The drain method can emulate truncate, but causes the excess\nelements to be returned instead of dropped.

\n

Note that this method has no effect on the allocated capacity\nof the vector.

\n
§Examples
\n

Truncating a five element vector to two elements:

\n\n
let mut vec = vec![1, 2, 3, 4, 5];\nvec.truncate(2);\nassert_eq!(vec, [1, 2]);
\n

No truncation occurs when len is greater than the vector’s current\nlength:

\n\n
let mut vec = vec![1, 2, 3];\nvec.truncate(8);\nassert_eq!(vec, [1, 2, 3]);
\n

Truncating when len == 0 is equivalent to calling the clear\nmethod.

\n\n
let mut vec = vec![1, 2, 3];\nvec.truncate(0);\nassert_eq!(vec, []);
\n
1.7.0 · source

pub fn as_slice(&self) -> &[T]

Extracts a slice containing the entire vector.

\n

Equivalent to &s[..].

\n
§Examples
\n
use std::io::{self, Write};\nlet buffer = vec![1, 2, 3, 5, 8];\nio::sink().write(buffer.as_slice()).unwrap();
\n
1.7.0 · source

pub fn as_mut_slice(&mut self) -> &mut [T]

Extracts a mutable slice of the entire vector.

\n

Equivalent to &mut s[..].

\n
§Examples
\n
use std::io::{self, Read};\nlet mut buffer = vec![0; 3];\nio::repeat(0b101).read_exact(buffer.as_mut_slice()).unwrap();
\n
1.37.0 · source

pub fn as_ptr(&self) -> *const T

Returns a raw pointer to the vector’s buffer, or a dangling raw pointer\nvalid for zero sized reads if the vector didn’t allocate.

\n

The caller must ensure that the vector outlives the pointer this\nfunction returns, or else it will end up pointing to garbage.\nModifying the vector may cause its buffer to be reallocated,\nwhich would also make any pointers to it invalid.

\n

The caller must also ensure that the memory the pointer (non-transitively) points to\nis never written to (except inside an UnsafeCell) using this pointer or any pointer\nderived from it. If you need to mutate the contents of the slice, use as_mut_ptr.

\n

This method guarantees that for the purpose of the aliasing model, this method\ndoes not materialize a reference to the underlying slice, and thus the returned pointer\nwill remain valid when mixed with other calls to as_ptr and as_mut_ptr.\nNote that calling other methods that materialize mutable references to the slice,\nor mutable references to specific elements you are planning on accessing through this pointer,\nas well as writing to those elements, may still invalidate this pointer.\nSee the second example below for how this guarantee can be used.

\n
§Examples
\n
let x = vec![1, 2, 4];\nlet x_ptr = x.as_ptr();\n\nunsafe {\n    for i in 0..x.len() {\n        assert_eq!(*x_ptr.add(i), 1 << i);\n    }\n}
\n

Due to the aliasing guarantee, the following code is legal:

\n\n
unsafe {\n    let mut v = vec![0, 1, 2];\n    let ptr1 = v.as_ptr();\n    let _ = ptr1.read();\n    let ptr2 = v.as_mut_ptr().offset(2);\n    ptr2.write(2);\n    // Notably, the write to `ptr2` did *not* invalidate `ptr1`\n    // because it mutated a different element:\n    let _ = ptr1.read();\n}
\n
1.37.0 · source

pub fn as_mut_ptr(&mut self) -> *mut T

Returns an unsafe mutable pointer to the vector’s buffer, or a dangling\nraw pointer valid for zero sized reads if the vector didn’t allocate.

\n

The caller must ensure that the vector outlives the pointer this\nfunction returns, or else it will end up pointing to garbage.\nModifying the vector may cause its buffer to be reallocated,\nwhich would also make any pointers to it invalid.

\n

This method guarantees that for the purpose of the aliasing model, this method\ndoes not materialize a reference to the underlying slice, and thus the returned pointer\nwill remain valid when mixed with other calls to as_ptr and as_mut_ptr.\nNote that calling other methods that materialize references to the slice,\nor references to specific elements you are planning on accessing through this pointer,\nmay still invalidate this pointer.\nSee the second example below for how this guarantee can be used.

\n
§Examples
\n
// Allocate vector big enough for 4 elements.\nlet size = 4;\nlet mut x: Vec<i32> = Vec::with_capacity(size);\nlet x_ptr = x.as_mut_ptr();\n\n// Initialize elements via raw pointer writes, then set length.\nunsafe {\n    for i in 0..size {\n        *x_ptr.add(i) = i as i32;\n    }\n    x.set_len(size);\n}\nassert_eq!(&*x, &[0, 1, 2, 3]);
\n

Due to the aliasing guarantee, the following code is legal:

\n\n
unsafe {\n    let mut v = vec![0];\n    let ptr1 = v.as_mut_ptr();\n    ptr1.write(1);\n    let ptr2 = v.as_mut_ptr();\n    ptr2.write(2);\n    // Notably, the write to `ptr2` did *not* invalidate `ptr1`:\n    ptr1.write(3);\n}
\n
source

pub fn allocator(&self) -> &A

🔬This is a nightly-only experimental API. (allocator_api)

Returns a reference to the underlying allocator.

\n
1.0.0 · source

pub unsafe fn set_len(&mut self, new_len: usize)

Forces the length of the vector to new_len.

\n

This is a low-level operation that maintains none of the normal\ninvariants of the type. Normally changing the length of a vector\nis done using one of the safe operations instead, such as\ntruncate, resize, extend, or clear.

\n
§Safety
\n
    \n
  • new_len must be less than or equal to capacity().
  • \n
  • The elements at old_len..new_len must be initialized.
  • \n
\n
§Examples
\n

This method can be useful for situations in which the vector\nis serving as a buffer for other code, particularly over FFI:

\n\n
pub fn get_dictionary(&self) -> Option<Vec<u8>> {\n    // Per the FFI method's docs, \"32768 bytes is always enough\".\n    let mut dict = Vec::with_capacity(32_768);\n    let mut dict_length = 0;\n    // SAFETY: When `deflateGetDictionary` returns `Z_OK`, it holds that:\n    // 1. `dict_length` elements were initialized.\n    // 2. `dict_length` <= the capacity (32_768)\n    // which makes `set_len` safe to call.\n    unsafe {\n        // Make the FFI call...\n        let r = deflateGetDictionary(self.strm, dict.as_mut_ptr(), &mut dict_length);\n        if r == Z_OK {\n            // ...and update the length to what was initialized.\n            dict.set_len(dict_length);\n            Some(dict)\n        } else {\n            None\n        }\n    }\n}
\n

While the following example is sound, there is a memory leak since\nthe inner vectors were not freed prior to the set_len call:

\n\n
let mut vec = vec![vec![1, 0, 0],\n                   vec![0, 1, 0],\n                   vec![0, 0, 1]];\n// SAFETY:\n// 1. `old_len..0` is empty so no elements need to be initialized.\n// 2. `0 <= capacity` always holds whatever `capacity` is.\nunsafe {\n    vec.set_len(0);\n}
\n

Normally, here, one would use clear instead to correctly drop\nthe contents and thus not leak memory.

\n
1.0.0 · source

pub fn swap_remove(&mut self, index: usize) -> T

Removes an element from the vector and returns it.

\n

The removed element is replaced by the last element of the vector.

\n

This does not preserve ordering of the remaining elements, but is O(1).\nIf you need to preserve the element order, use remove instead.

\n
§Panics
\n

Panics if index is out of bounds.

\n
§Examples
\n
let mut v = vec![\"foo\", \"bar\", \"baz\", \"qux\"];\n\nassert_eq!(v.swap_remove(1), \"bar\");\nassert_eq!(v, [\"foo\", \"qux\", \"baz\"]);\n\nassert_eq!(v.swap_remove(0), \"foo\");\nassert_eq!(v, [\"baz\", \"qux\"]);
\n
1.0.0 · source

pub fn insert(&mut self, index: usize, element: T)

Inserts an element at position index within the vector, shifting all\nelements after it to the right.

\n
§Panics
\n

Panics if index > len.

\n
§Examples
\n
let mut vec = vec![1, 2, 3];\nvec.insert(1, 4);\nassert_eq!(vec, [1, 4, 2, 3]);\nvec.insert(4, 5);\nassert_eq!(vec, [1, 4, 2, 3, 5]);
\n
§Time complexity
\n

Takes O(Vec::len) time. All items after the insertion index must be\nshifted to the right. In the worst case, all elements are shifted when\nthe insertion index is 0.

\n
1.0.0 · source

pub fn remove(&mut self, index: usize) -> T

Removes and returns the element at position index within the vector,\nshifting all elements after it to the left.

\n

Note: Because this shifts over the remaining elements, it has a\nworst-case performance of O(n). If you don’t need the order of elements\nto be preserved, use swap_remove instead. If you’d like to remove\nelements from the beginning of the Vec, consider using\nVecDeque::pop_front instead.

\n
§Panics
\n

Panics if index is out of bounds.

\n
§Examples
\n
let mut v = vec![1, 2, 3];\nassert_eq!(v.remove(1), 2);\nassert_eq!(v, [1, 3]);
\n
1.0.0 · source

pub fn retain<F>(&mut self, f: F)
where\n F: FnMut(&T) -> bool,

Retains only the elements specified by the predicate.

\n

In other words, remove all elements e for which f(&e) returns false.\nThis method operates in place, visiting each element exactly once in the\noriginal order, and preserves the order of the retained elements.

\n
§Examples
\n
let mut vec = vec![1, 2, 3, 4];\nvec.retain(|&x| x % 2 == 0);\nassert_eq!(vec, [2, 4]);
\n

Because the elements are visited exactly once in the original order,\nexternal state may be used to decide which elements to keep.

\n\n
let mut vec = vec![1, 2, 3, 4, 5];\nlet keep = [false, true, true, false, true];\nlet mut iter = keep.iter();\nvec.retain(|_| *iter.next().unwrap());\nassert_eq!(vec, [2, 3, 5]);
\n
1.61.0 · source

pub fn retain_mut<F>(&mut self, f: F)
where\n F: FnMut(&mut T) -> bool,

Retains only the elements specified by the predicate, passing a mutable reference to it.

\n

In other words, remove all elements e such that f(&mut e) returns false.\nThis method operates in place, visiting each element exactly once in the\noriginal order, and preserves the order of the retained elements.

\n
§Examples
\n
let mut vec = vec![1, 2, 3, 4];\nvec.retain_mut(|x| if *x <= 3 {\n    *x += 1;\n    true\n} else {\n    false\n});\nassert_eq!(vec, [2, 3, 4]);
\n
1.16.0 · source

pub fn dedup_by_key<F, K>(&mut self, key: F)
where\n F: FnMut(&mut T) -> K,\n K: PartialEq,

Removes all but the first of consecutive elements in the vector that resolve to the same\nkey.

\n

If the vector is sorted, this removes all duplicates.

\n
§Examples
\n
let mut vec = vec![10, 20, 21, 30, 20];\n\nvec.dedup_by_key(|i| *i / 10);\n\nassert_eq!(vec, [10, 20, 30, 20]);
\n
1.16.0 · source

pub fn dedup_by<F>(&mut self, same_bucket: F)
where\n F: FnMut(&mut T, &mut T) -> bool,

Removes all but the first of consecutive elements in the vector satisfying a given equality\nrelation.

\n

The same_bucket function is passed references to two elements from the vector and\nmust determine if the elements compare equal. The elements are passed in opposite order\nfrom their order in the slice, so if same_bucket(a, b) returns true, a is removed.

\n

If the vector is sorted, this removes all duplicates.

\n
§Examples
\n
let mut vec = vec![\"foo\", \"bar\", \"Bar\", \"baz\", \"bar\"];\n\nvec.dedup_by(|a, b| a.eq_ignore_ascii_case(b));\n\nassert_eq!(vec, [\"foo\", \"bar\", \"baz\", \"bar\"]);
\n
1.0.0 · source

pub fn push(&mut self, value: T)

Appends an element to the back of a collection.

\n
§Panics
\n

Panics if the new capacity exceeds isize::MAX bytes.

\n
§Examples
\n
let mut vec = vec![1, 2];\nvec.push(3);\nassert_eq!(vec, [1, 2, 3]);
\n
§Time complexity
\n

Takes amortized O(1) time. If the vector’s length would exceed its\ncapacity after the push, O(capacity) time is taken to copy the\nvector’s elements to a larger allocation. This expensive operation is\noffset by the capacity O(1) insertions it allows.

\n
source

pub fn push_within_capacity(&mut self, value: T) -> Result<(), T>

🔬This is a nightly-only experimental API. (vec_push_within_capacity)

Appends an element if there is sufficient spare capacity, otherwise an error is returned\nwith the element.

\n

Unlike push this method will not reallocate when there’s insufficient capacity.\nThe caller should use reserve or try_reserve to ensure that there is enough capacity.

\n
§Examples
\n

A manual, panic-free alternative to FromIterator:

\n\n
#![feature(vec_push_within_capacity)]\n\nuse std::collections::TryReserveError;\nfn from_iter_fallible<T>(iter: impl Iterator<Item=T>) -> Result<Vec<T>, TryReserveError> {\n    let mut vec = Vec::new();\n    for value in iter {\n        if let Err(value) = vec.push_within_capacity(value) {\n            vec.try_reserve(1)?;\n            // this cannot fail, the previous line either returned or added at least 1 free slot\n            let _ = vec.push_within_capacity(value);\n        }\n    }\n    Ok(vec)\n}\nassert_eq!(from_iter_fallible(0..100), Ok(Vec::from_iter(0..100)));
\n
§Time complexity
\n

Takes O(1) time.

\n
1.0.0 · source

pub fn pop(&mut self) -> Option<T>

Removes the last element from a vector and returns it, or None if it\nis empty.

\n

If you’d like to pop the first element, consider using\nVecDeque::pop_front instead.

\n
§Examples
\n
let mut vec = vec![1, 2, 3];\nassert_eq!(vec.pop(), Some(3));\nassert_eq!(vec, [1, 2]);
\n
§Time complexity
\n

Takes O(1) time.

\n
source

pub fn pop_if<F>(&mut self, f: F) -> Option<T>
where\n F: FnOnce(&mut T) -> bool,

🔬This is a nightly-only experimental API. (vec_pop_if)

Removes and returns the last element in a vector if the predicate\nreturns true, or None if the predicate returns false or the vector\nis empty.

\n
§Examples
\n
#![feature(vec_pop_if)]\n\nlet mut vec = vec![1, 2, 3, 4];\nlet pred = |x: &mut i32| *x % 2 == 0;\n\nassert_eq!(vec.pop_if(pred), Some(4));\nassert_eq!(vec, [1, 2, 3]);\nassert_eq!(vec.pop_if(pred), None);
\n
1.4.0 · source

pub fn append(&mut self, other: &mut Vec<T, A>)

Moves all the elements of other into self, leaving other empty.

\n
§Panics
\n

Panics if the new capacity exceeds isize::MAX bytes.

\n
§Examples
\n
let mut vec = vec![1, 2, 3];\nlet mut vec2 = vec![4, 5, 6];\nvec.append(&mut vec2);\nassert_eq!(vec, [1, 2, 3, 4, 5, 6]);\nassert_eq!(vec2, []);
\n
1.6.0 · source

pub fn drain<R>(&mut self, range: R) -> Drain<'_, T, A>
where\n R: RangeBounds<usize>,

Removes the specified range from the vector in bulk, returning all\nremoved elements as an iterator. If the iterator is dropped before\nbeing fully consumed, it drops the remaining removed elements.

\n

The returned iterator keeps a mutable borrow on the vector to optimize\nits implementation.

\n
§Panics
\n

Panics if the starting point is greater than the end point or if\nthe end point is greater than the length of the vector.

\n
§Leaking
\n

If the returned iterator goes out of scope without being dropped (due to\nmem::forget, for example), the vector may have lost and leaked\nelements arbitrarily, including elements outside the range.

\n
§Examples
\n
let mut v = vec![1, 2, 3];\nlet u: Vec<_> = v.drain(1..).collect();\nassert_eq!(v, &[1]);\nassert_eq!(u, &[2, 3]);\n\n// A full range clears the vector, like `clear()` does\nv.drain(..);\nassert_eq!(v, &[]);
\n
1.0.0 · source

pub fn clear(&mut self)

Clears the vector, removing all values.

\n

Note that this method has no effect on the allocated capacity\nof the vector.

\n
§Examples
\n
let mut v = vec![1, 2, 3];\n\nv.clear();\n\nassert!(v.is_empty());
\n
1.0.0 · source

pub fn len(&self) -> usize

Returns the number of elements in the vector, also referred to\nas its ‘length’.

\n
§Examples
\n
let a = vec![1, 2, 3];\nassert_eq!(a.len(), 3);
\n
1.0.0 · source

pub fn is_empty(&self) -> bool

Returns true if the vector contains no elements.

\n
§Examples
\n
let mut v = Vec::new();\nassert!(v.is_empty());\n\nv.push(1);\nassert!(!v.is_empty());
\n
1.4.0 · source

pub fn split_off(&mut self, at: usize) -> Vec<T, A>
where\n A: Clone,

Splits the collection into two at the given index.

\n

Returns a newly allocated vector containing the elements in the range\n[at, len). After the call, the original vector will be left containing\nthe elements [0, at) with its previous capacity unchanged.

\n
    \n
  • If you want to take ownership of the entire contents and capacity of\nthe vector, see mem::take or mem::replace.
  • \n
  • If you don’t need the returned vector at all, see Vec::truncate.
  • \n
  • If you want to take ownership of an arbitrary subslice, or you don’t\nnecessarily want to store the removed items in a vector, see Vec::drain.
  • \n
\n
§Panics
\n

Panics if at > len.

\n
§Examples
\n
let mut vec = vec![1, 2, 3];\nlet vec2 = vec.split_off(1);\nassert_eq!(vec, [1]);\nassert_eq!(vec2, [2, 3]);
\n
1.33.0 · source

pub fn resize_with<F>(&mut self, new_len: usize, f: F)
where\n F: FnMut() -> T,

Resizes the Vec in-place so that len is equal to new_len.

\n

If new_len is greater than len, the Vec is extended by the\ndifference, with each additional slot filled with the result of\ncalling the closure f. The return values from f will end up\nin the Vec in the order they have been generated.

\n

If new_len is less than len, the Vec is simply truncated.

\n

This method uses a closure to create new values on every push. If\nyou’d rather Clone a given value, use Vec::resize. If you\nwant to use the Default trait to generate values, you can\npass Default::default as the second argument.

\n
§Examples
\n
let mut vec = vec![1, 2, 3];\nvec.resize_with(5, Default::default);\nassert_eq!(vec, [1, 2, 3, 0, 0]);\n\nlet mut vec = vec![];\nlet mut p = 1;\nvec.resize_with(4, || { p *= 2; p });\nassert_eq!(vec, [2, 4, 8, 16]);
\n
1.47.0 · source

pub fn leak<'a>(self) -> &'a mut [T]
where\n A: 'a,

Consumes and leaks the Vec, returning a mutable reference to the contents,\n&'a mut [T]. Note that the type T must outlive the chosen lifetime\n'a. If the type has only static references, or none at all, then this\nmay be chosen to be 'static.

\n

As of Rust 1.57, this method does not reallocate or shrink the Vec,\nso the leaked allocation may include unused capacity that is not part\nof the returned slice.

\n

This function is mainly useful for data that lives for the remainder of\nthe program’s life. Dropping the returned reference will cause a memory\nleak.

\n
§Examples
\n

Simple usage:

\n\n
let x = vec![1, 2, 3];\nlet static_ref: &'static mut [usize] = x.leak();\nstatic_ref[0] += 1;\nassert_eq!(static_ref, &[2, 2, 3]);
\n
1.60.0 · source

pub fn spare_capacity_mut(&mut self) -> &mut [MaybeUninit<T>]

Returns the remaining spare capacity of the vector as a slice of\nMaybeUninit<T>.

\n

The returned slice can be used to fill the vector with data (e.g. by\nreading from a file) before marking the data as initialized using the\nset_len method.

\n
§Examples
\n
// Allocate vector big enough for 10 elements.\nlet mut v = Vec::with_capacity(10);\n\n// Fill in the first 3 elements.\nlet uninit = v.spare_capacity_mut();\nuninit[0].write(0);\nuninit[1].write(1);\nuninit[2].write(2);\n\n// Mark the first 3 elements of the vector as being initialized.\nunsafe {\n    v.set_len(3);\n}\n\nassert_eq!(&v, &[0, 1, 2]);
\n
source

pub fn split_at_spare_mut(&mut self) -> (&mut [T], &mut [MaybeUninit<T>])

🔬This is a nightly-only experimental API. (vec_split_at_spare)

Returns vector content as a slice of T, along with the remaining spare\ncapacity of the vector as a slice of MaybeUninit<T>.

\n

The returned spare capacity slice can be used to fill the vector with data\n(e.g. by reading from a file) before marking the data as initialized using\nthe set_len method.

\n

Note that this is a low-level API, which should be used with care for\noptimization purposes. If you need to append data to a Vec\nyou can use push, extend, extend_from_slice,\nextend_from_within, insert, append, resize or\nresize_with, depending on your exact needs.

\n
§Examples
\n
#![feature(vec_split_at_spare)]\n\nlet mut v = vec![1, 1, 2];\n\n// Reserve additional space big enough for 10 elements.\nv.reserve(10);\n\nlet (init, uninit) = v.split_at_spare_mut();\nlet sum = init.iter().copied().sum::<u32>();\n\n// Fill in the next 4 elements.\nuninit[0].write(sum);\nuninit[1].write(sum * 2);\nuninit[2].write(sum * 3);\nuninit[3].write(sum * 4);\n\n// Mark the 4 elements of the vector as being initialized.\nunsafe {\n    let len = v.len();\n    v.set_len(len + 4);\n}\n\nassert_eq!(&v, &[1, 1, 2, 4, 8, 12, 16]);
\n
",0,"air_test_framework::ephemeral::Data"],["
§

impl WritableBuffer for Vec<u8>

§

fn len(&self) -> usize

Returns position/offset for data to be written at. Read more
§

fn reserve(&mut self, size: usize) -> Result<(), ()>

Reserves specified number of bytes in the buffer. Read more
§

fn resize(&mut self, new_len: usize)

Writes zero bytes at the end of the buffer until the buffer\nhas the specified length.
§

fn write_bytes(&mut self, val: &[u8])

Writes the specified slice of bytes at the end of the buffer.
§

fn write_pod<T>(&mut self, val: &T)
where\n T: Pod,\n Self: Sized,

Writes the specified Pod type at the end of the buffer.
§

fn write_pod_slice<T>(&mut self, val: &[T])
where\n T: Pod,\n Self: Sized,

Writes the specified Pod slice at the end of the buffer.
","WritableBuffer","air_test_framework::ephemeral::Data"],["
1.0.0 · source§

impl<A> Write for Vec<u8, A>
where\n A: Allocator,

Write is implemented for Vec<u8> by appending to the vector.\nThe vector will grow as needed.

\n
source§

fn write(&mut self, buf: &[u8]) -> Result<usize, Error>

Write a buffer into this writer, returning how many bytes were written. Read more
source§

fn write_vectored(&mut self, bufs: &[IoSlice<'_>]) -> Result<usize, Error>

Like write, except that it writes from a slice of buffers. Read more
source§

fn is_write_vectored(&self) -> bool

🔬This is a nightly-only experimental API. (can_vector)
Determines if this Writer has an efficient write_vectored\nimplementation. Read more
source§

fn write_all(&mut self, buf: &[u8]) -> Result<(), Error>

Attempts to write an entire buffer into this writer. Read more
source§

fn flush(&mut self) -> Result<(), Error>

Flush this output stream, ensuring that all intermediately buffered\ncontents reach their destination. Read more
source§

fn write_all_vectored(&mut self, bufs: &mut [IoSlice<'_>]) -> Result<(), Error>

🔬This is a nightly-only experimental API. (write_all_vectored)
Attempts to write multiple buffers into this writer. Read more
1.0.0 · source§

fn write_fmt(&mut self, fmt: Arguments<'_>) -> Result<(), Error>

Writes a formatted string into this writer, returning any error\nencountered. Read more
1.0.0 · source§

fn by_ref(&mut self) -> &mut Self
where\n Self: Sized,

Creates a “by reference” adapter for this instance of Write. Read more
","Write","air_test_framework::ephemeral::Data"],["
§

impl WriteBuf for Vec<u8>

§

fn as_slice(&self) -> &[u8]

Returns the valid data part of this container. Should only cover initialized data.
§

fn capacity(&self) -> usize

Returns the full capacity of this container. May include uninitialized data.
§

fn as_mut_ptr(&mut self) -> *mut u8

Returns a pointer to the start of the data.
§

unsafe fn filled_until(&mut self, n: usize)

Indicates that the first n bytes of the container have been written.
§

unsafe fn write_from<F>(&mut self, f: F) -> Result<usize, usize>

Call the given closure using the pointer and capacity from self. Read more
","WriteBuf","air_test_framework::ephemeral::Data"],["
§

impl<Z> Zeroize for Vec<Z>
where\n Z: Zeroize,

§

fn zeroize(&mut self)

“Best effort” zeroization for Vec.

\n

Ensures the entire capacity of the Vec is zeroed. Cannot ensure that\nprevious reallocations did not leave values on the heap.

\n
","Zeroize","air_test_framework::ephemeral::Data"],["
§

impl<T> ComponentType for Vec<T>
where\n T: ComponentType,

","ComponentType","air_test_framework::ephemeral::Data"],["
source§

impl<T, A> DerefPure for Vec<T, A>
where\n A: Allocator,

","DerefPure","air_test_framework::ephemeral::Data"],["
1.0.0 · source§

impl<T, A> Eq for Vec<T, A>
where\n T: Eq,\n A: Allocator,

","Eq","air_test_framework::ephemeral::Data"],["
§

impl<T> Lift for Vec<T>
where\n T: Lift,

","Lift","air_test_framework::ephemeral::Data"],["
§

impl<T> Lower for Vec<T>
where\n T: Lower,

","Lower","air_test_framework::ephemeral::Data"],["
§

impl<T> StableDeref for Vec<T>

","StableDeref","air_test_framework::ephemeral::Data"],["
§

impl<Z> ZeroizeOnDrop for Vec<Z>
where\n Z: ZeroizeOnDrop,

","ZeroizeOnDrop","air_test_framework::ephemeral::Data"]], +"air_test_utils":[["
§

impl<'a, A> Arbitrary<'a> for Vec<A>
where\n A: Arbitrary<'a>,

§

fn arbitrary(u: &mut Unstructured<'a>) -> Result<Vec<A>, Error>

Generate an arbitrary value of Self from the given unstructured data. Read more
§

fn arbitrary_take_rest(u: Unstructured<'a>) -> Result<Vec<A>, Error>

Generate an arbitrary value of Self from the entirety of the given\nunstructured data. Read more
§

fn size_hint(_depth: usize) -> (usize, Option<usize>)

Get a size hint for how many bytes out of an Unstructured this type\nneeds to construct itself. Read more
","Arbitrary<'a>","air_test_utils::call_services::ArgTetraplets","air_test_utils::FoldLore"],["
§

impl<T> Archive for Vec<T>
where\n T: Archive,

§

type Archived = ArchivedVec<<T as Archive>::Archived>

The archived representation of this type. Read more
§

type Resolver = VecResolver

The resolver for this type. It must contain all the additional information from serializing\nneeded to make the archived type from the normal type.
§

unsafe fn resolve(\n &self,\n pos: usize,\n resolver: <Vec<T> as Archive>::Resolver,\n out: *mut <Vec<T> as Archive>::Archived,\n)

Creates the archived version of this value at the given position and writes it to the given\noutput. Read more
","Archive","air_test_utils::call_services::ArgTetraplets","air_test_utils::FoldLore"],["
§

impl<T> ArrayLike for Vec<T>

§

type Item = T

Type of the elements being stored.
","ArrayLike","air_test_utils::call_services::ArgTetraplets","air_test_utils::FoldLore"],["
§

impl<T> ArrayLike for Vec<T>

§

type Item = T

Type of the elements being stored.
","ArrayLike","air_test_utils::call_services::ArgTetraplets","air_test_utils::FoldLore"],["
1.5.0 · source§

impl<T, A> AsMut<[T]> for Vec<T, A>
where\n A: Allocator,

source§

fn as_mut(&mut self) -> &mut [T]

Converts this type into a mutable reference of the (usually inferred) input type.
","AsMut<[T]>","air_test_utils::call_services::ArgTetraplets","air_test_utils::FoldLore"],["
§

impl<K, V> AsMut<TiVec<K, V>> for Vec<V>

§

fn as_mut(&mut self) -> &mut TiVec<K, V>

Converts this type into a mutable reference of the (usually inferred) input type.
","AsMut>","air_test_utils::call_services::ArgTetraplets","air_test_utils::FoldLore"],["
1.5.0 · source§

impl<T, A> AsMut<Vec<T, A>> for Vec<T, A>
where\n A: Allocator,

source§

fn as_mut(&mut self) -> &mut Vec<T, A>

Converts this type into a mutable reference of the (usually inferred) input type.
","AsMut>","air_test_utils::call_services::ArgTetraplets","air_test_utils::FoldLore"],["
1.0.0 · source§

impl<T, A> AsRef<[T]> for Vec<T, A>
where\n A: Allocator,

source§

fn as_ref(&self) -> &[T]

Converts this type into a shared reference of the (usually inferred) input type.
","AsRef<[T]>","air_test_utils::call_services::ArgTetraplets","air_test_utils::FoldLore"],["
§

impl<K, V> AsRef<TiVec<K, V>> for Vec<V>

§

fn as_ref(&self) -> &TiVec<K, V>

Converts this type into a shared reference of the (usually inferred) input type.
","AsRef>","air_test_utils::call_services::ArgTetraplets","air_test_utils::FoldLore"],["
1.0.0 · source§

impl<T, A> AsRef<Vec<T, A>> for Vec<T, A>
where\n A: Allocator,

source§

fn as_ref(&self) -> &Vec<T, A>

Converts this type into a shared reference of the (usually inferred) input type.
","AsRef>","air_test_utils::call_services::ArgTetraplets","air_test_utils::FoldLore"],["
1.0.0 · source§

impl<T, A> Borrow<[T]> for Vec<T, A>
where\n A: Allocator,

source§

fn borrow(&self) -> &[T]

Immutably borrows from an owned value. Read more
","Borrow<[T]>","air_test_utils::call_services::ArgTetraplets","air_test_utils::FoldLore"],["
1.0.0 · source§

impl<T, A> BorrowMut<[T]> for Vec<T, A>
where\n A: Allocator,

source§

fn borrow_mut(&mut self) -> &mut [T]

Mutably borrows from an owned value. Read more
","BorrowMut<[T]>","air_test_utils::call_services::ArgTetraplets","air_test_utils::FoldLore"],["
§

impl<T> BorshDeserialize for Vec<T>
where\n T: BorshDeserialize,

§

fn deserialize_reader<R>(reader: &mut R) -> Result<Vec<T>, Error>
where\n R: Read,

§

fn deserialize(buf: &mut &[u8]) -> Result<Self, Error>

Deserializes this instance from a given slice of bytes.\nUpdates the buffer to point at the remaining bytes.
§

fn try_from_slice(v: &[u8]) -> Result<Self, Error>

Deserialize this instance from a slice of bytes.
§

fn try_from_reader<R>(reader: &mut R) -> Result<Self, Error>
where\n R: Read,

","BorshDeserialize","air_test_utils::call_services::ArgTetraplets","air_test_utils::FoldLore"],["
§

impl<T> BorshSerialize for Vec<T>
where\n T: BorshSerialize,

§

fn serialize<W>(&self, writer: &mut W) -> Result<(), Error>
where\n W: Write,

","BorshSerialize","air_test_utils::call_services::ArgTetraplets","air_test_utils::FoldLore"],["
1.0.0 · source§

impl<T, A> Clone for Vec<T, A>
where\n T: Clone,\n A: Allocator + Clone,

source§

fn clone_from(&mut self, source: &Vec<T, A>)

Overwrites the contents of self with a clone of the contents of source.

\n

This method is preferred over simply assigning source.clone() to self,\nas it avoids reallocation if possible. Additionally, if the element type\nT overrides clone_from(), this will reuse the resources of self’s\nelements as well.

\n
§Examples
\n
let x = vec![5, 6, 7];\nlet mut y = vec![8, 9, 10];\nlet yp: *const i32 = y.as_ptr();\n\ny.clone_from(&x);\n\n// The value is the same\nassert_eq!(x, y);\n\n// And no reallocation occurred\nassert_eq!(yp, y.as_ptr());
\n
source§

fn clone(&self) -> Vec<T, A>

Returns a copy of the value. Read more
","Clone","air_test_utils::call_services::ArgTetraplets","air_test_utils::FoldLore"],["
1.0.0 · source§

impl<T, A> Debug for Vec<T, A>
where\n T: Debug,\n A: Allocator,

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
","Debug","air_test_utils::call_services::ArgTetraplets","air_test_utils::FoldLore"],["
1.0.0 · source§

impl<T> Default for Vec<T>

source§

fn default() -> Vec<T>

Creates an empty Vec<T>.

\n

The vector will not allocate until elements are pushed onto it.

\n
","Default","air_test_utils::call_services::ArgTetraplets","air_test_utils::FoldLore"],["
1.0.0 · source§

impl<T, A> Deref for Vec<T, A>
where\n A: Allocator,

§

type Target = [T]

The resulting type after dereferencing.
source§

fn deref(&self) -> &[T]

Dereferences the value.
","Deref","air_test_utils::call_services::ArgTetraplets","air_test_utils::FoldLore"],["
1.0.0 · source§

impl<T, A> DerefMut for Vec<T, A>
where\n A: Allocator,

source§

fn deref_mut(&mut self) -> &mut [T]

Mutably dereferences the value.
","DerefMut","air_test_utils::call_services::ArgTetraplets","air_test_utils::FoldLore"],["
source§

impl<'de, T> Deserialize<'de> for Vec<T>
where\n T: Deserialize<'de>,

source§

fn deserialize<D>(\n deserializer: D,\n) -> Result<Vec<T>, <D as Deserializer<'de>>::Error>
where\n D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
","Deserialize<'de>","air_test_utils::call_services::ArgTetraplets","air_test_utils::FoldLore"],["
source§

impl<'de, T, U> DeserializeAs<'de, Vec<T>> for Vec<U>
where\n U: DeserializeAs<'de, T>,

source§

fn deserialize_as<D>(\n deserializer: D,\n) -> Result<Vec<T>, <D as Deserializer<'de>>::Error>
where\n D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer.
","DeserializeAs<'de, Vec>","air_test_utils::call_services::ArgTetraplets","air_test_utils::FoldLore"],["
1.0.0 · source§

impl<T, A> Drop for Vec<T, A>
where\n A: Allocator,

source§

fn drop(&mut self)

Executes the destructor for this type. Read more
","Drop","air_test_utils::call_services::ArgTetraplets","air_test_utils::FoldLore"],["
1.2.0 · source§

impl<'a, T, A> Extend<&'a T> for Vec<T, A>
where\n T: Copy + 'a,\n A: Allocator,

Extend implementation that copies elements out of references before pushing them onto the Vec.

\n

This implementation is specialized for slice iterators, where it uses copy_from_slice to\nappend the entire slice at once.

\n
source§

fn extend<I>(&mut self, iter: I)
where\n I: IntoIterator<Item = &'a T>,

Extends a collection with the contents of an iterator. Read more
source§

fn extend_one(&mut self, _: &'a T)

🔬This is a nightly-only experimental API. (extend_one)
Extends a collection with exactly one element.
source§

fn extend_reserve(&mut self, additional: usize)

🔬This is a nightly-only experimental API. (extend_one)
Reserves capacity in a collection for the given number of additional elements. Read more
","Extend<&'a T>","air_test_utils::call_services::ArgTetraplets","air_test_utils::FoldLore"],["
1.0.0 · source§

impl<T, A> Extend<T> for Vec<T, A>
where\n A: Allocator,

source§

fn extend<I>(&mut self, iter: I)
where\n I: IntoIterator<Item = T>,

Extends a collection with the contents of an iterator. Read more
source§

fn extend_one(&mut self, item: T)

🔬This is a nightly-only experimental API. (extend_one)
Extends a collection with exactly one element.
source§

fn extend_reserve(&mut self, additional: usize)

🔬This is a nightly-only experimental API. (extend_one)
Reserves capacity in a collection for the given number of additional elements. Read more
","Extend","air_test_utils::call_services::ArgTetraplets","air_test_utils::FoldLore"],["
1.0.0 · source§

impl<T> From<&[T]> for Vec<T>
where\n T: Clone,

source§

fn from(s: &[T]) -> Vec<T>

Allocate a Vec<T> and fill it by cloning s’s items.

\n
§Examples
\n
assert_eq!(Vec::from(&[1, 2, 3][..]), vec![1, 2, 3]);
\n
","From<&[T]>","air_test_utils::call_services::ArgTetraplets","air_test_utils::FoldLore"],["
1.74.0 · source§

impl<T, const N: usize> From<&[T; N]> for Vec<T>
where\n T: Clone,

source§

fn from(s: &[T; N]) -> Vec<T>

Allocate a Vec<T> and fill it by cloning s’s items.

\n
§Examples
\n
assert_eq!(Vec::from(&[1, 2, 3]), vec![1, 2, 3]);
\n
","From<&[T; N]>","air_test_utils::call_services::ArgTetraplets","air_test_utils::FoldLore"],["
1.19.0 · source§

impl<T> From<&mut [T]> for Vec<T>
where\n T: Clone,

source§

fn from(s: &mut [T]) -> Vec<T>

Allocate a Vec<T> and fill it by cloning s’s items.

\n
§Examples
\n
assert_eq!(Vec::from(&mut [1, 2, 3][..]), vec![1, 2, 3]);
\n
","From<&mut [T]>","air_test_utils::call_services::ArgTetraplets","air_test_utils::FoldLore"],["
1.74.0 · source§

impl<T, const N: usize> From<&mut [T; N]> for Vec<T>
where\n T: Clone,

source§

fn from(s: &mut [T; N]) -> Vec<T>

Allocate a Vec<T> and fill it by cloning s’s items.

\n
§Examples
\n
assert_eq!(Vec::from(&mut [1, 2, 3]), vec![1, 2, 3]);
\n
","From<&mut [T; N]>","air_test_utils::call_services::ArgTetraplets","air_test_utils::FoldLore"],["
1.44.0 · source§

impl<T, const N: usize> From<[T; N]> for Vec<T>

source§

fn from(s: [T; N]) -> Vec<T>

Allocate a Vec<T> and move s’s items into it.

\n
§Examples
\n
assert_eq!(Vec::from([1, 2, 3]), vec![1, 2, 3]);
\n
","From<[T; N]>","air_test_utils::call_services::ArgTetraplets","air_test_utils::FoldLore"],["
1.5.0 · source§

impl<T, A> From<BinaryHeap<T, A>> for Vec<T, A>
where\n A: Allocator,

source§

fn from(heap: BinaryHeap<T, A>) -> Vec<T, A>

Converts a BinaryHeap<T> into a Vec<T>.

\n

This conversion requires no data movement or allocation, and has\nconstant time complexity.

\n
","From>","air_test_utils::call_services::ArgTetraplets","air_test_utils::FoldLore"],["
1.18.0 · source§

impl<T, A> From<Box<[T], A>> for Vec<T, A>
where\n A: Allocator,

source§

fn from(s: Box<[T], A>) -> Vec<T, A>

Convert a boxed slice into a vector by transferring ownership of\nthe existing heap allocation.

\n
§Examples
\n
let b: Box<[i32]> = vec![1, 2, 3].into_boxed_slice();\nassert_eq!(Vec::from(b), vec![1, 2, 3]);
\n
","From>","air_test_utils::call_services::ArgTetraplets","air_test_utils::FoldLore"],["
1.14.0 · source§

impl<'a, T> From<Cow<'a, [T]>> for Vec<T>
where\n [T]: ToOwned<Owned = Vec<T>>,

source§

fn from(s: Cow<'a, [T]>) -> Vec<T>

Convert a clone-on-write slice into a vector.

\n

If s already owns a Vec<T>, it will be returned directly.\nIf s is borrowing a slice, a new Vec<T> will be allocated and\nfilled by cloning s’s items into it.

\n
§Examples
\n
let o: Cow<'_, [i32]> = Cow::Owned(vec![1, 2, 3]);\nlet b: Cow<'_, [i32]> = Cow::Borrowed(&[1, 2, 3]);\nassert_eq!(Vec::from(o), Vec::from(b));
\n
","From>","air_test_utils::call_services::ArgTetraplets","air_test_utils::FoldLore"],["
§

impl<T> From<NonEmpty<T>> for Vec<T>

§

fn from(v: NonEmpty<T>) -> Vec<T>

Converts to this type from the input type.
","From>","air_test_utils::call_services::ArgTetraplets","air_test_utils::FoldLore"],["
§

impl<K, V> From<TiVec<K, V>> for Vec<V>

§

fn from(vec: TiVec<K, V>) -> Vec<V>

Converts to this type from the input type.
","From>","air_test_utils::call_services::ArgTetraplets","air_test_utils::FoldLore"],["
1.10.0 · source§

impl<T, A> From<VecDeque<T, A>> for Vec<T, A>
where\n A: Allocator,

source§

fn from(other: VecDeque<T, A>) -> Vec<T, A>

Turn a VecDeque<T> into a Vec<T>.

\n

This never needs to re-allocate, but does need to do O(n) data movement if\nthe circular buffer doesn’t happen to be at the beginning of the allocation.

\n
§Examples
\n
use std::collections::VecDeque;\n\n// This one is *O*(1).\nlet deque: VecDeque<_> = (1..5).collect();\nlet ptr = deque.as_slices().0.as_ptr();\nlet vec = Vec::from(deque);\nassert_eq!(vec, [1, 2, 3, 4]);\nassert_eq!(vec.as_ptr(), ptr);\n\n// This one needs data rearranging.\nlet mut deque: VecDeque<_> = (1..5).collect();\ndeque.push_front(9);\ndeque.push_front(8);\nlet ptr = deque.as_slices().1.as_ptr();\nlet vec = Vec::from(deque);\nassert_eq!(vec, [8, 9, 1, 2, 3, 4]);\nassert_eq!(vec.as_ptr(), ptr);
\n
","From>","air_test_utils::call_services::ArgTetraplets","air_test_utils::FoldLore"],["
§

impl<T> FromDerObject for Vec<T>
where\n T: FromDerObject,

§

fn from_der_object(der_object: DerObject) -> Result<Vec<T>, Asn1DerError>

Converts der_object into Self
§

fn deserialize<'a>(\n source: impl Iterator<Item = &'a u8>,\n) -> Result<Self, Asn1DerError>

DER-deserializes the data from source
","FromDerObject","air_test_utils::call_services::ArgTetraplets","air_test_utils::FoldLore"],["
source§

impl<T> FromFallibleIterator<T> for Vec<T>

source§

fn from_fallible_iter<I>(\n it: I,\n) -> Result<Vec<T>, <I as IntoFallibleIterator>::Error>
where\n I: IntoFallibleIterator<Item = T>,

Creates a value from a fallible iterator.
","FromFallibleIterator","air_test_utils::call_services::ArgTetraplets","air_test_utils::FoldLore"],["
1.0.0 · source§

impl<T> FromIterator<T> for Vec<T>

Collects an iterator into a Vec, commonly called via Iterator::collect()

\n

§Allocation behavior

\n

In general Vec does not guarantee any particular growth or allocation strategy.\nThat also applies to this trait impl.

\n

Note: This section covers implementation details and is therefore exempt from\nstability guarantees.

\n

Vec may use any or none of the following strategies,\ndepending on the supplied iterator:

\n
    \n
  • preallocate based on Iterator::size_hint()\n
      \n
    • and panic if the number of items is outside the provided lower/upper bounds
    • \n
    \n
  • \n
  • use an amortized growth strategy similar to pushing one item at a time
  • \n
  • perform the iteration in-place on the original allocation backing the iterator
  • \n
\n

The last case warrants some attention. It is an optimization that in many cases reduces peak memory\nconsumption and improves cache locality. But when big, short-lived allocations are created,\nonly a small fraction of their items get collected, no further use is made of the spare capacity\nand the resulting Vec is moved into a longer-lived structure, then this can lead to the large\nallocations having their lifetimes unnecessarily extended which can result in increased memory\nfootprint.

\n

In cases where this is an issue, the excess capacity can be discarded with Vec::shrink_to(),\nVec::shrink_to_fit() or by collecting into Box<[T]> instead, which additionally reduces\nthe size of the long-lived struct.

\n\n
static LONG_LIVED: Mutex<Vec<Vec<u16>>> = Mutex::new(Vec::new());\n\nfor i in 0..10 {\n    let big_temporary: Vec<u16> = (0..1024).collect();\n    // discard most items\n    let mut result: Vec<_> = big_temporary.into_iter().filter(|i| i % 100 == 0).collect();\n    // without this a lot of unused capacity might be moved into the global\n    result.shrink_to_fit();\n    LONG_LIVED.lock().unwrap().push(result);\n}
\n
source§

fn from_iter<I>(iter: I) -> Vec<T>
where\n I: IntoIterator<Item = T>,

Creates a value from an iterator. Read more
","FromIterator","air_test_utils::call_services::ArgTetraplets","air_test_utils::FoldLore"],["
§

impl<T> FromParallelIterator<T> for Vec<T>
where\n T: Send,

Collects items from a parallel iterator into a vector.

\n
§

fn from_par_iter<I>(par_iter: I) -> Vec<T>
where\n I: IntoParallelIterator<Item = T>,

Creates an instance of the collection from the parallel iterator par_iter. Read more
","FromParallelIterator","air_test_utils::call_services::ArgTetraplets","air_test_utils::FoldLore"],["
1.0.0 · source§

impl<T, A> Hash for Vec<T, A>
where\n T: Hash,\n A: Allocator,

The hash of a vector is the same as that of the corresponding slice,\nas required by the core::borrow::Borrow implementation.

\n\n
use std::hash::BuildHasher;\n\nlet b = std::hash::RandomState::new();\nlet v: Vec<u8> = vec![0xa8, 0x3c, 0x09];\nlet s: &[u8] = &[0xa8, 0x3c, 0x09];\nassert_eq!(b.hash_one(v), b.hash_one(s));
\n
source§

fn hash<H>(&self, state: &mut H)
where\n H: Hasher,

Feeds this value into the given Hasher. Read more
1.3.0 · source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where\n H: Hasher,\n Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
","Hash","air_test_utils::call_services::ArgTetraplets","air_test_utils::FoldLore"],["
1.0.0 · source§

impl<T, I, A> Index<I> for Vec<T, A>
where\n I: SliceIndex<[T]>,\n A: Allocator,

§

type Output = <I as SliceIndex<[T]>>::Output

The returned type after indexing.
source§

fn index(&self, index: I) -> &<Vec<T, A> as Index<I>>::Output

Performs the indexing (container[index]) operation. Read more
","Index","air_test_utils::call_services::ArgTetraplets","air_test_utils::FoldLore"],["
1.0.0 · source§

impl<T, I, A> IndexMut<I> for Vec<T, A>
where\n I: SliceIndex<[T]>,\n A: Allocator,

source§

fn index_mut(&mut self, index: I) -> &mut <Vec<T, A> as Index<I>>::Output

Performs the mutable indexing (container[index]) operation. Read more
","IndexMut","air_test_utils::call_services::ArgTetraplets","air_test_utils::FoldLore"],["
§

impl<T> IntoDerObject for Vec<T>
where\n T: IntoDerObject,

§

fn into_der_object(self) -> DerObject

Converts self into a DER object
§

fn serialized_len(&self) -> usize

Efficiently computes the length of the DER-serialized representation of self
§

fn serialize<'a>(\n self,\n buf: impl Iterator<Item = &'a mut u8>,\n) -> Result<usize, Asn1DerError>

DER-serializes self into buf and returns the amount of bytes written
","IntoDerObject","air_test_utils::call_services::ArgTetraplets","air_test_utils::FoldLore"],["
source§

impl<'de, T, E> IntoDeserializer<'de, E> for Vec<T>
where\n T: IntoDeserializer<'de, E>,\n E: Error,

§

type Deserializer = SeqDeserializer<<Vec<T> as IntoIterator>::IntoIter, E>

The type of the deserializer being converted into.
source§

fn into_deserializer(self) -> <Vec<T> as IntoDeserializer<'de, E>>::Deserializer

Convert this value into a deserializer.
","IntoDeserializer<'de, E>","air_test_utils::call_services::ArgTetraplets","air_test_utils::FoldLore"],["
1.0.0 · source§

impl<T, A> IntoIterator for Vec<T, A>
where\n A: Allocator,

source§

fn into_iter(self) -> <Vec<T, A> as IntoIterator>::IntoIter

Creates a consuming iterator, that is, one that moves each value out of\nthe vector (from start to end). The vector cannot be used after calling\nthis.

\n
§Examples
\n
let v = vec![\"a\".to_string(), \"b\".to_string()];\nlet mut v_iter = v.into_iter();\n\nlet first_element: Option<String> = v_iter.next();\n\nassert_eq!(first_element, Some(\"a\".to_string()));\nassert_eq!(v_iter.next(), Some(\"b\".to_string()));\nassert_eq!(v_iter.next(), None);
\n
§

type Item = T

The type of the elements being iterated over.
§

type IntoIter = IntoIter<T, A>

Which kind of iterator are we turning this into?
","IntoIterator","air_test_utils::call_services::ArgTetraplets","air_test_utils::FoldLore"],["
§

impl<T> IntoParallelIterator for Vec<T>
where\n T: Send,

§

type Item = T

The type of item that the parallel iterator will produce.
§

type Iter = IntoIter<T>

The parallel iterator type that will be created.
§

fn into_par_iter(self) -> <Vec<T> as IntoParallelIterator>::Iter

Converts self into a parallel iterator. Read more
","IntoParallelIterator","air_test_utils::call_services::ArgTetraplets","air_test_utils::FoldLore"],["
1.0.0 · source§

impl<T, A> Ord for Vec<T, A>
where\n T: Ord,\n A: Allocator,

Implements ordering of vectors, lexicographically.

\n
source§

fn cmp(&self, other: &Vec<T, A>) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · source§

fn max(self, other: Self) -> Self
where\n Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · source§

fn min(self, other: Self) -> Self
where\n Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · source§

fn clamp(self, min: Self, max: Self) -> Self
where\n Self: Sized + PartialOrd,

Restrict a value to a certain interval. Read more
","Ord","air_test_utils::call_services::ArgTetraplets","air_test_utils::FoldLore"],["
§

impl<'a, T> ParallelExtend<&'a T> for Vec<T>
where\n T: 'a + Copy + Send + Sync,

Extends a vector with copied items from a parallel iterator.

\n
§

fn par_extend<I>(&mut self, par_iter: I)
where\n I: IntoParallelIterator<Item = &'a T>,

Extends an instance of the collection with the elements drawn\nfrom the parallel iterator par_iter. Read more
","ParallelExtend<&'a T>","air_test_utils::call_services::ArgTetraplets","air_test_utils::FoldLore"],["
§

impl<T> ParallelExtend<T> for Vec<T>
where\n T: Send,

Extends a vector with items from a parallel iterator.

\n
§

fn par_extend<I>(&mut self, par_iter: I)
where\n I: IntoParallelIterator<Item = T>,

Extends an instance of the collection with the elements drawn\nfrom the parallel iterator par_iter. Read more
","ParallelExtend","air_test_utils::call_services::ArgTetraplets","air_test_utils::FoldLore"],["
1.0.0 · source§

impl<T, U, A> PartialEq<&[U]> for Vec<T, A>
where\n A: Allocator,\n T: PartialEq<U>,

source§

fn eq(&self, other: &&[U]) -> bool

This method tests for self and other values to be equal, and is used\nby ==.
source§

fn ne(&self, other: &&[U]) -> bool

This method tests for !=. The default implementation is almost always\nsufficient, and should not be overridden without very good reason.
","PartialEq<&[U]>","air_test_utils::call_services::ArgTetraplets","air_test_utils::FoldLore"],["
1.0.0 · source§

impl<T, U, A, const N: usize> PartialEq<&[U; N]> for Vec<T, A>
where\n A: Allocator,\n T: PartialEq<U>,

source§

fn eq(&self, other: &&[U; N]) -> bool

This method tests for self and other values to be equal, and is used\nby ==.
source§

fn ne(&self, other: &&[U; N]) -> bool

This method tests for !=. The default implementation is almost always\nsufficient, and should not be overridden without very good reason.
","PartialEq<&[U; N]>","air_test_utils::call_services::ArgTetraplets","air_test_utils::FoldLore"],["
1.0.0 · source§

impl<T, U, A> PartialEq<&mut [U]> for Vec<T, A>
where\n A: Allocator,\n T: PartialEq<U>,

source§

fn eq(&self, other: &&mut [U]) -> bool

This method tests for self and other values to be equal, and is used\nby ==.
source§

fn ne(&self, other: &&mut [U]) -> bool

This method tests for !=. The default implementation is almost always\nsufficient, and should not be overridden without very good reason.
","PartialEq<&mut [U]>","air_test_utils::call_services::ArgTetraplets","air_test_utils::FoldLore"],["
1.48.0 · source§

impl<T, U, A> PartialEq<[U]> for Vec<T, A>
where\n A: Allocator,\n T: PartialEq<U>,

source§

fn eq(&self, other: &[U]) -> bool

This method tests for self and other values to be equal, and is used\nby ==.
source§

fn ne(&self, other: &[U]) -> bool

This method tests for !=. The default implementation is almost always\nsufficient, and should not be overridden without very good reason.
","PartialEq<[U]>","air_test_utils::call_services::ArgTetraplets","air_test_utils::FoldLore"],["
1.0.0 · source§

impl<T, U, A, const N: usize> PartialEq<[U; N]> for Vec<T, A>
where\n A: Allocator,\n T: PartialEq<U>,

source§

fn eq(&self, other: &[U; N]) -> bool

This method tests for self and other values to be equal, and is used\nby ==.
source§

fn ne(&self, other: &[U; N]) -> bool

This method tests for !=. The default implementation is almost always\nsufficient, and should not be overridden without very good reason.
","PartialEq<[U; N]>","air_test_utils::call_services::ArgTetraplets","air_test_utils::FoldLore"],["
§

impl<T, U> PartialEq<ArchivedVec<U>> for Vec<T>
where\n T: PartialEq<U>,

§

fn eq(&self, other: &ArchivedVec<U>) -> bool

This method tests for self and other values to be equal, and is used\nby ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always\nsufficient, and should not be overridden without very good reason.
","PartialEq>","air_test_utils::call_services::ArgTetraplets","air_test_utils::FoldLore"],["
1.0.0 · source§

impl<T, U, A1, A2> PartialEq<Vec<U, A2>> for Vec<T, A1>
where\n A1: Allocator,\n A2: Allocator,\n T: PartialEq<U>,

source§

fn eq(&self, other: &Vec<U, A2>) -> bool

This method tests for self and other values to be equal, and is used\nby ==.
source§

fn ne(&self, other: &Vec<U, A2>) -> bool

This method tests for !=. The default implementation is almost always\nsufficient, and should not be overridden without very good reason.
","PartialEq>","air_test_utils::call_services::ArgTetraplets","air_test_utils::FoldLore"],["
§

impl<T> PartialOrd<ArchivedVec<T>> for Vec<T>
where\n T: PartialOrd,

§

fn partial_cmp(&self, other: &ArchivedVec<T>) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · source§

fn lt(&self, other: &Rhs) -> bool

This method tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · source§

fn le(&self, other: &Rhs) -> bool

This method tests less than or equal to (for self and other) and is used by the <=\noperator. Read more
1.0.0 · source§

fn gt(&self, other: &Rhs) -> bool

This method tests greater than (for self and other) and is used by the > operator. Read more
1.0.0 · source§

fn ge(&self, other: &Rhs) -> bool

This method tests greater than or equal to (for self and other) and is used by the >=\noperator. Read more
","PartialOrd>","air_test_utils::call_services::ArgTetraplets","air_test_utils::FoldLore"],["
1.0.0 · source§

impl<T, A1, A2> PartialOrd<Vec<T, A2>> for Vec<T, A1>
where\n T: PartialOrd,\n A1: Allocator,\n A2: Allocator,

Implements comparison of vectors, lexicographically.

\n
source§

fn partial_cmp(&self, other: &Vec<T, A2>) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · source§

fn lt(&self, other: &Rhs) -> bool

This method tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · source§

fn le(&self, other: &Rhs) -> bool

This method tests less than or equal to (for self and other) and is used by the <=\noperator. Read more
1.0.0 · source§

fn gt(&self, other: &Rhs) -> bool

This method tests greater than (for self and other) and is used by the > operator. Read more
1.0.0 · source§

fn ge(&self, other: &Rhs) -> bool

This method tests greater than or equal to (for self and other) and is used by the >=\noperator. Read more
","PartialOrd>","air_test_utils::call_services::ArgTetraplets","air_test_utils::FoldLore"],["
§

impl<T, S> Serialize<S> for Vec<T>
where\n T: Serialize<S>,\n S: ScratchSpace + Serializer + ?Sized,

§

fn serialize(\n &self,\n serializer: &mut S,\n) -> Result<<Vec<T> as Archive>::Resolver, <S as Fallible>::Error>

Writes the dependencies for the object and returns a resolver that can create the archived\ntype.
","Serialize","air_test_utils::call_services::ArgTetraplets","air_test_utils::FoldLore"],["
source§

impl<T> Serialize for Vec<T>
where\n T: Serialize,

source§

fn serialize<S>(\n &self,\n serializer: S,\n) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error>
where\n S: Serializer,

Serialize this value into the given Serde serializer. Read more
","Serialize","air_test_utils::call_services::ArgTetraplets","air_test_utils::FoldLore"],["
source§

impl<T, U> SerializeAs<Vec<T>> for Vec<U>
where\n U: SerializeAs<T>,

source§

fn serialize_as<S>(\n source: &Vec<T>,\n serializer: S,\n) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error>
where\n S: Serializer,

Serialize this value into the given Serde serializer.
","SerializeAs>","air_test_utils::call_services::ArgTetraplets","air_test_utils::FoldLore"],["
§

impl<T> Sink<T> for Vec<T>

§

type Error = Infallible

The type of value produced by the sink when an error occurs.
§

fn poll_ready(\n self: Pin<&mut Vec<T>>,\n _: &mut Context<'_>,\n) -> Poll<Result<(), <Vec<T> as Sink<T>>::Error>>

Attempts to prepare the Sink to receive a value. Read more
§

fn start_send(\n self: Pin<&mut Vec<T>>,\n item: T,\n) -> Result<(), <Vec<T> as Sink<T>>::Error>

Begin the process of sending a value to the sink.\nEach call to this function must be preceded by a successful call to\npoll_ready which returned Poll::Ready(Ok(())). Read more
§

fn poll_flush(\n self: Pin<&mut Vec<T>>,\n _: &mut Context<'_>,\n) -> Poll<Result<(), <Vec<T> as Sink<T>>::Error>>

Flush any remaining output from this sink. Read more
§

fn poll_close(\n self: Pin<&mut Vec<T>>,\n _: &mut Context<'_>,\n) -> Poll<Result<(), <Vec<T> as Sink<T>>::Error>>

Flush any remaining output and close this sink, if necessary. Read more
","Sink","air_test_utils::call_services::ArgTetraplets","air_test_utils::FoldLore"],["
§

impl<W, I> ToBytes<W> for Vec<I>
where\n W: Write,\n I: ToBytes<W>,

Encode a vector into bytes.

\n

Decoder is decoders::binary::list.

\n
§

fn to_bytes(&self, writer: &mut W) -> Result<(), Error>

Converts the given value into &[u8] in the given writer.
","ToBytes","air_test_utils::call_services::ArgTetraplets","air_test_utils::FoldLore"],["
source§

impl<T> Vec<T>

1.0.0 (const: 1.39.0) · source

pub const fn new() -> Vec<T>

Constructs a new, empty Vec<T>.

\n

The vector will not allocate until elements are pushed onto it.

\n
§Examples
\n
let mut vec: Vec<i32> = Vec::new();
\n
1.0.0 · source

pub fn with_capacity(capacity: usize) -> Vec<T>

Constructs a new, empty Vec<T> with at least the specified capacity.

\n

The vector will be able to hold at least capacity elements without\nreallocating. This method is allowed to allocate for more elements than\ncapacity. If capacity is 0, the vector will not allocate.

\n

It is important to note that although the returned vector has the\nminimum capacity specified, the vector will have a zero length. For\nan explanation of the difference between length and capacity, see\nCapacity and reallocation.

\n

If it is important to know the exact allocated capacity of a Vec,\nalways use the capacity method after construction.

\n

For Vec<T> where T is a zero-sized type, there will be no allocation\nand the capacity will always be usize::MAX.

\n
§Panics
\n

Panics if the new capacity exceeds isize::MAX bytes.

\n
§Examples
\n
let mut vec = Vec::with_capacity(10);\n\n// The vector contains no items, even though it has capacity for more\nassert_eq!(vec.len(), 0);\nassert!(vec.capacity() >= 10);\n\n// These are all done without reallocating...\nfor i in 0..10 {\n    vec.push(i);\n}\nassert_eq!(vec.len(), 10);\nassert!(vec.capacity() >= 10);\n\n// ...but this may make the vector reallocate\nvec.push(11);\nassert_eq!(vec.len(), 11);\nassert!(vec.capacity() >= 11);\n\n// A vector of a zero-sized type will always over-allocate, since no\n// allocation is necessary\nlet vec_units = Vec::<()>::with_capacity(10);\nassert_eq!(vec_units.capacity(), usize::MAX);
\n
source

pub fn try_with_capacity(capacity: usize) -> Result<Vec<T>, TryReserveError>

🔬This is a nightly-only experimental API. (try_with_capacity)

Constructs a new, empty Vec<T> with at least the specified capacity.

\n

The vector will be able to hold at least capacity elements without\nreallocating. This method is allowed to allocate for more elements than\ncapacity. If capacity is 0, the vector will not allocate.

\n
§Errors
\n

Returns an error if the capacity exceeds isize::MAX bytes,\nor if the allocator reports allocation failure.

\n
1.0.0 · source

pub unsafe fn from_raw_parts(\n ptr: *mut T,\n length: usize,\n capacity: usize,\n) -> Vec<T>

Creates a Vec<T> directly from a pointer, a length, and a capacity.

\n
§Safety
\n

This is highly unsafe, due to the number of invariants that aren’t\nchecked:

\n
    \n
  • ptr must have been allocated using the global allocator, such as via\nthe alloc::alloc function.
  • \n
  • T needs to have the same alignment as what ptr was allocated with.\n(T having a less strict alignment is not sufficient, the alignment really\nneeds to be equal to satisfy the dealloc requirement that memory must be\nallocated and deallocated with the same layout.)
  • \n
  • The size of T times the capacity (ie. the allocated size in bytes) needs\nto be the same size as the pointer was allocated with. (Because similar to\nalignment, dealloc must be called with the same layout size.)
  • \n
  • length needs to be less than or equal to capacity.
  • \n
  • The first length values must be properly initialized values of type T.
  • \n
  • capacity needs to be the capacity that the pointer was allocated with.
  • \n
  • The allocated size in bytes must be no larger than isize::MAX.\nSee the safety documentation of pointer::offset.
  • \n
\n

These requirements are always upheld by any ptr that has been allocated\nvia Vec<T>. Other allocation sources are allowed if the invariants are\nupheld.

\n

Violating these may cause problems like corrupting the allocator’s\ninternal data structures. For example it is normally not safe\nto build a Vec<u8> from a pointer to a C char array with length\nsize_t, doing so is only safe if the array was initially allocated by\na Vec or String.\nIt’s also not safe to build one from a Vec<u16> and its length, because\nthe allocator cares about the alignment, and these two types have different\nalignments. The buffer was allocated with alignment 2 (for u16), but after\nturning it into a Vec<u8> it’ll be deallocated with alignment 1. To avoid\nthese issues, it is often preferable to do casting/transmuting using\nslice::from_raw_parts instead.

\n

The ownership of ptr is effectively transferred to the\nVec<T> which may then deallocate, reallocate or change the\ncontents of memory pointed to by the pointer at will. Ensure\nthat nothing else uses the pointer after calling this\nfunction.

\n
§Examples
\n
use std::ptr;\nuse std::mem;\n\nlet v = vec![1, 2, 3];\n\n// Prevent running `v`'s destructor so we are in complete control\n// of the allocation.\nlet mut v = mem::ManuallyDrop::new(v);\n\n// Pull out the various important pieces of information about `v`\nlet p = v.as_mut_ptr();\nlet len = v.len();\nlet cap = v.capacity();\n\nunsafe {\n    // Overwrite memory with 4, 5, 6\n    for i in 0..len {\n        ptr::write(p.add(i), 4 + i);\n    }\n\n    // Put everything back together into a Vec\n    let rebuilt = Vec::from_raw_parts(p, len, cap);\n    assert_eq!(rebuilt, [4, 5, 6]);\n}
\n

Using memory that was allocated elsewhere:

\n\n
use std::alloc::{alloc, Layout};\n\nfn main() {\n    let layout = Layout::array::<u32>(16).expect(\"overflow cannot happen\");\n\n    let vec = unsafe {\n        let mem = alloc(layout).cast::<u32>();\n        if mem.is_null() {\n            return;\n        }\n\n        mem.write(1_000_000);\n\n        Vec::from_raw_parts(mem, 1, 16)\n    };\n\n    assert_eq!(vec, &[1_000_000]);\n    assert_eq!(vec.capacity(), 16);\n}
\n
",0,"air_test_utils::call_services::ArgTetraplets","air_test_utils::FoldLore"],["
source§

impl<T, A> Vec<T, A>
where\n T: Clone,\n A: Allocator,

1.5.0 · source

pub fn resize(&mut self, new_len: usize, value: T)

Resizes the Vec in-place so that len is equal to new_len.

\n

If new_len is greater than len, the Vec is extended by the\ndifference, with each additional slot filled with value.\nIf new_len is less than len, the Vec is simply truncated.

\n

This method requires T to implement Clone,\nin order to be able to clone the passed value.\nIf you need more flexibility (or want to rely on Default instead of\nClone), use Vec::resize_with.\nIf you only need to resize to a smaller size, use Vec::truncate.

\n
§Examples
\n
let mut vec = vec![\"hello\"];\nvec.resize(3, \"world\");\nassert_eq!(vec, [\"hello\", \"world\", \"world\"]);\n\nlet mut vec = vec![1, 2, 3, 4];\nvec.resize(2, 0);\nassert_eq!(vec, [1, 2]);
\n
1.6.0 · source

pub fn extend_from_slice(&mut self, other: &[T])

Clones and appends all elements in a slice to the Vec.

\n

Iterates over the slice other, clones each element, and then appends\nit to this Vec. The other slice is traversed in-order.

\n

Note that this function is same as extend except that it is\nspecialized to work with slices instead. If and when Rust gets\nspecialization this function will likely be deprecated (but still\navailable).

\n
§Examples
\n
let mut vec = vec![1];\nvec.extend_from_slice(&[2, 3, 4]);\nassert_eq!(vec, [1, 2, 3, 4]);
\n
1.53.0 · source

pub fn extend_from_within<R>(&mut self, src: R)
where\n R: RangeBounds<usize>,

Copies elements from src range to the end of the vector.

\n
§Panics
\n

Panics if the starting point is greater than the end point or if\nthe end point is greater than the length of the vector.

\n
§Examples
\n
let mut vec = vec![0, 1, 2, 3, 4];\n\nvec.extend_from_within(2..);\nassert_eq!(vec, [0, 1, 2, 3, 4, 2, 3, 4]);\n\nvec.extend_from_within(..2);\nassert_eq!(vec, [0, 1, 2, 3, 4, 2, 3, 4, 0, 1]);\n\nvec.extend_from_within(4..8);\nassert_eq!(vec, [0, 1, 2, 3, 4, 2, 3, 4, 0, 1, 4, 2, 3, 4]);
\n
",0,"air_test_utils::call_services::ArgTetraplets","air_test_utils::FoldLore"],["
source§

impl<T, A> Vec<T, A>
where\n T: PartialEq,\n A: Allocator,

1.0.0 · source

pub fn dedup(&mut self)

Removes consecutive repeated elements in the vector according to the\nPartialEq trait implementation.

\n

If the vector is sorted, this removes all duplicates.

\n
§Examples
\n
let mut vec = vec![1, 2, 2, 3, 2];\n\nvec.dedup();\n\nassert_eq!(vec, [1, 2, 3, 2]);
\n
",0,"air_test_utils::call_services::ArgTetraplets","air_test_utils::FoldLore"],["
source§

impl<T, A> Vec<T, A>
where\n A: Allocator,

1.21.0 · source

pub fn splice<R, I>(\n &mut self,\n range: R,\n replace_with: I,\n) -> Splice<'_, <I as IntoIterator>::IntoIter, A>
where\n R: RangeBounds<usize>,\n I: IntoIterator<Item = T>,

Creates a splicing iterator that replaces the specified range in the vector\nwith the given replace_with iterator and yields the removed items.\nreplace_with does not need to be the same length as range.

\n

range is removed even if the iterator is not consumed until the end.

\n

It is unspecified how many elements are removed from the vector\nif the Splice value is leaked.

\n

The input iterator replace_with is only consumed when the Splice value is dropped.

\n

This is optimal if:

\n
    \n
  • The tail (elements in the vector after range) is empty,
  • \n
  • or replace_with yields fewer or equal elements than range’s length
  • \n
  • or the lower bound of its size_hint() is exact.
  • \n
\n

Otherwise, a temporary vector is allocated and the tail is moved twice.

\n
§Panics
\n

Panics if the starting point is greater than the end point or if\nthe end point is greater than the length of the vector.

\n
§Examples
\n
let mut v = vec![1, 2, 3, 4];\nlet new = [7, 8, 9];\nlet u: Vec<_> = v.splice(1..3, new).collect();\nassert_eq!(v, &[1, 7, 8, 9, 4]);\nassert_eq!(u, &[2, 3]);
\n
source

pub fn extract_if<F>(&mut self, filter: F) -> ExtractIf<'_, T, F, A>
where\n F: FnMut(&mut T) -> bool,

🔬This is a nightly-only experimental API. (extract_if)

Creates an iterator which uses a closure to determine if an element should be removed.

\n

If the closure returns true, then the element is removed and yielded.\nIf the closure returns false, the element will remain in the vector and will not be yielded\nby the iterator.

\n

If the returned ExtractIf is not exhausted, e.g. because it is dropped without iterating\nor the iteration short-circuits, then the remaining elements will be retained.\nUse retain with a negated predicate if you do not need the returned iterator.

\n

Using this method is equivalent to the following code:

\n\n
let mut i = 0;\nwhile i < vec.len() {\n    if some_predicate(&mut vec[i]) {\n        let val = vec.remove(i);\n        // your code here\n    } else {\n        i += 1;\n    }\n}\n
\n

But extract_if is easier to use. extract_if is also more efficient,\nbecause it can backshift the elements of the array in bulk.

\n

Note that extract_if also lets you mutate every element in the filter closure,\nregardless of whether you choose to keep or remove it.

\n
§Examples
\n

Splitting an array into evens and odds, reusing the original allocation:

\n\n
#![feature(extract_if)]\nlet mut numbers = vec![1, 2, 3, 4, 5, 6, 8, 9, 11, 13, 14, 15];\n\nlet evens = numbers.extract_if(|x| *x % 2 == 0).collect::<Vec<_>>();\nlet odds = numbers;\n\nassert_eq!(evens, vec![2, 4, 6, 8, 14]);\nassert_eq!(odds, vec![1, 3, 5, 9, 11, 13, 15]);
\n
",0,"air_test_utils::call_services::ArgTetraplets","air_test_utils::FoldLore"],["
source§

impl<T, A> Vec<T, A>
where\n A: Allocator,

source

pub const fn new_in(alloc: A) -> Vec<T, A>

🔬This is a nightly-only experimental API. (allocator_api)

Constructs a new, empty Vec<T, A>.

\n

The vector will not allocate until elements are pushed onto it.

\n
§Examples
\n
#![feature(allocator_api)]\n\nuse std::alloc::System;\n\nlet mut vec: Vec<i32, _> = Vec::new_in(System);
\n
source

pub fn with_capacity_in(capacity: usize, alloc: A) -> Vec<T, A>

🔬This is a nightly-only experimental API. (allocator_api)

Constructs a new, empty Vec<T, A> with at least the specified capacity\nwith the provided allocator.

\n

The vector will be able to hold at least capacity elements without\nreallocating. This method is allowed to allocate for more elements than\ncapacity. If capacity is 0, the vector will not allocate.

\n

It is important to note that although the returned vector has the\nminimum capacity specified, the vector will have a zero length. For\nan explanation of the difference between length and capacity, see\nCapacity and reallocation.

\n

If it is important to know the exact allocated capacity of a Vec,\nalways use the capacity method after construction.

\n

For Vec<T, A> where T is a zero-sized type, there will be no allocation\nand the capacity will always be usize::MAX.

\n
§Panics
\n

Panics if the new capacity exceeds isize::MAX bytes.

\n
§Examples
\n
#![feature(allocator_api)]\n\nuse std::alloc::System;\n\nlet mut vec = Vec::with_capacity_in(10, System);\n\n// The vector contains no items, even though it has capacity for more\nassert_eq!(vec.len(), 0);\nassert!(vec.capacity() >= 10);\n\n// These are all done without reallocating...\nfor i in 0..10 {\n    vec.push(i);\n}\nassert_eq!(vec.len(), 10);\nassert!(vec.capacity() >= 10);\n\n// ...but this may make the vector reallocate\nvec.push(11);\nassert_eq!(vec.len(), 11);\nassert!(vec.capacity() >= 11);\n\n// A vector of a zero-sized type will always over-allocate, since no\n// allocation is necessary\nlet vec_units = Vec::<(), System>::with_capacity_in(10, System);\nassert_eq!(vec_units.capacity(), usize::MAX);
\n
source

pub fn try_with_capacity_in(\n capacity: usize,\n alloc: A,\n) -> Result<Vec<T, A>, TryReserveError>

🔬This is a nightly-only experimental API. (allocator_api)

Constructs a new, empty Vec<T, A> with at least the specified capacity\nwith the provided allocator.

\n

The vector will be able to hold at least capacity elements without\nreallocating. This method is allowed to allocate for more elements than\ncapacity. If capacity is 0, the vector will not allocate.

\n
§Errors
\n

Returns an error if the capacity exceeds isize::MAX bytes,\nor if the allocator reports allocation failure.

\n
source

pub unsafe fn from_raw_parts_in(\n ptr: *mut T,\n length: usize,\n capacity: usize,\n alloc: A,\n) -> Vec<T, A>

🔬This is a nightly-only experimental API. (allocator_api)

Creates a Vec<T, A> directly from a pointer, a length, a capacity,\nand an allocator.

\n
§Safety
\n

This is highly unsafe, due to the number of invariants that aren’t\nchecked:

\n
    \n
  • ptr must be currently allocated via the given allocator alloc.
  • \n
  • T needs to have the same alignment as what ptr was allocated with.\n(T having a less strict alignment is not sufficient, the alignment really\nneeds to be equal to satisfy the dealloc requirement that memory must be\nallocated and deallocated with the same layout.)
  • \n
  • The size of T times the capacity (ie. the allocated size in bytes) needs\nto be the same size as the pointer was allocated with. (Because similar to\nalignment, dealloc must be called with the same layout size.)
  • \n
  • length needs to be less than or equal to capacity.
  • \n
  • The first length values must be properly initialized values of type T.
  • \n
  • capacity needs to fit the layout size that the pointer was allocated with.
  • \n
  • The allocated size in bytes must be no larger than isize::MAX.\nSee the safety documentation of pointer::offset.
  • \n
\n

These requirements are always upheld by any ptr that has been allocated\nvia Vec<T, A>. Other allocation sources are allowed if the invariants are\nupheld.

\n

Violating these may cause problems like corrupting the allocator’s\ninternal data structures. For example it is not safe\nto build a Vec<u8> from a pointer to a C char array with length size_t.\nIt’s also not safe to build one from a Vec<u16> and its length, because\nthe allocator cares about the alignment, and these two types have different\nalignments. The buffer was allocated with alignment 2 (for u16), but after\nturning it into a Vec<u8> it’ll be deallocated with alignment 1.

\n

The ownership of ptr is effectively transferred to the\nVec<T> which may then deallocate, reallocate or change the\ncontents of memory pointed to by the pointer at will. Ensure\nthat nothing else uses the pointer after calling this\nfunction.

\n
§Examples
\n
#![feature(allocator_api)]\n\nuse std::alloc::System;\n\nuse std::ptr;\nuse std::mem;\n\nlet mut v = Vec::with_capacity_in(3, System);\nv.push(1);\nv.push(2);\nv.push(3);\n\n// Prevent running `v`'s destructor so we are in complete control\n// of the allocation.\nlet mut v = mem::ManuallyDrop::new(v);\n\n// Pull out the various important pieces of information about `v`\nlet p = v.as_mut_ptr();\nlet len = v.len();\nlet cap = v.capacity();\nlet alloc = v.allocator();\n\nunsafe {\n    // Overwrite memory with 4, 5, 6\n    for i in 0..len {\n        ptr::write(p.add(i), 4 + i);\n    }\n\n    // Put everything back together into a Vec\n    let rebuilt = Vec::from_raw_parts_in(p, len, cap, alloc.clone());\n    assert_eq!(rebuilt, [4, 5, 6]);\n}
\n

Using memory that was allocated elsewhere:

\n\n
#![feature(allocator_api)]\n\nuse std::alloc::{AllocError, Allocator, Global, Layout};\n\nfn main() {\n    let layout = Layout::array::<u32>(16).expect(\"overflow cannot happen\");\n\n    let vec = unsafe {\n        let mem = match Global.allocate(layout) {\n            Ok(mem) => mem.cast::<u32>().as_ptr(),\n            Err(AllocError) => return,\n        };\n\n        mem.write(1_000_000);\n\n        Vec::from_raw_parts_in(mem, 1, 16, Global)\n    };\n\n    assert_eq!(vec, &[1_000_000]);\n    assert_eq!(vec.capacity(), 16);\n}
\n
source

pub fn into_raw_parts(self) -> (*mut T, usize, usize)

🔬This is a nightly-only experimental API. (vec_into_raw_parts)

Decomposes a Vec<T> into its raw components: (pointer, length, capacity).

\n

Returns the raw pointer to the underlying data, the length of\nthe vector (in elements), and the allocated capacity of the\ndata (in elements). These are the same arguments in the same\norder as the arguments to from_raw_parts.

\n

After calling this function, the caller is responsible for the\nmemory previously managed by the Vec. The only way to do\nthis is to convert the raw pointer, length, and capacity back\ninto a Vec with the from_raw_parts function, allowing\nthe destructor to perform the cleanup.

\n
§Examples
\n
#![feature(vec_into_raw_parts)]\nlet v: Vec<i32> = vec![-1, 0, 1];\n\nlet (ptr, len, cap) = v.into_raw_parts();\n\nlet rebuilt = unsafe {\n    // We can now make changes to the components, such as\n    // transmuting the raw pointer to a compatible type.\n    let ptr = ptr as *mut u32;\n\n    Vec::from_raw_parts(ptr, len, cap)\n};\nassert_eq!(rebuilt, [4294967295, 0, 1]);
\n
source

pub fn into_raw_parts_with_alloc(self) -> (*mut T, usize, usize, A)

🔬This is a nightly-only experimental API. (allocator_api)

Decomposes a Vec<T> into its raw components: (pointer, length, capacity, allocator).

\n

Returns the raw pointer to the underlying data, the length of the vector (in elements),\nthe allocated capacity of the data (in elements), and the allocator. These are the same\narguments in the same order as the arguments to from_raw_parts_in.

\n

After calling this function, the caller is responsible for the\nmemory previously managed by the Vec. The only way to do\nthis is to convert the raw pointer, length, and capacity back\ninto a Vec with the from_raw_parts_in function, allowing\nthe destructor to perform the cleanup.

\n
§Examples
\n
#![feature(allocator_api, vec_into_raw_parts)]\n\nuse std::alloc::System;\n\nlet mut v: Vec<i32, System> = Vec::new_in(System);\nv.push(-1);\nv.push(0);\nv.push(1);\n\nlet (ptr, len, cap, alloc) = v.into_raw_parts_with_alloc();\n\nlet rebuilt = unsafe {\n    // We can now make changes to the components, such as\n    // transmuting the raw pointer to a compatible type.\n    let ptr = ptr as *mut u32;\n\n    Vec::from_raw_parts_in(ptr, len, cap, alloc)\n};\nassert_eq!(rebuilt, [4294967295, 0, 1]);
\n
1.0.0 · source

pub fn capacity(&self) -> usize

Returns the total number of elements the vector can hold without\nreallocating.

\n
§Examples
\n
let mut vec: Vec<i32> = Vec::with_capacity(10);\nvec.push(42);\nassert!(vec.capacity() >= 10);
\n
1.0.0 · source

pub fn reserve(&mut self, additional: usize)

Reserves capacity for at least additional more elements to be inserted\nin the given Vec<T>. The collection may reserve more space to\nspeculatively avoid frequent reallocations. After calling reserve,\ncapacity will be greater than or equal to self.len() + additional.\nDoes nothing if capacity is already sufficient.

\n
§Panics
\n

Panics if the new capacity exceeds isize::MAX bytes.

\n
§Examples
\n
let mut vec = vec![1];\nvec.reserve(10);\nassert!(vec.capacity() >= 11);
\n
1.0.0 · source

pub fn reserve_exact(&mut self, additional: usize)

Reserves the minimum capacity for at least additional more elements to\nbe inserted in the given Vec<T>. Unlike reserve, this will not\ndeliberately over-allocate to speculatively avoid frequent allocations.\nAfter calling reserve_exact, capacity will be greater than or equal to\nself.len() + additional. Does nothing if the capacity is already\nsufficient.

\n

Note that the allocator may give the collection more space than it\nrequests. Therefore, capacity can not be relied upon to be precisely\nminimal. Prefer reserve if future insertions are expected.

\n
§Panics
\n

Panics if the new capacity exceeds isize::MAX bytes.

\n
§Examples
\n
let mut vec = vec![1];\nvec.reserve_exact(10);\nassert!(vec.capacity() >= 11);
\n
1.57.0 · source

pub fn try_reserve(&mut self, additional: usize) -> Result<(), TryReserveError>

Tries to reserve capacity for at least additional more elements to be inserted\nin the given Vec<T>. The collection may reserve more space to speculatively avoid\nfrequent reallocations. After calling try_reserve, capacity will be\ngreater than or equal to self.len() + additional if it returns\nOk(()). Does nothing if capacity is already sufficient. This method\npreserves the contents even if an error occurs.

\n
§Errors
\n

If the capacity overflows, or the allocator reports a failure, then an error\nis returned.

\n
§Examples
\n
use std::collections::TryReserveError;\n\nfn process_data(data: &[u32]) -> Result<Vec<u32>, TryReserveError> {\n    let mut output = Vec::new();\n\n    // Pre-reserve the memory, exiting if we can't\n    output.try_reserve(data.len())?;\n\n    // Now we know this can't OOM in the middle of our complex work\n    output.extend(data.iter().map(|&val| {\n        val * 2 + 5 // very complicated\n    }));\n\n    Ok(output)\n}
\n
1.57.0 · source

pub fn try_reserve_exact(\n &mut self,\n additional: usize,\n) -> Result<(), TryReserveError>

Tries to reserve the minimum capacity for at least additional\nelements to be inserted in the given Vec<T>. Unlike try_reserve,\nthis will not deliberately over-allocate to speculatively avoid frequent\nallocations. After calling try_reserve_exact, capacity will be greater\nthan or equal to self.len() + additional if it returns Ok(()).\nDoes nothing if the capacity is already sufficient.

\n

Note that the allocator may give the collection more space than it\nrequests. Therefore, capacity can not be relied upon to be precisely\nminimal. Prefer try_reserve if future insertions are expected.

\n
§Errors
\n

If the capacity overflows, or the allocator reports a failure, then an error\nis returned.

\n
§Examples
\n
use std::collections::TryReserveError;\n\nfn process_data(data: &[u32]) -> Result<Vec<u32>, TryReserveError> {\n    let mut output = Vec::new();\n\n    // Pre-reserve the memory, exiting if we can't\n    output.try_reserve_exact(data.len())?;\n\n    // Now we know this can't OOM in the middle of our complex work\n    output.extend(data.iter().map(|&val| {\n        val * 2 + 5 // very complicated\n    }));\n\n    Ok(output)\n}
\n
1.0.0 · source

pub fn shrink_to_fit(&mut self)

Shrinks the capacity of the vector as much as possible.

\n

The behavior of this method depends on the allocator, which may either shrink the vector\nin-place or reallocate. The resulting vector might still have some excess capacity, just as\nis the case for with_capacity. See Allocator::shrink for more details.

\n
§Examples
\n
let mut vec = Vec::with_capacity(10);\nvec.extend([1, 2, 3]);\nassert!(vec.capacity() >= 10);\nvec.shrink_to_fit();\nassert!(vec.capacity() >= 3);
\n
1.56.0 · source

pub fn shrink_to(&mut self, min_capacity: usize)

Shrinks the capacity of the vector with a lower bound.

\n

The capacity will remain at least as large as both the length\nand the supplied value.

\n

If the current capacity is less than the lower limit, this is a no-op.

\n
§Examples
\n
let mut vec = Vec::with_capacity(10);\nvec.extend([1, 2, 3]);\nassert!(vec.capacity() >= 10);\nvec.shrink_to(4);\nassert!(vec.capacity() >= 4);\nvec.shrink_to(0);\nassert!(vec.capacity() >= 3);
\n
1.0.0 · source

pub fn into_boxed_slice(self) -> Box<[T], A>

Converts the vector into Box<[T]>.

\n

Before doing the conversion, this method discards excess capacity like shrink_to_fit.

\n
§Examples
\n
let v = vec![1, 2, 3];\n\nlet slice = v.into_boxed_slice();
\n

Any excess capacity is removed:

\n\n
let mut vec = Vec::with_capacity(10);\nvec.extend([1, 2, 3]);\n\nassert!(vec.capacity() >= 10);\nlet slice = vec.into_boxed_slice();\nassert_eq!(slice.into_vec().capacity(), 3);
\n
1.0.0 · source

pub fn truncate(&mut self, len: usize)

Shortens the vector, keeping the first len elements and dropping\nthe rest.

\n

If len is greater or equal to the vector’s current length, this has\nno effect.

\n

The drain method can emulate truncate, but causes the excess\nelements to be returned instead of dropped.

\n

Note that this method has no effect on the allocated capacity\nof the vector.

\n
§Examples
\n

Truncating a five element vector to two elements:

\n\n
let mut vec = vec![1, 2, 3, 4, 5];\nvec.truncate(2);\nassert_eq!(vec, [1, 2]);
\n

No truncation occurs when len is greater than the vector’s current\nlength:

\n\n
let mut vec = vec![1, 2, 3];\nvec.truncate(8);\nassert_eq!(vec, [1, 2, 3]);
\n

Truncating when len == 0 is equivalent to calling the clear\nmethod.

\n\n
let mut vec = vec![1, 2, 3];\nvec.truncate(0);\nassert_eq!(vec, []);
\n
1.7.0 · source

pub fn as_slice(&self) -> &[T]

Extracts a slice containing the entire vector.

\n

Equivalent to &s[..].

\n
§Examples
\n
use std::io::{self, Write};\nlet buffer = vec![1, 2, 3, 5, 8];\nio::sink().write(buffer.as_slice()).unwrap();
\n
1.7.0 · source

pub fn as_mut_slice(&mut self) -> &mut [T]

Extracts a mutable slice of the entire vector.

\n

Equivalent to &mut s[..].

\n
§Examples
\n
use std::io::{self, Read};\nlet mut buffer = vec![0; 3];\nio::repeat(0b101).read_exact(buffer.as_mut_slice()).unwrap();
\n
1.37.0 · source

pub fn as_ptr(&self) -> *const T

Returns a raw pointer to the vector’s buffer, or a dangling raw pointer\nvalid for zero sized reads if the vector didn’t allocate.

\n

The caller must ensure that the vector outlives the pointer this\nfunction returns, or else it will end up pointing to garbage.\nModifying the vector may cause its buffer to be reallocated,\nwhich would also make any pointers to it invalid.

\n

The caller must also ensure that the memory the pointer (non-transitively) points to\nis never written to (except inside an UnsafeCell) using this pointer or any pointer\nderived from it. If you need to mutate the contents of the slice, use as_mut_ptr.

\n

This method guarantees that for the purpose of the aliasing model, this method\ndoes not materialize a reference to the underlying slice, and thus the returned pointer\nwill remain valid when mixed with other calls to as_ptr and as_mut_ptr.\nNote that calling other methods that materialize mutable references to the slice,\nor mutable references to specific elements you are planning on accessing through this pointer,\nas well as writing to those elements, may still invalidate this pointer.\nSee the second example below for how this guarantee can be used.

\n
§Examples
\n
let x = vec![1, 2, 4];\nlet x_ptr = x.as_ptr();\n\nunsafe {\n    for i in 0..x.len() {\n        assert_eq!(*x_ptr.add(i), 1 << i);\n    }\n}
\n

Due to the aliasing guarantee, the following code is legal:

\n\n
unsafe {\n    let mut v = vec![0, 1, 2];\n    let ptr1 = v.as_ptr();\n    let _ = ptr1.read();\n    let ptr2 = v.as_mut_ptr().offset(2);\n    ptr2.write(2);\n    // Notably, the write to `ptr2` did *not* invalidate `ptr1`\n    // because it mutated a different element:\n    let _ = ptr1.read();\n}
\n
1.37.0 · source

pub fn as_mut_ptr(&mut self) -> *mut T

Returns an unsafe mutable pointer to the vector’s buffer, or a dangling\nraw pointer valid for zero sized reads if the vector didn’t allocate.

\n

The caller must ensure that the vector outlives the pointer this\nfunction returns, or else it will end up pointing to garbage.\nModifying the vector may cause its buffer to be reallocated,\nwhich would also make any pointers to it invalid.

\n

This method guarantees that for the purpose of the aliasing model, this method\ndoes not materialize a reference to the underlying slice, and thus the returned pointer\nwill remain valid when mixed with other calls to as_ptr and as_mut_ptr.\nNote that calling other methods that materialize references to the slice,\nor references to specific elements you are planning on accessing through this pointer,\nmay still invalidate this pointer.\nSee the second example below for how this guarantee can be used.

\n
§Examples
\n
// Allocate vector big enough for 4 elements.\nlet size = 4;\nlet mut x: Vec<i32> = Vec::with_capacity(size);\nlet x_ptr = x.as_mut_ptr();\n\n// Initialize elements via raw pointer writes, then set length.\nunsafe {\n    for i in 0..size {\n        *x_ptr.add(i) = i as i32;\n    }\n    x.set_len(size);\n}\nassert_eq!(&*x, &[0, 1, 2, 3]);
\n

Due to the aliasing guarantee, the following code is legal:

\n\n
unsafe {\n    let mut v = vec![0];\n    let ptr1 = v.as_mut_ptr();\n    ptr1.write(1);\n    let ptr2 = v.as_mut_ptr();\n    ptr2.write(2);\n    // Notably, the write to `ptr2` did *not* invalidate `ptr1`:\n    ptr1.write(3);\n}
\n
source

pub fn allocator(&self) -> &A

🔬This is a nightly-only experimental API. (allocator_api)

Returns a reference to the underlying allocator.

\n
1.0.0 · source

pub unsafe fn set_len(&mut self, new_len: usize)

Forces the length of the vector to new_len.

\n

This is a low-level operation that maintains none of the normal\ninvariants of the type. Normally changing the length of a vector\nis done using one of the safe operations instead, such as\ntruncate, resize, extend, or clear.

\n
§Safety
\n
    \n
  • new_len must be less than or equal to capacity().
  • \n
  • The elements at old_len..new_len must be initialized.
  • \n
\n
§Examples
\n

This method can be useful for situations in which the vector\nis serving as a buffer for other code, particularly over FFI:

\n\n
pub fn get_dictionary(&self) -> Option<Vec<u8>> {\n    // Per the FFI method's docs, \"32768 bytes is always enough\".\n    let mut dict = Vec::with_capacity(32_768);\n    let mut dict_length = 0;\n    // SAFETY: When `deflateGetDictionary` returns `Z_OK`, it holds that:\n    // 1. `dict_length` elements were initialized.\n    // 2. `dict_length` <= the capacity (32_768)\n    // which makes `set_len` safe to call.\n    unsafe {\n        // Make the FFI call...\n        let r = deflateGetDictionary(self.strm, dict.as_mut_ptr(), &mut dict_length);\n        if r == Z_OK {\n            // ...and update the length to what was initialized.\n            dict.set_len(dict_length);\n            Some(dict)\n        } else {\n            None\n        }\n    }\n}
\n

While the following example is sound, there is a memory leak since\nthe inner vectors were not freed prior to the set_len call:

\n\n
let mut vec = vec![vec![1, 0, 0],\n                   vec![0, 1, 0],\n                   vec![0, 0, 1]];\n// SAFETY:\n// 1. `old_len..0` is empty so no elements need to be initialized.\n// 2. `0 <= capacity` always holds whatever `capacity` is.\nunsafe {\n    vec.set_len(0);\n}
\n

Normally, here, one would use clear instead to correctly drop\nthe contents and thus not leak memory.

\n
1.0.0 · source

pub fn swap_remove(&mut self, index: usize) -> T

Removes an element from the vector and returns it.

\n

The removed element is replaced by the last element of the vector.

\n

This does not preserve ordering of the remaining elements, but is O(1).\nIf you need to preserve the element order, use remove instead.

\n
§Panics
\n

Panics if index is out of bounds.

\n
§Examples
\n
let mut v = vec![\"foo\", \"bar\", \"baz\", \"qux\"];\n\nassert_eq!(v.swap_remove(1), \"bar\");\nassert_eq!(v, [\"foo\", \"qux\", \"baz\"]);\n\nassert_eq!(v.swap_remove(0), \"foo\");\nassert_eq!(v, [\"baz\", \"qux\"]);
\n
1.0.0 · source

pub fn insert(&mut self, index: usize, element: T)

Inserts an element at position index within the vector, shifting all\nelements after it to the right.

\n
§Panics
\n

Panics if index > len.

\n
§Examples
\n
let mut vec = vec![1, 2, 3];\nvec.insert(1, 4);\nassert_eq!(vec, [1, 4, 2, 3]);\nvec.insert(4, 5);\nassert_eq!(vec, [1, 4, 2, 3, 5]);
\n
§Time complexity
\n

Takes O(Vec::len) time. All items after the insertion index must be\nshifted to the right. In the worst case, all elements are shifted when\nthe insertion index is 0.

\n
1.0.0 · source

pub fn remove(&mut self, index: usize) -> T

Removes and returns the element at position index within the vector,\nshifting all elements after it to the left.

\n

Note: Because this shifts over the remaining elements, it has a\nworst-case performance of O(n). If you don’t need the order of elements\nto be preserved, use swap_remove instead. If you’d like to remove\nelements from the beginning of the Vec, consider using\nVecDeque::pop_front instead.

\n
§Panics
\n

Panics if index is out of bounds.

\n
§Examples
\n
let mut v = vec![1, 2, 3];\nassert_eq!(v.remove(1), 2);\nassert_eq!(v, [1, 3]);
\n
1.0.0 · source

pub fn retain<F>(&mut self, f: F)
where\n F: FnMut(&T) -> bool,

Retains only the elements specified by the predicate.

\n

In other words, remove all elements e for which f(&e) returns false.\nThis method operates in place, visiting each element exactly once in the\noriginal order, and preserves the order of the retained elements.

\n
§Examples
\n
let mut vec = vec![1, 2, 3, 4];\nvec.retain(|&x| x % 2 == 0);\nassert_eq!(vec, [2, 4]);
\n

Because the elements are visited exactly once in the original order,\nexternal state may be used to decide which elements to keep.

\n\n
let mut vec = vec![1, 2, 3, 4, 5];\nlet keep = [false, true, true, false, true];\nlet mut iter = keep.iter();\nvec.retain(|_| *iter.next().unwrap());\nassert_eq!(vec, [2, 3, 5]);
\n
1.61.0 · source

pub fn retain_mut<F>(&mut self, f: F)
where\n F: FnMut(&mut T) -> bool,

Retains only the elements specified by the predicate, passing a mutable reference to it.

\n

In other words, remove all elements e such that f(&mut e) returns false.\nThis method operates in place, visiting each element exactly once in the\noriginal order, and preserves the order of the retained elements.

\n
§Examples
\n
let mut vec = vec![1, 2, 3, 4];\nvec.retain_mut(|x| if *x <= 3 {\n    *x += 1;\n    true\n} else {\n    false\n});\nassert_eq!(vec, [2, 3, 4]);
\n
1.16.0 · source

pub fn dedup_by_key<F, K>(&mut self, key: F)
where\n F: FnMut(&mut T) -> K,\n K: PartialEq,

Removes all but the first of consecutive elements in the vector that resolve to the same\nkey.

\n

If the vector is sorted, this removes all duplicates.

\n
§Examples
\n
let mut vec = vec![10, 20, 21, 30, 20];\n\nvec.dedup_by_key(|i| *i / 10);\n\nassert_eq!(vec, [10, 20, 30, 20]);
\n
1.16.0 · source

pub fn dedup_by<F>(&mut self, same_bucket: F)
where\n F: FnMut(&mut T, &mut T) -> bool,

Removes all but the first of consecutive elements in the vector satisfying a given equality\nrelation.

\n

The same_bucket function is passed references to two elements from the vector and\nmust determine if the elements compare equal. The elements are passed in opposite order\nfrom their order in the slice, so if same_bucket(a, b) returns true, a is removed.

\n

If the vector is sorted, this removes all duplicates.

\n
§Examples
\n
let mut vec = vec![\"foo\", \"bar\", \"Bar\", \"baz\", \"bar\"];\n\nvec.dedup_by(|a, b| a.eq_ignore_ascii_case(b));\n\nassert_eq!(vec, [\"foo\", \"bar\", \"baz\", \"bar\"]);
\n
1.0.0 · source

pub fn push(&mut self, value: T)

Appends an element to the back of a collection.

\n
§Panics
\n

Panics if the new capacity exceeds isize::MAX bytes.

\n
§Examples
\n
let mut vec = vec![1, 2];\nvec.push(3);\nassert_eq!(vec, [1, 2, 3]);
\n
§Time complexity
\n

Takes amortized O(1) time. If the vector’s length would exceed its\ncapacity after the push, O(capacity) time is taken to copy the\nvector’s elements to a larger allocation. This expensive operation is\noffset by the capacity O(1) insertions it allows.

\n
source

pub fn push_within_capacity(&mut self, value: T) -> Result<(), T>

🔬This is a nightly-only experimental API. (vec_push_within_capacity)

Appends an element if there is sufficient spare capacity, otherwise an error is returned\nwith the element.

\n

Unlike push this method will not reallocate when there’s insufficient capacity.\nThe caller should use reserve or try_reserve to ensure that there is enough capacity.

\n
§Examples
\n

A manual, panic-free alternative to FromIterator:

\n\n
#![feature(vec_push_within_capacity)]\n\nuse std::collections::TryReserveError;\nfn from_iter_fallible<T>(iter: impl Iterator<Item=T>) -> Result<Vec<T>, TryReserveError> {\n    let mut vec = Vec::new();\n    for value in iter {\n        if let Err(value) = vec.push_within_capacity(value) {\n            vec.try_reserve(1)?;\n            // this cannot fail, the previous line either returned or added at least 1 free slot\n            let _ = vec.push_within_capacity(value);\n        }\n    }\n    Ok(vec)\n}\nassert_eq!(from_iter_fallible(0..100), Ok(Vec::from_iter(0..100)));
\n
§Time complexity
\n

Takes O(1) time.

\n
1.0.0 · source

pub fn pop(&mut self) -> Option<T>

Removes the last element from a vector and returns it, or None if it\nis empty.

\n

If you’d like to pop the first element, consider using\nVecDeque::pop_front instead.

\n
§Examples
\n
let mut vec = vec![1, 2, 3];\nassert_eq!(vec.pop(), Some(3));\nassert_eq!(vec, [1, 2]);
\n
§Time complexity
\n

Takes O(1) time.

\n
source

pub fn pop_if<F>(&mut self, f: F) -> Option<T>
where\n F: FnOnce(&mut T) -> bool,

🔬This is a nightly-only experimental API. (vec_pop_if)

Removes and returns the last element in a vector if the predicate\nreturns true, or None if the predicate returns false or the vector\nis empty.

\n
§Examples
\n
#![feature(vec_pop_if)]\n\nlet mut vec = vec![1, 2, 3, 4];\nlet pred = |x: &mut i32| *x % 2 == 0;\n\nassert_eq!(vec.pop_if(pred), Some(4));\nassert_eq!(vec, [1, 2, 3]);\nassert_eq!(vec.pop_if(pred), None);
\n
1.4.0 · source

pub fn append(&mut self, other: &mut Vec<T, A>)

Moves all the elements of other into self, leaving other empty.

\n
§Panics
\n

Panics if the new capacity exceeds isize::MAX bytes.

\n
§Examples
\n
let mut vec = vec![1, 2, 3];\nlet mut vec2 = vec![4, 5, 6];\nvec.append(&mut vec2);\nassert_eq!(vec, [1, 2, 3, 4, 5, 6]);\nassert_eq!(vec2, []);
\n
1.6.0 · source

pub fn drain<R>(&mut self, range: R) -> Drain<'_, T, A>
where\n R: RangeBounds<usize>,

Removes the specified range from the vector in bulk, returning all\nremoved elements as an iterator. If the iterator is dropped before\nbeing fully consumed, it drops the remaining removed elements.

\n

The returned iterator keeps a mutable borrow on the vector to optimize\nits implementation.

\n
§Panics
\n

Panics if the starting point is greater than the end point or if\nthe end point is greater than the length of the vector.

\n
§Leaking
\n

If the returned iterator goes out of scope without being dropped (due to\nmem::forget, for example), the vector may have lost and leaked\nelements arbitrarily, including elements outside the range.

\n
§Examples
\n
let mut v = vec![1, 2, 3];\nlet u: Vec<_> = v.drain(1..).collect();\nassert_eq!(v, &[1]);\nassert_eq!(u, &[2, 3]);\n\n// A full range clears the vector, like `clear()` does\nv.drain(..);\nassert_eq!(v, &[]);
\n
1.0.0 · source

pub fn clear(&mut self)

Clears the vector, removing all values.

\n

Note that this method has no effect on the allocated capacity\nof the vector.

\n
§Examples
\n
let mut v = vec![1, 2, 3];\n\nv.clear();\n\nassert!(v.is_empty());
\n
1.0.0 · source

pub fn len(&self) -> usize

Returns the number of elements in the vector, also referred to\nas its ‘length’.

\n
§Examples
\n
let a = vec![1, 2, 3];\nassert_eq!(a.len(), 3);
\n
1.0.0 · source

pub fn is_empty(&self) -> bool

Returns true if the vector contains no elements.

\n
§Examples
\n
let mut v = Vec::new();\nassert!(v.is_empty());\n\nv.push(1);\nassert!(!v.is_empty());
\n
1.4.0 · source

pub fn split_off(&mut self, at: usize) -> Vec<T, A>
where\n A: Clone,

Splits the collection into two at the given index.

\n

Returns a newly allocated vector containing the elements in the range\n[at, len). After the call, the original vector will be left containing\nthe elements [0, at) with its previous capacity unchanged.

\n
    \n
  • If you want to take ownership of the entire contents and capacity of\nthe vector, see mem::take or mem::replace.
  • \n
  • If you don’t need the returned vector at all, see Vec::truncate.
  • \n
  • If you want to take ownership of an arbitrary subslice, or you don’t\nnecessarily want to store the removed items in a vector, see Vec::drain.
  • \n
\n
§Panics
\n

Panics if at > len.

\n
§Examples
\n
let mut vec = vec![1, 2, 3];\nlet vec2 = vec.split_off(1);\nassert_eq!(vec, [1]);\nassert_eq!(vec2, [2, 3]);
\n
1.33.0 · source

pub fn resize_with<F>(&mut self, new_len: usize, f: F)
where\n F: FnMut() -> T,

Resizes the Vec in-place so that len is equal to new_len.

\n

If new_len is greater than len, the Vec is extended by the\ndifference, with each additional slot filled with the result of\ncalling the closure f. The return values from f will end up\nin the Vec in the order they have been generated.

\n

If new_len is less than len, the Vec is simply truncated.

\n

This method uses a closure to create new values on every push. If\nyou’d rather Clone a given value, use Vec::resize. If you\nwant to use the Default trait to generate values, you can\npass Default::default as the second argument.

\n
§Examples
\n
let mut vec = vec![1, 2, 3];\nvec.resize_with(5, Default::default);\nassert_eq!(vec, [1, 2, 3, 0, 0]);\n\nlet mut vec = vec![];\nlet mut p = 1;\nvec.resize_with(4, || { p *= 2; p });\nassert_eq!(vec, [2, 4, 8, 16]);
\n
1.47.0 · source

pub fn leak<'a>(self) -> &'a mut [T]
where\n A: 'a,

Consumes and leaks the Vec, returning a mutable reference to the contents,\n&'a mut [T]. Note that the type T must outlive the chosen lifetime\n'a. If the type has only static references, or none at all, then this\nmay be chosen to be 'static.

\n

As of Rust 1.57, this method does not reallocate or shrink the Vec,\nso the leaked allocation may include unused capacity that is not part\nof the returned slice.

\n

This function is mainly useful for data that lives for the remainder of\nthe program’s life. Dropping the returned reference will cause a memory\nleak.

\n
§Examples
\n

Simple usage:

\n\n
let x = vec![1, 2, 3];\nlet static_ref: &'static mut [usize] = x.leak();\nstatic_ref[0] += 1;\nassert_eq!(static_ref, &[2, 2, 3]);
\n
1.60.0 · source

pub fn spare_capacity_mut(&mut self) -> &mut [MaybeUninit<T>]

Returns the remaining spare capacity of the vector as a slice of\nMaybeUninit<T>.

\n

The returned slice can be used to fill the vector with data (e.g. by\nreading from a file) before marking the data as initialized using the\nset_len method.

\n
§Examples
\n
// Allocate vector big enough for 10 elements.\nlet mut v = Vec::with_capacity(10);\n\n// Fill in the first 3 elements.\nlet uninit = v.spare_capacity_mut();\nuninit[0].write(0);\nuninit[1].write(1);\nuninit[2].write(2);\n\n// Mark the first 3 elements of the vector as being initialized.\nunsafe {\n    v.set_len(3);\n}\n\nassert_eq!(&v, &[0, 1, 2]);
\n
source

pub fn split_at_spare_mut(&mut self) -> (&mut [T], &mut [MaybeUninit<T>])

🔬This is a nightly-only experimental API. (vec_split_at_spare)

Returns vector content as a slice of T, along with the remaining spare\ncapacity of the vector as a slice of MaybeUninit<T>.

\n

The returned spare capacity slice can be used to fill the vector with data\n(e.g. by reading from a file) before marking the data as initialized using\nthe set_len method.

\n

Note that this is a low-level API, which should be used with care for\noptimization purposes. If you need to append data to a Vec\nyou can use push, extend, extend_from_slice,\nextend_from_within, insert, append, resize or\nresize_with, depending on your exact needs.

\n
§Examples
\n
#![feature(vec_split_at_spare)]\n\nlet mut v = vec![1, 1, 2];\n\n// Reserve additional space big enough for 10 elements.\nv.reserve(10);\n\nlet (init, uninit) = v.split_at_spare_mut();\nlet sum = init.iter().copied().sum::<u32>();\n\n// Fill in the next 4 elements.\nuninit[0].write(sum);\nuninit[1].write(sum * 2);\nuninit[2].write(sum * 3);\nuninit[3].write(sum * 4);\n\n// Mark the 4 elements of the vector as being initialized.\nunsafe {\n    let len = v.len();\n    v.set_len(len + 4);\n}\n\nassert_eq!(&v, &[1, 1, 2, 4, 8, 12, 16]);
\n
",0,"air_test_utils::call_services::ArgTetraplets","air_test_utils::FoldLore"],["
§

impl<Z> Zeroize for Vec<Z>
where\n Z: Zeroize,

§

fn zeroize(&mut self)

“Best effort” zeroization for Vec.

\n

Ensures the entire capacity of the Vec is zeroed. Cannot ensure that\nprevious reallocations did not leave values on the heap.

\n
","Zeroize","air_test_utils::call_services::ArgTetraplets","air_test_utils::FoldLore"],["
§

impl<T> ComponentType for Vec<T>
where\n T: ComponentType,

","ComponentType","air_test_utils::call_services::ArgTetraplets","air_test_utils::FoldLore"],["
source§

impl<T, A> DerefPure for Vec<T, A>
where\n A: Allocator,

","DerefPure","air_test_utils::call_services::ArgTetraplets","air_test_utils::FoldLore"],["
1.0.0 · source§

impl<T, A> Eq for Vec<T, A>
where\n T: Eq,\n A: Allocator,

","Eq","air_test_utils::call_services::ArgTetraplets","air_test_utils::FoldLore"],["
§

impl<T> Lift for Vec<T>
where\n T: Lift,

","Lift","air_test_utils::call_services::ArgTetraplets","air_test_utils::FoldLore"],["
§

impl<T> Lower for Vec<T>
where\n T: Lower,

","Lower","air_test_utils::call_services::ArgTetraplets","air_test_utils::FoldLore"],["
§

impl<T> StableDeref for Vec<T>

","StableDeref","air_test_utils::call_services::ArgTetraplets","air_test_utils::FoldLore"],["
§

impl<Z> ZeroizeOnDrop for Vec<Z>
where\n Z: ZeroizeOnDrop,

","ZeroizeOnDrop","air_test_utils::call_services::ArgTetraplets","air_test_utils::FoldLore"]] +};if (window.register_type_impls) {window.register_type_impls(type_impls);} else {window.pending_type_impls = type_impls;}})() \ No newline at end of file diff --git a/type.impl/core/result/enum.Result.js b/type.impl/core/result/enum.Result.js new file mode 100644 index 00000000..2ef511b8 --- /dev/null +++ b/type.impl/core/result/enum.Result.js @@ -0,0 +1,5 @@ +(function() {var type_impls = { +"air_test_utils":[["
§

impl<'a, A, B> Arbitrary<'a> for Result<A, B>
where\n A: Arbitrary<'a>,\n B: Arbitrary<'a>,

§

fn arbitrary(u: &mut Unstructured<'a>) -> Result<Result<A, B>, Error>

Generate an arbitrary value of Self from the given unstructured data. Read more
§

fn size_hint(depth: usize) -> (usize, Option<usize>)

Get a size hint for how many bytes out of an Unstructured this type\nneeds to construct itself. Read more
§

fn arbitrary_take_rest(u: Unstructured<'a>) -> Result<Self, Error>

Generate an arbitrary value of Self from the entirety of the given\nunstructured data. Read more
","Arbitrary<'a>","air_test_utils::AVMResult","air_test_utils::RunnerResult"],["
§

impl<T, E> Archive for Result<T, E>
where\n T: Archive,\n E: Archive,

§

type Archived = ArchivedResult<<T as Archive>::Archived, <E as Archive>::Archived>

The archived representation of this type. Read more
§

type Resolver = Result<<T as Archive>::Resolver, <E as Archive>::Resolver>

The resolver for this type. It must contain all the additional information from serializing\nneeded to make the archived type from the normal type.
§

unsafe fn resolve(\n &self,\n pos: usize,\n resolver: <Result<T, E> as Archive>::Resolver,\n out: *mut <Result<T, E> as Archive>::Archived,\n)

Creates the archived version of this value at the given position and writes it to the given\noutput. Read more
","Archive","air_test_utils::AVMResult","air_test_utils::RunnerResult"],["
§

impl<T, E> BorshDeserialize for Result<T, E>
where\n T: BorshDeserialize,\n E: BorshDeserialize,

§

fn deserialize_reader<R>(reader: &mut R) -> Result<Result<T, E>, Error>
where\n R: Read,

§

fn deserialize(buf: &mut &[u8]) -> Result<Self, Error>

Deserializes this instance from a given slice of bytes.\nUpdates the buffer to point at the remaining bytes.
§

fn try_from_slice(v: &[u8]) -> Result<Self, Error>

Deserialize this instance from a slice of bytes.
§

fn try_from_reader<R>(reader: &mut R) -> Result<Self, Error>
where\n R: Read,

","BorshDeserialize","air_test_utils::AVMResult","air_test_utils::RunnerResult"],["
§

impl<T, E> BorshSerialize for Result<T, E>
where\n T: BorshSerialize,\n E: BorshSerialize,

§

fn serialize<W>(&self, writer: &mut W) -> Result<(), Error>
where\n W: Write,

","BorshSerialize","air_test_utils::AVMResult","air_test_utils::RunnerResult"],["
1.0.0 · source§

impl<T, E> Clone for Result<T, E>
where\n T: Clone,\n E: Clone,

source§

fn clone(&self) -> Result<T, E>

Returns a copy of the value. Read more
source§

fn clone_from(&mut self, source: &Result<T, E>)

Performs copy-assignment from source. Read more
","Clone","air_test_utils::AVMResult","air_test_utils::RunnerResult"],["
source§

impl<T, E> Context<T, E> for Result<T, E>
where\n E: StdError + Send + Sync + 'static,

source§

fn context<C>(self, context: C) -> Result<T, Error>
where\n C: Display + Send + Sync + 'static,

Wrap the error value with additional context.
source§

fn with_context<C, F>(self, context: F) -> Result<T, Error>
where\n C: Display + Send + Sync + 'static,\n F: FnOnce() -> C,

Wrap the error value with additional context that is evaluated lazily\nonly once an error does occur.
","Context","air_test_utils::AVMResult","air_test_utils::RunnerResult"],["
1.0.0 · source§

impl<T, E> Debug for Result<T, E>
where\n T: Debug,\n E: Debug,

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
","Debug","air_test_utils::AVMResult","air_test_utils::RunnerResult"],["
source§

impl<'de, T, E> Deserialize<'de> for Result<T, E>
where\n T: Deserialize<'de>,\n E: Deserialize<'de>,

source§

fn deserialize<D>(\n deserializer: D,\n) -> Result<Result<T, E>, <D as Deserializer<'de>>::Error>
where\n D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
","Deserialize<'de>","air_test_utils::AVMResult","air_test_utils::RunnerResult"],["
source§

impl<'de, T, TAs, E, EAs> DeserializeAs<'de, Result<T, E>> for Result<TAs, EAs>
where\n TAs: DeserializeAs<'de, T>,\n EAs: DeserializeAs<'de, E>,

source§

fn deserialize_as<D>(\n deserializer: D,\n) -> Result<Result<T, E>, <D as Deserializer<'de>>::Error>
where\n D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer.
","DeserializeAs<'de, Result>","air_test_utils::AVMResult","air_test_utils::RunnerResult"],["
1.0.0 · source§

impl<A, E, V> FromIterator<Result<A, E>> for Result<V, E>
where\n V: FromIterator<A>,

source§

fn from_iter<I>(iter: I) -> Result<V, E>
where\n I: IntoIterator<Item = Result<A, E>>,

Takes each element in the Iterator: if it is an Err, no further\nelements are taken, and the Err is returned. Should no Err occur, a\ncontainer with the values of each Result is returned.

\n

Here is an example which increments every integer in a vector,\nchecking for overflow:

\n\n
let v = vec![1, 2];\nlet res: Result<Vec<u32>, &'static str> = v.iter().map(|x: &u32|\n    x.checked_add(1).ok_or(\"Overflow!\")\n).collect();\nassert_eq!(res, Ok(vec![2, 3]));
\n

Here is another example that tries to subtract one from another list\nof integers, this time checking for underflow:

\n\n
let v = vec![1, 2, 0];\nlet res: Result<Vec<u32>, &'static str> = v.iter().map(|x: &u32|\n    x.checked_sub(1).ok_or(\"Underflow!\")\n).collect();\nassert_eq!(res, Err(\"Underflow!\"));
\n

Here is a variation on the previous example, showing that no\nfurther elements are taken from iter after the first Err.

\n\n
let v = vec![3, 2, 1, 10];\nlet mut shared = 0;\nlet res: Result<Vec<u32>, &'static str> = v.iter().map(|x: &u32| {\n    shared += x;\n    x.checked_sub(2).ok_or(\"Underflow!\")\n}).collect();\nassert_eq!(res, Err(\"Underflow!\"));\nassert_eq!(shared, 6);
\n

Since the third element caused an underflow, no further elements were taken,\nso the final value of shared is 6 (= 3 + 2 + 1), not 16.

\n
","FromIterator>","air_test_utils::AVMResult","air_test_utils::RunnerResult"],["
§

impl<C, T, E> FromParallelIterator<Result<T, E>> for Result<C, E>
where\n C: FromParallelIterator<T>,\n T: Send,\n E: Send,

Collect an arbitrary Result-wrapped collection.

\n

If any item is Err, then all previous Ok items collected are\ndiscarded, and it returns that error. If there are multiple errors, the\none returned is not deterministic.

\n
§

fn from_par_iter<I>(par_iter: I) -> Result<C, E>
where\n I: IntoParallelIterator<Item = Result<T, E>>,

Creates an instance of the collection from the parallel iterator par_iter. Read more
","FromParallelIterator>","air_test_utils::AVMResult","air_test_utils::RunnerResult"],["
source§

impl<T, E, F> FromResidual<Result<Infallible, E>> for Result<T, F>
where\n F: From<E>,

source§

fn from_residual(residual: Result<Infallible, E>) -> Result<T, F>

🔬This is a nightly-only experimental API. (try_trait_v2)
Constructs the type from a compatible Residual type. Read more
","FromResidual>","air_test_utils::AVMResult","air_test_utils::RunnerResult"],["
source§

impl<T, E, F> FromResidual<Yeet<E>> for Result<T, F>
where\n F: From<E>,

source§

fn from_residual(_: Yeet<E>) -> Result<T, F>

🔬This is a nightly-only experimental API. (try_trait_v2)
Constructs the type from a compatible Residual type. Read more
","FromResidual>","air_test_utils::AVMResult","air_test_utils::RunnerResult"],["
1.0.0 · source§

impl<T, E> Hash for Result<T, E>
where\n T: Hash,\n E: Hash,

source§

fn hash<__H>(&self, state: &mut __H)
where\n __H: Hasher,

Feeds this value into the given Hasher. Read more
1.3.0 · source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where\n H: Hasher,\n Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
","Hash","air_test_utils::AVMResult","air_test_utils::RunnerResult"],["
1.0.0 · source§

impl<T, E> IntoIterator for Result<T, E>

source§

fn into_iter(self) -> IntoIter<T>

Returns a consuming iterator over the possibly contained value.

\n

The iterator yields one value if the result is Result::Ok, otherwise none.

\n
§Examples
\n
let x: Result<u32, &str> = Ok(5);\nlet v: Vec<u32> = x.into_iter().collect();\nassert_eq!(v, [5]);\n\nlet x: Result<u32, &str> = Err(\"nothing!\");\nlet v: Vec<u32> = x.into_iter().collect();\nassert_eq!(v, []);
\n
§

type Item = T

The type of the elements being iterated over.
§

type IntoIter = IntoIter<T>

Which kind of iterator are we turning this into?
","IntoIterator","air_test_utils::AVMResult","air_test_utils::RunnerResult"],["
§

impl<T, E> IntoParallelIterator for Result<T, E>
where\n T: Send,

§

type Item = T

The type of item that the parallel iterator will produce.
§

type Iter = IntoIter<T>

The parallel iterator type that will be created.
§

fn into_par_iter(self) -> <Result<T, E> as IntoParallelIterator>::Iter

Converts self into a parallel iterator. Read more
","IntoParallelIterator","air_test_utils::AVMResult","air_test_utils::RunnerResult"],["
1.0.0 · source§

impl<T, E> Ord for Result<T, E>
where\n T: Ord,\n E: Ord,

source§

fn cmp(&self, other: &Result<T, E>) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · source§

fn max(self, other: Self) -> Self
where\n Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · source§

fn min(self, other: Self) -> Self
where\n Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · source§

fn clamp(self, min: Self, max: Self) -> Self
where\n Self: Sized + PartialOrd,

Restrict a value to a certain interval. Read more
","Ord","air_test_utils::AVMResult","air_test_utils::RunnerResult"],["
§

impl<T, U, E, F> PartialEq<ArchivedResult<T, E>> for Result<U, F>
where\n T: PartialEq<U>,\n E: PartialEq<F>,

§

fn eq(&self, other: &ArchivedResult<T, E>) -> bool

This method tests for self and other values to be equal, and is used\nby ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always\nsufficient, and should not be overridden without very good reason.
","PartialEq>","air_test_utils::AVMResult","air_test_utils::RunnerResult"],["
1.0.0 · source§

impl<T, E> PartialEq for Result<T, E>
where\n T: PartialEq,\n E: PartialEq,

source§

fn eq(&self, other: &Result<T, E>) -> bool

This method tests for self and other values to be equal, and is used\nby ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always\nsufficient, and should not be overridden without very good reason.
","PartialEq","air_test_utils::AVMResult","air_test_utils::RunnerResult"],["
1.0.0 · source§

impl<T, E> PartialOrd for Result<T, E>
where\n T: PartialOrd,\n E: PartialOrd,

source§

fn partial_cmp(&self, other: &Result<T, E>) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · source§

fn lt(&self, other: &Rhs) -> bool

This method tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · source§

fn le(&self, other: &Rhs) -> bool

This method tests less than or equal to (for self and other) and is used by the <=\noperator. Read more
1.0.0 · source§

fn gt(&self, other: &Rhs) -> bool

This method tests greater than (for self and other) and is used by the > operator. Read more
1.0.0 · source§

fn ge(&self, other: &Rhs) -> bool

This method tests greater than or equal to (for self and other) and is used by the >=\noperator. Read more
","PartialOrd","air_test_utils::AVMResult","air_test_utils::RunnerResult"],["
1.16.0 · source§

impl<T, U, E> Product<Result<U, E>> for Result<T, E>
where\n T: Product<U>,

source§

fn product<I>(iter: I) -> Result<T, E>
where\n I: Iterator<Item = Result<U, E>>,

Takes each element in the Iterator: if it is an Err, no further\nelements are taken, and the Err is returned. Should no Err\noccur, the product of all elements is returned.

\n
§Examples
\n

This multiplies each number in a vector of strings,\nif a string could not be parsed the operation returns Err:

\n\n
let nums = vec![\"5\", \"10\", \"1\", \"2\"];\nlet total: Result<usize, _> = nums.iter().map(|w| w.parse::<usize>()).product();\nassert_eq!(total, Ok(100));\nlet nums = vec![\"5\", \"10\", \"one\", \"2\"];\nlet total: Result<usize, _> = nums.iter().map(|w| w.parse::<usize>()).product();\nassert!(total.is_err());
\n
","Product>","air_test_utils::AVMResult","air_test_utils::RunnerResult"],["
source§

impl<T, E> Residual<T> for Result<Infallible, E>

§

type TryType = Result<T, E>

🔬This is a nightly-only experimental API. (try_trait_v2_residual)
The “return” type of this meta-function.
","Residual","air_test_utils::AVMResult","air_test_utils::RunnerResult"],["
source§

impl<T, E> Result<&T, E>

1.59.0 · source

pub fn copied(self) -> Result<T, E>
where\n T: Copy,

Maps a Result<&T, E> to a Result<T, E> by copying the contents of the\nOk part.

\n
§Examples
\n
let val = 12;\nlet x: Result<&i32, i32> = Ok(&val);\nassert_eq!(x, Ok(&12));\nlet copied = x.copied();\nassert_eq!(copied, Ok(12));
\n
1.59.0 · source

pub fn cloned(self) -> Result<T, E>
where\n T: Clone,

Maps a Result<&T, E> to a Result<T, E> by cloning the contents of the\nOk part.

\n
§Examples
\n
let val = 12;\nlet x: Result<&i32, i32> = Ok(&val);\nassert_eq!(x, Ok(&12));\nlet cloned = x.cloned();\nassert_eq!(cloned, Ok(12));
\n
",0,"air_test_utils::AVMResult","air_test_utils::RunnerResult"],["
source§

impl<T, E> Result<&mut T, E>

1.59.0 · source

pub fn copied(self) -> Result<T, E>
where\n T: Copy,

Maps a Result<&mut T, E> to a Result<T, E> by copying the contents of the\nOk part.

\n
§Examples
\n
let mut val = 12;\nlet x: Result<&mut i32, i32> = Ok(&mut val);\nassert_eq!(x, Ok(&mut 12));\nlet copied = x.copied();\nassert_eq!(copied, Ok(12));
\n
1.59.0 · source

pub fn cloned(self) -> Result<T, E>
where\n T: Clone,

Maps a Result<&mut T, E> to a Result<T, E> by cloning the contents of the\nOk part.

\n
§Examples
\n
let mut val = 12;\nlet x: Result<&mut i32, i32> = Ok(&mut val);\nassert_eq!(x, Ok(&mut 12));\nlet cloned = x.cloned();\nassert_eq!(cloned, Ok(12));
\n
",0,"air_test_utils::AVMResult","air_test_utils::RunnerResult"],["
source§

impl<T, E> Result<Option<T>, E>

1.33.0 (const: unstable) · source

pub fn transpose(self) -> Option<Result<T, E>>

Transposes a Result of an Option into an Option of a Result.

\n

Ok(None) will be mapped to None.\nOk(Some(_)) and Err(_) will be mapped to Some(Ok(_)) and Some(Err(_)).

\n
§Examples
\n
#[derive(Debug, Eq, PartialEq)]\nstruct SomeErr;\n\nlet x: Result<Option<i32>, SomeErr> = Ok(Some(5));\nlet y: Option<Result<i32, SomeErr>> = Some(Ok(5));\nassert_eq!(x.transpose(), y);
\n
",0,"air_test_utils::AVMResult","air_test_utils::RunnerResult"],["
source§

impl<T, E> Result<Result<T, E>, E>

source

pub fn flatten(self) -> Result<T, E>

🔬This is a nightly-only experimental API. (result_flattening)

Converts from Result<Result<T, E>, E> to Result<T, E>

\n
§Examples
\n
#![feature(result_flattening)]\nlet x: Result<Result<&'static str, u32>, u32> = Ok(Ok(\"hello\"));\nassert_eq!(Ok(\"hello\"), x.flatten());\n\nlet x: Result<Result<&'static str, u32>, u32> = Ok(Err(6));\nassert_eq!(Err(6), x.flatten());\n\nlet x: Result<Result<&'static str, u32>, u32> = Err(6);\nassert_eq!(Err(6), x.flatten());
\n

Flattening only removes one level of nesting at a time:

\n\n
#![feature(result_flattening)]\nlet x: Result<Result<Result<&'static str, u32>, u32>, u32> = Ok(Ok(Ok(\"hello\")));\nassert_eq!(Ok(Ok(\"hello\")), x.flatten());\nassert_eq!(Ok(\"hello\"), x.flatten().flatten());
\n
",0,"air_test_utils::AVMResult","air_test_utils::RunnerResult"],["
source§

impl<T, E> Result<T, E>

1.0.0 (const: 1.48.0) · source

pub const fn is_ok(&self) -> bool

Returns true if the result is Ok.

\n
§Examples
\n
let x: Result<i32, &str> = Ok(-3);\nassert_eq!(x.is_ok(), true);\n\nlet x: Result<i32, &str> = Err(\"Some error message\");\nassert_eq!(x.is_ok(), false);
\n
1.70.0 · source

pub fn is_ok_and(self, f: impl FnOnce(T) -> bool) -> bool

Returns true if the result is Ok and the value inside of it matches a predicate.

\n
§Examples
\n
let x: Result<u32, &str> = Ok(2);\nassert_eq!(x.is_ok_and(|x| x > 1), true);\n\nlet x: Result<u32, &str> = Ok(0);\nassert_eq!(x.is_ok_and(|x| x > 1), false);\n\nlet x: Result<u32, &str> = Err(\"hey\");\nassert_eq!(x.is_ok_and(|x| x > 1), false);
\n
1.0.0 (const: 1.48.0) · source

pub const fn is_err(&self) -> bool

Returns true if the result is Err.

\n
§Examples
\n
let x: Result<i32, &str> = Ok(-3);\nassert_eq!(x.is_err(), false);\n\nlet x: Result<i32, &str> = Err(\"Some error message\");\nassert_eq!(x.is_err(), true);
\n
1.70.0 · source

pub fn is_err_and(self, f: impl FnOnce(E) -> bool) -> bool

Returns true if the result is Err and the value inside of it matches a predicate.

\n
§Examples
\n
use std::io::{Error, ErrorKind};\n\nlet x: Result<u32, Error> = Err(Error::new(ErrorKind::NotFound, \"!\"));\nassert_eq!(x.is_err_and(|x| x.kind() == ErrorKind::NotFound), true);\n\nlet x: Result<u32, Error> = Err(Error::new(ErrorKind::PermissionDenied, \"!\"));\nassert_eq!(x.is_err_and(|x| x.kind() == ErrorKind::NotFound), false);\n\nlet x: Result<u32, Error> = Ok(123);\nassert_eq!(x.is_err_and(|x| x.kind() == ErrorKind::NotFound), false);
\n
1.0.0 · source

pub fn ok(self) -> Option<T>

Converts from Result<T, E> to Option<T>.

\n

Converts self into an Option<T>, consuming self,\nand discarding the error, if any.

\n
§Examples
\n
let x: Result<u32, &str> = Ok(2);\nassert_eq!(x.ok(), Some(2));\n\nlet x: Result<u32, &str> = Err(\"Nothing here\");\nassert_eq!(x.ok(), None);
\n
1.0.0 · source

pub fn err(self) -> Option<E>

Converts from Result<T, E> to Option<E>.

\n

Converts self into an Option<E>, consuming self,\nand discarding the success value, if any.

\n
§Examples
\n
let x: Result<u32, &str> = Ok(2);\nassert_eq!(x.err(), None);\n\nlet x: Result<u32, &str> = Err(\"Nothing here\");\nassert_eq!(x.err(), Some(\"Nothing here\"));
\n
1.0.0 (const: 1.48.0) · source

pub const fn as_ref(&self) -> Result<&T, &E>

Converts from &Result<T, E> to Result<&T, &E>.

\n

Produces a new Result, containing a reference\ninto the original, leaving the original in place.

\n
§Examples
\n
let x: Result<u32, &str> = Ok(2);\nassert_eq!(x.as_ref(), Ok(&2));\n\nlet x: Result<u32, &str> = Err(\"Error\");\nassert_eq!(x.as_ref(), Err(&\"Error\"));
\n
1.0.0 (const: unstable) · source

pub fn as_mut(&mut self) -> Result<&mut T, &mut E>

Converts from &mut Result<T, E> to Result<&mut T, &mut E>.

\n
§Examples
\n
fn mutate(r: &mut Result<i32, i32>) {\n    match r.as_mut() {\n        Ok(v) => *v = 42,\n        Err(e) => *e = 0,\n    }\n}\n\nlet mut x: Result<i32, i32> = Ok(2);\nmutate(&mut x);\nassert_eq!(x.unwrap(), 42);\n\nlet mut x: Result<i32, i32> = Err(13);\nmutate(&mut x);\nassert_eq!(x.unwrap_err(), 0);
\n
1.0.0 · source

pub fn map<U, F>(self, op: F) -> Result<U, E>
where\n F: FnOnce(T) -> U,

Maps a Result<T, E> to Result<U, E> by applying a function to a\ncontained Ok value, leaving an Err value untouched.

\n

This function can be used to compose the results of two functions.

\n
§Examples
\n

Print the numbers on each line of a string multiplied by two.

\n\n
let line = \"1\\n2\\n3\\n4\\n\";\n\nfor num in line.lines() {\n    match num.parse::<i32>().map(|i| i * 2) {\n        Ok(n) => println!(\"{n}\"),\n        Err(..) => {}\n    }\n}
\n
1.41.0 · source

pub fn map_or<U, F>(self, default: U, f: F) -> U
where\n F: FnOnce(T) -> U,

Returns the provided default (if Err), or\napplies a function to the contained value (if Ok).

\n

Arguments passed to map_or are eagerly evaluated; if you are passing\nthe result of a function call, it is recommended to use map_or_else,\nwhich is lazily evaluated.

\n
§Examples
\n
let x: Result<_, &str> = Ok(\"foo\");\nassert_eq!(x.map_or(42, |v| v.len()), 3);\n\nlet x: Result<&str, _> = Err(\"bar\");\nassert_eq!(x.map_or(42, |v| v.len()), 42);
\n
1.41.0 · source

pub fn map_or_else<U, D, F>(self, default: D, f: F) -> U
where\n D: FnOnce(E) -> U,\n F: FnOnce(T) -> U,

Maps a Result<T, E> to U by applying fallback function default to\na contained Err value, or function f to a contained Ok value.

\n

This function can be used to unpack a successful result\nwhile handling an error.

\n
§Examples
\n
let k = 21;\n\nlet x : Result<_, &str> = Ok(\"foo\");\nassert_eq!(x.map_or_else(|e| k * 2, |v| v.len()), 3);\n\nlet x : Result<&str, _> = Err(\"bar\");\nassert_eq!(x.map_or_else(|e| k * 2, |v| v.len()), 42);
\n
1.0.0 · source

pub fn map_err<F, O>(self, op: O) -> Result<T, F>
where\n O: FnOnce(E) -> F,

Maps a Result<T, E> to Result<T, F> by applying a function to a\ncontained Err value, leaving an Ok value untouched.

\n

This function can be used to pass through a successful result while handling\nan error.

\n
§Examples
\n
fn stringify(x: u32) -> String { format!(\"error code: {x}\") }\n\nlet x: Result<u32, u32> = Ok(2);\nassert_eq!(x.map_err(stringify), Ok(2));\n\nlet x: Result<u32, u32> = Err(13);\nassert_eq!(x.map_err(stringify), Err(\"error code: 13\".to_string()));
\n
1.76.0 · source

pub fn inspect<F>(self, f: F) -> Result<T, E>
where\n F: FnOnce(&T),

Calls a function with a reference to the contained value if Ok.

\n

Returns the original result.

\n
§Examples
\n
let x: u8 = \"4\"\n    .parse::<u8>()\n    .inspect(|x| println!(\"original: {x}\"))\n    .map(|x| x.pow(3))\n    .expect(\"failed to parse number\");
\n
1.76.0 · source

pub fn inspect_err<F>(self, f: F) -> Result<T, E>
where\n F: FnOnce(&E),

Calls a function with a reference to the contained value if Err.

\n

Returns the original result.

\n
§Examples
\n
use std::{fs, io};\n\nfn read() -> io::Result<String> {\n    fs::read_to_string(\"address.txt\")\n        .inspect_err(|e| eprintln!(\"failed to read file: {e}\"))\n}
\n
1.47.0 · source

pub fn as_deref(&self) -> Result<&<T as Deref>::Target, &E>
where\n T: Deref,

Converts from Result<T, E> (or &Result<T, E>) to Result<&<T as Deref>::Target, &E>.

\n

Coerces the Ok variant of the original Result via Deref\nand returns the new Result.

\n
§Examples
\n
let x: Result<String, u32> = Ok(\"hello\".to_string());\nlet y: Result<&str, &u32> = Ok(\"hello\");\nassert_eq!(x.as_deref(), y);\n\nlet x: Result<String, u32> = Err(42);\nlet y: Result<&str, &u32> = Err(&42);\nassert_eq!(x.as_deref(), y);
\n
1.47.0 · source

pub fn as_deref_mut(&mut self) -> Result<&mut <T as Deref>::Target, &mut E>
where\n T: DerefMut,

Converts from Result<T, E> (or &mut Result<T, E>) to Result<&mut <T as DerefMut>::Target, &mut E>.

\n

Coerces the Ok variant of the original Result via DerefMut\nand returns the new Result.

\n
§Examples
\n
let mut s = \"HELLO\".to_string();\nlet mut x: Result<String, u32> = Ok(\"hello\".to_string());\nlet y: Result<&mut str, &mut u32> = Ok(&mut s);\nassert_eq!(x.as_deref_mut().map(|x| { x.make_ascii_uppercase(); x }), y);\n\nlet mut i = 42;\nlet mut x: Result<String, u32> = Err(42);\nlet y: Result<&mut str, &mut u32> = Err(&mut i);\nassert_eq!(x.as_deref_mut().map(|x| { x.make_ascii_uppercase(); x }), y);
\n
1.0.0 · source

pub fn iter(&self) -> Iter<'_, T>

Returns an iterator over the possibly contained value.

\n

The iterator yields one value if the result is Result::Ok, otherwise none.

\n
§Examples
\n
let x: Result<u32, &str> = Ok(7);\nassert_eq!(x.iter().next(), Some(&7));\n\nlet x: Result<u32, &str> = Err(\"nothing!\");\nassert_eq!(x.iter().next(), None);
\n
1.0.0 · source

pub fn iter_mut(&mut self) -> IterMut<'_, T>

Returns a mutable iterator over the possibly contained value.

\n

The iterator yields one value if the result is Result::Ok, otherwise none.

\n
§Examples
\n
let mut x: Result<u32, &str> = Ok(7);\nmatch x.iter_mut().next() {\n    Some(v) => *v = 40,\n    None => {},\n}\nassert_eq!(x, Ok(40));\n\nlet mut x: Result<u32, &str> = Err(\"nothing!\");\nassert_eq!(x.iter_mut().next(), None);
\n
1.4.0 · source

pub fn expect(self, msg: &str) -> T
where\n E: Debug,

Returns the contained Ok value, consuming the self value.

\n

Because this function may panic, its use is generally discouraged.\nInstead, prefer to use pattern matching and handle the Err\ncase explicitly, or call unwrap_or, unwrap_or_else, or\nunwrap_or_default.

\n
§Panics
\n

Panics if the value is an Err, with a panic message including the\npassed message, and the content of the Err.

\n
§Examples
\n
let x: Result<u32, &str> = Err(\"emergency failure\");\nx.expect(\"Testing expect\"); // panics with `Testing expect: emergency failure`
\n
§Recommended Message Style
\n

We recommend that expect messages are used to describe the reason you\nexpect the Result should be Ok.

\n\n
let path = std::env::var(\"IMPORTANT_PATH\")\n    .expect(\"env variable `IMPORTANT_PATH` should be set by `wrapper_script.sh`\");
\n

Hint: If you’re having trouble remembering how to phrase expect\nerror messages remember to focus on the word “should” as in “env\nvariable should be set by blah” or “the given binary should be available\nand executable by the current user”.

\n

For more detail on expect message styles and the reasoning behind our recommendation please\nrefer to the section on “Common Message\nStyles” in the\nstd::error module docs.

\n
1.0.0 · source

pub fn unwrap(self) -> T
where\n E: Debug,

Returns the contained Ok value, consuming the self value.

\n

Because this function may panic, its use is generally discouraged.\nInstead, prefer to use pattern matching and handle the Err\ncase explicitly, or call unwrap_or, unwrap_or_else, or\nunwrap_or_default.

\n
§Panics
\n

Panics if the value is an Err, with a panic message provided by the\nErr’s value.

\n
§Examples
\n

Basic usage:

\n\n
let x: Result<u32, &str> = Ok(2);\nassert_eq!(x.unwrap(), 2);
\n\n
let x: Result<u32, &str> = Err(\"emergency failure\");\nx.unwrap(); // panics with `emergency failure`
\n
1.16.0 · source

pub fn unwrap_or_default(self) -> T
where\n T: Default,

Returns the contained Ok value or a default

\n

Consumes the self argument then, if Ok, returns the contained\nvalue, otherwise if Err, returns the default value for that\ntype.

\n
§Examples
\n

Converts a string to an integer, turning poorly-formed strings\ninto 0 (the default value for integers). parse converts\na string to any other type that implements FromStr, returning an\nErr on error.

\n\n
let good_year_from_input = \"1909\";\nlet bad_year_from_input = \"190blarg\";\nlet good_year = good_year_from_input.parse().unwrap_or_default();\nlet bad_year = bad_year_from_input.parse().unwrap_or_default();\n\nassert_eq!(1909, good_year);\nassert_eq!(0, bad_year);
\n
1.17.0 · source

pub fn expect_err(self, msg: &str) -> E
where\n T: Debug,

Returns the contained Err value, consuming the self value.

\n
§Panics
\n

Panics if the value is an Ok, with a panic message including the\npassed message, and the content of the Ok.

\n
§Examples
\n
let x: Result<u32, &str> = Ok(10);\nx.expect_err(\"Testing expect_err\"); // panics with `Testing expect_err: 10`
\n
1.0.0 · source

pub fn unwrap_err(self) -> E
where\n T: Debug,

Returns the contained Err value, consuming the self value.

\n
§Panics
\n

Panics if the value is an Ok, with a custom panic message provided\nby the Ok’s value.

\n
§Examples
\n
let x: Result<u32, &str> = Ok(2);\nx.unwrap_err(); // panics with `2`
\n\n
let x: Result<u32, &str> = Err(\"emergency failure\");\nassert_eq!(x.unwrap_err(), \"emergency failure\");
\n
source

pub fn into_ok(self) -> T
where\n E: Into<!>,

🔬This is a nightly-only experimental API. (unwrap_infallible)

Returns the contained Ok value, but never panics.

\n

Unlike unwrap, this method is known to never panic on the\nresult types it is implemented for. Therefore, it can be used\ninstead of unwrap as a maintainability safeguard that will fail\nto compile if the error type of the Result is later changed\nto an error that can actually occur.

\n
§Examples
\n
\nfn only_good_news() -> Result<String, !> {\n    Ok(\"this is fine\".into())\n}\n\nlet s: String = only_good_news().into_ok();\nprintln!(\"{s}\");
\n
source

pub fn into_err(self) -> E
where\n T: Into<!>,

🔬This is a nightly-only experimental API. (unwrap_infallible)

Returns the contained Err value, but never panics.

\n

Unlike unwrap_err, this method is known to never panic on the\nresult types it is implemented for. Therefore, it can be used\ninstead of unwrap_err as a maintainability safeguard that will fail\nto compile if the ok type of the Result is later changed\nto a type that can actually occur.

\n
§Examples
\n
\nfn only_bad_news() -> Result<!, String> {\n    Err(\"Oops, it failed\".into())\n}\n\nlet error: String = only_bad_news().into_err();\nprintln!(\"{error}\");
\n
1.0.0 · source

pub fn and<U>(self, res: Result<U, E>) -> Result<U, E>

Returns res if the result is Ok, otherwise returns the Err value of self.

\n

Arguments passed to and are eagerly evaluated; if you are passing the\nresult of a function call, it is recommended to use and_then, which is\nlazily evaluated.

\n
§Examples
\n
let x: Result<u32, &str> = Ok(2);\nlet y: Result<&str, &str> = Err(\"late error\");\nassert_eq!(x.and(y), Err(\"late error\"));\n\nlet x: Result<u32, &str> = Err(\"early error\");\nlet y: Result<&str, &str> = Ok(\"foo\");\nassert_eq!(x.and(y), Err(\"early error\"));\n\nlet x: Result<u32, &str> = Err(\"not a 2\");\nlet y: Result<&str, &str> = Err(\"late error\");\nassert_eq!(x.and(y), Err(\"not a 2\"));\n\nlet x: Result<u32, &str> = Ok(2);\nlet y: Result<&str, &str> = Ok(\"different result type\");\nassert_eq!(x.and(y), Ok(\"different result type\"));
\n
1.0.0 · source

pub fn and_then<U, F>(self, op: F) -> Result<U, E>
where\n F: FnOnce(T) -> Result<U, E>,

Calls op if the result is Ok, otherwise returns the Err value of self.

\n

This function can be used for control flow based on Result values.

\n
§Examples
\n
fn sq_then_to_string(x: u32) -> Result<String, &'static str> {\n    x.checked_mul(x).map(|sq| sq.to_string()).ok_or(\"overflowed\")\n}\n\nassert_eq!(Ok(2).and_then(sq_then_to_string), Ok(4.to_string()));\nassert_eq!(Ok(1_000_000).and_then(sq_then_to_string), Err(\"overflowed\"));\nassert_eq!(Err(\"not a number\").and_then(sq_then_to_string), Err(\"not a number\"));
\n

Often used to chain fallible operations that may return Err.

\n\n
use std::{io::ErrorKind, path::Path};\n\n// Note: on Windows \"/\" maps to \"C:\\\"\nlet root_modified_time = Path::new(\"/\").metadata().and_then(|md| md.modified());\nassert!(root_modified_time.is_ok());\n\nlet should_fail = Path::new(\"/bad/path\").metadata().and_then(|md| md.modified());\nassert!(should_fail.is_err());\nassert_eq!(should_fail.unwrap_err().kind(), ErrorKind::NotFound);
\n
1.0.0 · source

pub fn or<F>(self, res: Result<T, F>) -> Result<T, F>

Returns res if the result is Err, otherwise returns the Ok value of self.

\n

Arguments passed to or are eagerly evaluated; if you are passing the\nresult of a function call, it is recommended to use or_else, which is\nlazily evaluated.

\n
§Examples
\n
let x: Result<u32, &str> = Ok(2);\nlet y: Result<u32, &str> = Err(\"late error\");\nassert_eq!(x.or(y), Ok(2));\n\nlet x: Result<u32, &str> = Err(\"early error\");\nlet y: Result<u32, &str> = Ok(2);\nassert_eq!(x.or(y), Ok(2));\n\nlet x: Result<u32, &str> = Err(\"not a 2\");\nlet y: Result<u32, &str> = Err(\"late error\");\nassert_eq!(x.or(y), Err(\"late error\"));\n\nlet x: Result<u32, &str> = Ok(2);\nlet y: Result<u32, &str> = Ok(100);\nassert_eq!(x.or(y), Ok(2));
\n
1.0.0 · source

pub fn or_else<F, O>(self, op: O) -> Result<T, F>
where\n O: FnOnce(E) -> Result<T, F>,

Calls op if the result is Err, otherwise returns the Ok value of self.

\n

This function can be used for control flow based on result values.

\n
§Examples
\n
fn sq(x: u32) -> Result<u32, u32> { Ok(x * x) }\nfn err(x: u32) -> Result<u32, u32> { Err(x) }\n\nassert_eq!(Ok(2).or_else(sq).or_else(sq), Ok(2));\nassert_eq!(Ok(2).or_else(err).or_else(sq), Ok(2));\nassert_eq!(Err(3).or_else(sq).or_else(err), Ok(9));\nassert_eq!(Err(3).or_else(err).or_else(err), Err(3));
\n
1.0.0 · source

pub fn unwrap_or(self, default: T) -> T

Returns the contained Ok value or a provided default.

\n

Arguments passed to unwrap_or are eagerly evaluated; if you are passing\nthe result of a function call, it is recommended to use unwrap_or_else,\nwhich is lazily evaluated.

\n
§Examples
\n
let default = 2;\nlet x: Result<u32, &str> = Ok(9);\nassert_eq!(x.unwrap_or(default), 9);\n\nlet x: Result<u32, &str> = Err(\"error\");\nassert_eq!(x.unwrap_or(default), default);
\n
1.0.0 · source

pub fn unwrap_or_else<F>(self, op: F) -> T
where\n F: FnOnce(E) -> T,

Returns the contained Ok value or computes it from a closure.

\n
§Examples
\n
fn count(x: &str) -> usize { x.len() }\n\nassert_eq!(Ok(2).unwrap_or_else(count), 2);\nassert_eq!(Err(\"foo\").unwrap_or_else(count), 3);
\n
1.58.0 · source

pub unsafe fn unwrap_unchecked(self) -> T

Returns the contained Ok value, consuming the self value,\nwithout checking that the value is not an Err.

\n
§Safety
\n

Calling this method on an Err is undefined behavior.

\n
§Examples
\n
let x: Result<u32, &str> = Ok(2);\nassert_eq!(unsafe { x.unwrap_unchecked() }, 2);
\n\n
let x: Result<u32, &str> = Err(\"emergency failure\");\nunsafe { x.unwrap_unchecked(); } // Undefined behavior!
\n
1.58.0 · source

pub unsafe fn unwrap_err_unchecked(self) -> E

Returns the contained Err value, consuming the self value,\nwithout checking that the value is not an Ok.

\n
§Safety
\n

Calling this method on an Ok is undefined behavior.

\n
§Examples
\n
let x: Result<u32, &str> = Ok(2);\nunsafe { x.unwrap_err_unchecked() }; // Undefined behavior!
\n\n
let x: Result<u32, &str> = Err(\"emergency failure\");\nassert_eq!(unsafe { x.unwrap_err_unchecked() }, \"emergency failure\");
\n
",0,"air_test_utils::AVMResult","air_test_utils::RunnerResult"],["
§

impl<T, E, S> Serialize<S> for Result<T, E>
where\n T: Serialize<S>,\n E: Serialize<S>,\n S: Fallible + ?Sized,

§

fn serialize(\n &self,\n serializer: &mut S,\n) -> Result<<Result<T, E> as Archive>::Resolver, <S as Fallible>::Error>

Writes the dependencies for the object and returns a resolver that can create the archived\ntype.
","Serialize","air_test_utils::AVMResult","air_test_utils::RunnerResult"],["
source§

impl<T, E> Serialize for Result<T, E>
where\n T: Serialize,\n E: Serialize,

source§

fn serialize<S>(\n &self,\n serializer: S,\n) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error>
where\n S: Serializer,

Serialize this value into the given Serde serializer. Read more
","Serialize","air_test_utils::AVMResult","air_test_utils::RunnerResult"],["
source§

impl<T, TAs, E, EAs> SerializeAs<Result<T, E>> for Result<TAs, EAs>
where\n TAs: SerializeAs<T>,\n EAs: SerializeAs<E>,

source§

fn serialize_as<S>(\n source: &Result<T, E>,\n serializer: S,\n) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error>
where\n S: Serializer,

Serialize this value into the given Serde serializer.
","SerializeAs>","air_test_utils::AVMResult","air_test_utils::RunnerResult"],["
1.16.0 · source§

impl<T, U, E> Sum<Result<U, E>> for Result<T, E>
where\n T: Sum<U>,

source§

fn sum<I>(iter: I) -> Result<T, E>
where\n I: Iterator<Item = Result<U, E>>,

Takes each element in the Iterator: if it is an Err, no further\nelements are taken, and the Err is returned. Should no Err\noccur, the sum of all elements is returned.

\n
§Examples
\n

This sums up every integer in a vector, rejecting the sum if a negative\nelement is encountered:

\n\n
let f = |&x: &i32| if x < 0 { Err(\"Negative element found\") } else { Ok(x) };\nlet v = vec![1, 2];\nlet res: Result<i32, _> = v.iter().map(f).sum();\nassert_eq!(res, Ok(3));\nlet v = vec![1, -2];\nlet res: Result<i32, _> = v.iter().map(f).sum();\nassert_eq!(res, Err(\"Negative element found\"));
\n
","Sum>","air_test_utils::AVMResult","air_test_utils::RunnerResult"],["
1.61.0 · source§

impl<T, E> Termination for Result<T, E>
where\n T: Termination,\n E: Debug,

source§

fn report(self) -> ExitCode

Is called to get the representation of the value as status code.\nThis status code is returned to the operating system.
","Termination","air_test_utils::AVMResult","air_test_utils::RunnerResult"],["
source§

impl<T, E> Try for Result<T, E>

§

type Output = T

🔬This is a nightly-only experimental API. (try_trait_v2)
The type of the value produced by ? when not short-circuiting.
§

type Residual = Result<Infallible, E>

🔬This is a nightly-only experimental API. (try_trait_v2)
The type of the value passed to FromResidual::from_residual\nas part of ? when short-circuiting. Read more
source§

fn from_output(output: <Result<T, E> as Try>::Output) -> Result<T, E>

🔬This is a nightly-only experimental API. (try_trait_v2)
Constructs the type from its Output type. Read more
source§

fn branch(\n self,\n) -> ControlFlow<<Result<T, E> as Try>::Residual, <Result<T, E> as Try>::Output>

🔬This is a nightly-only experimental API. (try_trait_v2)
Used in ? to decide whether the operator should produce a value\n(because this returned ControlFlow::Continue)\nor propagate a value back to the caller\n(because this returned ControlFlow::Break). Read more
","Try","air_test_utils::AVMResult","air_test_utils::RunnerResult"],["
source§

impl<T, E> WrapErr<T, E> for Result<T, E>
where\n E: StdError + Send + Sync + 'static,

source§

fn wrap_err<D>(self, msg: D) -> Result<T, Report>
where\n D: Display + Send + Sync + 'static,

Wrap the error value with a new adhoc error
source§

fn wrap_err_with<D, F>(self, msg: F) -> Result<T, Report>
where\n D: Display + Send + Sync + 'static,\n F: FnOnce() -> D,

Wrap the error value with a new adhoc error that is evaluated lazily\nonly once an error does occur.
source§

fn context<D>(self, msg: D) -> Result<T, Report>
where\n D: Display + Send + Sync + 'static,

Compatibility re-export of wrap_err for interop with anyhow
source§

fn with_context<D, F>(self, msg: F) -> Result<T, Report>
where\n D: Display + Send + Sync + 'static,\n F: FnOnce() -> D,

Compatibility re-export of wrap_err_with for interop with anyhow
","WrapErr","air_test_utils::AVMResult","air_test_utils::RunnerResult"],["
§

impl<T, E> ComponentType for Result<T, E>
where\n T: ComponentType,\n E: ComponentType,

","ComponentType","air_test_utils::AVMResult","air_test_utils::RunnerResult"],["
1.0.0 · source§

impl<T, E> Copy for Result<T, E>
where\n T: Copy,\n E: Copy,

","Copy","air_test_utils::AVMResult","air_test_utils::RunnerResult"],["
1.0.0 · source§

impl<T, E> Eq for Result<T, E>
where\n T: Eq,\n E: Eq,

","Eq","air_test_utils::AVMResult","air_test_utils::RunnerResult"],["
§

impl<T, E> Lift for Result<T, E>
where\n T: Lift,\n E: Lift,

","Lift","air_test_utils::AVMResult","air_test_utils::RunnerResult"],["
§

impl<T, E> Lower for Result<T, E>
where\n T: Lower,\n E: Lower,

","Lower","air_test_utils::AVMResult","air_test_utils::RunnerResult"],["
1.0.0 · source§

impl<T, E> StructuralPartialEq for Result<T, E>

","StructuralPartialEq","air_test_utils::AVMResult","air_test_utils::RunnerResult"]], +"air_trace_handler":[["
§

impl<T, E> Archive for Result<T, E>
where\n T: Archive,\n E: Archive,

§

type Archived = ArchivedResult<<T as Archive>::Archived, <E as Archive>::Archived>

The archived representation of this type. Read more
§

type Resolver = Result<<T as Archive>::Resolver, <E as Archive>::Resolver>

The resolver for this type. It must contain all the additional information from serializing\nneeded to make the archived type from the normal type.
§

unsafe fn resolve(\n &self,\n pos: usize,\n resolver: <Result<T, E> as Archive>::Resolver,\n out: *mut <Result<T, E> as Archive>::Archived,\n)

Creates the archived version of this value at the given position and writes it to the given\noutput. Read more
","Archive","air_trace_handler::TraceHandlerResult"],["
§

impl<T, E> BorshDeserialize for Result<T, E>
where\n T: BorshDeserialize,\n E: BorshDeserialize,

§

fn deserialize_reader<R>(reader: &mut R) -> Result<Result<T, E>, Error>
where\n R: Read,

§

fn deserialize(buf: &mut &[u8]) -> Result<Self, Error>

Deserializes this instance from a given slice of bytes.\nUpdates the buffer to point at the remaining bytes.
§

fn try_from_slice(v: &[u8]) -> Result<Self, Error>

Deserialize this instance from a slice of bytes.
§

fn try_from_reader<R>(reader: &mut R) -> Result<Self, Error>
where\n R: Read,

","BorshDeserialize","air_trace_handler::TraceHandlerResult"],["
§

impl<T, E> BorshSerialize for Result<T, E>
where\n T: BorshSerialize,\n E: BorshSerialize,

§

fn serialize<W>(&self, writer: &mut W) -> Result<(), Error>
where\n W: Write,

","BorshSerialize","air_trace_handler::TraceHandlerResult"],["
1.0.0 · source§

impl<T, E> Clone for Result<T, E>
where\n T: Clone,\n E: Clone,

source§

fn clone(&self) -> Result<T, E>

Returns a copy of the value. Read more
source§

fn clone_from(&mut self, source: &Result<T, E>)

Performs copy-assignment from source. Read more
","Clone","air_trace_handler::TraceHandlerResult"],["
1.0.0 · source§

impl<T, E> Debug for Result<T, E>
where\n T: Debug,\n E: Debug,

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
","Debug","air_trace_handler::TraceHandlerResult"],["
source§

impl<'de, T, E> Deserialize<'de> for Result<T, E>
where\n T: Deserialize<'de>,\n E: Deserialize<'de>,

source§

fn deserialize<D>(\n deserializer: D,\n) -> Result<Result<T, E>, <D as Deserializer<'de>>::Error>
where\n D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
","Deserialize<'de>","air_trace_handler::TraceHandlerResult"],["
1.0.0 · source§

impl<A, E, V> FromIterator<Result<A, E>> for Result<V, E>
where\n V: FromIterator<A>,

source§

fn from_iter<I>(iter: I) -> Result<V, E>
where\n I: IntoIterator<Item = Result<A, E>>,

Takes each element in the Iterator: if it is an Err, no further\nelements are taken, and the Err is returned. Should no Err occur, a\ncontainer with the values of each Result is returned.

\n

Here is an example which increments every integer in a vector,\nchecking for overflow:

\n\n
let v = vec![1, 2];\nlet res: Result<Vec<u32>, &'static str> = v.iter().map(|x: &u32|\n    x.checked_add(1).ok_or(\"Overflow!\")\n).collect();\nassert_eq!(res, Ok(vec![2, 3]));
\n

Here is another example that tries to subtract one from another list\nof integers, this time checking for underflow:

\n\n
let v = vec![1, 2, 0];\nlet res: Result<Vec<u32>, &'static str> = v.iter().map(|x: &u32|\n    x.checked_sub(1).ok_or(\"Underflow!\")\n).collect();\nassert_eq!(res, Err(\"Underflow!\"));
\n

Here is a variation on the previous example, showing that no\nfurther elements are taken from iter after the first Err.

\n\n
let v = vec![3, 2, 1, 10];\nlet mut shared = 0;\nlet res: Result<Vec<u32>, &'static str> = v.iter().map(|x: &u32| {\n    shared += x;\n    x.checked_sub(2).ok_or(\"Underflow!\")\n}).collect();\nassert_eq!(res, Err(\"Underflow!\"));\nassert_eq!(shared, 6);
\n

Since the third element caused an underflow, no further elements were taken,\nso the final value of shared is 6 (= 3 + 2 + 1), not 16.

\n
","FromIterator>","air_trace_handler::TraceHandlerResult"],["
source§

impl<T, E, F> FromResidual<Result<Infallible, E>> for Result<T, F>
where\n F: From<E>,

source§

fn from_residual(residual: Result<Infallible, E>) -> Result<T, F>

🔬This is a nightly-only experimental API. (try_trait_v2)
Constructs the type from a compatible Residual type. Read more
","FromResidual>","air_trace_handler::TraceHandlerResult"],["
source§

impl<T, E, F> FromResidual<Yeet<E>> for Result<T, F>
where\n F: From<E>,

source§

fn from_residual(_: Yeet<E>) -> Result<T, F>

🔬This is a nightly-only experimental API. (try_trait_v2)
Constructs the type from a compatible Residual type. Read more
","FromResidual>","air_trace_handler::TraceHandlerResult"],["
1.0.0 · source§

impl<T, E> Hash for Result<T, E>
where\n T: Hash,\n E: Hash,

source§

fn hash<__H>(&self, state: &mut __H)
where\n __H: Hasher,

Feeds this value into the given Hasher. Read more
1.3.0 · source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where\n H: Hasher,\n Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
","Hash","air_trace_handler::TraceHandlerResult"],["
1.0.0 · source§

impl<T, E> IntoIterator for Result<T, E>

source§

fn into_iter(self) -> IntoIter<T>

Returns a consuming iterator over the possibly contained value.

\n

The iterator yields one value if the result is Result::Ok, otherwise none.

\n
§Examples
\n
let x: Result<u32, &str> = Ok(5);\nlet v: Vec<u32> = x.into_iter().collect();\nassert_eq!(v, [5]);\n\nlet x: Result<u32, &str> = Err(\"nothing!\");\nlet v: Vec<u32> = x.into_iter().collect();\nassert_eq!(v, []);
\n
§

type Item = T

The type of the elements being iterated over.
§

type IntoIter = IntoIter<T>

Which kind of iterator are we turning this into?
","IntoIterator","air_trace_handler::TraceHandlerResult"],["
1.0.0 · source§

impl<T, E> Ord for Result<T, E>
where\n T: Ord,\n E: Ord,

source§

fn cmp(&self, other: &Result<T, E>) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · source§

fn max(self, other: Self) -> Self
where\n Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · source§

fn min(self, other: Self) -> Self
where\n Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · source§

fn clamp(self, min: Self, max: Self) -> Self
where\n Self: Sized + PartialOrd,

Restrict a value to a certain interval. Read more
","Ord","air_trace_handler::TraceHandlerResult"],["
§

impl<T, U, E, F> PartialEq<ArchivedResult<T, E>> for Result<U, F>
where\n T: PartialEq<U>,\n E: PartialEq<F>,

§

fn eq(&self, other: &ArchivedResult<T, E>) -> bool

This method tests for self and other values to be equal, and is used\nby ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always\nsufficient, and should not be overridden without very good reason.
","PartialEq>","air_trace_handler::TraceHandlerResult"],["
1.0.0 · source§

impl<T, E> PartialEq for Result<T, E>
where\n T: PartialEq,\n E: PartialEq,

source§

fn eq(&self, other: &Result<T, E>) -> bool

This method tests for self and other values to be equal, and is used\nby ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always\nsufficient, and should not be overridden without very good reason.
","PartialEq","air_trace_handler::TraceHandlerResult"],["
1.0.0 · source§

impl<T, E> PartialOrd for Result<T, E>
where\n T: PartialOrd,\n E: PartialOrd,

source§

fn partial_cmp(&self, other: &Result<T, E>) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · source§

fn lt(&self, other: &Rhs) -> bool

This method tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · source§

fn le(&self, other: &Rhs) -> bool

This method tests less than or equal to (for self and other) and is used by the <=\noperator. Read more
1.0.0 · source§

fn gt(&self, other: &Rhs) -> bool

This method tests greater than (for self and other) and is used by the > operator. Read more
1.0.0 · source§

fn ge(&self, other: &Rhs) -> bool

This method tests greater than or equal to (for self and other) and is used by the >=\noperator. Read more
","PartialOrd","air_trace_handler::TraceHandlerResult"],["
1.16.0 · source§

impl<T, U, E> Product<Result<U, E>> for Result<T, E>
where\n T: Product<U>,

source§

fn product<I>(iter: I) -> Result<T, E>
where\n I: Iterator<Item = Result<U, E>>,

Takes each element in the Iterator: if it is an Err, no further\nelements are taken, and the Err is returned. Should no Err\noccur, the product of all elements is returned.

\n
§Examples
\n

This multiplies each number in a vector of strings,\nif a string could not be parsed the operation returns Err:

\n\n
let nums = vec![\"5\", \"10\", \"1\", \"2\"];\nlet total: Result<usize, _> = nums.iter().map(|w| w.parse::<usize>()).product();\nassert_eq!(total, Ok(100));\nlet nums = vec![\"5\", \"10\", \"one\", \"2\"];\nlet total: Result<usize, _> = nums.iter().map(|w| w.parse::<usize>()).product();\nassert!(total.is_err());
\n
","Product>","air_trace_handler::TraceHandlerResult"],["
source§

impl<T, E> Residual<T> for Result<Infallible, E>

§

type TryType = Result<T, E>

🔬This is a nightly-only experimental API. (try_trait_v2_residual)
The “return” type of this meta-function.
","Residual","air_trace_handler::TraceHandlerResult"],["
source§

impl<T, E> Result<&T, E>

1.59.0 · source

pub fn copied(self) -> Result<T, E>
where\n T: Copy,

Maps a Result<&T, E> to a Result<T, E> by copying the contents of the\nOk part.

\n
§Examples
\n
let val = 12;\nlet x: Result<&i32, i32> = Ok(&val);\nassert_eq!(x, Ok(&12));\nlet copied = x.copied();\nassert_eq!(copied, Ok(12));
\n
1.59.0 · source

pub fn cloned(self) -> Result<T, E>
where\n T: Clone,

Maps a Result<&T, E> to a Result<T, E> by cloning the contents of the\nOk part.

\n
§Examples
\n
let val = 12;\nlet x: Result<&i32, i32> = Ok(&val);\nassert_eq!(x, Ok(&12));\nlet cloned = x.cloned();\nassert_eq!(cloned, Ok(12));
\n
",0,"air_trace_handler::TraceHandlerResult"],["
source§

impl<T, E> Result<&mut T, E>

1.59.0 · source

pub fn copied(self) -> Result<T, E>
where\n T: Copy,

Maps a Result<&mut T, E> to a Result<T, E> by copying the contents of the\nOk part.

\n
§Examples
\n
let mut val = 12;\nlet x: Result<&mut i32, i32> = Ok(&mut val);\nassert_eq!(x, Ok(&mut 12));\nlet copied = x.copied();\nassert_eq!(copied, Ok(12));
\n
1.59.0 · source

pub fn cloned(self) -> Result<T, E>
where\n T: Clone,

Maps a Result<&mut T, E> to a Result<T, E> by cloning the contents of the\nOk part.

\n
§Examples
\n
let mut val = 12;\nlet x: Result<&mut i32, i32> = Ok(&mut val);\nassert_eq!(x, Ok(&mut 12));\nlet cloned = x.cloned();\nassert_eq!(cloned, Ok(12));
\n
",0,"air_trace_handler::TraceHandlerResult"],["
source§

impl<T, E> Result<Option<T>, E>

1.33.0 (const: unstable) · source

pub fn transpose(self) -> Option<Result<T, E>>

Transposes a Result of an Option into an Option of a Result.

\n

Ok(None) will be mapped to None.\nOk(Some(_)) and Err(_) will be mapped to Some(Ok(_)) and Some(Err(_)).

\n
§Examples
\n
#[derive(Debug, Eq, PartialEq)]\nstruct SomeErr;\n\nlet x: Result<Option<i32>, SomeErr> = Ok(Some(5));\nlet y: Option<Result<i32, SomeErr>> = Some(Ok(5));\nassert_eq!(x.transpose(), y);
\n
",0,"air_trace_handler::TraceHandlerResult"],["
source§

impl<T, E> Result<Result<T, E>, E>

source

pub fn flatten(self) -> Result<T, E>

🔬This is a nightly-only experimental API. (result_flattening)

Converts from Result<Result<T, E>, E> to Result<T, E>

\n
§Examples
\n
#![feature(result_flattening)]\nlet x: Result<Result<&'static str, u32>, u32> = Ok(Ok(\"hello\"));\nassert_eq!(Ok(\"hello\"), x.flatten());\n\nlet x: Result<Result<&'static str, u32>, u32> = Ok(Err(6));\nassert_eq!(Err(6), x.flatten());\n\nlet x: Result<Result<&'static str, u32>, u32> = Err(6);\nassert_eq!(Err(6), x.flatten());
\n

Flattening only removes one level of nesting at a time:

\n\n
#![feature(result_flattening)]\nlet x: Result<Result<Result<&'static str, u32>, u32>, u32> = Ok(Ok(Ok(\"hello\")));\nassert_eq!(Ok(Ok(\"hello\")), x.flatten());\nassert_eq!(Ok(\"hello\"), x.flatten().flatten());
\n
",0,"air_trace_handler::TraceHandlerResult"],["
source§

impl<T, E> Result<T, E>

1.0.0 (const: 1.48.0) · source

pub const fn is_ok(&self) -> bool

Returns true if the result is Ok.

\n
§Examples
\n
let x: Result<i32, &str> = Ok(-3);\nassert_eq!(x.is_ok(), true);\n\nlet x: Result<i32, &str> = Err(\"Some error message\");\nassert_eq!(x.is_ok(), false);
\n
1.70.0 · source

pub fn is_ok_and(self, f: impl FnOnce(T) -> bool) -> bool

Returns true if the result is Ok and the value inside of it matches a predicate.

\n
§Examples
\n
let x: Result<u32, &str> = Ok(2);\nassert_eq!(x.is_ok_and(|x| x > 1), true);\n\nlet x: Result<u32, &str> = Ok(0);\nassert_eq!(x.is_ok_and(|x| x > 1), false);\n\nlet x: Result<u32, &str> = Err(\"hey\");\nassert_eq!(x.is_ok_and(|x| x > 1), false);
\n
1.0.0 (const: 1.48.0) · source

pub const fn is_err(&self) -> bool

Returns true if the result is Err.

\n
§Examples
\n
let x: Result<i32, &str> = Ok(-3);\nassert_eq!(x.is_err(), false);\n\nlet x: Result<i32, &str> = Err(\"Some error message\");\nassert_eq!(x.is_err(), true);
\n
1.70.0 · source

pub fn is_err_and(self, f: impl FnOnce(E) -> bool) -> bool

Returns true if the result is Err and the value inside of it matches a predicate.

\n
§Examples
\n
use std::io::{Error, ErrorKind};\n\nlet x: Result<u32, Error> = Err(Error::new(ErrorKind::NotFound, \"!\"));\nassert_eq!(x.is_err_and(|x| x.kind() == ErrorKind::NotFound), true);\n\nlet x: Result<u32, Error> = Err(Error::new(ErrorKind::PermissionDenied, \"!\"));\nassert_eq!(x.is_err_and(|x| x.kind() == ErrorKind::NotFound), false);\n\nlet x: Result<u32, Error> = Ok(123);\nassert_eq!(x.is_err_and(|x| x.kind() == ErrorKind::NotFound), false);
\n
1.0.0 · source

pub fn ok(self) -> Option<T>

Converts from Result<T, E> to Option<T>.

\n

Converts self into an Option<T>, consuming self,\nand discarding the error, if any.

\n
§Examples
\n
let x: Result<u32, &str> = Ok(2);\nassert_eq!(x.ok(), Some(2));\n\nlet x: Result<u32, &str> = Err(\"Nothing here\");\nassert_eq!(x.ok(), None);
\n
1.0.0 · source

pub fn err(self) -> Option<E>

Converts from Result<T, E> to Option<E>.

\n

Converts self into an Option<E>, consuming self,\nand discarding the success value, if any.

\n
§Examples
\n
let x: Result<u32, &str> = Ok(2);\nassert_eq!(x.err(), None);\n\nlet x: Result<u32, &str> = Err(\"Nothing here\");\nassert_eq!(x.err(), Some(\"Nothing here\"));
\n
1.0.0 (const: 1.48.0) · source

pub const fn as_ref(&self) -> Result<&T, &E>

Converts from &Result<T, E> to Result<&T, &E>.

\n

Produces a new Result, containing a reference\ninto the original, leaving the original in place.

\n
§Examples
\n
let x: Result<u32, &str> = Ok(2);\nassert_eq!(x.as_ref(), Ok(&2));\n\nlet x: Result<u32, &str> = Err(\"Error\");\nassert_eq!(x.as_ref(), Err(&\"Error\"));
\n
1.0.0 (const: unstable) · source

pub fn as_mut(&mut self) -> Result<&mut T, &mut E>

Converts from &mut Result<T, E> to Result<&mut T, &mut E>.

\n
§Examples
\n
fn mutate(r: &mut Result<i32, i32>) {\n    match r.as_mut() {\n        Ok(v) => *v = 42,\n        Err(e) => *e = 0,\n    }\n}\n\nlet mut x: Result<i32, i32> = Ok(2);\nmutate(&mut x);\nassert_eq!(x.unwrap(), 42);\n\nlet mut x: Result<i32, i32> = Err(13);\nmutate(&mut x);\nassert_eq!(x.unwrap_err(), 0);
\n
1.0.0 · source

pub fn map<U, F>(self, op: F) -> Result<U, E>
where\n F: FnOnce(T) -> U,

Maps a Result<T, E> to Result<U, E> by applying a function to a\ncontained Ok value, leaving an Err value untouched.

\n

This function can be used to compose the results of two functions.

\n
§Examples
\n

Print the numbers on each line of a string multiplied by two.

\n\n
let line = \"1\\n2\\n3\\n4\\n\";\n\nfor num in line.lines() {\n    match num.parse::<i32>().map(|i| i * 2) {\n        Ok(n) => println!(\"{n}\"),\n        Err(..) => {}\n    }\n}
\n
1.41.0 · source

pub fn map_or<U, F>(self, default: U, f: F) -> U
where\n F: FnOnce(T) -> U,

Returns the provided default (if Err), or\napplies a function to the contained value (if Ok).

\n

Arguments passed to map_or are eagerly evaluated; if you are passing\nthe result of a function call, it is recommended to use map_or_else,\nwhich is lazily evaluated.

\n
§Examples
\n
let x: Result<_, &str> = Ok(\"foo\");\nassert_eq!(x.map_or(42, |v| v.len()), 3);\n\nlet x: Result<&str, _> = Err(\"bar\");\nassert_eq!(x.map_or(42, |v| v.len()), 42);
\n
1.41.0 · source

pub fn map_or_else<U, D, F>(self, default: D, f: F) -> U
where\n D: FnOnce(E) -> U,\n F: FnOnce(T) -> U,

Maps a Result<T, E> to U by applying fallback function default to\na contained Err value, or function f to a contained Ok value.

\n

This function can be used to unpack a successful result\nwhile handling an error.

\n
§Examples
\n
let k = 21;\n\nlet x : Result<_, &str> = Ok(\"foo\");\nassert_eq!(x.map_or_else(|e| k * 2, |v| v.len()), 3);\n\nlet x : Result<&str, _> = Err(\"bar\");\nassert_eq!(x.map_or_else(|e| k * 2, |v| v.len()), 42);
\n
1.0.0 · source

pub fn map_err<F, O>(self, op: O) -> Result<T, F>
where\n O: FnOnce(E) -> F,

Maps a Result<T, E> to Result<T, F> by applying a function to a\ncontained Err value, leaving an Ok value untouched.

\n

This function can be used to pass through a successful result while handling\nan error.

\n
§Examples
\n
fn stringify(x: u32) -> String { format!(\"error code: {x}\") }\n\nlet x: Result<u32, u32> = Ok(2);\nassert_eq!(x.map_err(stringify), Ok(2));\n\nlet x: Result<u32, u32> = Err(13);\nassert_eq!(x.map_err(stringify), Err(\"error code: 13\".to_string()));
\n
1.76.0 · source

pub fn inspect<F>(self, f: F) -> Result<T, E>
where\n F: FnOnce(&T),

Calls a function with a reference to the contained value if Ok.

\n

Returns the original result.

\n
§Examples
\n
let x: u8 = \"4\"\n    .parse::<u8>()\n    .inspect(|x| println!(\"original: {x}\"))\n    .map(|x| x.pow(3))\n    .expect(\"failed to parse number\");
\n
1.76.0 · source

pub fn inspect_err<F>(self, f: F) -> Result<T, E>
where\n F: FnOnce(&E),

Calls a function with a reference to the contained value if Err.

\n

Returns the original result.

\n
§Examples
\n
use std::{fs, io};\n\nfn read() -> io::Result<String> {\n    fs::read_to_string(\"address.txt\")\n        .inspect_err(|e| eprintln!(\"failed to read file: {e}\"))\n}
\n
1.47.0 · source

pub fn as_deref(&self) -> Result<&<T as Deref>::Target, &E>
where\n T: Deref,

Converts from Result<T, E> (or &Result<T, E>) to Result<&<T as Deref>::Target, &E>.

\n

Coerces the Ok variant of the original Result via Deref\nand returns the new Result.

\n
§Examples
\n
let x: Result<String, u32> = Ok(\"hello\".to_string());\nlet y: Result<&str, &u32> = Ok(\"hello\");\nassert_eq!(x.as_deref(), y);\n\nlet x: Result<String, u32> = Err(42);\nlet y: Result<&str, &u32> = Err(&42);\nassert_eq!(x.as_deref(), y);
\n
1.47.0 · source

pub fn as_deref_mut(&mut self) -> Result<&mut <T as Deref>::Target, &mut E>
where\n T: DerefMut,

Converts from Result<T, E> (or &mut Result<T, E>) to Result<&mut <T as DerefMut>::Target, &mut E>.

\n

Coerces the Ok variant of the original Result via DerefMut\nand returns the new Result.

\n
§Examples
\n
let mut s = \"HELLO\".to_string();\nlet mut x: Result<String, u32> = Ok(\"hello\".to_string());\nlet y: Result<&mut str, &mut u32> = Ok(&mut s);\nassert_eq!(x.as_deref_mut().map(|x| { x.make_ascii_uppercase(); x }), y);\n\nlet mut i = 42;\nlet mut x: Result<String, u32> = Err(42);\nlet y: Result<&mut str, &mut u32> = Err(&mut i);\nassert_eq!(x.as_deref_mut().map(|x| { x.make_ascii_uppercase(); x }), y);
\n
1.0.0 · source

pub fn iter(&self) -> Iter<'_, T>

Returns an iterator over the possibly contained value.

\n

The iterator yields one value if the result is Result::Ok, otherwise none.

\n
§Examples
\n
let x: Result<u32, &str> = Ok(7);\nassert_eq!(x.iter().next(), Some(&7));\n\nlet x: Result<u32, &str> = Err(\"nothing!\");\nassert_eq!(x.iter().next(), None);
\n
1.0.0 · source

pub fn iter_mut(&mut self) -> IterMut<'_, T>

Returns a mutable iterator over the possibly contained value.

\n

The iterator yields one value if the result is Result::Ok, otherwise none.

\n
§Examples
\n
let mut x: Result<u32, &str> = Ok(7);\nmatch x.iter_mut().next() {\n    Some(v) => *v = 40,\n    None => {},\n}\nassert_eq!(x, Ok(40));\n\nlet mut x: Result<u32, &str> = Err(\"nothing!\");\nassert_eq!(x.iter_mut().next(), None);
\n
1.4.0 · source

pub fn expect(self, msg: &str) -> T
where\n E: Debug,

Returns the contained Ok value, consuming the self value.

\n

Because this function may panic, its use is generally discouraged.\nInstead, prefer to use pattern matching and handle the Err\ncase explicitly, or call unwrap_or, unwrap_or_else, or\nunwrap_or_default.

\n
§Panics
\n

Panics if the value is an Err, with a panic message including the\npassed message, and the content of the Err.

\n
§Examples
\n
let x: Result<u32, &str> = Err(\"emergency failure\");\nx.expect(\"Testing expect\"); // panics with `Testing expect: emergency failure`
\n
§Recommended Message Style
\n

We recommend that expect messages are used to describe the reason you\nexpect the Result should be Ok.

\n\n
let path = std::env::var(\"IMPORTANT_PATH\")\n    .expect(\"env variable `IMPORTANT_PATH` should be set by `wrapper_script.sh`\");
\n

Hint: If you’re having trouble remembering how to phrase expect\nerror messages remember to focus on the word “should” as in “env\nvariable should be set by blah” or “the given binary should be available\nand executable by the current user”.

\n

For more detail on expect message styles and the reasoning behind our recommendation please\nrefer to the section on “Common Message\nStyles” in the\nstd::error module docs.

\n
1.0.0 · source

pub fn unwrap(self) -> T
where\n E: Debug,

Returns the contained Ok value, consuming the self value.

\n

Because this function may panic, its use is generally discouraged.\nInstead, prefer to use pattern matching and handle the Err\ncase explicitly, or call unwrap_or, unwrap_or_else, or\nunwrap_or_default.

\n
§Panics
\n

Panics if the value is an Err, with a panic message provided by the\nErr’s value.

\n
§Examples
\n

Basic usage:

\n\n
let x: Result<u32, &str> = Ok(2);\nassert_eq!(x.unwrap(), 2);
\n\n
let x: Result<u32, &str> = Err(\"emergency failure\");\nx.unwrap(); // panics with `emergency failure`
\n
1.16.0 · source

pub fn unwrap_or_default(self) -> T
where\n T: Default,

Returns the contained Ok value or a default

\n

Consumes the self argument then, if Ok, returns the contained\nvalue, otherwise if Err, returns the default value for that\ntype.

\n
§Examples
\n

Converts a string to an integer, turning poorly-formed strings\ninto 0 (the default value for integers). parse converts\na string to any other type that implements FromStr, returning an\nErr on error.

\n\n
let good_year_from_input = \"1909\";\nlet bad_year_from_input = \"190blarg\";\nlet good_year = good_year_from_input.parse().unwrap_or_default();\nlet bad_year = bad_year_from_input.parse().unwrap_or_default();\n\nassert_eq!(1909, good_year);\nassert_eq!(0, bad_year);
\n
1.17.0 · source

pub fn expect_err(self, msg: &str) -> E
where\n T: Debug,

Returns the contained Err value, consuming the self value.

\n
§Panics
\n

Panics if the value is an Ok, with a panic message including the\npassed message, and the content of the Ok.

\n
§Examples
\n
let x: Result<u32, &str> = Ok(10);\nx.expect_err(\"Testing expect_err\"); // panics with `Testing expect_err: 10`
\n
1.0.0 · source

pub fn unwrap_err(self) -> E
where\n T: Debug,

Returns the contained Err value, consuming the self value.

\n
§Panics
\n

Panics if the value is an Ok, with a custom panic message provided\nby the Ok’s value.

\n
§Examples
\n
let x: Result<u32, &str> = Ok(2);\nx.unwrap_err(); // panics with `2`
\n\n
let x: Result<u32, &str> = Err(\"emergency failure\");\nassert_eq!(x.unwrap_err(), \"emergency failure\");
\n
source

pub fn into_ok(self) -> T
where\n E: Into<!>,

🔬This is a nightly-only experimental API. (unwrap_infallible)

Returns the contained Ok value, but never panics.

\n

Unlike unwrap, this method is known to never panic on the\nresult types it is implemented for. Therefore, it can be used\ninstead of unwrap as a maintainability safeguard that will fail\nto compile if the error type of the Result is later changed\nto an error that can actually occur.

\n
§Examples
\n
\nfn only_good_news() -> Result<String, !> {\n    Ok(\"this is fine\".into())\n}\n\nlet s: String = only_good_news().into_ok();\nprintln!(\"{s}\");
\n
source

pub fn into_err(self) -> E
where\n T: Into<!>,

🔬This is a nightly-only experimental API. (unwrap_infallible)

Returns the contained Err value, but never panics.

\n

Unlike unwrap_err, this method is known to never panic on the\nresult types it is implemented for. Therefore, it can be used\ninstead of unwrap_err as a maintainability safeguard that will fail\nto compile if the ok type of the Result is later changed\nto a type that can actually occur.

\n
§Examples
\n
\nfn only_bad_news() -> Result<!, String> {\n    Err(\"Oops, it failed\".into())\n}\n\nlet error: String = only_bad_news().into_err();\nprintln!(\"{error}\");
\n
1.0.0 · source

pub fn and<U>(self, res: Result<U, E>) -> Result<U, E>

Returns res if the result is Ok, otherwise returns the Err value of self.

\n

Arguments passed to and are eagerly evaluated; if you are passing the\nresult of a function call, it is recommended to use and_then, which is\nlazily evaluated.

\n
§Examples
\n
let x: Result<u32, &str> = Ok(2);\nlet y: Result<&str, &str> = Err(\"late error\");\nassert_eq!(x.and(y), Err(\"late error\"));\n\nlet x: Result<u32, &str> = Err(\"early error\");\nlet y: Result<&str, &str> = Ok(\"foo\");\nassert_eq!(x.and(y), Err(\"early error\"));\n\nlet x: Result<u32, &str> = Err(\"not a 2\");\nlet y: Result<&str, &str> = Err(\"late error\");\nassert_eq!(x.and(y), Err(\"not a 2\"));\n\nlet x: Result<u32, &str> = Ok(2);\nlet y: Result<&str, &str> = Ok(\"different result type\");\nassert_eq!(x.and(y), Ok(\"different result type\"));
\n
1.0.0 · source

pub fn and_then<U, F>(self, op: F) -> Result<U, E>
where\n F: FnOnce(T) -> Result<U, E>,

Calls op if the result is Ok, otherwise returns the Err value of self.

\n

This function can be used for control flow based on Result values.

\n
§Examples
\n
fn sq_then_to_string(x: u32) -> Result<String, &'static str> {\n    x.checked_mul(x).map(|sq| sq.to_string()).ok_or(\"overflowed\")\n}\n\nassert_eq!(Ok(2).and_then(sq_then_to_string), Ok(4.to_string()));\nassert_eq!(Ok(1_000_000).and_then(sq_then_to_string), Err(\"overflowed\"));\nassert_eq!(Err(\"not a number\").and_then(sq_then_to_string), Err(\"not a number\"));
\n

Often used to chain fallible operations that may return Err.

\n\n
use std::{io::ErrorKind, path::Path};\n\n// Note: on Windows \"/\" maps to \"C:\\\"\nlet root_modified_time = Path::new(\"/\").metadata().and_then(|md| md.modified());\nassert!(root_modified_time.is_ok());\n\nlet should_fail = Path::new(\"/bad/path\").metadata().and_then(|md| md.modified());\nassert!(should_fail.is_err());\nassert_eq!(should_fail.unwrap_err().kind(), ErrorKind::NotFound);
\n
1.0.0 · source

pub fn or<F>(self, res: Result<T, F>) -> Result<T, F>

Returns res if the result is Err, otherwise returns the Ok value of self.

\n

Arguments passed to or are eagerly evaluated; if you are passing the\nresult of a function call, it is recommended to use or_else, which is\nlazily evaluated.

\n
§Examples
\n
let x: Result<u32, &str> = Ok(2);\nlet y: Result<u32, &str> = Err(\"late error\");\nassert_eq!(x.or(y), Ok(2));\n\nlet x: Result<u32, &str> = Err(\"early error\");\nlet y: Result<u32, &str> = Ok(2);\nassert_eq!(x.or(y), Ok(2));\n\nlet x: Result<u32, &str> = Err(\"not a 2\");\nlet y: Result<u32, &str> = Err(\"late error\");\nassert_eq!(x.or(y), Err(\"late error\"));\n\nlet x: Result<u32, &str> = Ok(2);\nlet y: Result<u32, &str> = Ok(100);\nassert_eq!(x.or(y), Ok(2));
\n
1.0.0 · source

pub fn or_else<F, O>(self, op: O) -> Result<T, F>
where\n O: FnOnce(E) -> Result<T, F>,

Calls op if the result is Err, otherwise returns the Ok value of self.

\n

This function can be used for control flow based on result values.

\n
§Examples
\n
fn sq(x: u32) -> Result<u32, u32> { Ok(x * x) }\nfn err(x: u32) -> Result<u32, u32> { Err(x) }\n\nassert_eq!(Ok(2).or_else(sq).or_else(sq), Ok(2));\nassert_eq!(Ok(2).or_else(err).or_else(sq), Ok(2));\nassert_eq!(Err(3).or_else(sq).or_else(err), Ok(9));\nassert_eq!(Err(3).or_else(err).or_else(err), Err(3));
\n
1.0.0 · source

pub fn unwrap_or(self, default: T) -> T

Returns the contained Ok value or a provided default.

\n

Arguments passed to unwrap_or are eagerly evaluated; if you are passing\nthe result of a function call, it is recommended to use unwrap_or_else,\nwhich is lazily evaluated.

\n
§Examples
\n
let default = 2;\nlet x: Result<u32, &str> = Ok(9);\nassert_eq!(x.unwrap_or(default), 9);\n\nlet x: Result<u32, &str> = Err(\"error\");\nassert_eq!(x.unwrap_or(default), default);
\n
1.0.0 · source

pub fn unwrap_or_else<F>(self, op: F) -> T
where\n F: FnOnce(E) -> T,

Returns the contained Ok value or computes it from a closure.

\n
§Examples
\n
fn count(x: &str) -> usize { x.len() }\n\nassert_eq!(Ok(2).unwrap_or_else(count), 2);\nassert_eq!(Err(\"foo\").unwrap_or_else(count), 3);
\n
1.58.0 · source

pub unsafe fn unwrap_unchecked(self) -> T

Returns the contained Ok value, consuming the self value,\nwithout checking that the value is not an Err.

\n
§Safety
\n

Calling this method on an Err is undefined behavior.

\n
§Examples
\n
let x: Result<u32, &str> = Ok(2);\nassert_eq!(unsafe { x.unwrap_unchecked() }, 2);
\n\n
let x: Result<u32, &str> = Err(\"emergency failure\");\nunsafe { x.unwrap_unchecked(); } // Undefined behavior!
\n
1.58.0 · source

pub unsafe fn unwrap_err_unchecked(self) -> E

Returns the contained Err value, consuming the self value,\nwithout checking that the value is not an Ok.

\n
§Safety
\n

Calling this method on an Ok is undefined behavior.

\n
§Examples
\n
let x: Result<u32, &str> = Ok(2);\nunsafe { x.unwrap_err_unchecked() }; // Undefined behavior!
\n\n
let x: Result<u32, &str> = Err(\"emergency failure\");\nassert_eq!(unsafe { x.unwrap_err_unchecked() }, \"emergency failure\");
\n
",0,"air_trace_handler::TraceHandlerResult"],["
§

impl<T, E, S> Serialize<S> for Result<T, E>
where\n T: Serialize<S>,\n E: Serialize<S>,\n S: Fallible + ?Sized,

§

fn serialize(\n &self,\n serializer: &mut S,\n) -> Result<<Result<T, E> as Archive>::Resolver, <S as Fallible>::Error>

Writes the dependencies for the object and returns a resolver that can create the archived\ntype.
","Serialize","air_trace_handler::TraceHandlerResult"],["
source§

impl<T, E> Serialize for Result<T, E>
where\n T: Serialize,\n E: Serialize,

source§

fn serialize<S>(\n &self,\n serializer: S,\n) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error>
where\n S: Serializer,

Serialize this value into the given Serde serializer. Read more
","Serialize","air_trace_handler::TraceHandlerResult"],["
1.16.0 · source§

impl<T, U, E> Sum<Result<U, E>> for Result<T, E>
where\n T: Sum<U>,

source§

fn sum<I>(iter: I) -> Result<T, E>
where\n I: Iterator<Item = Result<U, E>>,

Takes each element in the Iterator: if it is an Err, no further\nelements are taken, and the Err is returned. Should no Err\noccur, the sum of all elements is returned.

\n
§Examples
\n

This sums up every integer in a vector, rejecting the sum if a negative\nelement is encountered:

\n\n
let f = |&x: &i32| if x < 0 { Err(\"Negative element found\") } else { Ok(x) };\nlet v = vec![1, 2];\nlet res: Result<i32, _> = v.iter().map(f).sum();\nassert_eq!(res, Ok(3));\nlet v = vec![1, -2];\nlet res: Result<i32, _> = v.iter().map(f).sum();\nassert_eq!(res, Err(\"Negative element found\"));
\n
","Sum>","air_trace_handler::TraceHandlerResult"],["
1.61.0 · source§

impl<T, E> Termination for Result<T, E>
where\n T: Termination,\n E: Debug,

source§

fn report(self) -> ExitCode

Is called to get the representation of the value as status code.\nThis status code is returned to the operating system.
","Termination","air_trace_handler::TraceHandlerResult"],["
source§

impl<T, E> Try for Result<T, E>

§

type Output = T

🔬This is a nightly-only experimental API. (try_trait_v2)
The type of the value produced by ? when not short-circuiting.
§

type Residual = Result<Infallible, E>

🔬This is a nightly-only experimental API. (try_trait_v2)
The type of the value passed to FromResidual::from_residual\nas part of ? when short-circuiting. Read more
source§

fn from_output(output: <Result<T, E> as Try>::Output) -> Result<T, E>

🔬This is a nightly-only experimental API. (try_trait_v2)
Constructs the type from its Output type. Read more
source§

fn branch(\n self,\n) -> ControlFlow<<Result<T, E> as Try>::Residual, <Result<T, E> as Try>::Output>

🔬This is a nightly-only experimental API. (try_trait_v2)
Used in ? to decide whether the operator should produce a value\n(because this returned ControlFlow::Continue)\nor propagate a value back to the caller\n(because this returned ControlFlow::Break). Read more
","Try","air_trace_handler::TraceHandlerResult"],["
source§

impl<T, E> WrapErr<T, E> for Result<T, E>
where\n E: StdError + Send + Sync + 'static,

source§

fn wrap_err<D>(self, msg: D) -> Result<T, Report>
where\n D: Display + Send + Sync + 'static,

Wrap the error value with a new adhoc error
source§

fn wrap_err_with<D, F>(self, msg: F) -> Result<T, Report>
where\n D: Display + Send + Sync + 'static,\n F: FnOnce() -> D,

Wrap the error value with a new adhoc error that is evaluated lazily\nonly once an error does occur.
source§

fn context<D>(self, msg: D) -> Result<T, Report>
where\n D: Display + Send + Sync + 'static,

Compatibility re-export of wrap_err for interop with anyhow
source§

fn with_context<D, F>(self, msg: F) -> Result<T, Report>
where\n D: Display + Send + Sync + 'static,\n F: FnOnce() -> D,

Compatibility re-export of wrap_err_with for interop with anyhow
","WrapErr","air_trace_handler::TraceHandlerResult"],["
1.0.0 · source§

impl<T, E> Copy for Result<T, E>
where\n T: Copy,\n E: Copy,

","Copy","air_trace_handler::TraceHandlerResult"],["
1.0.0 · source§

impl<T, E> Eq for Result<T, E>
where\n T: Eq,\n E: Eq,

","Eq","air_trace_handler::TraceHandlerResult"],["
1.0.0 · source§

impl<T, E> StructuralPartialEq for Result<T, E>

","StructuralPartialEq","air_trace_handler::TraceHandlerResult"]], +"avm_server":[["
§

impl<'a, A, B> Arbitrary<'a> for Result<A, B>
where\n A: Arbitrary<'a>,\n B: Arbitrary<'a>,

§

fn arbitrary(u: &mut Unstructured<'a>) -> Result<Result<A, B>, Error>

Generate an arbitrary value of Self from the given unstructured data. Read more
§

fn size_hint(depth: usize) -> (usize, Option<usize>)

Get a size hint for how many bytes out of an Unstructured this type\nneeds to construct itself. Read more
§

fn arbitrary_take_rest(u: Unstructured<'a>) -> Result<Self, Error>

Generate an arbitrary value of Self from the entirety of the given\nunstructured data. Read more
","Arbitrary<'a>","avm_server::AVMResult","avm_server::RunnerResult"],["
§

impl<T, E> Archive for Result<T, E>
where\n T: Archive,\n E: Archive,

§

type Archived = ArchivedResult<<T as Archive>::Archived, <E as Archive>::Archived>

The archived representation of this type. Read more
§

type Resolver = Result<<T as Archive>::Resolver, <E as Archive>::Resolver>

The resolver for this type. It must contain all the additional information from serializing\nneeded to make the archived type from the normal type.
§

unsafe fn resolve(\n &self,\n pos: usize,\n resolver: <Result<T, E> as Archive>::Resolver,\n out: *mut <Result<T, E> as Archive>::Archived,\n)

Creates the archived version of this value at the given position and writes it to the given\noutput. Read more
","Archive","avm_server::AVMResult","avm_server::RunnerResult"],["
1.0.0 · source§

impl<T, E> Clone for Result<T, E>
where\n T: Clone,\n E: Clone,

source§

fn clone(&self) -> Result<T, E>

Returns a copy of the value. Read more
source§

fn clone_from(&mut self, source: &Result<T, E>)

Performs copy-assignment from source. Read more
","Clone","avm_server::AVMResult","avm_server::RunnerResult"],["
source§

impl<T, E> Context<T, E> for Result<T, E>
where\n E: StdError + Send + Sync + 'static,

source§

fn context<C>(self, context: C) -> Result<T, Error>
where\n C: Display + Send + Sync + 'static,

Wrap the error value with additional context.
source§

fn with_context<C, F>(self, context: F) -> Result<T, Error>
where\n C: Display + Send + Sync + 'static,\n F: FnOnce() -> C,

Wrap the error value with additional context that is evaluated lazily\nonly once an error does occur.
","Context","avm_server::AVMResult","avm_server::RunnerResult"],["
1.0.0 · source§

impl<T, E> Debug for Result<T, E>
where\n T: Debug,\n E: Debug,

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
","Debug","avm_server::AVMResult","avm_server::RunnerResult"],["
source§

impl<'de, T, E> Deserialize<'de> for Result<T, E>
where\n T: Deserialize<'de>,\n E: Deserialize<'de>,

source§

fn deserialize<D>(\n deserializer: D,\n) -> Result<Result<T, E>, <D as Deserializer<'de>>::Error>
where\n D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
","Deserialize<'de>","avm_server::AVMResult","avm_server::RunnerResult"],["
source§

impl<'de, T, TAs, E, EAs> DeserializeAs<'de, Result<T, E>> for Result<TAs, EAs>
where\n TAs: DeserializeAs<'de, T>,\n EAs: DeserializeAs<'de, E>,

source§

fn deserialize_as<D>(\n deserializer: D,\n) -> Result<Result<T, E>, <D as Deserializer<'de>>::Error>
where\n D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer.
","DeserializeAs<'de, Result>","avm_server::AVMResult","avm_server::RunnerResult"],["
1.0.0 · source§

impl<A, E, V> FromIterator<Result<A, E>> for Result<V, E>
where\n V: FromIterator<A>,

source§

fn from_iter<I>(iter: I) -> Result<V, E>
where\n I: IntoIterator<Item = Result<A, E>>,

Takes each element in the Iterator: if it is an Err, no further\nelements are taken, and the Err is returned. Should no Err occur, a\ncontainer with the values of each Result is returned.

\n

Here is an example which increments every integer in a vector,\nchecking for overflow:

\n\n
let v = vec![1, 2];\nlet res: Result<Vec<u32>, &'static str> = v.iter().map(|x: &u32|\n    x.checked_add(1).ok_or(\"Overflow!\")\n).collect();\nassert_eq!(res, Ok(vec![2, 3]));
\n

Here is another example that tries to subtract one from another list\nof integers, this time checking for underflow:

\n\n
let v = vec![1, 2, 0];\nlet res: Result<Vec<u32>, &'static str> = v.iter().map(|x: &u32|\n    x.checked_sub(1).ok_or(\"Underflow!\")\n).collect();\nassert_eq!(res, Err(\"Underflow!\"));
\n

Here is a variation on the previous example, showing that no\nfurther elements are taken from iter after the first Err.

\n\n
let v = vec![3, 2, 1, 10];\nlet mut shared = 0;\nlet res: Result<Vec<u32>, &'static str> = v.iter().map(|x: &u32| {\n    shared += x;\n    x.checked_sub(2).ok_or(\"Underflow!\")\n}).collect();\nassert_eq!(res, Err(\"Underflow!\"));\nassert_eq!(shared, 6);
\n

Since the third element caused an underflow, no further elements were taken,\nso the final value of shared is 6 (= 3 + 2 + 1), not 16.

\n
","FromIterator>","avm_server::AVMResult","avm_server::RunnerResult"],["
§

impl<C, T, E> FromParallelIterator<Result<T, E>> for Result<C, E>
where\n C: FromParallelIterator<T>,\n T: Send,\n E: Send,

Collect an arbitrary Result-wrapped collection.

\n

If any item is Err, then all previous Ok items collected are\ndiscarded, and it returns that error. If there are multiple errors, the\none returned is not deterministic.

\n
§

fn from_par_iter<I>(par_iter: I) -> Result<C, E>
where\n I: IntoParallelIterator<Item = Result<T, E>>,

Creates an instance of the collection from the parallel iterator par_iter. Read more
","FromParallelIterator>","avm_server::AVMResult","avm_server::RunnerResult"],["
source§

impl<T, E, F> FromResidual<Result<Infallible, E>> for Result<T, F>
where\n F: From<E>,

source§

fn from_residual(residual: Result<Infallible, E>) -> Result<T, F>

🔬This is a nightly-only experimental API. (try_trait_v2)
Constructs the type from a compatible Residual type. Read more
","FromResidual>","avm_server::AVMResult","avm_server::RunnerResult"],["
source§

impl<T, E, F> FromResidual<Yeet<E>> for Result<T, F>
where\n F: From<E>,

source§

fn from_residual(_: Yeet<E>) -> Result<T, F>

🔬This is a nightly-only experimental API. (try_trait_v2)
Constructs the type from a compatible Residual type. Read more
","FromResidual>","avm_server::AVMResult","avm_server::RunnerResult"],["
1.0.0 · source§

impl<T, E> Hash for Result<T, E>
where\n T: Hash,\n E: Hash,

source§

fn hash<__H>(&self, state: &mut __H)
where\n __H: Hasher,

Feeds this value into the given Hasher. Read more
1.3.0 · source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where\n H: Hasher,\n Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
","Hash","avm_server::AVMResult","avm_server::RunnerResult"],["
1.0.0 · source§

impl<T, E> IntoIterator for Result<T, E>

source§

fn into_iter(self) -> IntoIter<T>

Returns a consuming iterator over the possibly contained value.

\n

The iterator yields one value if the result is Result::Ok, otherwise none.

\n
§Examples
\n
let x: Result<u32, &str> = Ok(5);\nlet v: Vec<u32> = x.into_iter().collect();\nassert_eq!(v, [5]);\n\nlet x: Result<u32, &str> = Err(\"nothing!\");\nlet v: Vec<u32> = x.into_iter().collect();\nassert_eq!(v, []);
\n
§

type Item = T

The type of the elements being iterated over.
§

type IntoIter = IntoIter<T>

Which kind of iterator are we turning this into?
","IntoIterator","avm_server::AVMResult","avm_server::RunnerResult"],["
§

impl<T, E> IntoParallelIterator for Result<T, E>
where\n T: Send,

§

type Item = T

The type of item that the parallel iterator will produce.
§

type Iter = IntoIter<T>

The parallel iterator type that will be created.
§

fn into_par_iter(self) -> <Result<T, E> as IntoParallelIterator>::Iter

Converts self into a parallel iterator. Read more
","IntoParallelIterator","avm_server::AVMResult","avm_server::RunnerResult"],["
1.0.0 · source§

impl<T, E> Ord for Result<T, E>
where\n T: Ord,\n E: Ord,

source§

fn cmp(&self, other: &Result<T, E>) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · source§

fn max(self, other: Self) -> Self
where\n Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · source§

fn min(self, other: Self) -> Self
where\n Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · source§

fn clamp(self, min: Self, max: Self) -> Self
where\n Self: Sized + PartialOrd,

Restrict a value to a certain interval. Read more
","Ord","avm_server::AVMResult","avm_server::RunnerResult"],["
§

impl<T, U, E, F> PartialEq<ArchivedResult<T, E>> for Result<U, F>
where\n T: PartialEq<U>,\n E: PartialEq<F>,

§

fn eq(&self, other: &ArchivedResult<T, E>) -> bool

This method tests for self and other values to be equal, and is used\nby ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always\nsufficient, and should not be overridden without very good reason.
","PartialEq>","avm_server::AVMResult","avm_server::RunnerResult"],["
1.0.0 · source§

impl<T, E> PartialEq for Result<T, E>
where\n T: PartialEq,\n E: PartialEq,

source§

fn eq(&self, other: &Result<T, E>) -> bool

This method tests for self and other values to be equal, and is used\nby ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always\nsufficient, and should not be overridden without very good reason.
","PartialEq","avm_server::AVMResult","avm_server::RunnerResult"],["
1.0.0 · source§

impl<T, E> PartialOrd for Result<T, E>
where\n T: PartialOrd,\n E: PartialOrd,

source§

fn partial_cmp(&self, other: &Result<T, E>) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · source§

fn lt(&self, other: &Rhs) -> bool

This method tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · source§

fn le(&self, other: &Rhs) -> bool

This method tests less than or equal to (for self and other) and is used by the <=\noperator. Read more
1.0.0 · source§

fn gt(&self, other: &Rhs) -> bool

This method tests greater than (for self and other) and is used by the > operator. Read more
1.0.0 · source§

fn ge(&self, other: &Rhs) -> bool

This method tests greater than or equal to (for self and other) and is used by the >=\noperator. Read more
","PartialOrd","avm_server::AVMResult","avm_server::RunnerResult"],["
1.16.0 · source§

impl<T, U, E> Product<Result<U, E>> for Result<T, E>
where\n T: Product<U>,

source§

fn product<I>(iter: I) -> Result<T, E>
where\n I: Iterator<Item = Result<U, E>>,

Takes each element in the Iterator: if it is an Err, no further\nelements are taken, and the Err is returned. Should no Err\noccur, the product of all elements is returned.

\n
§Examples
\n

This multiplies each number in a vector of strings,\nif a string could not be parsed the operation returns Err:

\n\n
let nums = vec![\"5\", \"10\", \"1\", \"2\"];\nlet total: Result<usize, _> = nums.iter().map(|w| w.parse::<usize>()).product();\nassert_eq!(total, Ok(100));\nlet nums = vec![\"5\", \"10\", \"one\", \"2\"];\nlet total: Result<usize, _> = nums.iter().map(|w| w.parse::<usize>()).product();\nassert!(total.is_err());
\n
","Product>","avm_server::AVMResult","avm_server::RunnerResult"],["
source§

impl<T, E> Residual<T> for Result<Infallible, E>

§

type TryType = Result<T, E>

🔬This is a nightly-only experimental API. (try_trait_v2_residual)
The “return” type of this meta-function.
","Residual","avm_server::AVMResult","avm_server::RunnerResult"],["
source§

impl<T, E> Result<&T, E>

1.59.0 · source

pub fn copied(self) -> Result<T, E>
where\n T: Copy,

Maps a Result<&T, E> to a Result<T, E> by copying the contents of the\nOk part.

\n
§Examples
\n
let val = 12;\nlet x: Result<&i32, i32> = Ok(&val);\nassert_eq!(x, Ok(&12));\nlet copied = x.copied();\nassert_eq!(copied, Ok(12));
\n
1.59.0 · source

pub fn cloned(self) -> Result<T, E>
where\n T: Clone,

Maps a Result<&T, E> to a Result<T, E> by cloning the contents of the\nOk part.

\n
§Examples
\n
let val = 12;\nlet x: Result<&i32, i32> = Ok(&val);\nassert_eq!(x, Ok(&12));\nlet cloned = x.cloned();\nassert_eq!(cloned, Ok(12));
\n
",0,"avm_server::AVMResult","avm_server::RunnerResult"],["
source§

impl<T, E> Result<&mut T, E>

1.59.0 · source

pub fn copied(self) -> Result<T, E>
where\n T: Copy,

Maps a Result<&mut T, E> to a Result<T, E> by copying the contents of the\nOk part.

\n
§Examples
\n
let mut val = 12;\nlet x: Result<&mut i32, i32> = Ok(&mut val);\nassert_eq!(x, Ok(&mut 12));\nlet copied = x.copied();\nassert_eq!(copied, Ok(12));
\n
1.59.0 · source

pub fn cloned(self) -> Result<T, E>
where\n T: Clone,

Maps a Result<&mut T, E> to a Result<T, E> by cloning the contents of the\nOk part.

\n
§Examples
\n
let mut val = 12;\nlet x: Result<&mut i32, i32> = Ok(&mut val);\nassert_eq!(x, Ok(&mut 12));\nlet cloned = x.cloned();\nassert_eq!(cloned, Ok(12));
\n
",0,"avm_server::AVMResult","avm_server::RunnerResult"],["
source§

impl<T, E> Result<Option<T>, E>

1.33.0 (const: unstable) · source

pub fn transpose(self) -> Option<Result<T, E>>

Transposes a Result of an Option into an Option of a Result.

\n

Ok(None) will be mapped to None.\nOk(Some(_)) and Err(_) will be mapped to Some(Ok(_)) and Some(Err(_)).

\n
§Examples
\n
#[derive(Debug, Eq, PartialEq)]\nstruct SomeErr;\n\nlet x: Result<Option<i32>, SomeErr> = Ok(Some(5));\nlet y: Option<Result<i32, SomeErr>> = Some(Ok(5));\nassert_eq!(x.transpose(), y);
\n
",0,"avm_server::AVMResult","avm_server::RunnerResult"],["
source§

impl<T, E> Result<Result<T, E>, E>

source

pub fn flatten(self) -> Result<T, E>

🔬This is a nightly-only experimental API. (result_flattening)

Converts from Result<Result<T, E>, E> to Result<T, E>

\n
§Examples
\n
#![feature(result_flattening)]\nlet x: Result<Result<&'static str, u32>, u32> = Ok(Ok(\"hello\"));\nassert_eq!(Ok(\"hello\"), x.flatten());\n\nlet x: Result<Result<&'static str, u32>, u32> = Ok(Err(6));\nassert_eq!(Err(6), x.flatten());\n\nlet x: Result<Result<&'static str, u32>, u32> = Err(6);\nassert_eq!(Err(6), x.flatten());
\n

Flattening only removes one level of nesting at a time:

\n\n
#![feature(result_flattening)]\nlet x: Result<Result<Result<&'static str, u32>, u32>, u32> = Ok(Ok(Ok(\"hello\")));\nassert_eq!(Ok(Ok(\"hello\")), x.flatten());\nassert_eq!(Ok(\"hello\"), x.flatten().flatten());
\n
",0,"avm_server::AVMResult","avm_server::RunnerResult"],["
source§

impl<T, E> Result<T, E>

1.0.0 (const: 1.48.0) · source

pub const fn is_ok(&self) -> bool

Returns true if the result is Ok.

\n
§Examples
\n
let x: Result<i32, &str> = Ok(-3);\nassert_eq!(x.is_ok(), true);\n\nlet x: Result<i32, &str> = Err(\"Some error message\");\nassert_eq!(x.is_ok(), false);
\n
1.70.0 · source

pub fn is_ok_and(self, f: impl FnOnce(T) -> bool) -> bool

Returns true if the result is Ok and the value inside of it matches a predicate.

\n
§Examples
\n
let x: Result<u32, &str> = Ok(2);\nassert_eq!(x.is_ok_and(|x| x > 1), true);\n\nlet x: Result<u32, &str> = Ok(0);\nassert_eq!(x.is_ok_and(|x| x > 1), false);\n\nlet x: Result<u32, &str> = Err(\"hey\");\nassert_eq!(x.is_ok_and(|x| x > 1), false);
\n
1.0.0 (const: 1.48.0) · source

pub const fn is_err(&self) -> bool

Returns true if the result is Err.

\n
§Examples
\n
let x: Result<i32, &str> = Ok(-3);\nassert_eq!(x.is_err(), false);\n\nlet x: Result<i32, &str> = Err(\"Some error message\");\nassert_eq!(x.is_err(), true);
\n
1.70.0 · source

pub fn is_err_and(self, f: impl FnOnce(E) -> bool) -> bool

Returns true if the result is Err and the value inside of it matches a predicate.

\n
§Examples
\n
use std::io::{Error, ErrorKind};\n\nlet x: Result<u32, Error> = Err(Error::new(ErrorKind::NotFound, \"!\"));\nassert_eq!(x.is_err_and(|x| x.kind() == ErrorKind::NotFound), true);\n\nlet x: Result<u32, Error> = Err(Error::new(ErrorKind::PermissionDenied, \"!\"));\nassert_eq!(x.is_err_and(|x| x.kind() == ErrorKind::NotFound), false);\n\nlet x: Result<u32, Error> = Ok(123);\nassert_eq!(x.is_err_and(|x| x.kind() == ErrorKind::NotFound), false);
\n
1.0.0 · source

pub fn ok(self) -> Option<T>

Converts from Result<T, E> to Option<T>.

\n

Converts self into an Option<T>, consuming self,\nand discarding the error, if any.

\n
§Examples
\n
let x: Result<u32, &str> = Ok(2);\nassert_eq!(x.ok(), Some(2));\n\nlet x: Result<u32, &str> = Err(\"Nothing here\");\nassert_eq!(x.ok(), None);
\n
1.0.0 · source

pub fn err(self) -> Option<E>

Converts from Result<T, E> to Option<E>.

\n

Converts self into an Option<E>, consuming self,\nand discarding the success value, if any.

\n
§Examples
\n
let x: Result<u32, &str> = Ok(2);\nassert_eq!(x.err(), None);\n\nlet x: Result<u32, &str> = Err(\"Nothing here\");\nassert_eq!(x.err(), Some(\"Nothing here\"));
\n
1.0.0 (const: 1.48.0) · source

pub const fn as_ref(&self) -> Result<&T, &E>

Converts from &Result<T, E> to Result<&T, &E>.

\n

Produces a new Result, containing a reference\ninto the original, leaving the original in place.

\n
§Examples
\n
let x: Result<u32, &str> = Ok(2);\nassert_eq!(x.as_ref(), Ok(&2));\n\nlet x: Result<u32, &str> = Err(\"Error\");\nassert_eq!(x.as_ref(), Err(&\"Error\"));
\n
1.0.0 (const: unstable) · source

pub fn as_mut(&mut self) -> Result<&mut T, &mut E>

Converts from &mut Result<T, E> to Result<&mut T, &mut E>.

\n
§Examples
\n
fn mutate(r: &mut Result<i32, i32>) {\n    match r.as_mut() {\n        Ok(v) => *v = 42,\n        Err(e) => *e = 0,\n    }\n}\n\nlet mut x: Result<i32, i32> = Ok(2);\nmutate(&mut x);\nassert_eq!(x.unwrap(), 42);\n\nlet mut x: Result<i32, i32> = Err(13);\nmutate(&mut x);\nassert_eq!(x.unwrap_err(), 0);
\n
1.0.0 · source

pub fn map<U, F>(self, op: F) -> Result<U, E>
where\n F: FnOnce(T) -> U,

Maps a Result<T, E> to Result<U, E> by applying a function to a\ncontained Ok value, leaving an Err value untouched.

\n

This function can be used to compose the results of two functions.

\n
§Examples
\n

Print the numbers on each line of a string multiplied by two.

\n\n
let line = \"1\\n2\\n3\\n4\\n\";\n\nfor num in line.lines() {\n    match num.parse::<i32>().map(|i| i * 2) {\n        Ok(n) => println!(\"{n}\"),\n        Err(..) => {}\n    }\n}
\n
1.41.0 · source

pub fn map_or<U, F>(self, default: U, f: F) -> U
where\n F: FnOnce(T) -> U,

Returns the provided default (if Err), or\napplies a function to the contained value (if Ok).

\n

Arguments passed to map_or are eagerly evaluated; if you are passing\nthe result of a function call, it is recommended to use map_or_else,\nwhich is lazily evaluated.

\n
§Examples
\n
let x: Result<_, &str> = Ok(\"foo\");\nassert_eq!(x.map_or(42, |v| v.len()), 3);\n\nlet x: Result<&str, _> = Err(\"bar\");\nassert_eq!(x.map_or(42, |v| v.len()), 42);
\n
1.41.0 · source

pub fn map_or_else<U, D, F>(self, default: D, f: F) -> U
where\n D: FnOnce(E) -> U,\n F: FnOnce(T) -> U,

Maps a Result<T, E> to U by applying fallback function default to\na contained Err value, or function f to a contained Ok value.

\n

This function can be used to unpack a successful result\nwhile handling an error.

\n
§Examples
\n
let k = 21;\n\nlet x : Result<_, &str> = Ok(\"foo\");\nassert_eq!(x.map_or_else(|e| k * 2, |v| v.len()), 3);\n\nlet x : Result<&str, _> = Err(\"bar\");\nassert_eq!(x.map_or_else(|e| k * 2, |v| v.len()), 42);
\n
1.0.0 · source

pub fn map_err<F, O>(self, op: O) -> Result<T, F>
where\n O: FnOnce(E) -> F,

Maps a Result<T, E> to Result<T, F> by applying a function to a\ncontained Err value, leaving an Ok value untouched.

\n

This function can be used to pass through a successful result while handling\nan error.

\n
§Examples
\n
fn stringify(x: u32) -> String { format!(\"error code: {x}\") }\n\nlet x: Result<u32, u32> = Ok(2);\nassert_eq!(x.map_err(stringify), Ok(2));\n\nlet x: Result<u32, u32> = Err(13);\nassert_eq!(x.map_err(stringify), Err(\"error code: 13\".to_string()));
\n
1.76.0 · source

pub fn inspect<F>(self, f: F) -> Result<T, E>
where\n F: FnOnce(&T),

Calls a function with a reference to the contained value if Ok.

\n

Returns the original result.

\n
§Examples
\n
let x: u8 = \"4\"\n    .parse::<u8>()\n    .inspect(|x| println!(\"original: {x}\"))\n    .map(|x| x.pow(3))\n    .expect(\"failed to parse number\");
\n
1.76.0 · source

pub fn inspect_err<F>(self, f: F) -> Result<T, E>
where\n F: FnOnce(&E),

Calls a function with a reference to the contained value if Err.

\n

Returns the original result.

\n
§Examples
\n
use std::{fs, io};\n\nfn read() -> io::Result<String> {\n    fs::read_to_string(\"address.txt\")\n        .inspect_err(|e| eprintln!(\"failed to read file: {e}\"))\n}
\n
1.47.0 · source

pub fn as_deref(&self) -> Result<&<T as Deref>::Target, &E>
where\n T: Deref,

Converts from Result<T, E> (or &Result<T, E>) to Result<&<T as Deref>::Target, &E>.

\n

Coerces the Ok variant of the original Result via Deref\nand returns the new Result.

\n
§Examples
\n
let x: Result<String, u32> = Ok(\"hello\".to_string());\nlet y: Result<&str, &u32> = Ok(\"hello\");\nassert_eq!(x.as_deref(), y);\n\nlet x: Result<String, u32> = Err(42);\nlet y: Result<&str, &u32> = Err(&42);\nassert_eq!(x.as_deref(), y);
\n
1.47.0 · source

pub fn as_deref_mut(&mut self) -> Result<&mut <T as Deref>::Target, &mut E>
where\n T: DerefMut,

Converts from Result<T, E> (or &mut Result<T, E>) to Result<&mut <T as DerefMut>::Target, &mut E>.

\n

Coerces the Ok variant of the original Result via DerefMut\nand returns the new Result.

\n
§Examples
\n
let mut s = \"HELLO\".to_string();\nlet mut x: Result<String, u32> = Ok(\"hello\".to_string());\nlet y: Result<&mut str, &mut u32> = Ok(&mut s);\nassert_eq!(x.as_deref_mut().map(|x| { x.make_ascii_uppercase(); x }), y);\n\nlet mut i = 42;\nlet mut x: Result<String, u32> = Err(42);\nlet y: Result<&mut str, &mut u32> = Err(&mut i);\nassert_eq!(x.as_deref_mut().map(|x| { x.make_ascii_uppercase(); x }), y);
\n
1.0.0 · source

pub fn iter(&self) -> Iter<'_, T>

Returns an iterator over the possibly contained value.

\n

The iterator yields one value if the result is Result::Ok, otherwise none.

\n
§Examples
\n
let x: Result<u32, &str> = Ok(7);\nassert_eq!(x.iter().next(), Some(&7));\n\nlet x: Result<u32, &str> = Err(\"nothing!\");\nassert_eq!(x.iter().next(), None);
\n
1.0.0 · source

pub fn iter_mut(&mut self) -> IterMut<'_, T>

Returns a mutable iterator over the possibly contained value.

\n

The iterator yields one value if the result is Result::Ok, otherwise none.

\n
§Examples
\n
let mut x: Result<u32, &str> = Ok(7);\nmatch x.iter_mut().next() {\n    Some(v) => *v = 40,\n    None => {},\n}\nassert_eq!(x, Ok(40));\n\nlet mut x: Result<u32, &str> = Err(\"nothing!\");\nassert_eq!(x.iter_mut().next(), None);
\n
1.4.0 · source

pub fn expect(self, msg: &str) -> T
where\n E: Debug,

Returns the contained Ok value, consuming the self value.

\n

Because this function may panic, its use is generally discouraged.\nInstead, prefer to use pattern matching and handle the Err\ncase explicitly, or call unwrap_or, unwrap_or_else, or\nunwrap_or_default.

\n
§Panics
\n

Panics if the value is an Err, with a panic message including the\npassed message, and the content of the Err.

\n
§Examples
\n
let x: Result<u32, &str> = Err(\"emergency failure\");\nx.expect(\"Testing expect\"); // panics with `Testing expect: emergency failure`
\n
§Recommended Message Style
\n

We recommend that expect messages are used to describe the reason you\nexpect the Result should be Ok.

\n\n
let path = std::env::var(\"IMPORTANT_PATH\")\n    .expect(\"env variable `IMPORTANT_PATH` should be set by `wrapper_script.sh`\");
\n

Hint: If you’re having trouble remembering how to phrase expect\nerror messages remember to focus on the word “should” as in “env\nvariable should be set by blah” or “the given binary should be available\nand executable by the current user”.

\n

For more detail on expect message styles and the reasoning behind our recommendation please\nrefer to the section on “Common Message\nStyles” in the\nstd::error module docs.

\n
1.0.0 · source

pub fn unwrap(self) -> T
where\n E: Debug,

Returns the contained Ok value, consuming the self value.

\n

Because this function may panic, its use is generally discouraged.\nInstead, prefer to use pattern matching and handle the Err\ncase explicitly, or call unwrap_or, unwrap_or_else, or\nunwrap_or_default.

\n
§Panics
\n

Panics if the value is an Err, with a panic message provided by the\nErr’s value.

\n
§Examples
\n

Basic usage:

\n\n
let x: Result<u32, &str> = Ok(2);\nassert_eq!(x.unwrap(), 2);
\n\n
let x: Result<u32, &str> = Err(\"emergency failure\");\nx.unwrap(); // panics with `emergency failure`
\n
1.16.0 · source

pub fn unwrap_or_default(self) -> T
where\n T: Default,

Returns the contained Ok value or a default

\n

Consumes the self argument then, if Ok, returns the contained\nvalue, otherwise if Err, returns the default value for that\ntype.

\n
§Examples
\n

Converts a string to an integer, turning poorly-formed strings\ninto 0 (the default value for integers). parse converts\na string to any other type that implements FromStr, returning an\nErr on error.

\n\n
let good_year_from_input = \"1909\";\nlet bad_year_from_input = \"190blarg\";\nlet good_year = good_year_from_input.parse().unwrap_or_default();\nlet bad_year = bad_year_from_input.parse().unwrap_or_default();\n\nassert_eq!(1909, good_year);\nassert_eq!(0, bad_year);
\n
1.17.0 · source

pub fn expect_err(self, msg: &str) -> E
where\n T: Debug,

Returns the contained Err value, consuming the self value.

\n
§Panics
\n

Panics if the value is an Ok, with a panic message including the\npassed message, and the content of the Ok.

\n
§Examples
\n
let x: Result<u32, &str> = Ok(10);\nx.expect_err(\"Testing expect_err\"); // panics with `Testing expect_err: 10`
\n
1.0.0 · source

pub fn unwrap_err(self) -> E
where\n T: Debug,

Returns the contained Err value, consuming the self value.

\n
§Panics
\n

Panics if the value is an Ok, with a custom panic message provided\nby the Ok’s value.

\n
§Examples
\n
let x: Result<u32, &str> = Ok(2);\nx.unwrap_err(); // panics with `2`
\n\n
let x: Result<u32, &str> = Err(\"emergency failure\");\nassert_eq!(x.unwrap_err(), \"emergency failure\");
\n
source

pub fn into_ok(self) -> T
where\n E: Into<!>,

🔬This is a nightly-only experimental API. (unwrap_infallible)

Returns the contained Ok value, but never panics.

\n

Unlike unwrap, this method is known to never panic on the\nresult types it is implemented for. Therefore, it can be used\ninstead of unwrap as a maintainability safeguard that will fail\nto compile if the error type of the Result is later changed\nto an error that can actually occur.

\n
§Examples
\n
\nfn only_good_news() -> Result<String, !> {\n    Ok(\"this is fine\".into())\n}\n\nlet s: String = only_good_news().into_ok();\nprintln!(\"{s}\");
\n
source

pub fn into_err(self) -> E
where\n T: Into<!>,

🔬This is a nightly-only experimental API. (unwrap_infallible)

Returns the contained Err value, but never panics.

\n

Unlike unwrap_err, this method is known to never panic on the\nresult types it is implemented for. Therefore, it can be used\ninstead of unwrap_err as a maintainability safeguard that will fail\nto compile if the ok type of the Result is later changed\nto a type that can actually occur.

\n
§Examples
\n
\nfn only_bad_news() -> Result<!, String> {\n    Err(\"Oops, it failed\".into())\n}\n\nlet error: String = only_bad_news().into_err();\nprintln!(\"{error}\");
\n
1.0.0 · source

pub fn and<U>(self, res: Result<U, E>) -> Result<U, E>

Returns res if the result is Ok, otherwise returns the Err value of self.

\n

Arguments passed to and are eagerly evaluated; if you are passing the\nresult of a function call, it is recommended to use and_then, which is\nlazily evaluated.

\n
§Examples
\n
let x: Result<u32, &str> = Ok(2);\nlet y: Result<&str, &str> = Err(\"late error\");\nassert_eq!(x.and(y), Err(\"late error\"));\n\nlet x: Result<u32, &str> = Err(\"early error\");\nlet y: Result<&str, &str> = Ok(\"foo\");\nassert_eq!(x.and(y), Err(\"early error\"));\n\nlet x: Result<u32, &str> = Err(\"not a 2\");\nlet y: Result<&str, &str> = Err(\"late error\");\nassert_eq!(x.and(y), Err(\"not a 2\"));\n\nlet x: Result<u32, &str> = Ok(2);\nlet y: Result<&str, &str> = Ok(\"different result type\");\nassert_eq!(x.and(y), Ok(\"different result type\"));
\n
1.0.0 · source

pub fn and_then<U, F>(self, op: F) -> Result<U, E>
where\n F: FnOnce(T) -> Result<U, E>,

Calls op if the result is Ok, otherwise returns the Err value of self.

\n

This function can be used for control flow based on Result values.

\n
§Examples
\n
fn sq_then_to_string(x: u32) -> Result<String, &'static str> {\n    x.checked_mul(x).map(|sq| sq.to_string()).ok_or(\"overflowed\")\n}\n\nassert_eq!(Ok(2).and_then(sq_then_to_string), Ok(4.to_string()));\nassert_eq!(Ok(1_000_000).and_then(sq_then_to_string), Err(\"overflowed\"));\nassert_eq!(Err(\"not a number\").and_then(sq_then_to_string), Err(\"not a number\"));
\n

Often used to chain fallible operations that may return Err.

\n\n
use std::{io::ErrorKind, path::Path};\n\n// Note: on Windows \"/\" maps to \"C:\\\"\nlet root_modified_time = Path::new(\"/\").metadata().and_then(|md| md.modified());\nassert!(root_modified_time.is_ok());\n\nlet should_fail = Path::new(\"/bad/path\").metadata().and_then(|md| md.modified());\nassert!(should_fail.is_err());\nassert_eq!(should_fail.unwrap_err().kind(), ErrorKind::NotFound);
\n
1.0.0 · source

pub fn or<F>(self, res: Result<T, F>) -> Result<T, F>

Returns res if the result is Err, otherwise returns the Ok value of self.

\n

Arguments passed to or are eagerly evaluated; if you are passing the\nresult of a function call, it is recommended to use or_else, which is\nlazily evaluated.

\n
§Examples
\n
let x: Result<u32, &str> = Ok(2);\nlet y: Result<u32, &str> = Err(\"late error\");\nassert_eq!(x.or(y), Ok(2));\n\nlet x: Result<u32, &str> = Err(\"early error\");\nlet y: Result<u32, &str> = Ok(2);\nassert_eq!(x.or(y), Ok(2));\n\nlet x: Result<u32, &str> = Err(\"not a 2\");\nlet y: Result<u32, &str> = Err(\"late error\");\nassert_eq!(x.or(y), Err(\"late error\"));\n\nlet x: Result<u32, &str> = Ok(2);\nlet y: Result<u32, &str> = Ok(100);\nassert_eq!(x.or(y), Ok(2));
\n
1.0.0 · source

pub fn or_else<F, O>(self, op: O) -> Result<T, F>
where\n O: FnOnce(E) -> Result<T, F>,

Calls op if the result is Err, otherwise returns the Ok value of self.

\n

This function can be used for control flow based on result values.

\n
§Examples
\n
fn sq(x: u32) -> Result<u32, u32> { Ok(x * x) }\nfn err(x: u32) -> Result<u32, u32> { Err(x) }\n\nassert_eq!(Ok(2).or_else(sq).or_else(sq), Ok(2));\nassert_eq!(Ok(2).or_else(err).or_else(sq), Ok(2));\nassert_eq!(Err(3).or_else(sq).or_else(err), Ok(9));\nassert_eq!(Err(3).or_else(err).or_else(err), Err(3));
\n
1.0.0 · source

pub fn unwrap_or(self, default: T) -> T

Returns the contained Ok value or a provided default.

\n

Arguments passed to unwrap_or are eagerly evaluated; if you are passing\nthe result of a function call, it is recommended to use unwrap_or_else,\nwhich is lazily evaluated.

\n
§Examples
\n
let default = 2;\nlet x: Result<u32, &str> = Ok(9);\nassert_eq!(x.unwrap_or(default), 9);\n\nlet x: Result<u32, &str> = Err(\"error\");\nassert_eq!(x.unwrap_or(default), default);
\n
1.0.0 · source

pub fn unwrap_or_else<F>(self, op: F) -> T
where\n F: FnOnce(E) -> T,

Returns the contained Ok value or computes it from a closure.

\n
§Examples
\n
fn count(x: &str) -> usize { x.len() }\n\nassert_eq!(Ok(2).unwrap_or_else(count), 2);\nassert_eq!(Err(\"foo\").unwrap_or_else(count), 3);
\n
1.58.0 · source

pub unsafe fn unwrap_unchecked(self) -> T

Returns the contained Ok value, consuming the self value,\nwithout checking that the value is not an Err.

\n
§Safety
\n

Calling this method on an Err is undefined behavior.

\n
§Examples
\n
let x: Result<u32, &str> = Ok(2);\nassert_eq!(unsafe { x.unwrap_unchecked() }, 2);
\n\n
let x: Result<u32, &str> = Err(\"emergency failure\");\nunsafe { x.unwrap_unchecked(); } // Undefined behavior!
\n
1.58.0 · source

pub unsafe fn unwrap_err_unchecked(self) -> E

Returns the contained Err value, consuming the self value,\nwithout checking that the value is not an Ok.

\n
§Safety
\n

Calling this method on an Ok is undefined behavior.

\n
§Examples
\n
let x: Result<u32, &str> = Ok(2);\nunsafe { x.unwrap_err_unchecked() }; // Undefined behavior!
\n\n
let x: Result<u32, &str> = Err(\"emergency failure\");\nassert_eq!(unsafe { x.unwrap_err_unchecked() }, \"emergency failure\");
\n
",0,"avm_server::AVMResult","avm_server::RunnerResult"],["
§

impl<T, E, S> Serialize<S> for Result<T, E>
where\n T: Serialize<S>,\n E: Serialize<S>,\n S: Fallible + ?Sized,

§

fn serialize(\n &self,\n serializer: &mut S,\n) -> Result<<Result<T, E> as Archive>::Resolver, <S as Fallible>::Error>

Writes the dependencies for the object and returns a resolver that can create the archived\ntype.
","Serialize","avm_server::AVMResult","avm_server::RunnerResult"],["
source§

impl<T, E> Serialize for Result<T, E>
where\n T: Serialize,\n E: Serialize,

source§

fn serialize<S>(\n &self,\n serializer: S,\n) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error>
where\n S: Serializer,

Serialize this value into the given Serde serializer. Read more
","Serialize","avm_server::AVMResult","avm_server::RunnerResult"],["
source§

impl<T, TAs, E, EAs> SerializeAs<Result<T, E>> for Result<TAs, EAs>
where\n TAs: SerializeAs<T>,\n EAs: SerializeAs<E>,

source§

fn serialize_as<S>(\n source: &Result<T, E>,\n serializer: S,\n) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error>
where\n S: Serializer,

Serialize this value into the given Serde serializer.
","SerializeAs>","avm_server::AVMResult","avm_server::RunnerResult"],["
1.16.0 · source§

impl<T, U, E> Sum<Result<U, E>> for Result<T, E>
where\n T: Sum<U>,

source§

fn sum<I>(iter: I) -> Result<T, E>
where\n I: Iterator<Item = Result<U, E>>,

Takes each element in the Iterator: if it is an Err, no further\nelements are taken, and the Err is returned. Should no Err\noccur, the sum of all elements is returned.

\n
§Examples
\n

This sums up every integer in a vector, rejecting the sum if a negative\nelement is encountered:

\n\n
let f = |&x: &i32| if x < 0 { Err(\"Negative element found\") } else { Ok(x) };\nlet v = vec![1, 2];\nlet res: Result<i32, _> = v.iter().map(f).sum();\nassert_eq!(res, Ok(3));\nlet v = vec![1, -2];\nlet res: Result<i32, _> = v.iter().map(f).sum();\nassert_eq!(res, Err(\"Negative element found\"));
\n
","Sum>","avm_server::AVMResult","avm_server::RunnerResult"],["
1.61.0 · source§

impl<T, E> Termination for Result<T, E>
where\n T: Termination,\n E: Debug,

source§

fn report(self) -> ExitCode

Is called to get the representation of the value as status code.\nThis status code is returned to the operating system.
","Termination","avm_server::AVMResult","avm_server::RunnerResult"],["
source§

impl<T, E> Try for Result<T, E>

§

type Output = T

🔬This is a nightly-only experimental API. (try_trait_v2)
The type of the value produced by ? when not short-circuiting.
§

type Residual = Result<Infallible, E>

🔬This is a nightly-only experimental API. (try_trait_v2)
The type of the value passed to FromResidual::from_residual\nas part of ? when short-circuiting. Read more
source§

fn from_output(output: <Result<T, E> as Try>::Output) -> Result<T, E>

🔬This is a nightly-only experimental API. (try_trait_v2)
Constructs the type from its Output type. Read more
source§

fn branch(\n self,\n) -> ControlFlow<<Result<T, E> as Try>::Residual, <Result<T, E> as Try>::Output>

🔬This is a nightly-only experimental API. (try_trait_v2)
Used in ? to decide whether the operator should produce a value\n(because this returned ControlFlow::Continue)\nor propagate a value back to the caller\n(because this returned ControlFlow::Break). Read more
","Try","avm_server::AVMResult","avm_server::RunnerResult"],["
source§

impl<T, E> WrapErr<T, E> for Result<T, E>
where\n E: StdError + Send + Sync + 'static,

source§

fn wrap_err<D>(self, msg: D) -> Result<T, Report>
where\n D: Display + Send + Sync + 'static,

Wrap the error value with a new adhoc error
source§

fn wrap_err_with<D, F>(self, msg: F) -> Result<T, Report>
where\n D: Display + Send + Sync + 'static,\n F: FnOnce() -> D,

Wrap the error value with a new adhoc error that is evaluated lazily\nonly once an error does occur.
source§

fn context<D>(self, msg: D) -> Result<T, Report>
where\n D: Display + Send + Sync + 'static,

Compatibility re-export of wrap_err for interop with anyhow
source§

fn with_context<D, F>(self, msg: F) -> Result<T, Report>
where\n D: Display + Send + Sync + 'static,\n F: FnOnce() -> D,

Compatibility re-export of wrap_err_with for interop with anyhow
","WrapErr","avm_server::AVMResult","avm_server::RunnerResult"],["
§

impl<T, E> ComponentType for Result<T, E>
where\n T: ComponentType,\n E: ComponentType,

","ComponentType","avm_server::AVMResult","avm_server::RunnerResult"],["
1.0.0 · source§

impl<T, E> Copy for Result<T, E>
where\n T: Copy,\n E: Copy,

","Copy","avm_server::AVMResult","avm_server::RunnerResult"],["
1.0.0 · source§

impl<T, E> Eq for Result<T, E>
where\n T: Eq,\n E: Eq,

","Eq","avm_server::AVMResult","avm_server::RunnerResult"],["
§

impl<T, E> Lift for Result<T, E>
where\n T: Lift,\n E: Lift,

","Lift","avm_server::AVMResult","avm_server::RunnerResult"],["
§

impl<T, E> Lower for Result<T, E>
where\n T: Lower,\n E: Lower,

","Lower","avm_server::AVMResult","avm_server::RunnerResult"],["
1.0.0 · source§

impl<T, E> StructuralPartialEq for Result<T, E>

","StructuralPartialEq","avm_server::AVMResult","avm_server::RunnerResult"]] +};if (window.register_type_impls) {window.register_type_impls(type_impls);} else {window.pending_type_impls = type_impls;}})() \ No newline at end of file diff --git a/type.impl/marine_core/config/struct.HostImportDescriptor.js b/type.impl/marine_core/config/struct.HostImportDescriptor.js new file mode 100644 index 00000000..f2f2f3f2 --- /dev/null +++ b/type.impl/marine_core/config/struct.HostImportDescriptor.js @@ -0,0 +1,4 @@ +(function() {var type_impls = { +"air_test_utils":[], +"avm_server":[] +};if (window.register_type_impls) {window.register_type_impls(type_impls);} else {window.pending_type_impls = type_impls;}})() \ No newline at end of file diff --git a/type.impl/serde_json/value/enum.Value.js b/type.impl/serde_json/value/enum.Value.js new file mode 100644 index 00000000..d581bd1f --- /dev/null +++ b/type.impl/serde_json/value/enum.Value.js @@ -0,0 +1,3 @@ +(function() {var type_impls = { +"air_test_framework":[["
source§

impl Clone for Value

source§

fn clone(&self) -> Value

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
","Clone","air_test_framework::services::JValue"],["
source§

impl Debug for Value

source§

fn fmt(&self, formatter: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
","Debug","air_test_framework::services::JValue"],["
source§

impl Default for Value

The default value is Value::Null.

\n

This is useful for handling omitted Value fields when deserializing.

\n

§Examples

\n
use serde_json::Value;\n\n#[derive(Deserialize)]\nstruct Settings {\n    level: i32,\n    #[serde(default)]\n    extras: Value,\n}\n\nlet data = r#\" { \"level\": 42 } \"#;\nlet s: Settings = serde_json::from_str(data)?;\n\nassert_eq!(s.level, 42);\nassert_eq!(s.extras, Value::Null);
\n
source§

fn default() -> Value

Returns the “default value” for a type. Read more
","Default","air_test_framework::services::JValue"],["
source§

impl<'de> Deserialize<'de> for Value

source§

fn deserialize<D>(\n deserializer: D,\n) -> Result<Value, <D as Deserializer<'de>>::Error>
where\n D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
","Deserialize<'de>","air_test_framework::services::JValue"],["
source§

impl<'de> Deserializer<'de> for Value

§

type Error = Error

The error type that can be returned if some error occurs during\ndeserialization.
source§

fn deserialize_any<V>(\n self,\n visitor: V,\n) -> Result<<V as Visitor<'de>>::Value, Error>
where\n V: Visitor<'de>,

Require the Deserializer to figure out how to drive the visitor based\non what data type is in the input. Read more
source§

fn deserialize_i8<V>(\n self,\n visitor: V,\n) -> Result<<V as Visitor<'de>>::Value, Error>
where\n V: Visitor<'de>,

Hint that the Deserialize type is expecting an i8 value.
source§

fn deserialize_i16<V>(\n self,\n visitor: V,\n) -> Result<<V as Visitor<'de>>::Value, Error>
where\n V: Visitor<'de>,

Hint that the Deserialize type is expecting an i16 value.
source§

fn deserialize_i32<V>(\n self,\n visitor: V,\n) -> Result<<V as Visitor<'de>>::Value, Error>
where\n V: Visitor<'de>,

Hint that the Deserialize type is expecting an i32 value.
source§

fn deserialize_i64<V>(\n self,\n visitor: V,\n) -> Result<<V as Visitor<'de>>::Value, Error>
where\n V: Visitor<'de>,

Hint that the Deserialize type is expecting an i64 value.
source§

fn deserialize_i128<V>(\n self,\n visitor: V,\n) -> Result<<V as Visitor<'de>>::Value, Error>
where\n V: Visitor<'de>,

Hint that the Deserialize type is expecting an i128 value. Read more
source§

fn deserialize_u8<V>(\n self,\n visitor: V,\n) -> Result<<V as Visitor<'de>>::Value, Error>
where\n V: Visitor<'de>,

Hint that the Deserialize type is expecting a u8 value.
source§

fn deserialize_u16<V>(\n self,\n visitor: V,\n) -> Result<<V as Visitor<'de>>::Value, Error>
where\n V: Visitor<'de>,

Hint that the Deserialize type is expecting a u16 value.
source§

fn deserialize_u32<V>(\n self,\n visitor: V,\n) -> Result<<V as Visitor<'de>>::Value, Error>
where\n V: Visitor<'de>,

Hint that the Deserialize type is expecting a u32 value.
source§

fn deserialize_u64<V>(\n self,\n visitor: V,\n) -> Result<<V as Visitor<'de>>::Value, Error>
where\n V: Visitor<'de>,

Hint that the Deserialize type is expecting a u64 value.
source§

fn deserialize_u128<V>(\n self,\n visitor: V,\n) -> Result<<V as Visitor<'de>>::Value, Error>
where\n V: Visitor<'de>,

Hint that the Deserialize type is expecting an u128 value. Read more
source§

fn deserialize_f32<V>(\n self,\n visitor: V,\n) -> Result<<V as Visitor<'de>>::Value, Error>
where\n V: Visitor<'de>,

Hint that the Deserialize type is expecting a f32 value.
source§

fn deserialize_f64<V>(\n self,\n visitor: V,\n) -> Result<<V as Visitor<'de>>::Value, Error>
where\n V: Visitor<'de>,

Hint that the Deserialize type is expecting a f64 value.
source§

fn deserialize_option<V>(\n self,\n visitor: V,\n) -> Result<<V as Visitor<'de>>::Value, Error>
where\n V: Visitor<'de>,

Hint that the Deserialize type is expecting an optional value. Read more
source§

fn deserialize_enum<V>(\n self,\n _name: &str,\n _variants: &'static [&'static str],\n visitor: V,\n) -> Result<<V as Visitor<'de>>::Value, Error>
where\n V: Visitor<'de>,

Hint that the Deserialize type is expecting an enum value with a\nparticular name and possible variants.
source§

fn deserialize_newtype_struct<V>(\n self,\n name: &'static str,\n visitor: V,\n) -> Result<<V as Visitor<'de>>::Value, Error>
where\n V: Visitor<'de>,

Hint that the Deserialize type is expecting a newtype struct with a\nparticular name.
source§

fn deserialize_bool<V>(\n self,\n visitor: V,\n) -> Result<<V as Visitor<'de>>::Value, Error>
where\n V: Visitor<'de>,

Hint that the Deserialize type is expecting a bool value.
source§

fn deserialize_char<V>(\n self,\n visitor: V,\n) -> Result<<V as Visitor<'de>>::Value, Error>
where\n V: Visitor<'de>,

Hint that the Deserialize type is expecting a char value.
source§

fn deserialize_str<V>(\n self,\n visitor: V,\n) -> Result<<V as Visitor<'de>>::Value, Error>
where\n V: Visitor<'de>,

Hint that the Deserialize type is expecting a string value and does\nnot benefit from taking ownership of buffered data owned by the\nDeserializer. Read more
source§

fn deserialize_string<V>(\n self,\n visitor: V,\n) -> Result<<V as Visitor<'de>>::Value, Error>
where\n V: Visitor<'de>,

Hint that the Deserialize type is expecting a string value and would\nbenefit from taking ownership of buffered data owned by the\nDeserializer. Read more
source§

fn deserialize_bytes<V>(\n self,\n visitor: V,\n) -> Result<<V as Visitor<'de>>::Value, Error>
where\n V: Visitor<'de>,

Hint that the Deserialize type is expecting a byte array and does not\nbenefit from taking ownership of buffered data owned by the\nDeserializer. Read more
source§

fn deserialize_byte_buf<V>(\n self,\n visitor: V,\n) -> Result<<V as Visitor<'de>>::Value, Error>
where\n V: Visitor<'de>,

Hint that the Deserialize type is expecting a byte array and would\nbenefit from taking ownership of buffered data owned by the\nDeserializer. Read more
source§

fn deserialize_unit<V>(\n self,\n visitor: V,\n) -> Result<<V as Visitor<'de>>::Value, Error>
where\n V: Visitor<'de>,

Hint that the Deserialize type is expecting a unit value.
source§

fn deserialize_unit_struct<V>(\n self,\n _name: &'static str,\n visitor: V,\n) -> Result<<V as Visitor<'de>>::Value, Error>
where\n V: Visitor<'de>,

Hint that the Deserialize type is expecting a unit struct with a\nparticular name.
source§

fn deserialize_seq<V>(\n self,\n visitor: V,\n) -> Result<<V as Visitor<'de>>::Value, Error>
where\n V: Visitor<'de>,

Hint that the Deserialize type is expecting a sequence of values.
source§

fn deserialize_tuple<V>(\n self,\n _len: usize,\n visitor: V,\n) -> Result<<V as Visitor<'de>>::Value, Error>
where\n V: Visitor<'de>,

Hint that the Deserialize type is expecting a sequence of values and\nknows how many values there are without looking at the serialized data.
source§

fn deserialize_tuple_struct<V>(\n self,\n _name: &'static str,\n _len: usize,\n visitor: V,\n) -> Result<<V as Visitor<'de>>::Value, Error>
where\n V: Visitor<'de>,

Hint that the Deserialize type is expecting a tuple struct with a\nparticular name and number of fields.
source§

fn deserialize_map<V>(\n self,\n visitor: V,\n) -> Result<<V as Visitor<'de>>::Value, Error>
where\n V: Visitor<'de>,

Hint that the Deserialize type is expecting a map of key-value pairs.
source§

fn deserialize_struct<V>(\n self,\n _name: &'static str,\n _fields: &'static [&'static str],\n visitor: V,\n) -> Result<<V as Visitor<'de>>::Value, Error>
where\n V: Visitor<'de>,

Hint that the Deserialize type is expecting a struct with a particular\nname and fields.
source§

fn deserialize_identifier<V>(\n self,\n visitor: V,\n) -> Result<<V as Visitor<'de>>::Value, Error>
where\n V: Visitor<'de>,

Hint that the Deserialize type is expecting the name of a struct\nfield or the discriminant of an enum variant.
source§

fn deserialize_ignored_any<V>(\n self,\n visitor: V,\n) -> Result<<V as Visitor<'de>>::Value, Error>
where\n V: Visitor<'de>,

Hint that the Deserialize type needs to deserialize a value whose type\ndoesn’t matter because it is ignored. Read more
source§

fn is_human_readable(&self) -> bool

Determine whether Deserialize implementations should expect to\ndeserialize their human-readable form. Read more
","Deserializer<'de>","air_test_framework::services::JValue"],["
source§

impl Display for Value

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Display a JSON value as a string.

\n\n
let json = json!({ \"city\": \"London\", \"street\": \"10 Downing Street\" });\n\n// Compact format:\n//\n// {\"city\":\"London\",\"street\":\"10 Downing Street\"}\nlet compact = format!(\"{}\", json);\nassert_eq!(compact,\n    \"{\\\"city\\\":\\\"London\\\",\\\"street\\\":\\\"10 Downing Street\\\"}\");\n\n// Pretty format:\n//\n// {\n//   \"city\": \"London\",\n//   \"street\": \"10 Downing Street\"\n// }\nlet pretty = format!(\"{:#}\", json);\nassert_eq!(pretty,\n    \"{\\n  \\\"city\\\": \\\"London\\\",\\n  \\\"street\\\": \\\"10 Downing Street\\\"\\n}\");
\n
","Display","air_test_framework::services::JValue"],["
source§

impl<T> From<&[T]> for Value
where\n T: Clone + Into<Value>,

source§

fn from(f: &[T]) -> Value

Convert a slice to Value::Array.

\n
§Examples
\n
use serde_json::Value;\n\nlet v: &[&str] = &[\"lorem\", \"ipsum\", \"dolor\"];\nlet x: Value = v.into();
\n
","From<&[T]>","air_test_framework::services::JValue"],["
source§

impl From<&Number> for Value

source§

fn from(number: &Number) -> Value

Converts to this type from the input type.
","From<&Number>","air_test_framework::services::JValue"],["
source§

impl From<&str> for Value

source§

fn from(f: &str) -> Value

Convert string slice to Value::String.

\n
§Examples
\n
use serde_json::Value;\n\nlet s: &str = \"lorem\";\nlet x: Value = s.into();
\n
","From<&str>","air_test_framework::services::JValue"],["
source§

impl From<()> for Value

source§

fn from(_: ()) -> Value

Convert () to Value::Null.

\n
§Examples
\n
use serde_json::Value;\n\nlet u = ();\nlet x: Value = u.into();
\n
","From<()>","air_test_framework::services::JValue"],["
source§

impl<'a> From<Cow<'a, str>> for Value

source§

fn from(f: Cow<'a, str>) -> Value

Convert copy-on-write string to Value::String.

\n
§Examples
\n
use serde_json::Value;\nuse std::borrow::Cow;\n\nlet s: Cow<str> = Cow::Borrowed(\"lorem\");\nlet x: Value = s.into();
\n\n
use serde_json::Value;\nuse std::borrow::Cow;\n\nlet s: Cow<str> = Cow::Owned(\"lorem\".to_string());\nlet x: Value = s.into();
\n
","From>","air_test_framework::services::JValue"],["
source§

impl From<Map<String, Value>> for Value

source§

fn from(f: Map<String, Value>) -> Value

Convert map (with string keys) to Value::Object.

\n
§Examples
\n
use serde_json::{Map, Value};\n\nlet mut m = Map::new();\nm.insert(\"Lorem\".to_string(), \"ipsum\".into());\nlet x: Value = m.into();
\n
","From>","air_test_framework::services::JValue"],["
source§

impl From<Number> for Value

source§

fn from(f: Number) -> Value

Convert Number to Value::Number.

\n
§Examples
\n
use serde_json::{Number, Value};\n\nlet n = Number::from(7);\nlet x: Value = n.into();
\n
","From","air_test_framework::services::JValue"],["
source§

impl From<Number> for Value

source§

fn from(number: Number) -> Value

Converts to this type from the input type.
","From","air_test_framework::services::JValue"],["
source§

impl<T> From<Option<T>> for Value
where\n T: Into<Value>,

source§

fn from(opt: Option<T>) -> Value

Converts to this type from the input type.
","From>","air_test_framework::services::JValue"],["
source§

impl From<String> for Value

source§

fn from(f: String) -> Value

Convert String to Value::String.

\n
§Examples
\n
use serde_json::Value;\n\nlet s: String = \"lorem\".to_string();\nlet x: Value = s.into();
\n
","From","air_test_framework::services::JValue"],["
source§

impl<T> From<Vec<T>> for Value
where\n T: Into<Value>,

source§

fn from(f: Vec<T>) -> Value

Convert a Vec to Value::Array.

\n
§Examples
\n
use serde_json::Value;\n\nlet v = vec![\"lorem\", \"ipsum\", \"dolor\"];\nlet x: Value = v.into();
\n
","From>","air_test_framework::services::JValue"],["
source§

impl From<bool> for Value

source§

fn from(f: bool) -> Value

Convert boolean to Value::Bool.

\n
§Examples
\n
use serde_json::Value;\n\nlet b = false;\nlet x: Value = b.into();
\n
","From","air_test_framework::services::JValue"],["
source§

impl From<f32> for Value

source§

fn from(f: f32) -> Value

Convert 32-bit floating point number to Value::Number, or\nValue::Null if infinite or NaN.

\n
§Examples
\n
use serde_json::Value;\n\nlet f: f32 = 13.37;\nlet x: Value = f.into();
\n
","From","air_test_framework::services::JValue"],["
source§

impl From<f64> for Value

source§

fn from(f: f64) -> Value

Convert 64-bit floating point number to Value::Number, or\nValue::Null if infinite or NaN.

\n
§Examples
\n
use serde_json::Value;\n\nlet f: f64 = 13.37;\nlet x: Value = f.into();
\n
","From","air_test_framework::services::JValue"],["
source§

impl From<i16> for Value

source§

fn from(n: i16) -> Value

Converts to this type from the input type.
","From","air_test_framework::services::JValue"],["
source§

impl From<i32> for Value

source§

fn from(n: i32) -> Value

Converts to this type from the input type.
","From","air_test_framework::services::JValue"],["
source§

impl From<i64> for Value

source§

fn from(n: i64) -> Value

Converts to this type from the input type.
","From","air_test_framework::services::JValue"],["
source§

impl From<i8> for Value

source§

fn from(n: i8) -> Value

Converts to this type from the input type.
","From","air_test_framework::services::JValue"],["
source§

impl From<isize> for Value

source§

fn from(n: isize) -> Value

Converts to this type from the input type.
","From","air_test_framework::services::JValue"],["
source§

impl From<u16> for Value

source§

fn from(n: u16) -> Value

Converts to this type from the input type.
","From","air_test_framework::services::JValue"],["
source§

impl From<u32> for Value

source§

fn from(n: u32) -> Value

Converts to this type from the input type.
","From","air_test_framework::services::JValue"],["
source§

impl From<u64> for Value

source§

fn from(n: u64) -> Value

Converts to this type from the input type.
","From","air_test_framework::services::JValue"],["
source§

impl From<u8> for Value

source§

fn from(n: u8) -> Value

Converts to this type from the input type.
","From","air_test_framework::services::JValue"],["
source§

impl From<usize> for Value

source§

fn from(n: usize) -> Value

Converts to this type from the input type.
","From","air_test_framework::services::JValue"],["
source§

impl<K, V> FromIterator<(K, V)> for Value
where\n K: Into<String>,\n V: Into<Value>,

source§

fn from_iter<I>(iter: I) -> Value
where\n I: IntoIterator<Item = (K, V)>,

Create a Value::Object by collecting an iterator of key-value pairs.

\n
§Examples
\n
use serde_json::Value;\n\nlet v: Vec<_> = vec![(\"lorem\", 40), (\"ipsum\", 2)];\nlet x: Value = v.into_iter().collect();
\n
","FromIterator<(K, V)>","air_test_framework::services::JValue"],["
source§

impl<T> FromIterator<T> for Value
where\n T: Into<Value>,

source§

fn from_iter<I>(iter: I) -> Value
where\n I: IntoIterator<Item = T>,

Create a Value::Array by collecting an iterator of array elements.

\n
§Examples
\n
use serde_json::Value;\n\nlet v = std::iter::repeat(42).take(5);\nlet x: Value = v.collect();
\n\n
use serde_json::Value;\n\nlet v: Vec<_> = vec![\"lorem\", \"ipsum\", \"dolor\"];\nlet x: Value = v.into_iter().collect();
\n\n
use std::iter::FromIterator;\nuse serde_json::Value;\n\nlet x: Value = Value::from_iter(vec![\"lorem\", \"ipsum\", \"dolor\"]);
\n
","FromIterator","air_test_framework::services::JValue"],["
source§

impl FromStr for Value

§

type Err = Error

The associated error which can be returned from parsing.
source§

fn from_str(s: &str) -> Result<Value, Error>

Parses a string s to return a value of this type. Read more
","FromStr","air_test_framework::services::JValue"],["
source§

impl<I> Index<I> for Value
where\n I: Index,

source§

fn index(&self, index: I) -> &Value

Index into a serde_json::Value using the syntax value[0] or\nvalue[\"k\"].

\n

Returns Value::Null if the type of self does not match the type of\nthe index, for example if the index is a string and self is an array\nor a number. Also returns Value::Null if the given key does not exist\nin the map or the given index is not within the bounds of the array.

\n

For retrieving deeply nested values, you should have a look at the\nValue::pointer method.

\n
§Examples
\n
let data = json!({\n    \"x\": {\n        \"y\": [\"z\", \"zz\"]\n    }\n});\n\nassert_eq!(data[\"x\"][\"y\"], json!([\"z\", \"zz\"]));\nassert_eq!(data[\"x\"][\"y\"][0], json!(\"z\"));\n\nassert_eq!(data[\"a\"], json!(null)); // returns null for undefined values\nassert_eq!(data[\"a\"][\"b\"], json!(null)); // does not panic
\n
§

type Output = Value

The returned type after indexing.
","Index","air_test_framework::services::JValue"],["
source§

impl<I> IndexMut<I> for Value
where\n I: Index,

source§

fn index_mut(&mut self, index: I) -> &mut Value

Write into a serde_json::Value using the syntax value[0] = ... or\nvalue[\"k\"] = ....

\n

If the index is a number, the value must be an array of length bigger\nthan the index. Indexing into a value that is not an array or an array\nthat is too small will panic.

\n

If the index is a string, the value must be an object or null which is\ntreated like an empty object. If the key is not already present in the\nobject, it will be inserted with a value of null. Indexing into a value\nthat is neither an object nor null will panic.

\n
§Examples
\n
let mut data = json!({ \"x\": 0 });\n\n// replace an existing key\ndata[\"x\"] = json!(1);\n\n// insert a new key\ndata[\"y\"] = json!([false, false, false]);\n\n// replace an array value\ndata[\"y\"][0] = json!(true);\n\n// inserted a deeply nested key\ndata[\"a\"][\"b\"][\"c\"][\"d\"] = json!(true);\n\nprintln!(\"{}\", data);
\n
","IndexMut","air_test_framework::services::JValue"],["
source§

impl<'de> IntoDeserializer<'de, Error> for Value

§

type Deserializer = Value

The type of the deserializer being converted into.
source§

fn into_deserializer(\n self,\n) -> <Value as IntoDeserializer<'de, Error>>::Deserializer

Convert this value into a deserializer.
","IntoDeserializer<'de, Error>","air_test_framework::services::JValue"],["
source§

impl PartialEq<&str> for Value

source§

fn eq(&self, other: &&str) -> bool

This method tests for self and other values to be equal, and is used\nby ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always\nsufficient, and should not be overridden without very good reason.
","PartialEq<&str>","air_test_framework::services::JValue"],["
source§

impl PartialEq<String> for Value

source§

fn eq(&self, other: &String) -> bool

This method tests for self and other values to be equal, and is used\nby ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always\nsufficient, and should not be overridden without very good reason.
","PartialEq","air_test_framework::services::JValue"],["
source§

impl PartialEq<bool> for Value

source§

fn eq(&self, other: &bool) -> bool

This method tests for self and other values to be equal, and is used\nby ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always\nsufficient, and should not be overridden without very good reason.
","PartialEq","air_test_framework::services::JValue"],["
source§

impl PartialEq<f32> for Value

source§

fn eq(&self, other: &f32) -> bool

This method tests for self and other values to be equal, and is used\nby ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always\nsufficient, and should not be overridden without very good reason.
","PartialEq","air_test_framework::services::JValue"],["
source§

impl PartialEq<f64> for Value

source§

fn eq(&self, other: &f64) -> bool

This method tests for self and other values to be equal, and is used\nby ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always\nsufficient, and should not be overridden without very good reason.
","PartialEq","air_test_framework::services::JValue"],["
source§

impl PartialEq<i16> for Value

source§

fn eq(&self, other: &i16) -> bool

This method tests for self and other values to be equal, and is used\nby ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always\nsufficient, and should not be overridden without very good reason.
","PartialEq","air_test_framework::services::JValue"],["
source§

impl PartialEq<i32> for Value

source§

fn eq(&self, other: &i32) -> bool

This method tests for self and other values to be equal, and is used\nby ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always\nsufficient, and should not be overridden without very good reason.
","PartialEq","air_test_framework::services::JValue"],["
source§

impl PartialEq<i64> for Value

source§

fn eq(&self, other: &i64) -> bool

This method tests for self and other values to be equal, and is used\nby ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always\nsufficient, and should not be overridden without very good reason.
","PartialEq","air_test_framework::services::JValue"],["
source§

impl PartialEq<i8> for Value

source§

fn eq(&self, other: &i8) -> bool

This method tests for self and other values to be equal, and is used\nby ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always\nsufficient, and should not be overridden without very good reason.
","PartialEq","air_test_framework::services::JValue"],["
source§

impl PartialEq<isize> for Value

source§

fn eq(&self, other: &isize) -> bool

This method tests for self and other values to be equal, and is used\nby ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always\nsufficient, and should not be overridden without very good reason.
","PartialEq","air_test_framework::services::JValue"],["
source§

impl PartialEq<str> for Value

source§

fn eq(&self, other: &str) -> bool

This method tests for self and other values to be equal, and is used\nby ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always\nsufficient, and should not be overridden without very good reason.
","PartialEq","air_test_framework::services::JValue"],["
source§

impl PartialEq<u16> for Value

source§

fn eq(&self, other: &u16) -> bool

This method tests for self and other values to be equal, and is used\nby ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always\nsufficient, and should not be overridden without very good reason.
","PartialEq","air_test_framework::services::JValue"],["
source§

impl PartialEq<u32> for Value

source§

fn eq(&self, other: &u32) -> bool

This method tests for self and other values to be equal, and is used\nby ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always\nsufficient, and should not be overridden without very good reason.
","PartialEq","air_test_framework::services::JValue"],["
source§

impl PartialEq<u64> for Value

source§

fn eq(&self, other: &u64) -> bool

This method tests for self and other values to be equal, and is used\nby ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always\nsufficient, and should not be overridden without very good reason.
","PartialEq","air_test_framework::services::JValue"],["
source§

impl PartialEq<u8> for Value

source§

fn eq(&self, other: &u8) -> bool

This method tests for self and other values to be equal, and is used\nby ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always\nsufficient, and should not be overridden without very good reason.
","PartialEq","air_test_framework::services::JValue"],["
source§

impl PartialEq<usize> for Value

source§

fn eq(&self, other: &usize) -> bool

This method tests for self and other values to be equal, and is used\nby ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always\nsufficient, and should not be overridden without very good reason.
","PartialEq","air_test_framework::services::JValue"],["
source§

impl PartialEq for Value

source§

fn eq(&self, other: &Value) -> bool

This method tests for self and other values to be equal, and is used\nby ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always\nsufficient, and should not be overridden without very good reason.
","PartialEq","air_test_framework::services::JValue"],["
source§

impl Serialize for Value

source§

fn serialize<S>(\n &self,\n serializer: S,\n) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error>
where\n S: Serializer,

Serialize this value into the given Serde serializer. Read more
","Serialize","air_test_framework::services::JValue"],["
source§

impl Value

source

pub fn get<I>(&self, index: I) -> Option<&Value>
where\n I: Index,

Index into a JSON array or map. A string index can be used to access a\nvalue in a map, and a usize index can be used to access an element of an\narray.

\n

Returns None if the type of self does not match the type of the\nindex, for example if the index is a string and self is an array or a\nnumber. Also returns None if the given key does not exist in the map\nor the given index is not within the bounds of the array.

\n\n
let object = json!({ \"A\": 65, \"B\": 66, \"C\": 67 });\nassert_eq!(*object.get(\"A\").unwrap(), json!(65));\n\nlet array = json!([ \"A\", \"B\", \"C\" ]);\nassert_eq!(*array.get(2).unwrap(), json!(\"C\"));\n\nassert_eq!(array.get(\"A\"), None);
\n

Square brackets can also be used to index into a value in a more concise\nway. This returns Value::Null in cases where get would have returned\nNone.

\n\n
let object = json!({\n    \"A\": [\"a\", \"á\", \"à\"],\n    \"B\": [\"b\", \"b́\"],\n    \"C\": [\"c\", \"ć\", \"ć̣\", \"ḉ\"],\n});\nassert_eq!(object[\"B\"][0], json!(\"b\"));\n\nassert_eq!(object[\"D\"], json!(null));\nassert_eq!(object[0][\"x\"][\"y\"][\"z\"], json!(null));
\n
source

pub fn get_mut<I>(&mut self, index: I) -> Option<&mut Value>
where\n I: Index,

Mutably index into a JSON array or map. A string index can be used to\naccess a value in a map, and a usize index can be used to access an\nelement of an array.

\n

Returns None if the type of self does not match the type of the\nindex, for example if the index is a string and self is an array or a\nnumber. Also returns None if the given key does not exist in the map\nor the given index is not within the bounds of the array.

\n\n
let mut object = json!({ \"A\": 65, \"B\": 66, \"C\": 67 });\n*object.get_mut(\"A\").unwrap() = json!(69);\n\nlet mut array = json!([ \"A\", \"B\", \"C\" ]);\n*array.get_mut(2).unwrap() = json!(\"D\");
\n
source

pub fn is_object(&self) -> bool

Returns true if the Value is an Object. Returns false otherwise.

\n

For any Value on which is_object returns true, as_object and\nas_object_mut are guaranteed to return the map representation of the\nobject.

\n\n
let obj = json!({ \"a\": { \"nested\": true }, \"b\": [\"an\", \"array\"] });\n\nassert!(obj.is_object());\nassert!(obj[\"a\"].is_object());\n\n// array, not an object\nassert!(!obj[\"b\"].is_object());
\n
source

pub fn as_object(&self) -> Option<&Map<String, Value>>

If the Value is an Object, returns the associated Map. Returns None\notherwise.

\n\n
let v = json!({ \"a\": { \"nested\": true }, \"b\": [\"an\", \"array\"] });\n\n// The length of `{\"nested\": true}` is 1 entry.\nassert_eq!(v[\"a\"].as_object().unwrap().len(), 1);\n\n// The array `[\"an\", \"array\"]` is not an object.\nassert_eq!(v[\"b\"].as_object(), None);
\n
source

pub fn as_object_mut(&mut self) -> Option<&mut Map<String, Value>>

If the Value is an Object, returns the associated mutable Map.\nReturns None otherwise.

\n\n
let mut v = json!({ \"a\": { \"nested\": true } });\n\nv[\"a\"].as_object_mut().unwrap().clear();\nassert_eq!(v, json!({ \"a\": {} }));
\n
source

pub fn is_array(&self) -> bool

Returns true if the Value is an Array. Returns false otherwise.

\n

For any Value on which is_array returns true, as_array and\nas_array_mut are guaranteed to return the vector representing the\narray.

\n\n
let obj = json!({ \"a\": [\"an\", \"array\"], \"b\": { \"an\": \"object\" } });\n\nassert!(obj[\"a\"].is_array());\n\n// an object, not an array\nassert!(!obj[\"b\"].is_array());
\n
source

pub fn as_array(&self) -> Option<&Vec<Value>>

If the Value is an Array, returns the associated vector. Returns None\notherwise.

\n\n
let v = json!({ \"a\": [\"an\", \"array\"], \"b\": { \"an\": \"object\" } });\n\n// The length of `[\"an\", \"array\"]` is 2 elements.\nassert_eq!(v[\"a\"].as_array().unwrap().len(), 2);\n\n// The object `{\"an\": \"object\"}` is not an array.\nassert_eq!(v[\"b\"].as_array(), None);
\n
source

pub fn as_array_mut(&mut self) -> Option<&mut Vec<Value>>

If the Value is an Array, returns the associated mutable vector.\nReturns None otherwise.

\n\n
let mut v = json!({ \"a\": [\"an\", \"array\"] });\n\nv[\"a\"].as_array_mut().unwrap().clear();\nassert_eq!(v, json!({ \"a\": [] }));
\n
source

pub fn is_string(&self) -> bool

Returns true if the Value is a String. Returns false otherwise.

\n

For any Value on which is_string returns true, as_str is guaranteed\nto return the string slice.

\n\n
let v = json!({ \"a\": \"some string\", \"b\": false });\n\nassert!(v[\"a\"].is_string());\n\n// The boolean `false` is not a string.\nassert!(!v[\"b\"].is_string());
\n
source

pub fn as_str(&self) -> Option<&str>

If the Value is a String, returns the associated str. Returns None\notherwise.

\n\n
let v = json!({ \"a\": \"some string\", \"b\": false });\n\nassert_eq!(v[\"a\"].as_str(), Some(\"some string\"));\n\n// The boolean `false` is not a string.\nassert_eq!(v[\"b\"].as_str(), None);\n\n// JSON values are printed in JSON representation, so strings are in quotes.\n//\n//    The value is: \"some string\"\nprintln!(\"The value is: {}\", v[\"a\"]);\n\n// Rust strings are printed without quotes.\n//\n//    The value is: some string\nprintln!(\"The value is: {}\", v[\"a\"].as_str().unwrap());
\n
source

pub fn is_number(&self) -> bool

Returns true if the Value is a Number. Returns false otherwise.

\n\n
let v = json!({ \"a\": 1, \"b\": \"2\" });\n\nassert!(v[\"a\"].is_number());\n\n// The string `\"2\"` is a string, not a number.\nassert!(!v[\"b\"].is_number());
\n
source

pub fn as_number(&self) -> Option<&Number>

If the Value is a Number, returns the associated Number. Returns\nNone otherwise.

\n\n
let v = json!({ \"a\": 1, \"b\": 2.2, \"c\": -3, \"d\": \"4\" });\n\nassert_eq!(v[\"a\"].as_number(), Some(&Number::from(1u64)));\nassert_eq!(v[\"b\"].as_number(), Some(&Number::from_f64(2.2).unwrap()));\nassert_eq!(v[\"c\"].as_number(), Some(&Number::from(-3i64)));\n\n// The string `\"4\"` is not a number.\nassert_eq!(v[\"d\"].as_number(), None);
\n
source

pub fn is_i64(&self) -> bool

Returns true if the Value is an integer between i64::MIN and\ni64::MAX.

\n

For any Value on which is_i64 returns true, as_i64 is guaranteed to\nreturn the integer value.

\n\n
let big = i64::max_value() as u64 + 10;\nlet v = json!({ \"a\": 64, \"b\": big, \"c\": 256.0 });\n\nassert!(v[\"a\"].is_i64());\n\n// Greater than i64::MAX.\nassert!(!v[\"b\"].is_i64());\n\n// Numbers with a decimal point are not considered integers.\nassert!(!v[\"c\"].is_i64());
\n
source

pub fn is_u64(&self) -> bool

Returns true if the Value is an integer between zero and u64::MAX.

\n

For any Value on which is_u64 returns true, as_u64 is guaranteed to\nreturn the integer value.

\n\n
let v = json!({ \"a\": 64, \"b\": -64, \"c\": 256.0 });\n\nassert!(v[\"a\"].is_u64());\n\n// Negative integer.\nassert!(!v[\"b\"].is_u64());\n\n// Numbers with a decimal point are not considered integers.\nassert!(!v[\"c\"].is_u64());
\n
source

pub fn is_f64(&self) -> bool

Returns true if the Value is a number that can be represented by f64.

\n

For any Value on which is_f64 returns true, as_f64 is guaranteed to\nreturn the floating point value.

\n

Currently this function returns true if and only if both is_i64 and\nis_u64 return false but this is not a guarantee in the future.

\n\n
let v = json!({ \"a\": 256.0, \"b\": 64, \"c\": -64 });\n\nassert!(v[\"a\"].is_f64());\n\n// Integers.\nassert!(!v[\"b\"].is_f64());\nassert!(!v[\"c\"].is_f64());
\n
source

pub fn as_i64(&self) -> Option<i64>

If the Value is an integer, represent it as i64 if possible. Returns\nNone otherwise.

\n\n
let big = i64::max_value() as u64 + 10;\nlet v = json!({ \"a\": 64, \"b\": big, \"c\": 256.0 });\n\nassert_eq!(v[\"a\"].as_i64(), Some(64));\nassert_eq!(v[\"b\"].as_i64(), None);\nassert_eq!(v[\"c\"].as_i64(), None);
\n
source

pub fn as_u64(&self) -> Option<u64>

If the Value is an integer, represent it as u64 if possible. Returns\nNone otherwise.

\n\n
let v = json!({ \"a\": 64, \"b\": -64, \"c\": 256.0 });\n\nassert_eq!(v[\"a\"].as_u64(), Some(64));\nassert_eq!(v[\"b\"].as_u64(), None);\nassert_eq!(v[\"c\"].as_u64(), None);
\n
source

pub fn as_f64(&self) -> Option<f64>

If the Value is a number, represent it as f64 if possible. Returns\nNone otherwise.

\n\n
let v = json!({ \"a\": 256.0, \"b\": 64, \"c\": -64 });\n\nassert_eq!(v[\"a\"].as_f64(), Some(256.0));\nassert_eq!(v[\"b\"].as_f64(), Some(64.0));\nassert_eq!(v[\"c\"].as_f64(), Some(-64.0));
\n
source

pub fn is_boolean(&self) -> bool

Returns true if the Value is a Boolean. Returns false otherwise.

\n

For any Value on which is_boolean returns true, as_bool is\nguaranteed to return the boolean value.

\n\n
let v = json!({ \"a\": false, \"b\": \"false\" });\n\nassert!(v[\"a\"].is_boolean());\n\n// The string `\"false\"` is a string, not a boolean.\nassert!(!v[\"b\"].is_boolean());
\n
source

pub fn as_bool(&self) -> Option<bool>

If the Value is a Boolean, returns the associated bool. Returns None\notherwise.

\n\n
let v = json!({ \"a\": false, \"b\": \"false\" });\n\nassert_eq!(v[\"a\"].as_bool(), Some(false));\n\n// The string `\"false\"` is a string, not a boolean.\nassert_eq!(v[\"b\"].as_bool(), None);
\n
source

pub fn is_null(&self) -> bool

Returns true if the Value is a Null. Returns false otherwise.

\n

For any Value on which is_null returns true, as_null is guaranteed\nto return Some(()).

\n\n
let v = json!({ \"a\": null, \"b\": false });\n\nassert!(v[\"a\"].is_null());\n\n// The boolean `false` is not null.\nassert!(!v[\"b\"].is_null());
\n
source

pub fn as_null(&self) -> Option<()>

If the Value is a Null, returns (). Returns None otherwise.

\n\n
let v = json!({ \"a\": null, \"b\": false });\n\nassert_eq!(v[\"a\"].as_null(), Some(()));\n\n// The boolean `false` is not null.\nassert_eq!(v[\"b\"].as_null(), None);
\n
source

pub fn pointer(&self, pointer: &str) -> Option<&Value>

Looks up a value by a JSON Pointer.

\n

JSON Pointer defines a string syntax for identifying a specific value\nwithin a JavaScript Object Notation (JSON) document.

\n

A Pointer is a Unicode string with the reference tokens separated by /.\nInside tokens / is replaced by ~1 and ~ is replaced by ~0. The\naddressed value is returned and if there is no such value None is\nreturned.

\n

For more information read RFC6901.

\n
§Examples
\n
let data = json!({\n    \"x\": {\n        \"y\": [\"z\", \"zz\"]\n    }\n});\n\nassert_eq!(data.pointer(\"/x/y/1\").unwrap(), &json!(\"zz\"));\nassert_eq!(data.pointer(\"/a/b/c\"), None);
\n
source

pub fn pointer_mut(&mut self, pointer: &str) -> Option<&mut Value>

Looks up a value by a JSON Pointer and returns a mutable reference to\nthat value.

\n

JSON Pointer defines a string syntax for identifying a specific value\nwithin a JavaScript Object Notation (JSON) document.

\n

A Pointer is a Unicode string with the reference tokens separated by /.\nInside tokens / is replaced by ~1 and ~ is replaced by ~0. The\naddressed value is returned and if there is no such value None is\nreturned.

\n

For more information read RFC6901.

\n
§Example of Use
\n
use serde_json::Value;\n\nfn main() {\n    let s = r#\"{\"x\": 1.0, \"y\": 2.0}\"#;\n    let mut value: Value = serde_json::from_str(s).unwrap();\n\n    // Check value using read-only pointer\n    assert_eq!(value.pointer(\"/x\"), Some(&1.0.into()));\n    // Change value with direct assignment\n    *value.pointer_mut(\"/x\").unwrap() = 1.5.into();\n    // Check that new value was written\n    assert_eq!(value.pointer(\"/x\"), Some(&1.5.into()));\n    // Or change the value only if it exists\n    value.pointer_mut(\"/x\").map(|v| *v = 1.5.into());\n\n    // \"Steal\" ownership of a value. Can replace with any valid Value.\n    let old_x = value.pointer_mut(\"/x\").map(Value::take).unwrap();\n    assert_eq!(old_x, 1.5);\n    assert_eq!(value.pointer(\"/x\").unwrap(), &Value::Null);\n}
\n
source

pub fn take(&mut self) -> Value

Takes the value out of the Value, leaving a Null in its place.

\n\n
let mut v = json!({ \"x\": \"y\" });\nassert_eq!(v[\"x\"].take(), json!(\"y\"));\nassert_eq!(v, json!({ \"x\": null }));
\n
",0,"air_test_framework::services::JValue"],["
source§

impl Eq for Value

","Eq","air_test_framework::services::JValue"],["
source§

impl StructuralPartialEq for Value

","StructuralPartialEq","air_test_framework::services::JValue"]] +};if (window.register_type_impls) {window.register_type_impls(type_impls);} else {window.pending_type_impls = type_impls;}})() \ No newline at end of file diff --git a/type.impl/std/collections/hash/map/struct.HashMap.js b/type.impl/std/collections/hash/map/struct.HashMap.js new file mode 100644 index 00000000..835fc385 --- /dev/null +++ b/type.impl/std/collections/hash/map/struct.HashMap.js @@ -0,0 +1,6 @@ +(function() {var type_impls = { +"air_interpreter_interface":[["
§

impl<K, V, S> Archive for HashMap<K, V, S>
where\n K: Archive + Hash + Eq,\n V: Archive,\n <K as Archive>::Archived: Hash + Eq,

§

type Archived = ArchivedHashMap<<K as Archive>::Archived, <V as Archive>::Archived>

The archived representation of this type. Read more
§

type Resolver = HashMapResolver

The resolver for this type. It must contain all the additional information from serializing\nneeded to make the archived type from the normal type.
§

unsafe fn resolve(\n &self,\n pos: usize,\n resolver: <HashMap<K, V, S> as Archive>::Resolver,\n out: *mut <HashMap<K, V, S> as Archive>::Archived,\n)

Creates the archived version of this value at the given position and writes it to the given\noutput. Read more
","Archive","air_interpreter_interface::call_request_parameters::CallRequests","air_interpreter_interface::call_service_result::CallResults"],["
1.0.0 · source§

impl<K, V, S> Clone for HashMap<K, V, S>
where\n K: Clone,\n V: Clone,\n S: Clone,

source§

fn clone(&self) -> HashMap<K, V, S>

Returns a copy of the value. Read more
source§

fn clone_from(&mut self, source: &HashMap<K, V, S>)

Performs copy-assignment from source. Read more
","Clone","air_interpreter_interface::call_request_parameters::CallRequests","air_interpreter_interface::call_service_result::CallResults"],["
1.0.0 · source§

impl<K, V, S> Debug for HashMap<K, V, S>
where\n K: Debug,\n V: Debug,

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
","Debug","air_interpreter_interface::call_request_parameters::CallRequests","air_interpreter_interface::call_service_result::CallResults"],["
1.0.0 · source§

impl<K, V, S> Default for HashMap<K, V, S>
where\n S: Default,

source§

fn default() -> HashMap<K, V, S>

Creates an empty HashMap<K, V, S>, with the Default value for the hasher.

\n
","Default","air_interpreter_interface::call_request_parameters::CallRequests","air_interpreter_interface::call_service_result::CallResults"],["
source§

impl<'de, K, V, S> Deserialize<'de> for HashMap<K, V, S>
where\n K: Deserialize<'de> + Eq + Hash,\n V: Deserialize<'de>,\n S: BuildHasher + Default,

source§

fn deserialize<D>(\n deserializer: D,\n) -> Result<HashMap<K, V, S>, <D as Deserializer<'de>>::Error>
where\n D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
","Deserialize<'de>","air_interpreter_interface::call_request_parameters::CallRequests","air_interpreter_interface::call_service_result::CallResults"],["
1.4.0 · source§

impl<'a, K, V, S> Extend<(&'a K, &'a V)> for HashMap<K, V, S>
where\n K: Eq + Hash + Copy,\n V: Copy,\n S: BuildHasher,

source§

fn extend<T>(&mut self, iter: T)
where\n T: IntoIterator<Item = (&'a K, &'a V)>,

Extends a collection with the contents of an iterator. Read more
source§

fn extend_one(&mut self, _: (&'a K, &'a V))

🔬This is a nightly-only experimental API. (extend_one)
Extends a collection with exactly one element.
source§

fn extend_reserve(&mut self, additional: usize)

🔬This is a nightly-only experimental API. (extend_one)
Reserves capacity in a collection for the given number of additional elements. Read more
","Extend<(&'a K, &'a V)>","air_interpreter_interface::call_request_parameters::CallRequests","air_interpreter_interface::call_service_result::CallResults"],["
1.0.0 · source§

impl<K, V, S> Extend<(K, V)> for HashMap<K, V, S>
where\n K: Eq + Hash,\n S: BuildHasher,

Inserts all new key-values from the iterator and replaces values with existing\nkeys with new values returned from the iterator.

\n
source§

fn extend<T>(&mut self, iter: T)
where\n T: IntoIterator<Item = (K, V)>,

Extends a collection with the contents of an iterator. Read more
source§

fn extend_one(&mut self, _: (K, V))

🔬This is a nightly-only experimental API. (extend_one)
Extends a collection with exactly one element.
source§

fn extend_reserve(&mut self, additional: usize)

🔬This is a nightly-only experimental API. (extend_one)
Reserves capacity in a collection for the given number of additional elements. Read more
","Extend<(K, V)>","air_interpreter_interface::call_request_parameters::CallRequests","air_interpreter_interface::call_service_result::CallResults"],["
1.56.0 · source§

impl<K, V, const N: usize> From<[(K, V); N]> for HashMap<K, V>
where\n K: Eq + Hash,

source§

fn from(arr: [(K, V); N]) -> HashMap<K, V>

§Examples
\n
use std::collections::HashMap;\n\nlet map1 = HashMap::from([(1, 2), (3, 4)]);\nlet map2: HashMap<_, _> = [(1, 2), (3, 4)].into();\nassert_eq!(map1, map2);
\n
","From<[(K, V); N]>","air_interpreter_interface::call_request_parameters::CallRequests","air_interpreter_interface::call_service_result::CallResults"],["
1.0.0 · source§

impl<K, V, S> FromIterator<(K, V)> for HashMap<K, V, S>
where\n K: Eq + Hash,\n S: BuildHasher + Default,

source§

fn from_iter<T>(iter: T) -> HashMap<K, V, S>
where\n T: IntoIterator<Item = (K, V)>,

Creates a value from an iterator. Read more
","FromIterator<(K, V)>","air_interpreter_interface::call_request_parameters::CallRequests","air_interpreter_interface::call_service_result::CallResults"],["
source§

impl<K, V> HashMap<K, V>

1.0.0 · source

pub fn new() -> HashMap<K, V>

Creates an empty HashMap.

\n

The hash map is initially created with a capacity of 0, so it will not allocate until it\nis first inserted into.

\n
§Examples
\n
use std::collections::HashMap;\nlet mut map: HashMap<&str, i32> = HashMap::new();
\n
1.0.0 · source

pub fn with_capacity(capacity: usize) -> HashMap<K, V>

Creates an empty HashMap with at least the specified capacity.

\n

The hash map will be able to hold at least capacity elements without\nreallocating. This method is allowed to allocate for more elements than\ncapacity. If capacity is 0, the hash map will not allocate.

\n
§Examples
\n
use std::collections::HashMap;\nlet mut map: HashMap<&str, i32> = HashMap::with_capacity(10);
\n
",0,"air_interpreter_interface::call_request_parameters::CallRequests","air_interpreter_interface::call_service_result::CallResults"],["
source§

impl<K, V, S> HashMap<K, V, S>
where\n S: BuildHasher,

source

pub fn raw_entry_mut(&mut self) -> RawEntryBuilderMut<'_, K, V, S>

🔬This is a nightly-only experimental API. (hash_raw_entry)

Creates a raw entry builder for the HashMap.

\n

Raw entries provide the lowest level of control for searching and\nmanipulating a map. They must be manually initialized with a hash and\nthen manually searched. After this, insertions into a vacant entry\nstill require an owned key to be provided.

\n

Raw entries are useful for such exotic situations as:

\n
    \n
  • Hash memoization
  • \n
  • Deferring the creation of an owned key until it is known to be required
  • \n
  • Using a search key that doesn’t work with the Borrow trait
  • \n
  • Using custom comparison logic without newtype wrappers
  • \n
\n

Because raw entries provide much more low-level control, it’s much easier\nto put the HashMap into an inconsistent state which, while memory-safe,\nwill cause the map to produce seemingly random results. Higher-level and\nmore foolproof APIs like entry should be preferred when possible.

\n

In particular, the hash used to initialize the raw entry must still be\nconsistent with the hash of the key that is ultimately stored in the entry.\nThis is because implementations of HashMap may need to recompute hashes\nwhen resizing, at which point only the keys are available.

\n

Raw entries give mutable access to the keys. This must not be used\nto modify how the key would compare or hash, as the map will not re-evaluate\nwhere the key should go, meaning the keys may become “lost” if their\nlocation does not reflect their state. For instance, if you change a key\nso that the map now contains keys which compare equal, search may start\nacting erratically, with two keys randomly masking each other. Implementations\nare free to assume this doesn’t happen (within the limits of memory-safety).

\n
source

pub fn raw_entry(&self) -> RawEntryBuilder<'_, K, V, S>

🔬This is a nightly-only experimental API. (hash_raw_entry)

Creates a raw immutable entry builder for the HashMap.

\n

Raw entries provide the lowest level of control for searching and\nmanipulating a map. They must be manually initialized with a hash and\nthen manually searched.

\n

This is useful for

\n
    \n
  • Hash memoization
  • \n
  • Using a search key that doesn’t work with the Borrow trait
  • \n
  • Using custom comparison logic without newtype wrappers
  • \n
\n

Unless you are in such a situation, higher-level and more foolproof APIs like\nget should be preferred.

\n

Immutable raw entries have very limited use; you might instead want raw_entry_mut.

\n
",0,"air_interpreter_interface::call_request_parameters::CallRequests","air_interpreter_interface::call_service_result::CallResults"],["
source§

impl<K, V, S> HashMap<K, V, S>

1.7.0 (const: unstable) · source

pub fn with_hasher(hash_builder: S) -> HashMap<K, V, S>

Creates an empty HashMap which will use the given hash builder to hash\nkeys.

\n

The created map has the default initial capacity.

\n

Warning: hash_builder is normally randomly generated, and\nis designed to allow HashMaps to be resistant to attacks that\ncause many collisions and very poor performance. Setting it\nmanually using this function can expose a DoS attack vector.

\n

The hash_builder passed should implement the BuildHasher trait for\nthe HashMap to be useful, see its documentation for details.

\n
§Examples
\n
use std::collections::HashMap;\nuse std::hash::RandomState;\n\nlet s = RandomState::new();\nlet mut map = HashMap::with_hasher(s);\nmap.insert(1, 2);
\n
1.7.0 · source

pub fn with_capacity_and_hasher(capacity: usize, hasher: S) -> HashMap<K, V, S>

Creates an empty HashMap with at least the specified capacity, using\nhasher to hash the keys.

\n

The hash map will be able to hold at least capacity elements without\nreallocating. This method is allowed to allocate for more elements than\ncapacity. If capacity is 0, the hash map will not allocate.

\n

Warning: hasher is normally randomly generated, and\nis designed to allow HashMaps to be resistant to attacks that\ncause many collisions and very poor performance. Setting it\nmanually using this function can expose a DoS attack vector.

\n

The hasher passed should implement the BuildHasher trait for\nthe HashMap to be useful, see its documentation for details.

\n
§Examples
\n
use std::collections::HashMap;\nuse std::hash::RandomState;\n\nlet s = RandomState::new();\nlet mut map = HashMap::with_capacity_and_hasher(10, s);\nmap.insert(1, 2);
\n
1.0.0 · source

pub fn capacity(&self) -> usize

Returns the number of elements the map can hold without reallocating.

\n

This number is a lower bound; the HashMap<K, V> might be able to hold\nmore, but is guaranteed to be able to hold at least this many.

\n
§Examples
\n
use std::collections::HashMap;\nlet map: HashMap<i32, i32> = HashMap::with_capacity(100);\nassert!(map.capacity() >= 100);
\n
1.0.0 · source

pub fn keys(&self) -> Keys<'_, K, V>

An iterator visiting all keys in arbitrary order.\nThe iterator element type is &'a K.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet map = HashMap::from([\n    (\"a\", 1),\n    (\"b\", 2),\n    (\"c\", 3),\n]);\n\nfor key in map.keys() {\n    println!(\"{key}\");\n}
\n
§Performance
\n

In the current implementation, iterating over keys takes O(capacity) time\ninstead of O(len) because it internally visits empty buckets too.

\n
1.54.0 · source

pub fn into_keys(self) -> IntoKeys<K, V>

Creates a consuming iterator visiting all the keys in arbitrary order.\nThe map cannot be used after calling this.\nThe iterator element type is K.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet map = HashMap::from([\n    (\"a\", 1),\n    (\"b\", 2),\n    (\"c\", 3),\n]);\n\nlet mut vec: Vec<&str> = map.into_keys().collect();\n// The `IntoKeys` iterator produces keys in arbitrary order, so the\n// keys must be sorted to test them against a sorted array.\nvec.sort_unstable();\nassert_eq!(vec, [\"a\", \"b\", \"c\"]);
\n
§Performance
\n

In the current implementation, iterating over keys takes O(capacity) time\ninstead of O(len) because it internally visits empty buckets too.

\n
1.0.0 · source

pub fn values(&self) -> Values<'_, K, V>

An iterator visiting all values in arbitrary order.\nThe iterator element type is &'a V.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet map = HashMap::from([\n    (\"a\", 1),\n    (\"b\", 2),\n    (\"c\", 3),\n]);\n\nfor val in map.values() {\n    println!(\"{val}\");\n}
\n
§Performance
\n

In the current implementation, iterating over values takes O(capacity) time\ninstead of O(len) because it internally visits empty buckets too.

\n
1.10.0 · source

pub fn values_mut(&mut self) -> ValuesMut<'_, K, V>

An iterator visiting all values mutably in arbitrary order.\nThe iterator element type is &'a mut V.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet mut map = HashMap::from([\n    (\"a\", 1),\n    (\"b\", 2),\n    (\"c\", 3),\n]);\n\nfor val in map.values_mut() {\n    *val = *val + 10;\n}\n\nfor val in map.values() {\n    println!(\"{val}\");\n}
\n
§Performance
\n

In the current implementation, iterating over values takes O(capacity) time\ninstead of O(len) because it internally visits empty buckets too.

\n
1.54.0 · source

pub fn into_values(self) -> IntoValues<K, V>

Creates a consuming iterator visiting all the values in arbitrary order.\nThe map cannot be used after calling this.\nThe iterator element type is V.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet map = HashMap::from([\n    (\"a\", 1),\n    (\"b\", 2),\n    (\"c\", 3),\n]);\n\nlet mut vec: Vec<i32> = map.into_values().collect();\n// The `IntoValues` iterator produces values in arbitrary order, so\n// the values must be sorted to test them against a sorted array.\nvec.sort_unstable();\nassert_eq!(vec, [1, 2, 3]);
\n
§Performance
\n

In the current implementation, iterating over values takes O(capacity) time\ninstead of O(len) because it internally visits empty buckets too.

\n
1.0.0 · source

pub fn iter(&self) -> Iter<'_, K, V>

An iterator visiting all key-value pairs in arbitrary order.\nThe iterator element type is (&'a K, &'a V).

\n
§Examples
\n
use std::collections::HashMap;\n\nlet map = HashMap::from([\n    (\"a\", 1),\n    (\"b\", 2),\n    (\"c\", 3),\n]);\n\nfor (key, val) in map.iter() {\n    println!(\"key: {key} val: {val}\");\n}
\n
§Performance
\n

In the current implementation, iterating over map takes O(capacity) time\ninstead of O(len) because it internally visits empty buckets too.

\n
1.0.0 · source

pub fn iter_mut(&mut self) -> IterMut<'_, K, V>

An iterator visiting all key-value pairs in arbitrary order,\nwith mutable references to the values.\nThe iterator element type is (&'a K, &'a mut V).

\n
§Examples
\n
use std::collections::HashMap;\n\nlet mut map = HashMap::from([\n    (\"a\", 1),\n    (\"b\", 2),\n    (\"c\", 3),\n]);\n\n// Update all values\nfor (_, val) in map.iter_mut() {\n    *val *= 2;\n}\n\nfor (key, val) in &map {\n    println!(\"key: {key} val: {val}\");\n}
\n
§Performance
\n

In the current implementation, iterating over map takes O(capacity) time\ninstead of O(len) because it internally visits empty buckets too.

\n
1.0.0 · source

pub fn len(&self) -> usize

Returns the number of elements in the map.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet mut a = HashMap::new();\nassert_eq!(a.len(), 0);\na.insert(1, \"a\");\nassert_eq!(a.len(), 1);
\n
1.0.0 · source

pub fn is_empty(&self) -> bool

Returns true if the map contains no elements.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet mut a = HashMap::new();\nassert!(a.is_empty());\na.insert(1, \"a\");\nassert!(!a.is_empty());
\n
1.6.0 · source

pub fn drain(&mut self) -> Drain<'_, K, V>

Clears the map, returning all key-value pairs as an iterator. Keeps the\nallocated memory for reuse.

\n

If the returned iterator is dropped before being fully consumed, it\ndrops the remaining key-value pairs. The returned iterator keeps a\nmutable borrow on the map to optimize its implementation.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet mut a = HashMap::new();\na.insert(1, \"a\");\na.insert(2, \"b\");\n\nfor (k, v) in a.drain().take(1) {\n    assert!(k == 1 || k == 2);\n    assert!(v == \"a\" || v == \"b\");\n}\n\nassert!(a.is_empty());
\n
source

pub fn extract_if<F>(&mut self, pred: F) -> ExtractIf<'_, K, V, F>
where\n F: FnMut(&K, &mut V) -> bool,

🔬This is a nightly-only experimental API. (hash_extract_if)

Creates an iterator which uses a closure to determine if an element should be removed.

\n

If the closure returns true, the element is removed from the map and yielded.\nIf the closure returns false, or panics, the element remains in the map and will not be\nyielded.

\n

Note that extract_if lets you mutate every value in the filter closure, regardless of\nwhether you choose to keep or remove it.

\n

If the returned ExtractIf is not exhausted, e.g. because it is dropped without iterating\nor the iteration short-circuits, then the remaining elements will be retained.\nUse retain with a negated predicate if you do not need the returned iterator.

\n
§Examples
\n

Splitting a map into even and odd keys, reusing the original map:

\n\n
#![feature(hash_extract_if)]\nuse std::collections::HashMap;\n\nlet mut map: HashMap<i32, i32> = (0..8).map(|x| (x, x)).collect();\nlet extracted: HashMap<i32, i32> = map.extract_if(|k, _v| k % 2 == 0).collect();\n\nlet mut evens = extracted.keys().copied().collect::<Vec<_>>();\nlet mut odds = map.keys().copied().collect::<Vec<_>>();\nevens.sort();\nodds.sort();\n\nassert_eq!(evens, vec![0, 2, 4, 6]);\nassert_eq!(odds, vec![1, 3, 5, 7]);
\n
1.18.0 · source

pub fn retain<F>(&mut self, f: F)
where\n F: FnMut(&K, &mut V) -> bool,

Retains only the elements specified by the predicate.

\n

In other words, remove all pairs (k, v) for which f(&k, &mut v) returns false.\nThe elements are visited in unsorted (and unspecified) order.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet mut map: HashMap<i32, i32> = (0..8).map(|x| (x, x*10)).collect();\nmap.retain(|&k, _| k % 2 == 0);\nassert_eq!(map.len(), 4);
\n
§Performance
\n

In the current implementation, this operation takes O(capacity) time\ninstead of O(len) because it internally visits empty buckets too.

\n
1.0.0 · source

pub fn clear(&mut self)

Clears the map, removing all key-value pairs. Keeps the allocated memory\nfor reuse.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet mut a = HashMap::new();\na.insert(1, \"a\");\na.clear();\nassert!(a.is_empty());
\n
1.9.0 · source

pub fn hasher(&self) -> &S

Returns a reference to the map’s BuildHasher.

\n
§Examples
\n
use std::collections::HashMap;\nuse std::hash::RandomState;\n\nlet hasher = RandomState::new();\nlet map: HashMap<i32, i32> = HashMap::with_hasher(hasher);\nlet hasher: &RandomState = map.hasher();
\n
",0,"air_interpreter_interface::call_request_parameters::CallRequests","air_interpreter_interface::call_service_result::CallResults"],["
source§

impl<K, V, S> HashMap<K, V, S>
where\n K: Eq + Hash,\n S: BuildHasher,

1.0.0 · source

pub fn reserve(&mut self, additional: usize)

Reserves capacity for at least additional more elements to be inserted\nin the HashMap. The collection may reserve more space to speculatively\navoid frequent reallocations. After calling reserve,\ncapacity will be greater than or equal to self.len() + additional.\nDoes nothing if capacity is already sufficient.

\n
§Panics
\n

Panics if the new allocation size overflows usize.

\n
§Examples
\n
use std::collections::HashMap;\nlet mut map: HashMap<&str, i32> = HashMap::new();\nmap.reserve(10);
\n
1.57.0 · source

pub fn try_reserve(&mut self, additional: usize) -> Result<(), TryReserveError>

Tries to reserve capacity for at least additional more elements to be inserted\nin the HashMap. The collection may reserve more space to speculatively\navoid frequent reallocations. After calling try_reserve,\ncapacity will be greater than or equal to self.len() + additional if\nit returns Ok(()).\nDoes nothing if capacity is already sufficient.

\n
§Errors
\n

If the capacity overflows, or the allocator reports a failure, then an error\nis returned.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet mut map: HashMap<&str, isize> = HashMap::new();\nmap.try_reserve(10).expect(\"why is the test harness OOMing on a handful of bytes?\");
\n
1.0.0 · source

pub fn shrink_to_fit(&mut self)

Shrinks the capacity of the map as much as possible. It will drop\ndown as much as possible while maintaining the internal rules\nand possibly leaving some space in accordance with the resize policy.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet mut map: HashMap<i32, i32> = HashMap::with_capacity(100);\nmap.insert(1, 2);\nmap.insert(3, 4);\nassert!(map.capacity() >= 100);\nmap.shrink_to_fit();\nassert!(map.capacity() >= 2);
\n
1.56.0 · source

pub fn shrink_to(&mut self, min_capacity: usize)

Shrinks the capacity of the map with a lower limit. It will drop\ndown no lower than the supplied limit while maintaining the internal rules\nand possibly leaving some space in accordance with the resize policy.

\n

If the current capacity is less than the lower limit, this is a no-op.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet mut map: HashMap<i32, i32> = HashMap::with_capacity(100);\nmap.insert(1, 2);\nmap.insert(3, 4);\nassert!(map.capacity() >= 100);\nmap.shrink_to(10);\nassert!(map.capacity() >= 10);\nmap.shrink_to(0);\nassert!(map.capacity() >= 2);
\n
1.0.0 · source

pub fn entry(&mut self, key: K) -> Entry<'_, K, V>

Gets the given key’s corresponding entry in the map for in-place manipulation.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet mut letters = HashMap::new();\n\nfor ch in \"a short treatise on fungi\".chars() {\n    letters.entry(ch).and_modify(|counter| *counter += 1).or_insert(1);\n}\n\nassert_eq!(letters[&'s'], 2);\nassert_eq!(letters[&'t'], 3);\nassert_eq!(letters[&'u'], 1);\nassert_eq!(letters.get(&'y'), None);
\n
1.0.0 · source

pub fn get<Q>(&self, k: &Q) -> Option<&V>
where\n K: Borrow<Q>,\n Q: Hash + Eq + ?Sized,

Returns a reference to the value corresponding to the key.

\n

The key may be any borrowed form of the map’s key type, but\nHash and Eq on the borrowed form must match those for\nthe key type.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet mut map = HashMap::new();\nmap.insert(1, \"a\");\nassert_eq!(map.get(&1), Some(&\"a\"));\nassert_eq!(map.get(&2), None);
\n
1.40.0 · source

pub fn get_key_value<Q>(&self, k: &Q) -> Option<(&K, &V)>
where\n K: Borrow<Q>,\n Q: Hash + Eq + ?Sized,

Returns the key-value pair corresponding to the supplied key.

\n

The supplied key may be any borrowed form of the map’s key type, but\nHash and Eq on the borrowed form must match those for\nthe key type.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet mut map = HashMap::new();\nmap.insert(1, \"a\");\nassert_eq!(map.get_key_value(&1), Some((&1, &\"a\")));\nassert_eq!(map.get_key_value(&2), None);
\n
source

pub fn get_many_mut<Q, const N: usize>(\n &mut self,\n ks: [&Q; N],\n) -> Option<[&mut V; N]>
where\n K: Borrow<Q>,\n Q: Hash + Eq + ?Sized,

🔬This is a nightly-only experimental API. (map_many_mut)

Attempts to get mutable references to N values in the map at once.

\n

Returns an array of length N with the results of each query. For soundness, at most one\nmutable reference will be returned to any value. None will be returned if any of the\nkeys are duplicates or missing.

\n
§Examples
\n
#![feature(map_many_mut)]\nuse std::collections::HashMap;\n\nlet mut libraries = HashMap::new();\nlibraries.insert(\"Bodleian Library\".to_string(), 1602);\nlibraries.insert(\"Athenæum\".to_string(), 1807);\nlibraries.insert(\"Herzogin-Anna-Amalia-Bibliothek\".to_string(), 1691);\nlibraries.insert(\"Library of Congress\".to_string(), 1800);\n\nlet got = libraries.get_many_mut([\n    \"Athenæum\",\n    \"Library of Congress\",\n]);\nassert_eq!(\n    got,\n    Some([\n        &mut 1807,\n        &mut 1800,\n    ]),\n);\n\n// Missing keys result in None\nlet got = libraries.get_many_mut([\n    \"Athenæum\",\n    \"New York Public Library\",\n]);\nassert_eq!(got, None);\n\n// Duplicate keys result in None\nlet got = libraries.get_many_mut([\n    \"Athenæum\",\n    \"Athenæum\",\n]);\nassert_eq!(got, None);
\n
source

pub unsafe fn get_many_unchecked_mut<Q, const N: usize>(\n &mut self,\n ks: [&Q; N],\n) -> Option<[&mut V; N]>
where\n K: Borrow<Q>,\n Q: Hash + Eq + ?Sized,

🔬This is a nightly-only experimental API. (map_many_mut)

Attempts to get mutable references to N values in the map at once, without validating that\nthe values are unique.

\n

Returns an array of length N with the results of each query. None will be returned if\nany of the keys are missing.

\n

For a safe alternative see get_many_mut.

\n
§Safety
\n

Calling this method with overlapping keys is undefined behavior even if the resulting\nreferences are not used.

\n
§Examples
\n
#![feature(map_many_mut)]\nuse std::collections::HashMap;\n\nlet mut libraries = HashMap::new();\nlibraries.insert(\"Bodleian Library\".to_string(), 1602);\nlibraries.insert(\"Athenæum\".to_string(), 1807);\nlibraries.insert(\"Herzogin-Anna-Amalia-Bibliothek\".to_string(), 1691);\nlibraries.insert(\"Library of Congress\".to_string(), 1800);\n\nlet got = libraries.get_many_mut([\n    \"Athenæum\",\n    \"Library of Congress\",\n]);\nassert_eq!(\n    got,\n    Some([\n        &mut 1807,\n        &mut 1800,\n    ]),\n);\n\n// Missing keys result in None\nlet got = libraries.get_many_mut([\n    \"Athenæum\",\n    \"New York Public Library\",\n]);\nassert_eq!(got, None);
\n
1.0.0 · source

pub fn contains_key<Q>(&self, k: &Q) -> bool
where\n K: Borrow<Q>,\n Q: Hash + Eq + ?Sized,

Returns true if the map contains a value for the specified key.

\n

The key may be any borrowed form of the map’s key type, but\nHash and Eq on the borrowed form must match those for\nthe key type.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet mut map = HashMap::new();\nmap.insert(1, \"a\");\nassert_eq!(map.contains_key(&1), true);\nassert_eq!(map.contains_key(&2), false);
\n
1.0.0 · source

pub fn get_mut<Q>(&mut self, k: &Q) -> Option<&mut V>
where\n K: Borrow<Q>,\n Q: Hash + Eq + ?Sized,

Returns a mutable reference to the value corresponding to the key.

\n

The key may be any borrowed form of the map’s key type, but\nHash and Eq on the borrowed form must match those for\nthe key type.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet mut map = HashMap::new();\nmap.insert(1, \"a\");\nif let Some(x) = map.get_mut(&1) {\n    *x = \"b\";\n}\nassert_eq!(map[&1], \"b\");
\n
1.0.0 · source

pub fn insert(&mut self, k: K, v: V) -> Option<V>

Inserts a key-value pair into the map.

\n

If the map did not have this key present, None is returned.

\n

If the map did have this key present, the value is updated, and the old\nvalue is returned. The key is not updated, though; this matters for\ntypes that can be == without being identical. See the module-level\ndocumentation for more.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet mut map = HashMap::new();\nassert_eq!(map.insert(37, \"a\"), None);\nassert_eq!(map.is_empty(), false);\n\nmap.insert(37, \"b\");\nassert_eq!(map.insert(37, \"c\"), Some(\"b\"));\nassert_eq!(map[&37], \"c\");
\n
source

pub fn try_insert(\n &mut self,\n key: K,\n value: V,\n) -> Result<&mut V, OccupiedError<'_, K, V>>

🔬This is a nightly-only experimental API. (map_try_insert)

Tries to insert a key-value pair into the map, and returns\na mutable reference to the value in the entry.

\n

If the map already had this key present, nothing is updated, and\nan error containing the occupied entry and the value is returned.

\n
§Examples
\n

Basic usage:

\n\n
#![feature(map_try_insert)]\n\nuse std::collections::HashMap;\n\nlet mut map = HashMap::new();\nassert_eq!(map.try_insert(37, \"a\").unwrap(), &\"a\");\n\nlet err = map.try_insert(37, \"b\").unwrap_err();\nassert_eq!(err.entry.key(), &37);\nassert_eq!(err.entry.get(), &\"a\");\nassert_eq!(err.value, \"b\");
\n
1.0.0 · source

pub fn remove<Q>(&mut self, k: &Q) -> Option<V>
where\n K: Borrow<Q>,\n Q: Hash + Eq + ?Sized,

Removes a key from the map, returning the value at the key if the key\nwas previously in the map.

\n

The key may be any borrowed form of the map’s key type, but\nHash and Eq on the borrowed form must match those for\nthe key type.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet mut map = HashMap::new();\nmap.insert(1, \"a\");\nassert_eq!(map.remove(&1), Some(\"a\"));\nassert_eq!(map.remove(&1), None);
\n
1.27.0 · source

pub fn remove_entry<Q>(&mut self, k: &Q) -> Option<(K, V)>
where\n K: Borrow<Q>,\n Q: Hash + Eq + ?Sized,

Removes a key from the map, returning the stored key and value if the\nkey was previously in the map.

\n

The key may be any borrowed form of the map’s key type, but\nHash and Eq on the borrowed form must match those for\nthe key type.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet mut map = HashMap::new();\nmap.insert(1, \"a\");\nassert_eq!(map.remove_entry(&1), Some((1, \"a\")));\nassert_eq!(map.remove(&1), None);
\n
",0,"air_interpreter_interface::call_request_parameters::CallRequests","air_interpreter_interface::call_service_result::CallResults"],["
1.0.0 · source§

impl<K, Q, V, S> Index<&Q> for HashMap<K, V, S>
where\n K: Eq + Hash + Borrow<Q>,\n Q: Eq + Hash + ?Sized,\n S: BuildHasher,

source§

fn index(&self, key: &Q) -> &V

Returns a reference to the value corresponding to the supplied key.

\n
§Panics
\n

Panics if the key is not present in the HashMap.

\n
§

type Output = V

The returned type after indexing.
","Index<&Q>","air_interpreter_interface::call_request_parameters::CallRequests","air_interpreter_interface::call_service_result::CallResults"],["
source§

impl<'de, K, V, S, E> IntoDeserializer<'de, E> for HashMap<K, V, S>
where\n K: IntoDeserializer<'de, E> + Eq + Hash,\n V: IntoDeserializer<'de, E>,\n S: BuildHasher,\n E: Error,

§

type Deserializer = MapDeserializer<'de, <HashMap<K, V, S> as IntoIterator>::IntoIter, E>

The type of the deserializer being converted into.
source§

fn into_deserializer(\n self,\n) -> <HashMap<K, V, S> as IntoDeserializer<'de, E>>::Deserializer

Convert this value into a deserializer.
","IntoDeserializer<'de, E>","air_interpreter_interface::call_request_parameters::CallRequests","air_interpreter_interface::call_service_result::CallResults"],["
1.0.0 · source§

impl<K, V, S> IntoIterator for HashMap<K, V, S>

source§

fn into_iter(self) -> IntoIter<K, V>

Creates a consuming iterator, that is, one that moves each key-value\npair out of the map in arbitrary order. The map cannot be used after\ncalling this.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet map = HashMap::from([\n    (\"a\", 1),\n    (\"b\", 2),\n    (\"c\", 3),\n]);\n\n// Not possible with .iter()\nlet vec: Vec<(&str, i32)> = map.into_iter().collect();
\n
§

type Item = (K, V)

The type of the elements being iterated over.
§

type IntoIter = IntoIter<K, V>

Which kind of iterator are we turning this into?
","IntoIterator","air_interpreter_interface::call_request_parameters::CallRequests","air_interpreter_interface::call_service_result::CallResults"],["
§

impl<K, V, AK, AV> PartialEq<ArchivedHashMap<AK, AV>> for HashMap<K, V>
where\n K: Hash + Eq + Borrow<AK>,\n AK: Hash + Eq,\n AV: PartialEq<V>,

§

fn eq(&self, other: &ArchivedHashMap<AK, AV>) -> bool

This method tests for self and other values to be equal, and is used\nby ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always\nsufficient, and should not be overridden without very good reason.
","PartialEq>","air_interpreter_interface::call_request_parameters::CallRequests","air_interpreter_interface::call_service_result::CallResults"],["
1.0.0 · source§

impl<K, V, S> PartialEq for HashMap<K, V, S>
where\n K: Eq + Hash,\n V: PartialEq,\n S: BuildHasher,

source§

fn eq(&self, other: &HashMap<K, V, S>) -> bool

This method tests for self and other values to be equal, and is used\nby ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always\nsufficient, and should not be overridden without very good reason.
","PartialEq","air_interpreter_interface::call_request_parameters::CallRequests","air_interpreter_interface::call_service_result::CallResults"],["
§

impl<K, V, S, RandomState> Serialize<S> for HashMap<K, V, RandomState>
where\n K: Serialize<S> + Hash + Eq,\n <K as Archive>::Archived: Hash + Eq,\n V: Serialize<S>,\n S: Serializer + ScratchSpace + ?Sized,

§

fn serialize(\n &self,\n serializer: &mut S,\n) -> Result<<HashMap<K, V, RandomState> as Archive>::Resolver, <S as Fallible>::Error>

Writes the dependencies for the object and returns a resolver that can create the archived\ntype.
","Serialize","air_interpreter_interface::call_request_parameters::CallRequests","air_interpreter_interface::call_service_result::CallResults"],["
source§

impl<K, V, H> Serialize for HashMap<K, V, H>
where\n K: Serialize,\n V: Serialize,

source§

fn serialize<S>(\n &self,\n serializer: S,\n) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error>
where\n S: Serializer,

Serialize this value into the given Serde serializer. Read more
","Serialize","air_interpreter_interface::call_request_parameters::CallRequests","air_interpreter_interface::call_service_result::CallResults"],["
1.0.0 · source§

impl<K, V, S> Eq for HashMap<K, V, S>
where\n K: Eq + Hash,\n V: Eq,\n S: BuildHasher,

","Eq","air_interpreter_interface::call_request_parameters::CallRequests","air_interpreter_interface::call_service_result::CallResults"],["
1.36.0 · source§

impl<K, V, S> UnwindSafe for HashMap<K, V, S>
where\n K: UnwindSafe,\n V: UnwindSafe,\n S: UnwindSafe,

","UnwindSafe","air_interpreter_interface::call_request_parameters::CallRequests","air_interpreter_interface::call_service_result::CallResults"]], +"air_test_utils":[["
§

impl<'a, K, V, S> Arbitrary<'a> for HashMap<K, V, S>
where\n K: Arbitrary<'a> + Eq + Hash,\n V: Arbitrary<'a>,\n S: BuildHasher + Default,

§

fn arbitrary(u: &mut Unstructured<'a>) -> Result<HashMap<K, V, S>, Error>

Generate an arbitrary value of Self from the given unstructured data. Read more
§

fn arbitrary_take_rest(u: Unstructured<'a>) -> Result<HashMap<K, V, S>, Error>

Generate an arbitrary value of Self from the entirety of the given\nunstructured data. Read more
§

fn size_hint(_depth: usize) -> (usize, Option<usize>)

Get a size hint for how many bytes out of an Unstructured this type\nneeds to construct itself. Read more
","Arbitrary<'a>","air_test_utils::CallRequests","air_test_utils::CallResults"],["
§

impl<K, V, S> Archive for HashMap<K, V, S>
where\n K: Archive + Hash + Eq,\n V: Archive,\n <K as Archive>::Archived: Hash + Eq,

§

type Archived = ArchivedHashMap<<K as Archive>::Archived, <V as Archive>::Archived>

The archived representation of this type. Read more
§

type Resolver = HashMapResolver

The resolver for this type. It must contain all the additional information from serializing\nneeded to make the archived type from the normal type.
§

unsafe fn resolve(\n &self,\n pos: usize,\n resolver: <HashMap<K, V, S> as Archive>::Resolver,\n out: *mut <HashMap<K, V, S> as Archive>::Archived,\n)

Creates the archived version of this value at the given position and writes it to the given\noutput. Read more
","Archive","air_test_utils::CallRequests","air_test_utils::CallResults"],["
§

impl<K, V, H> BorshDeserialize for HashMap<K, V, H>
where\n K: BorshDeserialize + Eq + Hash + Ord,\n V: BorshDeserialize,\n H: BuildHasher + Default,

§

fn deserialize_reader<R>(reader: &mut R) -> Result<HashMap<K, V, H>, Error>
where\n R: Read,

§

fn deserialize(buf: &mut &[u8]) -> Result<Self, Error>

Deserializes this instance from a given slice of bytes.\nUpdates the buffer to point at the remaining bytes.
§

fn try_from_slice(v: &[u8]) -> Result<Self, Error>

Deserialize this instance from a slice of bytes.
§

fn try_from_reader<R>(reader: &mut R) -> Result<Self, Error>
where\n R: Read,

","BorshDeserialize","air_test_utils::CallRequests","air_test_utils::CallResults"],["
§

impl<K, V, H> BorshSerialize for HashMap<K, V, H>
where\n K: BorshSerialize + Ord,\n V: BorshSerialize,\n H: BuildHasher,

§

fn serialize<W>(&self, writer: &mut W) -> Result<(), Error>
where\n W: Write,

","BorshSerialize","air_test_utils::CallRequests","air_test_utils::CallResults"],["
1.0.0 · source§

impl<K, V, S> Clone for HashMap<K, V, S>
where\n K: Clone,\n V: Clone,\n S: Clone,

source§

fn clone(&self) -> HashMap<K, V, S>

Returns a copy of the value. Read more
source§

fn clone_from(&mut self, source: &HashMap<K, V, S>)

Performs copy-assignment from source. Read more
","Clone","air_test_utils::CallRequests","air_test_utils::CallResults"],["
1.0.0 · source§

impl<K, V, S> Debug for HashMap<K, V, S>
where\n K: Debug,\n V: Debug,

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
","Debug","air_test_utils::CallRequests","air_test_utils::CallResults"],["
1.0.0 · source§

impl<K, V, S> Default for HashMap<K, V, S>
where\n S: Default,

source§

fn default() -> HashMap<K, V, S>

Creates an empty HashMap<K, V, S>, with the Default value for the hasher.

\n
","Default","air_test_utils::CallRequests","air_test_utils::CallResults"],["
source§

impl<'de, K, V, S> Deserialize<'de> for HashMap<K, V, S>
where\n K: Deserialize<'de> + Eq + Hash,\n V: Deserialize<'de>,\n S: BuildHasher + Default,

source§

fn deserialize<D>(\n deserializer: D,\n) -> Result<HashMap<K, V, S>, <D as Deserializer<'de>>::Error>
where\n D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
","Deserialize<'de>","air_test_utils::CallRequests","air_test_utils::CallResults"],["
source§

impl<'de, K, KAs, V, VAs, const N: usize> DeserializeAs<'de, [(K, V); N]> for HashMap<KAs, VAs>
where\n KAs: DeserializeAs<'de, K>,\n VAs: DeserializeAs<'de, V>,

source§

fn deserialize_as<D>(\n deserializer: D,\n) -> Result<[(K, V); N], <D as Deserializer<'de>>::Error>
where\n D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer.
","DeserializeAs<'de, [(K, V); N]>","air_test_utils::CallRequests","air_test_utils::CallResults"],["
source§

impl<'de, K, KAs, V, VAs> DeserializeAs<'de, BTreeSet<(K, V)>> for HashMap<KAs, VAs>
where\n KAs: DeserializeAs<'de, K>,\n VAs: DeserializeAs<'de, V>,\n (K, V): Ord,

source§

fn deserialize_as<D>(\n deserializer: D,\n) -> Result<BTreeSet<(K, V)>, <D as Deserializer<'de>>::Error>
where\n D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer.
","DeserializeAs<'de, BTreeSet<(K, V)>>","air_test_utils::CallRequests","air_test_utils::CallResults"],["
source§

impl<'de, K, KAs, V, VAs> DeserializeAs<'de, BinaryHeap<(K, V)>> for HashMap<KAs, VAs>
where\n KAs: DeserializeAs<'de, K>,\n VAs: DeserializeAs<'de, V>,\n (K, V): Ord,

source§

fn deserialize_as<D>(\n deserializer: D,\n) -> Result<BinaryHeap<(K, V)>, <D as Deserializer<'de>>::Error>
where\n D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer.
","DeserializeAs<'de, BinaryHeap<(K, V)>>","air_test_utils::CallRequests","air_test_utils::CallResults"],["
source§

impl<'de, K, V, KU, VU, S> DeserializeAs<'de, HashMap<K, V, S>> for HashMap<KU, VU, S>
where\n KU: DeserializeAs<'de, K>,\n VU: DeserializeAs<'de, V>,\n K: Eq + Hash,\n S: BuildHasher + Default,

source§

fn deserialize_as<D>(\n deserializer: D,\n) -> Result<HashMap<K, V, S>, <D as Deserializer<'de>>::Error>
where\n D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer.
","DeserializeAs<'de, HashMap>","air_test_utils::CallRequests","air_test_utils::CallResults"],["
source§

impl<'de, K, KAs, V, VAs> DeserializeAs<'de, HashSet<(K, V)>> for HashMap<KAs, VAs>
where\n KAs: DeserializeAs<'de, K>,\n VAs: DeserializeAs<'de, V>,\n (K, V): Eq + Hash,

source§

fn deserialize_as<D>(\n deserializer: D,\n) -> Result<HashSet<(K, V)>, <D as Deserializer<'de>>::Error>
where\n D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer.
","DeserializeAs<'de, HashSet<(K, V)>>","air_test_utils::CallRequests","air_test_utils::CallResults"],["
source§

impl<'de, K, KAs, V, VAs> DeserializeAs<'de, LinkedList<(K, V)>> for HashMap<KAs, VAs>
where\n KAs: DeserializeAs<'de, K>,\n VAs: DeserializeAs<'de, V>,

source§

fn deserialize_as<D>(\n deserializer: D,\n) -> Result<LinkedList<(K, V)>, <D as Deserializer<'de>>::Error>
where\n D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer.
","DeserializeAs<'de, LinkedList<(K, V)>>","air_test_utils::CallRequests","air_test_utils::CallResults"],["
source§

impl<'de, K, KAs, V, VAs> DeserializeAs<'de, Option<(K, V)>> for HashMap<KAs, VAs>
where\n KAs: DeserializeAs<'de, K>,\n VAs: DeserializeAs<'de, V>,

source§

fn deserialize_as<D>(\n deserializer: D,\n) -> Result<Option<(K, V)>, <D as Deserializer<'de>>::Error>
where\n D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer.
","DeserializeAs<'de, Option<(K, V)>>","air_test_utils::CallRequests","air_test_utils::CallResults"],["
source§

impl<'de, K, KAs, V, VAs> DeserializeAs<'de, Vec<(K, V)>> for HashMap<KAs, VAs>
where\n KAs: DeserializeAs<'de, K>,\n VAs: DeserializeAs<'de, V>,

source§

fn deserialize_as<D>(\n deserializer: D,\n) -> Result<Vec<(K, V)>, <D as Deserializer<'de>>::Error>
where\n D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer.
","DeserializeAs<'de, Vec<(K, V)>>","air_test_utils::CallRequests","air_test_utils::CallResults"],["
source§

impl<'de, K, KAs, V, VAs> DeserializeAs<'de, VecDeque<(K, V)>> for HashMap<KAs, VAs>
where\n KAs: DeserializeAs<'de, K>,\n VAs: DeserializeAs<'de, V>,

source§

fn deserialize_as<D>(\n deserializer: D,\n) -> Result<VecDeque<(K, V)>, <D as Deserializer<'de>>::Error>
where\n D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer.
","DeserializeAs<'de, VecDeque<(K, V)>>","air_test_utils::CallRequests","air_test_utils::CallResults"],["
1.4.0 · source§

impl<'a, K, V, S> Extend<(&'a K, &'a V)> for HashMap<K, V, S>
where\n K: Eq + Hash + Copy,\n V: Copy,\n S: BuildHasher,

source§

fn extend<T>(&mut self, iter: T)
where\n T: IntoIterator<Item = (&'a K, &'a V)>,

Extends a collection with the contents of an iterator. Read more
source§

fn extend_one(&mut self, _: (&'a K, &'a V))

🔬This is a nightly-only experimental API. (extend_one)
Extends a collection with exactly one element.
source§

fn extend_reserve(&mut self, additional: usize)

🔬This is a nightly-only experimental API. (extend_one)
Reserves capacity in a collection for the given number of additional elements. Read more
","Extend<(&'a K, &'a V)>","air_test_utils::CallRequests","air_test_utils::CallResults"],["
1.0.0 · source§

impl<K, V, S> Extend<(K, V)> for HashMap<K, V, S>
where\n K: Eq + Hash,\n S: BuildHasher,

Inserts all new key-values from the iterator and replaces values with existing\nkeys with new values returned from the iterator.

\n
source§

fn extend<T>(&mut self, iter: T)
where\n T: IntoIterator<Item = (K, V)>,

Extends a collection with the contents of an iterator. Read more
source§

fn extend_one(&mut self, _: (K, V))

🔬This is a nightly-only experimental API. (extend_one)
Extends a collection with exactly one element.
source§

fn extend_reserve(&mut self, additional: usize)

🔬This is a nightly-only experimental API. (extend_one)
Reserves capacity in a collection for the given number of additional elements. Read more
","Extend<(K, V)>","air_test_utils::CallRequests","air_test_utils::CallResults"],["
1.56.0 · source§

impl<K, V, const N: usize> From<[(K, V); N]> for HashMap<K, V>
where\n K: Eq + Hash,

source§

fn from(arr: [(K, V); N]) -> HashMap<K, V>

§Examples
\n
use std::collections::HashMap;\n\nlet map1 = HashMap::from([(1, 2), (3, 4)]);\nlet map2: HashMap<_, _> = [(1, 2), (3, 4)].into();\nassert_eq!(map1, map2);
\n
","From<[(K, V); N]>","air_test_utils::CallRequests","air_test_utils::CallResults"],["
source§

impl<K, V, S> FromFallibleIterator<(K, V)> for HashMap<K, V, S>
where\n K: Hash + Eq,\n S: BuildHasher + Default,

source§

fn from_fallible_iter<I>(\n it: I,\n) -> Result<HashMap<K, V, S>, <I as IntoFallibleIterator>::Error>
where\n I: IntoFallibleIterator<Item = (K, V)>,

Creates a value from a fallible iterator.
","FromFallibleIterator<(K, V)>","air_test_utils::CallRequests","air_test_utils::CallResults"],["
1.0.0 · source§

impl<K, V, S> FromIterator<(K, V)> for HashMap<K, V, S>
where\n K: Eq + Hash,\n S: BuildHasher + Default,

source§

fn from_iter<T>(iter: T) -> HashMap<K, V, S>
where\n T: IntoIterator<Item = (K, V)>,

Creates a value from an iterator. Read more
","FromIterator<(K, V)>","air_test_utils::CallRequests","air_test_utils::CallResults"],["
§

impl<K, V, S> FromParallelIterator<(K, V)> for HashMap<K, V, S>
where\n K: Eq + Hash + Send,\n V: Send,\n S: BuildHasher + Default + Send,

Collects (key, value) pairs from a parallel iterator into a\nhashmap. If multiple pairs correspond to the same key, then the\nones produced earlier in the parallel iterator will be\noverwritten, just as with a sequential iterator.

\n
§

fn from_par_iter<I>(par_iter: I) -> HashMap<K, V, S>
where\n I: IntoParallelIterator<Item = (K, V)>,

Creates an instance of the collection from the parallel iterator par_iter. Read more
","FromParallelIterator<(K, V)>","air_test_utils::CallRequests","air_test_utils::CallResults"],["
source§

impl<K, V> HashMap<K, V>

1.0.0 · source

pub fn new() -> HashMap<K, V>

Creates an empty HashMap.

\n

The hash map is initially created with a capacity of 0, so it will not allocate until it\nis first inserted into.

\n
§Examples
\n
use std::collections::HashMap;\nlet mut map: HashMap<&str, i32> = HashMap::new();
\n
1.0.0 · source

pub fn with_capacity(capacity: usize) -> HashMap<K, V>

Creates an empty HashMap with at least the specified capacity.

\n

The hash map will be able to hold at least capacity elements without\nreallocating. This method is allowed to allocate for more elements than\ncapacity. If capacity is 0, the hash map will not allocate.

\n
§Examples
\n
use std::collections::HashMap;\nlet mut map: HashMap<&str, i32> = HashMap::with_capacity(10);
\n
",0,"air_test_utils::CallRequests","air_test_utils::CallResults"],["
source§

impl<K, V, S> HashMap<K, V, S>
where\n S: BuildHasher,

source

pub fn raw_entry_mut(&mut self) -> RawEntryBuilderMut<'_, K, V, S>

🔬This is a nightly-only experimental API. (hash_raw_entry)

Creates a raw entry builder for the HashMap.

\n

Raw entries provide the lowest level of control for searching and\nmanipulating a map. They must be manually initialized with a hash and\nthen manually searched. After this, insertions into a vacant entry\nstill require an owned key to be provided.

\n

Raw entries are useful for such exotic situations as:

\n
    \n
  • Hash memoization
  • \n
  • Deferring the creation of an owned key until it is known to be required
  • \n
  • Using a search key that doesn’t work with the Borrow trait
  • \n
  • Using custom comparison logic without newtype wrappers
  • \n
\n

Because raw entries provide much more low-level control, it’s much easier\nto put the HashMap into an inconsistent state which, while memory-safe,\nwill cause the map to produce seemingly random results. Higher-level and\nmore foolproof APIs like entry should be preferred when possible.

\n

In particular, the hash used to initialize the raw entry must still be\nconsistent with the hash of the key that is ultimately stored in the entry.\nThis is because implementations of HashMap may need to recompute hashes\nwhen resizing, at which point only the keys are available.

\n

Raw entries give mutable access to the keys. This must not be used\nto modify how the key would compare or hash, as the map will not re-evaluate\nwhere the key should go, meaning the keys may become “lost” if their\nlocation does not reflect their state. For instance, if you change a key\nso that the map now contains keys which compare equal, search may start\nacting erratically, with two keys randomly masking each other. Implementations\nare free to assume this doesn’t happen (within the limits of memory-safety).

\n
source

pub fn raw_entry(&self) -> RawEntryBuilder<'_, K, V, S>

🔬This is a nightly-only experimental API. (hash_raw_entry)

Creates a raw immutable entry builder for the HashMap.

\n

Raw entries provide the lowest level of control for searching and\nmanipulating a map. They must be manually initialized with a hash and\nthen manually searched.

\n

This is useful for

\n
    \n
  • Hash memoization
  • \n
  • Using a search key that doesn’t work with the Borrow trait
  • \n
  • Using custom comparison logic without newtype wrappers
  • \n
\n

Unless you are in such a situation, higher-level and more foolproof APIs like\nget should be preferred.

\n

Immutable raw entries have very limited use; you might instead want raw_entry_mut.

\n
",0,"air_test_utils::CallRequests","air_test_utils::CallResults"],["
source§

impl<K, V, S> HashMap<K, V, S>

1.7.0 (const: unstable) · source

pub fn with_hasher(hash_builder: S) -> HashMap<K, V, S>

Creates an empty HashMap which will use the given hash builder to hash\nkeys.

\n

The created map has the default initial capacity.

\n

Warning: hash_builder is normally randomly generated, and\nis designed to allow HashMaps to be resistant to attacks that\ncause many collisions and very poor performance. Setting it\nmanually using this function can expose a DoS attack vector.

\n

The hash_builder passed should implement the BuildHasher trait for\nthe HashMap to be useful, see its documentation for details.

\n
§Examples
\n
use std::collections::HashMap;\nuse std::hash::RandomState;\n\nlet s = RandomState::new();\nlet mut map = HashMap::with_hasher(s);\nmap.insert(1, 2);
\n
1.7.0 · source

pub fn with_capacity_and_hasher(capacity: usize, hasher: S) -> HashMap<K, V, S>

Creates an empty HashMap with at least the specified capacity, using\nhasher to hash the keys.

\n

The hash map will be able to hold at least capacity elements without\nreallocating. This method is allowed to allocate for more elements than\ncapacity. If capacity is 0, the hash map will not allocate.

\n

Warning: hasher is normally randomly generated, and\nis designed to allow HashMaps to be resistant to attacks that\ncause many collisions and very poor performance. Setting it\nmanually using this function can expose a DoS attack vector.

\n

The hasher passed should implement the BuildHasher trait for\nthe HashMap to be useful, see its documentation for details.

\n
§Examples
\n
use std::collections::HashMap;\nuse std::hash::RandomState;\n\nlet s = RandomState::new();\nlet mut map = HashMap::with_capacity_and_hasher(10, s);\nmap.insert(1, 2);
\n
1.0.0 · source

pub fn capacity(&self) -> usize

Returns the number of elements the map can hold without reallocating.

\n

This number is a lower bound; the HashMap<K, V> might be able to hold\nmore, but is guaranteed to be able to hold at least this many.

\n
§Examples
\n
use std::collections::HashMap;\nlet map: HashMap<i32, i32> = HashMap::with_capacity(100);\nassert!(map.capacity() >= 100);
\n
1.0.0 · source

pub fn keys(&self) -> Keys<'_, K, V>

An iterator visiting all keys in arbitrary order.\nThe iterator element type is &'a K.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet map = HashMap::from([\n    (\"a\", 1),\n    (\"b\", 2),\n    (\"c\", 3),\n]);\n\nfor key in map.keys() {\n    println!(\"{key}\");\n}
\n
§Performance
\n

In the current implementation, iterating over keys takes O(capacity) time\ninstead of O(len) because it internally visits empty buckets too.

\n
1.54.0 · source

pub fn into_keys(self) -> IntoKeys<K, V>

Creates a consuming iterator visiting all the keys in arbitrary order.\nThe map cannot be used after calling this.\nThe iterator element type is K.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet map = HashMap::from([\n    (\"a\", 1),\n    (\"b\", 2),\n    (\"c\", 3),\n]);\n\nlet mut vec: Vec<&str> = map.into_keys().collect();\n// The `IntoKeys` iterator produces keys in arbitrary order, so the\n// keys must be sorted to test them against a sorted array.\nvec.sort_unstable();\nassert_eq!(vec, [\"a\", \"b\", \"c\"]);
\n
§Performance
\n

In the current implementation, iterating over keys takes O(capacity) time\ninstead of O(len) because it internally visits empty buckets too.

\n
1.0.0 · source

pub fn values(&self) -> Values<'_, K, V>

An iterator visiting all values in arbitrary order.\nThe iterator element type is &'a V.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet map = HashMap::from([\n    (\"a\", 1),\n    (\"b\", 2),\n    (\"c\", 3),\n]);\n\nfor val in map.values() {\n    println!(\"{val}\");\n}
\n
§Performance
\n

In the current implementation, iterating over values takes O(capacity) time\ninstead of O(len) because it internally visits empty buckets too.

\n
1.10.0 · source

pub fn values_mut(&mut self) -> ValuesMut<'_, K, V>

An iterator visiting all values mutably in arbitrary order.\nThe iterator element type is &'a mut V.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet mut map = HashMap::from([\n    (\"a\", 1),\n    (\"b\", 2),\n    (\"c\", 3),\n]);\n\nfor val in map.values_mut() {\n    *val = *val + 10;\n}\n\nfor val in map.values() {\n    println!(\"{val}\");\n}
\n
§Performance
\n

In the current implementation, iterating over values takes O(capacity) time\ninstead of O(len) because it internally visits empty buckets too.

\n
1.54.0 · source

pub fn into_values(self) -> IntoValues<K, V>

Creates a consuming iterator visiting all the values in arbitrary order.\nThe map cannot be used after calling this.\nThe iterator element type is V.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet map = HashMap::from([\n    (\"a\", 1),\n    (\"b\", 2),\n    (\"c\", 3),\n]);\n\nlet mut vec: Vec<i32> = map.into_values().collect();\n// The `IntoValues` iterator produces values in arbitrary order, so\n// the values must be sorted to test them against a sorted array.\nvec.sort_unstable();\nassert_eq!(vec, [1, 2, 3]);
\n
§Performance
\n

In the current implementation, iterating over values takes O(capacity) time\ninstead of O(len) because it internally visits empty buckets too.

\n
1.0.0 · source

pub fn iter(&self) -> Iter<'_, K, V>

An iterator visiting all key-value pairs in arbitrary order.\nThe iterator element type is (&'a K, &'a V).

\n
§Examples
\n
use std::collections::HashMap;\n\nlet map = HashMap::from([\n    (\"a\", 1),\n    (\"b\", 2),\n    (\"c\", 3),\n]);\n\nfor (key, val) in map.iter() {\n    println!(\"key: {key} val: {val}\");\n}
\n
§Performance
\n

In the current implementation, iterating over map takes O(capacity) time\ninstead of O(len) because it internally visits empty buckets too.

\n
1.0.0 · source

pub fn iter_mut(&mut self) -> IterMut<'_, K, V>

An iterator visiting all key-value pairs in arbitrary order,\nwith mutable references to the values.\nThe iterator element type is (&'a K, &'a mut V).

\n
§Examples
\n
use std::collections::HashMap;\n\nlet mut map = HashMap::from([\n    (\"a\", 1),\n    (\"b\", 2),\n    (\"c\", 3),\n]);\n\n// Update all values\nfor (_, val) in map.iter_mut() {\n    *val *= 2;\n}\n\nfor (key, val) in &map {\n    println!(\"key: {key} val: {val}\");\n}
\n
§Performance
\n

In the current implementation, iterating over map takes O(capacity) time\ninstead of O(len) because it internally visits empty buckets too.

\n
1.0.0 · source

pub fn len(&self) -> usize

Returns the number of elements in the map.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet mut a = HashMap::new();\nassert_eq!(a.len(), 0);\na.insert(1, \"a\");\nassert_eq!(a.len(), 1);
\n
1.0.0 · source

pub fn is_empty(&self) -> bool

Returns true if the map contains no elements.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet mut a = HashMap::new();\nassert!(a.is_empty());\na.insert(1, \"a\");\nassert!(!a.is_empty());
\n
1.6.0 · source

pub fn drain(&mut self) -> Drain<'_, K, V>

Clears the map, returning all key-value pairs as an iterator. Keeps the\nallocated memory for reuse.

\n

If the returned iterator is dropped before being fully consumed, it\ndrops the remaining key-value pairs. The returned iterator keeps a\nmutable borrow on the map to optimize its implementation.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet mut a = HashMap::new();\na.insert(1, \"a\");\na.insert(2, \"b\");\n\nfor (k, v) in a.drain().take(1) {\n    assert!(k == 1 || k == 2);\n    assert!(v == \"a\" || v == \"b\");\n}\n\nassert!(a.is_empty());
\n
source

pub fn extract_if<F>(&mut self, pred: F) -> ExtractIf<'_, K, V, F>
where\n F: FnMut(&K, &mut V) -> bool,

🔬This is a nightly-only experimental API. (hash_extract_if)

Creates an iterator which uses a closure to determine if an element should be removed.

\n

If the closure returns true, the element is removed from the map and yielded.\nIf the closure returns false, or panics, the element remains in the map and will not be\nyielded.

\n

Note that extract_if lets you mutate every value in the filter closure, regardless of\nwhether you choose to keep or remove it.

\n

If the returned ExtractIf is not exhausted, e.g. because it is dropped without iterating\nor the iteration short-circuits, then the remaining elements will be retained.\nUse retain with a negated predicate if you do not need the returned iterator.

\n
§Examples
\n

Splitting a map into even and odd keys, reusing the original map:

\n\n
#![feature(hash_extract_if)]\nuse std::collections::HashMap;\n\nlet mut map: HashMap<i32, i32> = (0..8).map(|x| (x, x)).collect();\nlet extracted: HashMap<i32, i32> = map.extract_if(|k, _v| k % 2 == 0).collect();\n\nlet mut evens = extracted.keys().copied().collect::<Vec<_>>();\nlet mut odds = map.keys().copied().collect::<Vec<_>>();\nevens.sort();\nodds.sort();\n\nassert_eq!(evens, vec![0, 2, 4, 6]);\nassert_eq!(odds, vec![1, 3, 5, 7]);
\n
1.18.0 · source

pub fn retain<F>(&mut self, f: F)
where\n F: FnMut(&K, &mut V) -> bool,

Retains only the elements specified by the predicate.

\n

In other words, remove all pairs (k, v) for which f(&k, &mut v) returns false.\nThe elements are visited in unsorted (and unspecified) order.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet mut map: HashMap<i32, i32> = (0..8).map(|x| (x, x*10)).collect();\nmap.retain(|&k, _| k % 2 == 0);\nassert_eq!(map.len(), 4);
\n
§Performance
\n

In the current implementation, this operation takes O(capacity) time\ninstead of O(len) because it internally visits empty buckets too.

\n
1.0.0 · source

pub fn clear(&mut self)

Clears the map, removing all key-value pairs. Keeps the allocated memory\nfor reuse.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet mut a = HashMap::new();\na.insert(1, \"a\");\na.clear();\nassert!(a.is_empty());
\n
1.9.0 · source

pub fn hasher(&self) -> &S

Returns a reference to the map’s BuildHasher.

\n
§Examples
\n
use std::collections::HashMap;\nuse std::hash::RandomState;\n\nlet hasher = RandomState::new();\nlet map: HashMap<i32, i32> = HashMap::with_hasher(hasher);\nlet hasher: &RandomState = map.hasher();
\n
",0,"air_test_utils::CallRequests","air_test_utils::CallResults"],["
source§

impl<K, V, S> HashMap<K, V, S>
where\n K: Eq + Hash,\n S: BuildHasher,

1.0.0 · source

pub fn reserve(&mut self, additional: usize)

Reserves capacity for at least additional more elements to be inserted\nin the HashMap. The collection may reserve more space to speculatively\navoid frequent reallocations. After calling reserve,\ncapacity will be greater than or equal to self.len() + additional.\nDoes nothing if capacity is already sufficient.

\n
§Panics
\n

Panics if the new allocation size overflows usize.

\n
§Examples
\n
use std::collections::HashMap;\nlet mut map: HashMap<&str, i32> = HashMap::new();\nmap.reserve(10);
\n
1.57.0 · source

pub fn try_reserve(&mut self, additional: usize) -> Result<(), TryReserveError>

Tries to reserve capacity for at least additional more elements to be inserted\nin the HashMap. The collection may reserve more space to speculatively\navoid frequent reallocations. After calling try_reserve,\ncapacity will be greater than or equal to self.len() + additional if\nit returns Ok(()).\nDoes nothing if capacity is already sufficient.

\n
§Errors
\n

If the capacity overflows, or the allocator reports a failure, then an error\nis returned.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet mut map: HashMap<&str, isize> = HashMap::new();\nmap.try_reserve(10).expect(\"why is the test harness OOMing on a handful of bytes?\");
\n
1.0.0 · source

pub fn shrink_to_fit(&mut self)

Shrinks the capacity of the map as much as possible. It will drop\ndown as much as possible while maintaining the internal rules\nand possibly leaving some space in accordance with the resize policy.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet mut map: HashMap<i32, i32> = HashMap::with_capacity(100);\nmap.insert(1, 2);\nmap.insert(3, 4);\nassert!(map.capacity() >= 100);\nmap.shrink_to_fit();\nassert!(map.capacity() >= 2);
\n
1.56.0 · source

pub fn shrink_to(&mut self, min_capacity: usize)

Shrinks the capacity of the map with a lower limit. It will drop\ndown no lower than the supplied limit while maintaining the internal rules\nand possibly leaving some space in accordance with the resize policy.

\n

If the current capacity is less than the lower limit, this is a no-op.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet mut map: HashMap<i32, i32> = HashMap::with_capacity(100);\nmap.insert(1, 2);\nmap.insert(3, 4);\nassert!(map.capacity() >= 100);\nmap.shrink_to(10);\nassert!(map.capacity() >= 10);\nmap.shrink_to(0);\nassert!(map.capacity() >= 2);
\n
1.0.0 · source

pub fn entry(&mut self, key: K) -> Entry<'_, K, V>

Gets the given key’s corresponding entry in the map for in-place manipulation.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet mut letters = HashMap::new();\n\nfor ch in \"a short treatise on fungi\".chars() {\n    letters.entry(ch).and_modify(|counter| *counter += 1).or_insert(1);\n}\n\nassert_eq!(letters[&'s'], 2);\nassert_eq!(letters[&'t'], 3);\nassert_eq!(letters[&'u'], 1);\nassert_eq!(letters.get(&'y'), None);
\n
1.0.0 · source

pub fn get<Q>(&self, k: &Q) -> Option<&V>
where\n K: Borrow<Q>,\n Q: Hash + Eq + ?Sized,

Returns a reference to the value corresponding to the key.

\n

The key may be any borrowed form of the map’s key type, but\nHash and Eq on the borrowed form must match those for\nthe key type.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet mut map = HashMap::new();\nmap.insert(1, \"a\");\nassert_eq!(map.get(&1), Some(&\"a\"));\nassert_eq!(map.get(&2), None);
\n
1.40.0 · source

pub fn get_key_value<Q>(&self, k: &Q) -> Option<(&K, &V)>
where\n K: Borrow<Q>,\n Q: Hash + Eq + ?Sized,

Returns the key-value pair corresponding to the supplied key.

\n

The supplied key may be any borrowed form of the map’s key type, but\nHash and Eq on the borrowed form must match those for\nthe key type.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet mut map = HashMap::new();\nmap.insert(1, \"a\");\nassert_eq!(map.get_key_value(&1), Some((&1, &\"a\")));\nassert_eq!(map.get_key_value(&2), None);
\n
source

pub fn get_many_mut<Q, const N: usize>(\n &mut self,\n ks: [&Q; N],\n) -> Option<[&mut V; N]>
where\n K: Borrow<Q>,\n Q: Hash + Eq + ?Sized,

🔬This is a nightly-only experimental API. (map_many_mut)

Attempts to get mutable references to N values in the map at once.

\n

Returns an array of length N with the results of each query. For soundness, at most one\nmutable reference will be returned to any value. None will be returned if any of the\nkeys are duplicates or missing.

\n
§Examples
\n
#![feature(map_many_mut)]\nuse std::collections::HashMap;\n\nlet mut libraries = HashMap::new();\nlibraries.insert(\"Bodleian Library\".to_string(), 1602);\nlibraries.insert(\"Athenæum\".to_string(), 1807);\nlibraries.insert(\"Herzogin-Anna-Amalia-Bibliothek\".to_string(), 1691);\nlibraries.insert(\"Library of Congress\".to_string(), 1800);\n\nlet got = libraries.get_many_mut([\n    \"Athenæum\",\n    \"Library of Congress\",\n]);\nassert_eq!(\n    got,\n    Some([\n        &mut 1807,\n        &mut 1800,\n    ]),\n);\n\n// Missing keys result in None\nlet got = libraries.get_many_mut([\n    \"Athenæum\",\n    \"New York Public Library\",\n]);\nassert_eq!(got, None);\n\n// Duplicate keys result in None\nlet got = libraries.get_many_mut([\n    \"Athenæum\",\n    \"Athenæum\",\n]);\nassert_eq!(got, None);
\n
source

pub unsafe fn get_many_unchecked_mut<Q, const N: usize>(\n &mut self,\n ks: [&Q; N],\n) -> Option<[&mut V; N]>
where\n K: Borrow<Q>,\n Q: Hash + Eq + ?Sized,

🔬This is a nightly-only experimental API. (map_many_mut)

Attempts to get mutable references to N values in the map at once, without validating that\nthe values are unique.

\n

Returns an array of length N with the results of each query. None will be returned if\nany of the keys are missing.

\n

For a safe alternative see get_many_mut.

\n
§Safety
\n

Calling this method with overlapping keys is undefined behavior even if the resulting\nreferences are not used.

\n
§Examples
\n
#![feature(map_many_mut)]\nuse std::collections::HashMap;\n\nlet mut libraries = HashMap::new();\nlibraries.insert(\"Bodleian Library\".to_string(), 1602);\nlibraries.insert(\"Athenæum\".to_string(), 1807);\nlibraries.insert(\"Herzogin-Anna-Amalia-Bibliothek\".to_string(), 1691);\nlibraries.insert(\"Library of Congress\".to_string(), 1800);\n\nlet got = libraries.get_many_mut([\n    \"Athenæum\",\n    \"Library of Congress\",\n]);\nassert_eq!(\n    got,\n    Some([\n        &mut 1807,\n        &mut 1800,\n    ]),\n);\n\n// Missing keys result in None\nlet got = libraries.get_many_mut([\n    \"Athenæum\",\n    \"New York Public Library\",\n]);\nassert_eq!(got, None);
\n
1.0.0 · source

pub fn contains_key<Q>(&self, k: &Q) -> bool
where\n K: Borrow<Q>,\n Q: Hash + Eq + ?Sized,

Returns true if the map contains a value for the specified key.

\n

The key may be any borrowed form of the map’s key type, but\nHash and Eq on the borrowed form must match those for\nthe key type.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet mut map = HashMap::new();\nmap.insert(1, \"a\");\nassert_eq!(map.contains_key(&1), true);\nassert_eq!(map.contains_key(&2), false);
\n
1.0.0 · source

pub fn get_mut<Q>(&mut self, k: &Q) -> Option<&mut V>
where\n K: Borrow<Q>,\n Q: Hash + Eq + ?Sized,

Returns a mutable reference to the value corresponding to the key.

\n

The key may be any borrowed form of the map’s key type, but\nHash and Eq on the borrowed form must match those for\nthe key type.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet mut map = HashMap::new();\nmap.insert(1, \"a\");\nif let Some(x) = map.get_mut(&1) {\n    *x = \"b\";\n}\nassert_eq!(map[&1], \"b\");
\n
1.0.0 · source

pub fn insert(&mut self, k: K, v: V) -> Option<V>

Inserts a key-value pair into the map.

\n

If the map did not have this key present, None is returned.

\n

If the map did have this key present, the value is updated, and the old\nvalue is returned. The key is not updated, though; this matters for\ntypes that can be == without being identical. See the module-level\ndocumentation for more.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet mut map = HashMap::new();\nassert_eq!(map.insert(37, \"a\"), None);\nassert_eq!(map.is_empty(), false);\n\nmap.insert(37, \"b\");\nassert_eq!(map.insert(37, \"c\"), Some(\"b\"));\nassert_eq!(map[&37], \"c\");
\n
source

pub fn try_insert(\n &mut self,\n key: K,\n value: V,\n) -> Result<&mut V, OccupiedError<'_, K, V>>

🔬This is a nightly-only experimental API. (map_try_insert)

Tries to insert a key-value pair into the map, and returns\na mutable reference to the value in the entry.

\n

If the map already had this key present, nothing is updated, and\nan error containing the occupied entry and the value is returned.

\n
§Examples
\n

Basic usage:

\n\n
#![feature(map_try_insert)]\n\nuse std::collections::HashMap;\n\nlet mut map = HashMap::new();\nassert_eq!(map.try_insert(37, \"a\").unwrap(), &\"a\");\n\nlet err = map.try_insert(37, \"b\").unwrap_err();\nassert_eq!(err.entry.key(), &37);\nassert_eq!(err.entry.get(), &\"a\");\nassert_eq!(err.value, \"b\");
\n
1.0.0 · source

pub fn remove<Q>(&mut self, k: &Q) -> Option<V>
where\n K: Borrow<Q>,\n Q: Hash + Eq + ?Sized,

Removes a key from the map, returning the value at the key if the key\nwas previously in the map.

\n

The key may be any borrowed form of the map’s key type, but\nHash and Eq on the borrowed form must match those for\nthe key type.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet mut map = HashMap::new();\nmap.insert(1, \"a\");\nassert_eq!(map.remove(&1), Some(\"a\"));\nassert_eq!(map.remove(&1), None);
\n
1.27.0 · source

pub fn remove_entry<Q>(&mut self, k: &Q) -> Option<(K, V)>
where\n K: Borrow<Q>,\n Q: Hash + Eq + ?Sized,

Removes a key from the map, returning the stored key and value if the\nkey was previously in the map.

\n

The key may be any borrowed form of the map’s key type, but\nHash and Eq on the borrowed form must match those for\nthe key type.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet mut map = HashMap::new();\nmap.insert(1, \"a\");\nassert_eq!(map.remove_entry(&1), Some((1, \"a\")));\nassert_eq!(map.remove(&1), None);
\n
",0,"air_test_utils::CallRequests","air_test_utils::CallResults"],["
1.0.0 · source§

impl<K, Q, V, S> Index<&Q> for HashMap<K, V, S>
where\n K: Eq + Hash + Borrow<Q>,\n Q: Eq + Hash + ?Sized,\n S: BuildHasher,

source§

fn index(&self, key: &Q) -> &V

Returns a reference to the value corresponding to the supplied key.

\n
§Panics
\n

Panics if the key is not present in the HashMap.

\n
§

type Output = V

The returned type after indexing.
","Index<&Q>","air_test_utils::CallRequests","air_test_utils::CallResults"],["
source§

impl<'de, K, V, S, E> IntoDeserializer<'de, E> for HashMap<K, V, S>
where\n K: IntoDeserializer<'de, E> + Eq + Hash,\n V: IntoDeserializer<'de, E>,\n S: BuildHasher,\n E: Error,

§

type Deserializer = MapDeserializer<'de, <HashMap<K, V, S> as IntoIterator>::IntoIter, E>

The type of the deserializer being converted into.
source§

fn into_deserializer(\n self,\n) -> <HashMap<K, V, S> as IntoDeserializer<'de, E>>::Deserializer

Convert this value into a deserializer.
","IntoDeserializer<'de, E>","air_test_utils::CallRequests","air_test_utils::CallResults"],["
1.0.0 · source§

impl<K, V, S> IntoIterator for HashMap<K, V, S>

source§

fn into_iter(self) -> IntoIter<K, V>

Creates a consuming iterator, that is, one that moves each key-value\npair out of the map in arbitrary order. The map cannot be used after\ncalling this.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet map = HashMap::from([\n    (\"a\", 1),\n    (\"b\", 2),\n    (\"c\", 3),\n]);\n\n// Not possible with .iter()\nlet vec: Vec<(&str, i32)> = map.into_iter().collect();
\n
§

type Item = (K, V)

The type of the elements being iterated over.
§

type IntoIter = IntoIter<K, V>

Which kind of iterator are we turning this into?
","IntoIterator","air_test_utils::CallRequests","air_test_utils::CallResults"],["
§

impl<K, V, S> IntoParallelIterator for HashMap<K, V, S>
where\n K: Hash + Eq + Send,\n V: Send,\n S: BuildHasher,

§

type Item = <HashMap<K, V, S> as IntoIterator>::Item

The type of item that the parallel iterator will produce.
§

type Iter = IntoIter<K, V>

The parallel iterator type that will be created.
§

fn into_par_iter(self) -> <HashMap<K, V, S> as IntoParallelIterator>::Iter

Converts self into a parallel iterator. Read more
","IntoParallelIterator","air_test_utils::CallRequests","air_test_utils::CallResults"],["
§

impl<'a, K, V, S> ParallelExtend<(&'a K, &'a V)> for HashMap<K, V, S>
where\n K: 'a + Copy + Eq + Hash + Send + Sync,\n V: 'a + Copy + Send + Sync,\n S: BuildHasher + Send,

Extends a hash map with copied items from a parallel iterator.

\n
§

fn par_extend<I>(&mut self, par_iter: I)
where\n I: IntoParallelIterator<Item = (&'a K, &'a V)>,

Extends an instance of the collection with the elements drawn\nfrom the parallel iterator par_iter. Read more
","ParallelExtend<(&'a K, &'a V)>","air_test_utils::CallRequests","air_test_utils::CallResults"],["
§

impl<K, V, S> ParallelExtend<(K, V)> for HashMap<K, V, S>
where\n K: Eq + Hash + Send,\n V: Send,\n S: BuildHasher + Send,

Extends a hash map with items from a parallel iterator.

\n
§

fn par_extend<I>(&mut self, par_iter: I)
where\n I: IntoParallelIterator<Item = (K, V)>,

Extends an instance of the collection with the elements drawn\nfrom the parallel iterator par_iter. Read more
","ParallelExtend<(K, V)>","air_test_utils::CallRequests","air_test_utils::CallResults"],["
§

impl<K, V, AK, AV> PartialEq<ArchivedHashMap<AK, AV>> for HashMap<K, V>
where\n K: Hash + Eq + Borrow<AK>,\n AK: Hash + Eq,\n AV: PartialEq<V>,

§

fn eq(&self, other: &ArchivedHashMap<AK, AV>) -> bool

This method tests for self and other values to be equal, and is used\nby ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always\nsufficient, and should not be overridden without very good reason.
","PartialEq>","air_test_utils::CallRequests","air_test_utils::CallResults"],["
1.0.0 · source§

impl<K, V, S> PartialEq for HashMap<K, V, S>
where\n K: Eq + Hash,\n V: PartialEq,\n S: BuildHasher,

source§

fn eq(&self, other: &HashMap<K, V, S>) -> bool

This method tests for self and other values to be equal, and is used\nby ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always\nsufficient, and should not be overridden without very good reason.
","PartialEq","air_test_utils::CallRequests","air_test_utils::CallResults"],["
§

impl<K, V, S, RandomState> Serialize<S> for HashMap<K, V, RandomState>
where\n K: Serialize<S> + Hash + Eq,\n <K as Archive>::Archived: Hash + Eq,\n V: Serialize<S>,\n S: Serializer + ScratchSpace + ?Sized,

§

fn serialize(\n &self,\n serializer: &mut S,\n) -> Result<<HashMap<K, V, RandomState> as Archive>::Resolver, <S as Fallible>::Error>

Writes the dependencies for the object and returns a resolver that can create the archived\ntype.
","Serialize","air_test_utils::CallRequests","air_test_utils::CallResults"],["
source§

impl<K, V, H> Serialize for HashMap<K, V, H>
where\n K: Serialize,\n V: Serialize,

source§

fn serialize<S>(\n &self,\n serializer: S,\n) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error>
where\n S: Serializer,

Serialize this value into the given Serde serializer. Read more
","Serialize","air_test_utils::CallRequests","air_test_utils::CallResults"],["
source§

impl<K, KAs, V, VAs> SerializeAs<[(K, V)]> for HashMap<KAs, VAs>
where\n KAs: SerializeAs<K>,\n VAs: SerializeAs<V>,

source§

fn serialize_as<S>(\n source: &[(K, V)],\n serializer: S,\n) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error>
where\n S: Serializer,

Serialize this value into the given Serde serializer.
","SerializeAs<[(K, V)]>","air_test_utils::CallRequests","air_test_utils::CallResults"],["
source§

impl<K, KAs, V, VAs, const N: usize> SerializeAs<[(K, V); N]> for HashMap<KAs, VAs>
where\n KAs: SerializeAs<K>,\n VAs: SerializeAs<V>,

source§

fn serialize_as<S>(\n source: &[(K, V); N],\n serializer: S,\n) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error>
where\n S: Serializer,

Serialize this value into the given Serde serializer.
","SerializeAs<[(K, V); N]>","air_test_utils::CallRequests","air_test_utils::CallResults"],["
source§

impl<K, KAs, V, VAs> SerializeAs<BTreeSet<(K, V)>> for HashMap<KAs, VAs>
where\n KAs: SerializeAs<K>,\n VAs: SerializeAs<V>,

source§

fn serialize_as<S>(\n source: &BTreeSet<(K, V)>,\n serializer: S,\n) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error>
where\n S: Serializer,

Serialize this value into the given Serde serializer.
","SerializeAs>","air_test_utils::CallRequests","air_test_utils::CallResults"],["
source§

impl<K, KAs, V, VAs> SerializeAs<BinaryHeap<(K, V)>> for HashMap<KAs, VAs>
where\n KAs: SerializeAs<K>,\n VAs: SerializeAs<V>,

source§

fn serialize_as<S>(\n source: &BinaryHeap<(K, V)>,\n serializer: S,\n) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error>
where\n S: Serializer,

Serialize this value into the given Serde serializer.
","SerializeAs>","air_test_utils::CallRequests","air_test_utils::CallResults"],["
source§

impl<K, KAs, V, VAs> SerializeAs<Box<[(K, V)]>> for HashMap<KAs, VAs>
where\n KAs: SerializeAs<K>,\n VAs: SerializeAs<V>,

source§

fn serialize_as<S>(\n source: &Box<[(K, V)]>,\n serializer: S,\n) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error>
where\n S: Serializer,

Serialize this value into the given Serde serializer.
","SerializeAs>","air_test_utils::CallRequests","air_test_utils::CallResults"],["
source§

impl<K, KU, V, VU, H> SerializeAs<HashMap<K, V, H>> for HashMap<KU, VU, H>
where\n KU: SerializeAs<K>,\n VU: SerializeAs<V>,

source§

fn serialize_as<S>(\n source: &HashMap<K, V, H>,\n serializer: S,\n) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error>
where\n S: Serializer,

Serialize this value into the given Serde serializer.
","SerializeAs>","air_test_utils::CallRequests","air_test_utils::CallResults"],["
source§

impl<K, KAs, V, VAs, H> SerializeAs<HashSet<(K, V), H>> for HashMap<KAs, VAs>
where\n KAs: SerializeAs<K>,\n VAs: SerializeAs<V>,

source§

fn serialize_as<S>(\n source: &HashSet<(K, V), H>,\n serializer: S,\n) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error>
where\n S: Serializer,

Serialize this value into the given Serde serializer.
","SerializeAs>","air_test_utils::CallRequests","air_test_utils::CallResults"],["
source§

impl<K, KAs, V, VAs> SerializeAs<LinkedList<(K, V)>> for HashMap<KAs, VAs>
where\n KAs: SerializeAs<K>,\n VAs: SerializeAs<V>,

source§

fn serialize_as<S>(\n source: &LinkedList<(K, V)>,\n serializer: S,\n) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error>
where\n S: Serializer,

Serialize this value into the given Serde serializer.
","SerializeAs>","air_test_utils::CallRequests","air_test_utils::CallResults"],["
source§

impl<K, KAs, V, VAs> SerializeAs<Option<(K, V)>> for HashMap<KAs, VAs>
where\n KAs: SerializeAs<K>,\n VAs: SerializeAs<V>,

source§

fn serialize_as<S>(\n source: &Option<(K, V)>,\n serializer: S,\n) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error>
where\n S: Serializer,

Serialize this value into the given Serde serializer.
","SerializeAs>","air_test_utils::CallRequests","air_test_utils::CallResults"],["
source§

impl<K, KAs, V, VAs> SerializeAs<Vec<(K, V)>> for HashMap<KAs, VAs>
where\n KAs: SerializeAs<K>,\n VAs: SerializeAs<V>,

source§

fn serialize_as<S>(\n source: &Vec<(K, V)>,\n serializer: S,\n) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error>
where\n S: Serializer,

Serialize this value into the given Serde serializer.
","SerializeAs>","air_test_utils::CallRequests","air_test_utils::CallResults"],["
source§

impl<K, KAs, V, VAs> SerializeAs<VecDeque<(K, V)>> for HashMap<KAs, VAs>
where\n KAs: SerializeAs<K>,\n VAs: SerializeAs<V>,

source§

fn serialize_as<S>(\n source: &VecDeque<(K, V)>,\n serializer: S,\n) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error>
where\n S: Serializer,

Serialize this value into the given Serde serializer.
","SerializeAs>","air_test_utils::CallRequests","air_test_utils::CallResults"],["
1.0.0 · source§

impl<K, V, S> Eq for HashMap<K, V, S>
where\n K: Eq + Hash,\n V: Eq,\n S: BuildHasher,

","Eq","air_test_utils::CallRequests","air_test_utils::CallResults"],["
1.36.0 · source§

impl<K, V, S> UnwindSafe for HashMap<K, V, S>
where\n K: UnwindSafe,\n V: UnwindSafe,\n S: UnwindSafe,

","UnwindSafe","air_test_utils::CallRequests","air_test_utils::CallResults"]], +"avm_interface":[["
§

impl<K, V, S> Archive for HashMap<K, V, S>
where\n K: Archive + Hash + Eq,\n V: Archive,\n <K as Archive>::Archived: Hash + Eq,

§

type Archived = ArchivedHashMap<<K as Archive>::Archived, <V as Archive>::Archived>

The archived representation of this type. Read more
§

type Resolver = HashMapResolver

The resolver for this type. It must contain all the additional information from serializing\nneeded to make the archived type from the normal type.
§

unsafe fn resolve(\n &self,\n pos: usize,\n resolver: <HashMap<K, V, S> as Archive>::Resolver,\n out: *mut <HashMap<K, V, S> as Archive>::Archived,\n)

Creates the archived version of this value at the given position and writes it to the given\noutput. Read more
","Archive","avm_interface::call_request_parameters::CallRequests","avm_interface::call_service_result::CallResults"],["
1.0.0 · source§

impl<K, V, S> Clone for HashMap<K, V, S>
where\n K: Clone,\n V: Clone,\n S: Clone,

source§

fn clone(&self) -> HashMap<K, V, S>

Returns a copy of the value. Read more
source§

fn clone_from(&mut self, source: &HashMap<K, V, S>)

Performs copy-assignment from source. Read more
","Clone","avm_interface::call_request_parameters::CallRequests","avm_interface::call_service_result::CallResults"],["
1.0.0 · source§

impl<K, V, S> Debug for HashMap<K, V, S>
where\n K: Debug,\n V: Debug,

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
","Debug","avm_interface::call_request_parameters::CallRequests","avm_interface::call_service_result::CallResults"],["
1.0.0 · source§

impl<K, V, S> Default for HashMap<K, V, S>
where\n S: Default,

source§

fn default() -> HashMap<K, V, S>

Creates an empty HashMap<K, V, S>, with the Default value for the hasher.

\n
","Default","avm_interface::call_request_parameters::CallRequests","avm_interface::call_service_result::CallResults"],["
source§

impl<'de, K, V, S> Deserialize<'de> for HashMap<K, V, S>
where\n K: Deserialize<'de> + Eq + Hash,\n V: Deserialize<'de>,\n S: BuildHasher + Default,

source§

fn deserialize<D>(\n deserializer: D,\n) -> Result<HashMap<K, V, S>, <D as Deserializer<'de>>::Error>
where\n D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
","Deserialize<'de>","avm_interface::call_request_parameters::CallRequests","avm_interface::call_service_result::CallResults"],["
1.4.0 · source§

impl<'a, K, V, S> Extend<(&'a K, &'a V)> for HashMap<K, V, S>
where\n K: Eq + Hash + Copy,\n V: Copy,\n S: BuildHasher,

source§

fn extend<T>(&mut self, iter: T)
where\n T: IntoIterator<Item = (&'a K, &'a V)>,

Extends a collection with the contents of an iterator. Read more
source§

fn extend_one(&mut self, _: (&'a K, &'a V))

🔬This is a nightly-only experimental API. (extend_one)
Extends a collection with exactly one element.
source§

fn extend_reserve(&mut self, additional: usize)

🔬This is a nightly-only experimental API. (extend_one)
Reserves capacity in a collection for the given number of additional elements. Read more
","Extend<(&'a K, &'a V)>","avm_interface::call_request_parameters::CallRequests","avm_interface::call_service_result::CallResults"],["
1.0.0 · source§

impl<K, V, S> Extend<(K, V)> for HashMap<K, V, S>
where\n K: Eq + Hash,\n S: BuildHasher,

Inserts all new key-values from the iterator and replaces values with existing\nkeys with new values returned from the iterator.

\n
source§

fn extend<T>(&mut self, iter: T)
where\n T: IntoIterator<Item = (K, V)>,

Extends a collection with the contents of an iterator. Read more
source§

fn extend_one(&mut self, _: (K, V))

🔬This is a nightly-only experimental API. (extend_one)
Extends a collection with exactly one element.
source§

fn extend_reserve(&mut self, additional: usize)

🔬This is a nightly-only experimental API. (extend_one)
Reserves capacity in a collection for the given number of additional elements. Read more
","Extend<(K, V)>","avm_interface::call_request_parameters::CallRequests","avm_interface::call_service_result::CallResults"],["
1.56.0 · source§

impl<K, V, const N: usize> From<[(K, V); N]> for HashMap<K, V>
where\n K: Eq + Hash,

source§

fn from(arr: [(K, V); N]) -> HashMap<K, V>

§Examples
\n
use std::collections::HashMap;\n\nlet map1 = HashMap::from([(1, 2), (3, 4)]);\nlet map2: HashMap<_, _> = [(1, 2), (3, 4)].into();\nassert_eq!(map1, map2);
\n
","From<[(K, V); N]>","avm_interface::call_request_parameters::CallRequests","avm_interface::call_service_result::CallResults"],["
1.0.0 · source§

impl<K, V, S> FromIterator<(K, V)> for HashMap<K, V, S>
where\n K: Eq + Hash,\n S: BuildHasher + Default,

source§

fn from_iter<T>(iter: T) -> HashMap<K, V, S>
where\n T: IntoIterator<Item = (K, V)>,

Creates a value from an iterator. Read more
","FromIterator<(K, V)>","avm_interface::call_request_parameters::CallRequests","avm_interface::call_service_result::CallResults"],["
source§

impl<K, V> HashMap<K, V>

1.0.0 · source

pub fn new() -> HashMap<K, V>

Creates an empty HashMap.

\n

The hash map is initially created with a capacity of 0, so it will not allocate until it\nis first inserted into.

\n
§Examples
\n
use std::collections::HashMap;\nlet mut map: HashMap<&str, i32> = HashMap::new();
\n
1.0.0 · source

pub fn with_capacity(capacity: usize) -> HashMap<K, V>

Creates an empty HashMap with at least the specified capacity.

\n

The hash map will be able to hold at least capacity elements without\nreallocating. This method is allowed to allocate for more elements than\ncapacity. If capacity is 0, the hash map will not allocate.

\n
§Examples
\n
use std::collections::HashMap;\nlet mut map: HashMap<&str, i32> = HashMap::with_capacity(10);
\n
",0,"avm_interface::call_request_parameters::CallRequests","avm_interface::call_service_result::CallResults"],["
source§

impl<K, V, S> HashMap<K, V, S>
where\n S: BuildHasher,

source

pub fn raw_entry_mut(&mut self) -> RawEntryBuilderMut<'_, K, V, S>

🔬This is a nightly-only experimental API. (hash_raw_entry)

Creates a raw entry builder for the HashMap.

\n

Raw entries provide the lowest level of control for searching and\nmanipulating a map. They must be manually initialized with a hash and\nthen manually searched. After this, insertions into a vacant entry\nstill require an owned key to be provided.

\n

Raw entries are useful for such exotic situations as:

\n
    \n
  • Hash memoization
  • \n
  • Deferring the creation of an owned key until it is known to be required
  • \n
  • Using a search key that doesn’t work with the Borrow trait
  • \n
  • Using custom comparison logic without newtype wrappers
  • \n
\n

Because raw entries provide much more low-level control, it’s much easier\nto put the HashMap into an inconsistent state which, while memory-safe,\nwill cause the map to produce seemingly random results. Higher-level and\nmore foolproof APIs like entry should be preferred when possible.

\n

In particular, the hash used to initialize the raw entry must still be\nconsistent with the hash of the key that is ultimately stored in the entry.\nThis is because implementations of HashMap may need to recompute hashes\nwhen resizing, at which point only the keys are available.

\n

Raw entries give mutable access to the keys. This must not be used\nto modify how the key would compare or hash, as the map will not re-evaluate\nwhere the key should go, meaning the keys may become “lost” if their\nlocation does not reflect their state. For instance, if you change a key\nso that the map now contains keys which compare equal, search may start\nacting erratically, with two keys randomly masking each other. Implementations\nare free to assume this doesn’t happen (within the limits of memory-safety).

\n
source

pub fn raw_entry(&self) -> RawEntryBuilder<'_, K, V, S>

🔬This is a nightly-only experimental API. (hash_raw_entry)

Creates a raw immutable entry builder for the HashMap.

\n

Raw entries provide the lowest level of control for searching and\nmanipulating a map. They must be manually initialized with a hash and\nthen manually searched.

\n

This is useful for

\n
    \n
  • Hash memoization
  • \n
  • Using a search key that doesn’t work with the Borrow trait
  • \n
  • Using custom comparison logic without newtype wrappers
  • \n
\n

Unless you are in such a situation, higher-level and more foolproof APIs like\nget should be preferred.

\n

Immutable raw entries have very limited use; you might instead want raw_entry_mut.

\n
",0,"avm_interface::call_request_parameters::CallRequests","avm_interface::call_service_result::CallResults"],["
source§

impl<K, V, S> HashMap<K, V, S>

1.7.0 (const: unstable) · source

pub fn with_hasher(hash_builder: S) -> HashMap<K, V, S>

Creates an empty HashMap which will use the given hash builder to hash\nkeys.

\n

The created map has the default initial capacity.

\n

Warning: hash_builder is normally randomly generated, and\nis designed to allow HashMaps to be resistant to attacks that\ncause many collisions and very poor performance. Setting it\nmanually using this function can expose a DoS attack vector.

\n

The hash_builder passed should implement the BuildHasher trait for\nthe HashMap to be useful, see its documentation for details.

\n
§Examples
\n
use std::collections::HashMap;\nuse std::hash::RandomState;\n\nlet s = RandomState::new();\nlet mut map = HashMap::with_hasher(s);\nmap.insert(1, 2);
\n
1.7.0 · source

pub fn with_capacity_and_hasher(capacity: usize, hasher: S) -> HashMap<K, V, S>

Creates an empty HashMap with at least the specified capacity, using\nhasher to hash the keys.

\n

The hash map will be able to hold at least capacity elements without\nreallocating. This method is allowed to allocate for more elements than\ncapacity. If capacity is 0, the hash map will not allocate.

\n

Warning: hasher is normally randomly generated, and\nis designed to allow HashMaps to be resistant to attacks that\ncause many collisions and very poor performance. Setting it\nmanually using this function can expose a DoS attack vector.

\n

The hasher passed should implement the BuildHasher trait for\nthe HashMap to be useful, see its documentation for details.

\n
§Examples
\n
use std::collections::HashMap;\nuse std::hash::RandomState;\n\nlet s = RandomState::new();\nlet mut map = HashMap::with_capacity_and_hasher(10, s);\nmap.insert(1, 2);
\n
1.0.0 · source

pub fn capacity(&self) -> usize

Returns the number of elements the map can hold without reallocating.

\n

This number is a lower bound; the HashMap<K, V> might be able to hold\nmore, but is guaranteed to be able to hold at least this many.

\n
§Examples
\n
use std::collections::HashMap;\nlet map: HashMap<i32, i32> = HashMap::with_capacity(100);\nassert!(map.capacity() >= 100);
\n
1.0.0 · source

pub fn keys(&self) -> Keys<'_, K, V>

An iterator visiting all keys in arbitrary order.\nThe iterator element type is &'a K.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet map = HashMap::from([\n    (\"a\", 1),\n    (\"b\", 2),\n    (\"c\", 3),\n]);\n\nfor key in map.keys() {\n    println!(\"{key}\");\n}
\n
§Performance
\n

In the current implementation, iterating over keys takes O(capacity) time\ninstead of O(len) because it internally visits empty buckets too.

\n
1.54.0 · source

pub fn into_keys(self) -> IntoKeys<K, V>

Creates a consuming iterator visiting all the keys in arbitrary order.\nThe map cannot be used after calling this.\nThe iterator element type is K.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet map = HashMap::from([\n    (\"a\", 1),\n    (\"b\", 2),\n    (\"c\", 3),\n]);\n\nlet mut vec: Vec<&str> = map.into_keys().collect();\n// The `IntoKeys` iterator produces keys in arbitrary order, so the\n// keys must be sorted to test them against a sorted array.\nvec.sort_unstable();\nassert_eq!(vec, [\"a\", \"b\", \"c\"]);
\n
§Performance
\n

In the current implementation, iterating over keys takes O(capacity) time\ninstead of O(len) because it internally visits empty buckets too.

\n
1.0.0 · source

pub fn values(&self) -> Values<'_, K, V>

An iterator visiting all values in arbitrary order.\nThe iterator element type is &'a V.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet map = HashMap::from([\n    (\"a\", 1),\n    (\"b\", 2),\n    (\"c\", 3),\n]);\n\nfor val in map.values() {\n    println!(\"{val}\");\n}
\n
§Performance
\n

In the current implementation, iterating over values takes O(capacity) time\ninstead of O(len) because it internally visits empty buckets too.

\n
1.10.0 · source

pub fn values_mut(&mut self) -> ValuesMut<'_, K, V>

An iterator visiting all values mutably in arbitrary order.\nThe iterator element type is &'a mut V.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet mut map = HashMap::from([\n    (\"a\", 1),\n    (\"b\", 2),\n    (\"c\", 3),\n]);\n\nfor val in map.values_mut() {\n    *val = *val + 10;\n}\n\nfor val in map.values() {\n    println!(\"{val}\");\n}
\n
§Performance
\n

In the current implementation, iterating over values takes O(capacity) time\ninstead of O(len) because it internally visits empty buckets too.

\n
1.54.0 · source

pub fn into_values(self) -> IntoValues<K, V>

Creates a consuming iterator visiting all the values in arbitrary order.\nThe map cannot be used after calling this.\nThe iterator element type is V.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet map = HashMap::from([\n    (\"a\", 1),\n    (\"b\", 2),\n    (\"c\", 3),\n]);\n\nlet mut vec: Vec<i32> = map.into_values().collect();\n// The `IntoValues` iterator produces values in arbitrary order, so\n// the values must be sorted to test them against a sorted array.\nvec.sort_unstable();\nassert_eq!(vec, [1, 2, 3]);
\n
§Performance
\n

In the current implementation, iterating over values takes O(capacity) time\ninstead of O(len) because it internally visits empty buckets too.

\n
1.0.0 · source

pub fn iter(&self) -> Iter<'_, K, V>

An iterator visiting all key-value pairs in arbitrary order.\nThe iterator element type is (&'a K, &'a V).

\n
§Examples
\n
use std::collections::HashMap;\n\nlet map = HashMap::from([\n    (\"a\", 1),\n    (\"b\", 2),\n    (\"c\", 3),\n]);\n\nfor (key, val) in map.iter() {\n    println!(\"key: {key} val: {val}\");\n}
\n
§Performance
\n

In the current implementation, iterating over map takes O(capacity) time\ninstead of O(len) because it internally visits empty buckets too.

\n
1.0.0 · source

pub fn iter_mut(&mut self) -> IterMut<'_, K, V>

An iterator visiting all key-value pairs in arbitrary order,\nwith mutable references to the values.\nThe iterator element type is (&'a K, &'a mut V).

\n
§Examples
\n
use std::collections::HashMap;\n\nlet mut map = HashMap::from([\n    (\"a\", 1),\n    (\"b\", 2),\n    (\"c\", 3),\n]);\n\n// Update all values\nfor (_, val) in map.iter_mut() {\n    *val *= 2;\n}\n\nfor (key, val) in &map {\n    println!(\"key: {key} val: {val}\");\n}
\n
§Performance
\n

In the current implementation, iterating over map takes O(capacity) time\ninstead of O(len) because it internally visits empty buckets too.

\n
1.0.0 · source

pub fn len(&self) -> usize

Returns the number of elements in the map.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet mut a = HashMap::new();\nassert_eq!(a.len(), 0);\na.insert(1, \"a\");\nassert_eq!(a.len(), 1);
\n
1.0.0 · source

pub fn is_empty(&self) -> bool

Returns true if the map contains no elements.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet mut a = HashMap::new();\nassert!(a.is_empty());\na.insert(1, \"a\");\nassert!(!a.is_empty());
\n
1.6.0 · source

pub fn drain(&mut self) -> Drain<'_, K, V>

Clears the map, returning all key-value pairs as an iterator. Keeps the\nallocated memory for reuse.

\n

If the returned iterator is dropped before being fully consumed, it\ndrops the remaining key-value pairs. The returned iterator keeps a\nmutable borrow on the map to optimize its implementation.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet mut a = HashMap::new();\na.insert(1, \"a\");\na.insert(2, \"b\");\n\nfor (k, v) in a.drain().take(1) {\n    assert!(k == 1 || k == 2);\n    assert!(v == \"a\" || v == \"b\");\n}\n\nassert!(a.is_empty());
\n
source

pub fn extract_if<F>(&mut self, pred: F) -> ExtractIf<'_, K, V, F>
where\n F: FnMut(&K, &mut V) -> bool,

🔬This is a nightly-only experimental API. (hash_extract_if)

Creates an iterator which uses a closure to determine if an element should be removed.

\n

If the closure returns true, the element is removed from the map and yielded.\nIf the closure returns false, or panics, the element remains in the map and will not be\nyielded.

\n

Note that extract_if lets you mutate every value in the filter closure, regardless of\nwhether you choose to keep or remove it.

\n

If the returned ExtractIf is not exhausted, e.g. because it is dropped without iterating\nor the iteration short-circuits, then the remaining elements will be retained.\nUse retain with a negated predicate if you do not need the returned iterator.

\n
§Examples
\n

Splitting a map into even and odd keys, reusing the original map:

\n\n
#![feature(hash_extract_if)]\nuse std::collections::HashMap;\n\nlet mut map: HashMap<i32, i32> = (0..8).map(|x| (x, x)).collect();\nlet extracted: HashMap<i32, i32> = map.extract_if(|k, _v| k % 2 == 0).collect();\n\nlet mut evens = extracted.keys().copied().collect::<Vec<_>>();\nlet mut odds = map.keys().copied().collect::<Vec<_>>();\nevens.sort();\nodds.sort();\n\nassert_eq!(evens, vec![0, 2, 4, 6]);\nassert_eq!(odds, vec![1, 3, 5, 7]);
\n
1.18.0 · source

pub fn retain<F>(&mut self, f: F)
where\n F: FnMut(&K, &mut V) -> bool,

Retains only the elements specified by the predicate.

\n

In other words, remove all pairs (k, v) for which f(&k, &mut v) returns false.\nThe elements are visited in unsorted (and unspecified) order.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet mut map: HashMap<i32, i32> = (0..8).map(|x| (x, x*10)).collect();\nmap.retain(|&k, _| k % 2 == 0);\nassert_eq!(map.len(), 4);
\n
§Performance
\n

In the current implementation, this operation takes O(capacity) time\ninstead of O(len) because it internally visits empty buckets too.

\n
1.0.0 · source

pub fn clear(&mut self)

Clears the map, removing all key-value pairs. Keeps the allocated memory\nfor reuse.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet mut a = HashMap::new();\na.insert(1, \"a\");\na.clear();\nassert!(a.is_empty());
\n
1.9.0 · source

pub fn hasher(&self) -> &S

Returns a reference to the map’s BuildHasher.

\n
§Examples
\n
use std::collections::HashMap;\nuse std::hash::RandomState;\n\nlet hasher = RandomState::new();\nlet map: HashMap<i32, i32> = HashMap::with_hasher(hasher);\nlet hasher: &RandomState = map.hasher();
\n
",0,"avm_interface::call_request_parameters::CallRequests","avm_interface::call_service_result::CallResults"],["
source§

impl<K, V, S> HashMap<K, V, S>
where\n K: Eq + Hash,\n S: BuildHasher,

1.0.0 · source

pub fn reserve(&mut self, additional: usize)

Reserves capacity for at least additional more elements to be inserted\nin the HashMap. The collection may reserve more space to speculatively\navoid frequent reallocations. After calling reserve,\ncapacity will be greater than or equal to self.len() + additional.\nDoes nothing if capacity is already sufficient.

\n
§Panics
\n

Panics if the new allocation size overflows usize.

\n
§Examples
\n
use std::collections::HashMap;\nlet mut map: HashMap<&str, i32> = HashMap::new();\nmap.reserve(10);
\n
1.57.0 · source

pub fn try_reserve(&mut self, additional: usize) -> Result<(), TryReserveError>

Tries to reserve capacity for at least additional more elements to be inserted\nin the HashMap. The collection may reserve more space to speculatively\navoid frequent reallocations. After calling try_reserve,\ncapacity will be greater than or equal to self.len() + additional if\nit returns Ok(()).\nDoes nothing if capacity is already sufficient.

\n
§Errors
\n

If the capacity overflows, or the allocator reports a failure, then an error\nis returned.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet mut map: HashMap<&str, isize> = HashMap::new();\nmap.try_reserve(10).expect(\"why is the test harness OOMing on a handful of bytes?\");
\n
1.0.0 · source

pub fn shrink_to_fit(&mut self)

Shrinks the capacity of the map as much as possible. It will drop\ndown as much as possible while maintaining the internal rules\nand possibly leaving some space in accordance with the resize policy.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet mut map: HashMap<i32, i32> = HashMap::with_capacity(100);\nmap.insert(1, 2);\nmap.insert(3, 4);\nassert!(map.capacity() >= 100);\nmap.shrink_to_fit();\nassert!(map.capacity() >= 2);
\n
1.56.0 · source

pub fn shrink_to(&mut self, min_capacity: usize)

Shrinks the capacity of the map with a lower limit. It will drop\ndown no lower than the supplied limit while maintaining the internal rules\nand possibly leaving some space in accordance with the resize policy.

\n

If the current capacity is less than the lower limit, this is a no-op.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet mut map: HashMap<i32, i32> = HashMap::with_capacity(100);\nmap.insert(1, 2);\nmap.insert(3, 4);\nassert!(map.capacity() >= 100);\nmap.shrink_to(10);\nassert!(map.capacity() >= 10);\nmap.shrink_to(0);\nassert!(map.capacity() >= 2);
\n
1.0.0 · source

pub fn entry(&mut self, key: K) -> Entry<'_, K, V>

Gets the given key’s corresponding entry in the map for in-place manipulation.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet mut letters = HashMap::new();\n\nfor ch in \"a short treatise on fungi\".chars() {\n    letters.entry(ch).and_modify(|counter| *counter += 1).or_insert(1);\n}\n\nassert_eq!(letters[&'s'], 2);\nassert_eq!(letters[&'t'], 3);\nassert_eq!(letters[&'u'], 1);\nassert_eq!(letters.get(&'y'), None);
\n
1.0.0 · source

pub fn get<Q>(&self, k: &Q) -> Option<&V>
where\n K: Borrow<Q>,\n Q: Hash + Eq + ?Sized,

Returns a reference to the value corresponding to the key.

\n

The key may be any borrowed form of the map’s key type, but\nHash and Eq on the borrowed form must match those for\nthe key type.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet mut map = HashMap::new();\nmap.insert(1, \"a\");\nassert_eq!(map.get(&1), Some(&\"a\"));\nassert_eq!(map.get(&2), None);
\n
1.40.0 · source

pub fn get_key_value<Q>(&self, k: &Q) -> Option<(&K, &V)>
where\n K: Borrow<Q>,\n Q: Hash + Eq + ?Sized,

Returns the key-value pair corresponding to the supplied key.

\n

The supplied key may be any borrowed form of the map’s key type, but\nHash and Eq on the borrowed form must match those for\nthe key type.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet mut map = HashMap::new();\nmap.insert(1, \"a\");\nassert_eq!(map.get_key_value(&1), Some((&1, &\"a\")));\nassert_eq!(map.get_key_value(&2), None);
\n
source

pub fn get_many_mut<Q, const N: usize>(\n &mut self,\n ks: [&Q; N],\n) -> Option<[&mut V; N]>
where\n K: Borrow<Q>,\n Q: Hash + Eq + ?Sized,

🔬This is a nightly-only experimental API. (map_many_mut)

Attempts to get mutable references to N values in the map at once.

\n

Returns an array of length N with the results of each query. For soundness, at most one\nmutable reference will be returned to any value. None will be returned if any of the\nkeys are duplicates or missing.

\n
§Examples
\n
#![feature(map_many_mut)]\nuse std::collections::HashMap;\n\nlet mut libraries = HashMap::new();\nlibraries.insert(\"Bodleian Library\".to_string(), 1602);\nlibraries.insert(\"Athenæum\".to_string(), 1807);\nlibraries.insert(\"Herzogin-Anna-Amalia-Bibliothek\".to_string(), 1691);\nlibraries.insert(\"Library of Congress\".to_string(), 1800);\n\nlet got = libraries.get_many_mut([\n    \"Athenæum\",\n    \"Library of Congress\",\n]);\nassert_eq!(\n    got,\n    Some([\n        &mut 1807,\n        &mut 1800,\n    ]),\n);\n\n// Missing keys result in None\nlet got = libraries.get_many_mut([\n    \"Athenæum\",\n    \"New York Public Library\",\n]);\nassert_eq!(got, None);\n\n// Duplicate keys result in None\nlet got = libraries.get_many_mut([\n    \"Athenæum\",\n    \"Athenæum\",\n]);\nassert_eq!(got, None);
\n
source

pub unsafe fn get_many_unchecked_mut<Q, const N: usize>(\n &mut self,\n ks: [&Q; N],\n) -> Option<[&mut V; N]>
where\n K: Borrow<Q>,\n Q: Hash + Eq + ?Sized,

🔬This is a nightly-only experimental API. (map_many_mut)

Attempts to get mutable references to N values in the map at once, without validating that\nthe values are unique.

\n

Returns an array of length N with the results of each query. None will be returned if\nany of the keys are missing.

\n

For a safe alternative see get_many_mut.

\n
§Safety
\n

Calling this method with overlapping keys is undefined behavior even if the resulting\nreferences are not used.

\n
§Examples
\n
#![feature(map_many_mut)]\nuse std::collections::HashMap;\n\nlet mut libraries = HashMap::new();\nlibraries.insert(\"Bodleian Library\".to_string(), 1602);\nlibraries.insert(\"Athenæum\".to_string(), 1807);\nlibraries.insert(\"Herzogin-Anna-Amalia-Bibliothek\".to_string(), 1691);\nlibraries.insert(\"Library of Congress\".to_string(), 1800);\n\nlet got = libraries.get_many_mut([\n    \"Athenæum\",\n    \"Library of Congress\",\n]);\nassert_eq!(\n    got,\n    Some([\n        &mut 1807,\n        &mut 1800,\n    ]),\n);\n\n// Missing keys result in None\nlet got = libraries.get_many_mut([\n    \"Athenæum\",\n    \"New York Public Library\",\n]);\nassert_eq!(got, None);
\n
1.0.0 · source

pub fn contains_key<Q>(&self, k: &Q) -> bool
where\n K: Borrow<Q>,\n Q: Hash + Eq + ?Sized,

Returns true if the map contains a value for the specified key.

\n

The key may be any borrowed form of the map’s key type, but\nHash and Eq on the borrowed form must match those for\nthe key type.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet mut map = HashMap::new();\nmap.insert(1, \"a\");\nassert_eq!(map.contains_key(&1), true);\nassert_eq!(map.contains_key(&2), false);
\n
1.0.0 · source

pub fn get_mut<Q>(&mut self, k: &Q) -> Option<&mut V>
where\n K: Borrow<Q>,\n Q: Hash + Eq + ?Sized,

Returns a mutable reference to the value corresponding to the key.

\n

The key may be any borrowed form of the map’s key type, but\nHash and Eq on the borrowed form must match those for\nthe key type.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet mut map = HashMap::new();\nmap.insert(1, \"a\");\nif let Some(x) = map.get_mut(&1) {\n    *x = \"b\";\n}\nassert_eq!(map[&1], \"b\");
\n
1.0.0 · source

pub fn insert(&mut self, k: K, v: V) -> Option<V>

Inserts a key-value pair into the map.

\n

If the map did not have this key present, None is returned.

\n

If the map did have this key present, the value is updated, and the old\nvalue is returned. The key is not updated, though; this matters for\ntypes that can be == without being identical. See the module-level\ndocumentation for more.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet mut map = HashMap::new();\nassert_eq!(map.insert(37, \"a\"), None);\nassert_eq!(map.is_empty(), false);\n\nmap.insert(37, \"b\");\nassert_eq!(map.insert(37, \"c\"), Some(\"b\"));\nassert_eq!(map[&37], \"c\");
\n
source

pub fn try_insert(\n &mut self,\n key: K,\n value: V,\n) -> Result<&mut V, OccupiedError<'_, K, V>>

🔬This is a nightly-only experimental API. (map_try_insert)

Tries to insert a key-value pair into the map, and returns\na mutable reference to the value in the entry.

\n

If the map already had this key present, nothing is updated, and\nan error containing the occupied entry and the value is returned.

\n
§Examples
\n

Basic usage:

\n\n
#![feature(map_try_insert)]\n\nuse std::collections::HashMap;\n\nlet mut map = HashMap::new();\nassert_eq!(map.try_insert(37, \"a\").unwrap(), &\"a\");\n\nlet err = map.try_insert(37, \"b\").unwrap_err();\nassert_eq!(err.entry.key(), &37);\nassert_eq!(err.entry.get(), &\"a\");\nassert_eq!(err.value, \"b\");
\n
1.0.0 · source

pub fn remove<Q>(&mut self, k: &Q) -> Option<V>
where\n K: Borrow<Q>,\n Q: Hash + Eq + ?Sized,

Removes a key from the map, returning the value at the key if the key\nwas previously in the map.

\n

The key may be any borrowed form of the map’s key type, but\nHash and Eq on the borrowed form must match those for\nthe key type.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet mut map = HashMap::new();\nmap.insert(1, \"a\");\nassert_eq!(map.remove(&1), Some(\"a\"));\nassert_eq!(map.remove(&1), None);
\n
1.27.0 · source

pub fn remove_entry<Q>(&mut self, k: &Q) -> Option<(K, V)>
where\n K: Borrow<Q>,\n Q: Hash + Eq + ?Sized,

Removes a key from the map, returning the stored key and value if the\nkey was previously in the map.

\n

The key may be any borrowed form of the map’s key type, but\nHash and Eq on the borrowed form must match those for\nthe key type.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet mut map = HashMap::new();\nmap.insert(1, \"a\");\nassert_eq!(map.remove_entry(&1), Some((1, \"a\")));\nassert_eq!(map.remove(&1), None);
\n
",0,"avm_interface::call_request_parameters::CallRequests","avm_interface::call_service_result::CallResults"],["
1.0.0 · source§

impl<K, Q, V, S> Index<&Q> for HashMap<K, V, S>
where\n K: Eq + Hash + Borrow<Q>,\n Q: Eq + Hash + ?Sized,\n S: BuildHasher,

source§

fn index(&self, key: &Q) -> &V

Returns a reference to the value corresponding to the supplied key.

\n
§Panics
\n

Panics if the key is not present in the HashMap.

\n
§

type Output = V

The returned type after indexing.
","Index<&Q>","avm_interface::call_request_parameters::CallRequests","avm_interface::call_service_result::CallResults"],["
source§

impl<'de, K, V, S, E> IntoDeserializer<'de, E> for HashMap<K, V, S>
where\n K: IntoDeserializer<'de, E> + Eq + Hash,\n V: IntoDeserializer<'de, E>,\n S: BuildHasher,\n E: Error,

§

type Deserializer = MapDeserializer<'de, <HashMap<K, V, S> as IntoIterator>::IntoIter, E>

The type of the deserializer being converted into.
source§

fn into_deserializer(\n self,\n) -> <HashMap<K, V, S> as IntoDeserializer<'de, E>>::Deserializer

Convert this value into a deserializer.
","IntoDeserializer<'de, E>","avm_interface::call_request_parameters::CallRequests","avm_interface::call_service_result::CallResults"],["
1.0.0 · source§

impl<K, V, S> IntoIterator for HashMap<K, V, S>

source§

fn into_iter(self) -> IntoIter<K, V>

Creates a consuming iterator, that is, one that moves each key-value\npair out of the map in arbitrary order. The map cannot be used after\ncalling this.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet map = HashMap::from([\n    (\"a\", 1),\n    (\"b\", 2),\n    (\"c\", 3),\n]);\n\n// Not possible with .iter()\nlet vec: Vec<(&str, i32)> = map.into_iter().collect();
\n
§

type Item = (K, V)

The type of the elements being iterated over.
§

type IntoIter = IntoIter<K, V>

Which kind of iterator are we turning this into?
","IntoIterator","avm_interface::call_request_parameters::CallRequests","avm_interface::call_service_result::CallResults"],["
§

impl<K, V, AK, AV> PartialEq<ArchivedHashMap<AK, AV>> for HashMap<K, V>
where\n K: Hash + Eq + Borrow<AK>,\n AK: Hash + Eq,\n AV: PartialEq<V>,

§

fn eq(&self, other: &ArchivedHashMap<AK, AV>) -> bool

This method tests for self and other values to be equal, and is used\nby ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always\nsufficient, and should not be overridden without very good reason.
","PartialEq>","avm_interface::call_request_parameters::CallRequests","avm_interface::call_service_result::CallResults"],["
1.0.0 · source§

impl<K, V, S> PartialEq for HashMap<K, V, S>
where\n K: Eq + Hash,\n V: PartialEq,\n S: BuildHasher,

source§

fn eq(&self, other: &HashMap<K, V, S>) -> bool

This method tests for self and other values to be equal, and is used\nby ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always\nsufficient, and should not be overridden without very good reason.
","PartialEq","avm_interface::call_request_parameters::CallRequests","avm_interface::call_service_result::CallResults"],["
§

impl<K, V, S, RandomState> Serialize<S> for HashMap<K, V, RandomState>
where\n K: Serialize<S> + Hash + Eq,\n <K as Archive>::Archived: Hash + Eq,\n V: Serialize<S>,\n S: Serializer + ScratchSpace + ?Sized,

§

fn serialize(\n &self,\n serializer: &mut S,\n) -> Result<<HashMap<K, V, RandomState> as Archive>::Resolver, <S as Fallible>::Error>

Writes the dependencies for the object and returns a resolver that can create the archived\ntype.
","Serialize","avm_interface::call_request_parameters::CallRequests","avm_interface::call_service_result::CallResults"],["
source§

impl<K, V, H> Serialize for HashMap<K, V, H>
where\n K: Serialize,\n V: Serialize,

source§

fn serialize<S>(\n &self,\n serializer: S,\n) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error>
where\n S: Serializer,

Serialize this value into the given Serde serializer. Read more
","Serialize","avm_interface::call_request_parameters::CallRequests","avm_interface::call_service_result::CallResults"],["
1.0.0 · source§

impl<K, V, S> Eq for HashMap<K, V, S>
where\n K: Eq + Hash,\n V: Eq,\n S: BuildHasher,

","Eq","avm_interface::call_request_parameters::CallRequests","avm_interface::call_service_result::CallResults"],["
1.36.0 · source§

impl<K, V, S> UnwindSafe for HashMap<K, V, S>
where\n K: UnwindSafe,\n V: UnwindSafe,\n S: UnwindSafe,

","UnwindSafe","avm_interface::call_request_parameters::CallRequests","avm_interface::call_service_result::CallResults"]], +"avm_server":[["
§

impl<'a, K, V, S> Arbitrary<'a> for HashMap<K, V, S>
where\n K: Arbitrary<'a> + Eq + Hash,\n V: Arbitrary<'a>,\n S: BuildHasher + Default,

§

fn arbitrary(u: &mut Unstructured<'a>) -> Result<HashMap<K, V, S>, Error>

Generate an arbitrary value of Self from the given unstructured data. Read more
§

fn arbitrary_take_rest(u: Unstructured<'a>) -> Result<HashMap<K, V, S>, Error>

Generate an arbitrary value of Self from the entirety of the given\nunstructured data. Read more
§

fn size_hint(_depth: usize) -> (usize, Option<usize>)

Get a size hint for how many bytes out of an Unstructured this type\nneeds to construct itself. Read more
","Arbitrary<'a>","avm_server::CallRequests","avm_server::CallResults"],["
§

impl<K, V, S> Archive for HashMap<K, V, S>
where\n K: Archive + Hash + Eq,\n V: Archive,\n <K as Archive>::Archived: Hash + Eq,

§

type Archived = ArchivedHashMap<<K as Archive>::Archived, <V as Archive>::Archived>

The archived representation of this type. Read more
§

type Resolver = HashMapResolver

The resolver for this type. It must contain all the additional information from serializing\nneeded to make the archived type from the normal type.
§

unsafe fn resolve(\n &self,\n pos: usize,\n resolver: <HashMap<K, V, S> as Archive>::Resolver,\n out: *mut <HashMap<K, V, S> as Archive>::Archived,\n)

Creates the archived version of this value at the given position and writes it to the given\noutput. Read more
","Archive","avm_server::CallRequests","avm_server::CallResults"],["
1.0.0 · source§

impl<K, V, S> Clone for HashMap<K, V, S>
where\n K: Clone,\n V: Clone,\n S: Clone,

source§

fn clone(&self) -> HashMap<K, V, S>

Returns a copy of the value. Read more
source§

fn clone_from(&mut self, source: &HashMap<K, V, S>)

Performs copy-assignment from source. Read more
","Clone","avm_server::CallRequests","avm_server::CallResults"],["
1.0.0 · source§

impl<K, V, S> Debug for HashMap<K, V, S>
where\n K: Debug,\n V: Debug,

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
","Debug","avm_server::CallRequests","avm_server::CallResults"],["
1.0.0 · source§

impl<K, V, S> Default for HashMap<K, V, S>
where\n S: Default,

source§

fn default() -> HashMap<K, V, S>

Creates an empty HashMap<K, V, S>, with the Default value for the hasher.

\n
","Default","avm_server::CallRequests","avm_server::CallResults"],["
source§

impl<'de, K, V, S> Deserialize<'de> for HashMap<K, V, S>
where\n K: Deserialize<'de> + Eq + Hash,\n V: Deserialize<'de>,\n S: BuildHasher + Default,

source§

fn deserialize<D>(\n deserializer: D,\n) -> Result<HashMap<K, V, S>, <D as Deserializer<'de>>::Error>
where\n D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
","Deserialize<'de>","avm_server::CallRequests","avm_server::CallResults"],["
source§

impl<'de, K, KAs, V, VAs, const N: usize> DeserializeAs<'de, [(K, V); N]> for HashMap<KAs, VAs>
where\n KAs: DeserializeAs<'de, K>,\n VAs: DeserializeAs<'de, V>,

source§

fn deserialize_as<D>(\n deserializer: D,\n) -> Result<[(K, V); N], <D as Deserializer<'de>>::Error>
where\n D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer.
","DeserializeAs<'de, [(K, V); N]>","avm_server::CallRequests","avm_server::CallResults"],["
source§

impl<'de, K, KAs, V, VAs> DeserializeAs<'de, BTreeSet<(K, V)>> for HashMap<KAs, VAs>
where\n KAs: DeserializeAs<'de, K>,\n VAs: DeserializeAs<'de, V>,\n (K, V): Ord,

source§

fn deserialize_as<D>(\n deserializer: D,\n) -> Result<BTreeSet<(K, V)>, <D as Deserializer<'de>>::Error>
where\n D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer.
","DeserializeAs<'de, BTreeSet<(K, V)>>","avm_server::CallRequests","avm_server::CallResults"],["
source§

impl<'de, K, KAs, V, VAs> DeserializeAs<'de, BinaryHeap<(K, V)>> for HashMap<KAs, VAs>
where\n KAs: DeserializeAs<'de, K>,\n VAs: DeserializeAs<'de, V>,\n (K, V): Ord,

source§

fn deserialize_as<D>(\n deserializer: D,\n) -> Result<BinaryHeap<(K, V)>, <D as Deserializer<'de>>::Error>
where\n D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer.
","DeserializeAs<'de, BinaryHeap<(K, V)>>","avm_server::CallRequests","avm_server::CallResults"],["
source§

impl<'de, K, V, KU, VU, S> DeserializeAs<'de, HashMap<K, V, S>> for HashMap<KU, VU, S>
where\n KU: DeserializeAs<'de, K>,\n VU: DeserializeAs<'de, V>,\n K: Eq + Hash,\n S: BuildHasher + Default,

source§

fn deserialize_as<D>(\n deserializer: D,\n) -> Result<HashMap<K, V, S>, <D as Deserializer<'de>>::Error>
where\n D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer.
","DeserializeAs<'de, HashMap>","avm_server::CallRequests","avm_server::CallResults"],["
source§

impl<'de, K, KAs, V, VAs> DeserializeAs<'de, HashSet<(K, V)>> for HashMap<KAs, VAs>
where\n KAs: DeserializeAs<'de, K>,\n VAs: DeserializeAs<'de, V>,\n (K, V): Eq + Hash,

source§

fn deserialize_as<D>(\n deserializer: D,\n) -> Result<HashSet<(K, V)>, <D as Deserializer<'de>>::Error>
where\n D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer.
","DeserializeAs<'de, HashSet<(K, V)>>","avm_server::CallRequests","avm_server::CallResults"],["
source§

impl<'de, K, KAs, V, VAs> DeserializeAs<'de, LinkedList<(K, V)>> for HashMap<KAs, VAs>
where\n KAs: DeserializeAs<'de, K>,\n VAs: DeserializeAs<'de, V>,

source§

fn deserialize_as<D>(\n deserializer: D,\n) -> Result<LinkedList<(K, V)>, <D as Deserializer<'de>>::Error>
where\n D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer.
","DeserializeAs<'de, LinkedList<(K, V)>>","avm_server::CallRequests","avm_server::CallResults"],["
source§

impl<'de, K, KAs, V, VAs> DeserializeAs<'de, Option<(K, V)>> for HashMap<KAs, VAs>
where\n KAs: DeserializeAs<'de, K>,\n VAs: DeserializeAs<'de, V>,

source§

fn deserialize_as<D>(\n deserializer: D,\n) -> Result<Option<(K, V)>, <D as Deserializer<'de>>::Error>
where\n D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer.
","DeserializeAs<'de, Option<(K, V)>>","avm_server::CallRequests","avm_server::CallResults"],["
source§

impl<'de, K, KAs, V, VAs> DeserializeAs<'de, Vec<(K, V)>> for HashMap<KAs, VAs>
where\n KAs: DeserializeAs<'de, K>,\n VAs: DeserializeAs<'de, V>,

source§

fn deserialize_as<D>(\n deserializer: D,\n) -> Result<Vec<(K, V)>, <D as Deserializer<'de>>::Error>
where\n D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer.
","DeserializeAs<'de, Vec<(K, V)>>","avm_server::CallRequests","avm_server::CallResults"],["
source§

impl<'de, K, KAs, V, VAs> DeserializeAs<'de, VecDeque<(K, V)>> for HashMap<KAs, VAs>
where\n KAs: DeserializeAs<'de, K>,\n VAs: DeserializeAs<'de, V>,

source§

fn deserialize_as<D>(\n deserializer: D,\n) -> Result<VecDeque<(K, V)>, <D as Deserializer<'de>>::Error>
where\n D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer.
","DeserializeAs<'de, VecDeque<(K, V)>>","avm_server::CallRequests","avm_server::CallResults"],["
1.4.0 · source§

impl<'a, K, V, S> Extend<(&'a K, &'a V)> for HashMap<K, V, S>
where\n K: Eq + Hash + Copy,\n V: Copy,\n S: BuildHasher,

source§

fn extend<T>(&mut self, iter: T)
where\n T: IntoIterator<Item = (&'a K, &'a V)>,

Extends a collection with the contents of an iterator. Read more
source§

fn extend_one(&mut self, _: (&'a K, &'a V))

🔬This is a nightly-only experimental API. (extend_one)
Extends a collection with exactly one element.
source§

fn extend_reserve(&mut self, additional: usize)

🔬This is a nightly-only experimental API. (extend_one)
Reserves capacity in a collection for the given number of additional elements. Read more
","Extend<(&'a K, &'a V)>","avm_server::CallRequests","avm_server::CallResults"],["
1.0.0 · source§

impl<K, V, S> Extend<(K, V)> for HashMap<K, V, S>
where\n K: Eq + Hash,\n S: BuildHasher,

Inserts all new key-values from the iterator and replaces values with existing\nkeys with new values returned from the iterator.

\n
source§

fn extend<T>(&mut self, iter: T)
where\n T: IntoIterator<Item = (K, V)>,

Extends a collection with the contents of an iterator. Read more
source§

fn extend_one(&mut self, _: (K, V))

🔬This is a nightly-only experimental API. (extend_one)
Extends a collection with exactly one element.
source§

fn extend_reserve(&mut self, additional: usize)

🔬This is a nightly-only experimental API. (extend_one)
Reserves capacity in a collection for the given number of additional elements. Read more
","Extend<(K, V)>","avm_server::CallRequests","avm_server::CallResults"],["
1.56.0 · source§

impl<K, V, const N: usize> From<[(K, V); N]> for HashMap<K, V>
where\n K: Eq + Hash,

source§

fn from(arr: [(K, V); N]) -> HashMap<K, V>

§Examples
\n
use std::collections::HashMap;\n\nlet map1 = HashMap::from([(1, 2), (3, 4)]);\nlet map2: HashMap<_, _> = [(1, 2), (3, 4)].into();\nassert_eq!(map1, map2);
\n
","From<[(K, V); N]>","avm_server::CallRequests","avm_server::CallResults"],["
source§

impl<K, V, S> FromFallibleIterator<(K, V)> for HashMap<K, V, S>
where\n K: Hash + Eq,\n S: BuildHasher + Default,

source§

fn from_fallible_iter<I>(\n it: I,\n) -> Result<HashMap<K, V, S>, <I as IntoFallibleIterator>::Error>
where\n I: IntoFallibleIterator<Item = (K, V)>,

Creates a value from a fallible iterator.
","FromFallibleIterator<(K, V)>","avm_server::CallRequests","avm_server::CallResults"],["
1.0.0 · source§

impl<K, V, S> FromIterator<(K, V)> for HashMap<K, V, S>
where\n K: Eq + Hash,\n S: BuildHasher + Default,

source§

fn from_iter<T>(iter: T) -> HashMap<K, V, S>
where\n T: IntoIterator<Item = (K, V)>,

Creates a value from an iterator. Read more
","FromIterator<(K, V)>","avm_server::CallRequests","avm_server::CallResults"],["
§

impl<K, V, S> FromParallelIterator<(K, V)> for HashMap<K, V, S>
where\n K: Eq + Hash + Send,\n V: Send,\n S: BuildHasher + Default + Send,

Collects (key, value) pairs from a parallel iterator into a\nhashmap. If multiple pairs correspond to the same key, then the\nones produced earlier in the parallel iterator will be\noverwritten, just as with a sequential iterator.

\n
§

fn from_par_iter<I>(par_iter: I) -> HashMap<K, V, S>
where\n I: IntoParallelIterator<Item = (K, V)>,

Creates an instance of the collection from the parallel iterator par_iter. Read more
","FromParallelIterator<(K, V)>","avm_server::CallRequests","avm_server::CallResults"],["
source§

impl<K, V> HashMap<K, V>

1.0.0 · source

pub fn new() -> HashMap<K, V>

Creates an empty HashMap.

\n

The hash map is initially created with a capacity of 0, so it will not allocate until it\nis first inserted into.

\n
§Examples
\n
use std::collections::HashMap;\nlet mut map: HashMap<&str, i32> = HashMap::new();
\n
1.0.0 · source

pub fn with_capacity(capacity: usize) -> HashMap<K, V>

Creates an empty HashMap with at least the specified capacity.

\n

The hash map will be able to hold at least capacity elements without\nreallocating. This method is allowed to allocate for more elements than\ncapacity. If capacity is 0, the hash map will not allocate.

\n
§Examples
\n
use std::collections::HashMap;\nlet mut map: HashMap<&str, i32> = HashMap::with_capacity(10);
\n
",0,"avm_server::CallRequests","avm_server::CallResults"],["
source§

impl<K, V, S> HashMap<K, V, S>
where\n S: BuildHasher,

source

pub fn raw_entry_mut(&mut self) -> RawEntryBuilderMut<'_, K, V, S>

🔬This is a nightly-only experimental API. (hash_raw_entry)

Creates a raw entry builder for the HashMap.

\n

Raw entries provide the lowest level of control for searching and\nmanipulating a map. They must be manually initialized with a hash and\nthen manually searched. After this, insertions into a vacant entry\nstill require an owned key to be provided.

\n

Raw entries are useful for such exotic situations as:

\n
    \n
  • Hash memoization
  • \n
  • Deferring the creation of an owned key until it is known to be required
  • \n
  • Using a search key that doesn’t work with the Borrow trait
  • \n
  • Using custom comparison logic without newtype wrappers
  • \n
\n

Because raw entries provide much more low-level control, it’s much easier\nto put the HashMap into an inconsistent state which, while memory-safe,\nwill cause the map to produce seemingly random results. Higher-level and\nmore foolproof APIs like entry should be preferred when possible.

\n

In particular, the hash used to initialize the raw entry must still be\nconsistent with the hash of the key that is ultimately stored in the entry.\nThis is because implementations of HashMap may need to recompute hashes\nwhen resizing, at which point only the keys are available.

\n

Raw entries give mutable access to the keys. This must not be used\nto modify how the key would compare or hash, as the map will not re-evaluate\nwhere the key should go, meaning the keys may become “lost” if their\nlocation does not reflect their state. For instance, if you change a key\nso that the map now contains keys which compare equal, search may start\nacting erratically, with two keys randomly masking each other. Implementations\nare free to assume this doesn’t happen (within the limits of memory-safety).

\n
source

pub fn raw_entry(&self) -> RawEntryBuilder<'_, K, V, S>

🔬This is a nightly-only experimental API. (hash_raw_entry)

Creates a raw immutable entry builder for the HashMap.

\n

Raw entries provide the lowest level of control for searching and\nmanipulating a map. They must be manually initialized with a hash and\nthen manually searched.

\n

This is useful for

\n
    \n
  • Hash memoization
  • \n
  • Using a search key that doesn’t work with the Borrow trait
  • \n
  • Using custom comparison logic without newtype wrappers
  • \n
\n

Unless you are in such a situation, higher-level and more foolproof APIs like\nget should be preferred.

\n

Immutable raw entries have very limited use; you might instead want raw_entry_mut.

\n
",0,"avm_server::CallRequests","avm_server::CallResults"],["
source§

impl<K, V, S> HashMap<K, V, S>

1.7.0 (const: unstable) · source

pub fn with_hasher(hash_builder: S) -> HashMap<K, V, S>

Creates an empty HashMap which will use the given hash builder to hash\nkeys.

\n

The created map has the default initial capacity.

\n

Warning: hash_builder is normally randomly generated, and\nis designed to allow HashMaps to be resistant to attacks that\ncause many collisions and very poor performance. Setting it\nmanually using this function can expose a DoS attack vector.

\n

The hash_builder passed should implement the BuildHasher trait for\nthe HashMap to be useful, see its documentation for details.

\n
§Examples
\n
use std::collections::HashMap;\nuse std::hash::RandomState;\n\nlet s = RandomState::new();\nlet mut map = HashMap::with_hasher(s);\nmap.insert(1, 2);
\n
1.7.0 · source

pub fn with_capacity_and_hasher(capacity: usize, hasher: S) -> HashMap<K, V, S>

Creates an empty HashMap with at least the specified capacity, using\nhasher to hash the keys.

\n

The hash map will be able to hold at least capacity elements without\nreallocating. This method is allowed to allocate for more elements than\ncapacity. If capacity is 0, the hash map will not allocate.

\n

Warning: hasher is normally randomly generated, and\nis designed to allow HashMaps to be resistant to attacks that\ncause many collisions and very poor performance. Setting it\nmanually using this function can expose a DoS attack vector.

\n

The hasher passed should implement the BuildHasher trait for\nthe HashMap to be useful, see its documentation for details.

\n
§Examples
\n
use std::collections::HashMap;\nuse std::hash::RandomState;\n\nlet s = RandomState::new();\nlet mut map = HashMap::with_capacity_and_hasher(10, s);\nmap.insert(1, 2);
\n
1.0.0 · source

pub fn capacity(&self) -> usize

Returns the number of elements the map can hold without reallocating.

\n

This number is a lower bound; the HashMap<K, V> might be able to hold\nmore, but is guaranteed to be able to hold at least this many.

\n
§Examples
\n
use std::collections::HashMap;\nlet map: HashMap<i32, i32> = HashMap::with_capacity(100);\nassert!(map.capacity() >= 100);
\n
1.0.0 · source

pub fn keys(&self) -> Keys<'_, K, V>

An iterator visiting all keys in arbitrary order.\nThe iterator element type is &'a K.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet map = HashMap::from([\n    (\"a\", 1),\n    (\"b\", 2),\n    (\"c\", 3),\n]);\n\nfor key in map.keys() {\n    println!(\"{key}\");\n}
\n
§Performance
\n

In the current implementation, iterating over keys takes O(capacity) time\ninstead of O(len) because it internally visits empty buckets too.

\n
1.54.0 · source

pub fn into_keys(self) -> IntoKeys<K, V>

Creates a consuming iterator visiting all the keys in arbitrary order.\nThe map cannot be used after calling this.\nThe iterator element type is K.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet map = HashMap::from([\n    (\"a\", 1),\n    (\"b\", 2),\n    (\"c\", 3),\n]);\n\nlet mut vec: Vec<&str> = map.into_keys().collect();\n// The `IntoKeys` iterator produces keys in arbitrary order, so the\n// keys must be sorted to test them against a sorted array.\nvec.sort_unstable();\nassert_eq!(vec, [\"a\", \"b\", \"c\"]);
\n
§Performance
\n

In the current implementation, iterating over keys takes O(capacity) time\ninstead of O(len) because it internally visits empty buckets too.

\n
1.0.0 · source

pub fn values(&self) -> Values<'_, K, V>

An iterator visiting all values in arbitrary order.\nThe iterator element type is &'a V.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet map = HashMap::from([\n    (\"a\", 1),\n    (\"b\", 2),\n    (\"c\", 3),\n]);\n\nfor val in map.values() {\n    println!(\"{val}\");\n}
\n
§Performance
\n

In the current implementation, iterating over values takes O(capacity) time\ninstead of O(len) because it internally visits empty buckets too.

\n
1.10.0 · source

pub fn values_mut(&mut self) -> ValuesMut<'_, K, V>

An iterator visiting all values mutably in arbitrary order.\nThe iterator element type is &'a mut V.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet mut map = HashMap::from([\n    (\"a\", 1),\n    (\"b\", 2),\n    (\"c\", 3),\n]);\n\nfor val in map.values_mut() {\n    *val = *val + 10;\n}\n\nfor val in map.values() {\n    println!(\"{val}\");\n}
\n
§Performance
\n

In the current implementation, iterating over values takes O(capacity) time\ninstead of O(len) because it internally visits empty buckets too.

\n
1.54.0 · source

pub fn into_values(self) -> IntoValues<K, V>

Creates a consuming iterator visiting all the values in arbitrary order.\nThe map cannot be used after calling this.\nThe iterator element type is V.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet map = HashMap::from([\n    (\"a\", 1),\n    (\"b\", 2),\n    (\"c\", 3),\n]);\n\nlet mut vec: Vec<i32> = map.into_values().collect();\n// The `IntoValues` iterator produces values in arbitrary order, so\n// the values must be sorted to test them against a sorted array.\nvec.sort_unstable();\nassert_eq!(vec, [1, 2, 3]);
\n
§Performance
\n

In the current implementation, iterating over values takes O(capacity) time\ninstead of O(len) because it internally visits empty buckets too.

\n
1.0.0 · source

pub fn iter(&self) -> Iter<'_, K, V>

An iterator visiting all key-value pairs in arbitrary order.\nThe iterator element type is (&'a K, &'a V).

\n
§Examples
\n
use std::collections::HashMap;\n\nlet map = HashMap::from([\n    (\"a\", 1),\n    (\"b\", 2),\n    (\"c\", 3),\n]);\n\nfor (key, val) in map.iter() {\n    println!(\"key: {key} val: {val}\");\n}
\n
§Performance
\n

In the current implementation, iterating over map takes O(capacity) time\ninstead of O(len) because it internally visits empty buckets too.

\n
1.0.0 · source

pub fn iter_mut(&mut self) -> IterMut<'_, K, V>

An iterator visiting all key-value pairs in arbitrary order,\nwith mutable references to the values.\nThe iterator element type is (&'a K, &'a mut V).

\n
§Examples
\n
use std::collections::HashMap;\n\nlet mut map = HashMap::from([\n    (\"a\", 1),\n    (\"b\", 2),\n    (\"c\", 3),\n]);\n\n// Update all values\nfor (_, val) in map.iter_mut() {\n    *val *= 2;\n}\n\nfor (key, val) in &map {\n    println!(\"key: {key} val: {val}\");\n}
\n
§Performance
\n

In the current implementation, iterating over map takes O(capacity) time\ninstead of O(len) because it internally visits empty buckets too.

\n
1.0.0 · source

pub fn len(&self) -> usize

Returns the number of elements in the map.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet mut a = HashMap::new();\nassert_eq!(a.len(), 0);\na.insert(1, \"a\");\nassert_eq!(a.len(), 1);
\n
1.0.0 · source

pub fn is_empty(&self) -> bool

Returns true if the map contains no elements.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet mut a = HashMap::new();\nassert!(a.is_empty());\na.insert(1, \"a\");\nassert!(!a.is_empty());
\n
1.6.0 · source

pub fn drain(&mut self) -> Drain<'_, K, V>

Clears the map, returning all key-value pairs as an iterator. Keeps the\nallocated memory for reuse.

\n

If the returned iterator is dropped before being fully consumed, it\ndrops the remaining key-value pairs. The returned iterator keeps a\nmutable borrow on the map to optimize its implementation.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet mut a = HashMap::new();\na.insert(1, \"a\");\na.insert(2, \"b\");\n\nfor (k, v) in a.drain().take(1) {\n    assert!(k == 1 || k == 2);\n    assert!(v == \"a\" || v == \"b\");\n}\n\nassert!(a.is_empty());
\n
source

pub fn extract_if<F>(&mut self, pred: F) -> ExtractIf<'_, K, V, F>
where\n F: FnMut(&K, &mut V) -> bool,

🔬This is a nightly-only experimental API. (hash_extract_if)

Creates an iterator which uses a closure to determine if an element should be removed.

\n

If the closure returns true, the element is removed from the map and yielded.\nIf the closure returns false, or panics, the element remains in the map and will not be\nyielded.

\n

Note that extract_if lets you mutate every value in the filter closure, regardless of\nwhether you choose to keep or remove it.

\n

If the returned ExtractIf is not exhausted, e.g. because it is dropped without iterating\nor the iteration short-circuits, then the remaining elements will be retained.\nUse retain with a negated predicate if you do not need the returned iterator.

\n
§Examples
\n

Splitting a map into even and odd keys, reusing the original map:

\n\n
#![feature(hash_extract_if)]\nuse std::collections::HashMap;\n\nlet mut map: HashMap<i32, i32> = (0..8).map(|x| (x, x)).collect();\nlet extracted: HashMap<i32, i32> = map.extract_if(|k, _v| k % 2 == 0).collect();\n\nlet mut evens = extracted.keys().copied().collect::<Vec<_>>();\nlet mut odds = map.keys().copied().collect::<Vec<_>>();\nevens.sort();\nodds.sort();\n\nassert_eq!(evens, vec![0, 2, 4, 6]);\nassert_eq!(odds, vec![1, 3, 5, 7]);
\n
1.18.0 · source

pub fn retain<F>(&mut self, f: F)
where\n F: FnMut(&K, &mut V) -> bool,

Retains only the elements specified by the predicate.

\n

In other words, remove all pairs (k, v) for which f(&k, &mut v) returns false.\nThe elements are visited in unsorted (and unspecified) order.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet mut map: HashMap<i32, i32> = (0..8).map(|x| (x, x*10)).collect();\nmap.retain(|&k, _| k % 2 == 0);\nassert_eq!(map.len(), 4);
\n
§Performance
\n

In the current implementation, this operation takes O(capacity) time\ninstead of O(len) because it internally visits empty buckets too.

\n
1.0.0 · source

pub fn clear(&mut self)

Clears the map, removing all key-value pairs. Keeps the allocated memory\nfor reuse.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet mut a = HashMap::new();\na.insert(1, \"a\");\na.clear();\nassert!(a.is_empty());
\n
1.9.0 · source

pub fn hasher(&self) -> &S

Returns a reference to the map’s BuildHasher.

\n
§Examples
\n
use std::collections::HashMap;\nuse std::hash::RandomState;\n\nlet hasher = RandomState::new();\nlet map: HashMap<i32, i32> = HashMap::with_hasher(hasher);\nlet hasher: &RandomState = map.hasher();
\n
",0,"avm_server::CallRequests","avm_server::CallResults"],["
source§

impl<K, V, S> HashMap<K, V, S>
where\n K: Eq + Hash,\n S: BuildHasher,

1.0.0 · source

pub fn reserve(&mut self, additional: usize)

Reserves capacity for at least additional more elements to be inserted\nin the HashMap. The collection may reserve more space to speculatively\navoid frequent reallocations. After calling reserve,\ncapacity will be greater than or equal to self.len() + additional.\nDoes nothing if capacity is already sufficient.

\n
§Panics
\n

Panics if the new allocation size overflows usize.

\n
§Examples
\n
use std::collections::HashMap;\nlet mut map: HashMap<&str, i32> = HashMap::new();\nmap.reserve(10);
\n
1.57.0 · source

pub fn try_reserve(&mut self, additional: usize) -> Result<(), TryReserveError>

Tries to reserve capacity for at least additional more elements to be inserted\nin the HashMap. The collection may reserve more space to speculatively\navoid frequent reallocations. After calling try_reserve,\ncapacity will be greater than or equal to self.len() + additional if\nit returns Ok(()).\nDoes nothing if capacity is already sufficient.

\n
§Errors
\n

If the capacity overflows, or the allocator reports a failure, then an error\nis returned.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet mut map: HashMap<&str, isize> = HashMap::new();\nmap.try_reserve(10).expect(\"why is the test harness OOMing on a handful of bytes?\");
\n
1.0.0 · source

pub fn shrink_to_fit(&mut self)

Shrinks the capacity of the map as much as possible. It will drop\ndown as much as possible while maintaining the internal rules\nand possibly leaving some space in accordance with the resize policy.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet mut map: HashMap<i32, i32> = HashMap::with_capacity(100);\nmap.insert(1, 2);\nmap.insert(3, 4);\nassert!(map.capacity() >= 100);\nmap.shrink_to_fit();\nassert!(map.capacity() >= 2);
\n
1.56.0 · source

pub fn shrink_to(&mut self, min_capacity: usize)

Shrinks the capacity of the map with a lower limit. It will drop\ndown no lower than the supplied limit while maintaining the internal rules\nand possibly leaving some space in accordance with the resize policy.

\n

If the current capacity is less than the lower limit, this is a no-op.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet mut map: HashMap<i32, i32> = HashMap::with_capacity(100);\nmap.insert(1, 2);\nmap.insert(3, 4);\nassert!(map.capacity() >= 100);\nmap.shrink_to(10);\nassert!(map.capacity() >= 10);\nmap.shrink_to(0);\nassert!(map.capacity() >= 2);
\n
1.0.0 · source

pub fn entry(&mut self, key: K) -> Entry<'_, K, V>

Gets the given key’s corresponding entry in the map for in-place manipulation.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet mut letters = HashMap::new();\n\nfor ch in \"a short treatise on fungi\".chars() {\n    letters.entry(ch).and_modify(|counter| *counter += 1).or_insert(1);\n}\n\nassert_eq!(letters[&'s'], 2);\nassert_eq!(letters[&'t'], 3);\nassert_eq!(letters[&'u'], 1);\nassert_eq!(letters.get(&'y'), None);
\n
1.0.0 · source

pub fn get<Q>(&self, k: &Q) -> Option<&V>
where\n K: Borrow<Q>,\n Q: Hash + Eq + ?Sized,

Returns a reference to the value corresponding to the key.

\n

The key may be any borrowed form of the map’s key type, but\nHash and Eq on the borrowed form must match those for\nthe key type.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet mut map = HashMap::new();\nmap.insert(1, \"a\");\nassert_eq!(map.get(&1), Some(&\"a\"));\nassert_eq!(map.get(&2), None);
\n
1.40.0 · source

pub fn get_key_value<Q>(&self, k: &Q) -> Option<(&K, &V)>
where\n K: Borrow<Q>,\n Q: Hash + Eq + ?Sized,

Returns the key-value pair corresponding to the supplied key.

\n

The supplied key may be any borrowed form of the map’s key type, but\nHash and Eq on the borrowed form must match those for\nthe key type.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet mut map = HashMap::new();\nmap.insert(1, \"a\");\nassert_eq!(map.get_key_value(&1), Some((&1, &\"a\")));\nassert_eq!(map.get_key_value(&2), None);
\n
source

pub fn get_many_mut<Q, const N: usize>(\n &mut self,\n ks: [&Q; N],\n) -> Option<[&mut V; N]>
where\n K: Borrow<Q>,\n Q: Hash + Eq + ?Sized,

🔬This is a nightly-only experimental API. (map_many_mut)

Attempts to get mutable references to N values in the map at once.

\n

Returns an array of length N with the results of each query. For soundness, at most one\nmutable reference will be returned to any value. None will be returned if any of the\nkeys are duplicates or missing.

\n
§Examples
\n
#![feature(map_many_mut)]\nuse std::collections::HashMap;\n\nlet mut libraries = HashMap::new();\nlibraries.insert(\"Bodleian Library\".to_string(), 1602);\nlibraries.insert(\"Athenæum\".to_string(), 1807);\nlibraries.insert(\"Herzogin-Anna-Amalia-Bibliothek\".to_string(), 1691);\nlibraries.insert(\"Library of Congress\".to_string(), 1800);\n\nlet got = libraries.get_many_mut([\n    \"Athenæum\",\n    \"Library of Congress\",\n]);\nassert_eq!(\n    got,\n    Some([\n        &mut 1807,\n        &mut 1800,\n    ]),\n);\n\n// Missing keys result in None\nlet got = libraries.get_many_mut([\n    \"Athenæum\",\n    \"New York Public Library\",\n]);\nassert_eq!(got, None);\n\n// Duplicate keys result in None\nlet got = libraries.get_many_mut([\n    \"Athenæum\",\n    \"Athenæum\",\n]);\nassert_eq!(got, None);
\n
source

pub unsafe fn get_many_unchecked_mut<Q, const N: usize>(\n &mut self,\n ks: [&Q; N],\n) -> Option<[&mut V; N]>
where\n K: Borrow<Q>,\n Q: Hash + Eq + ?Sized,

🔬This is a nightly-only experimental API. (map_many_mut)

Attempts to get mutable references to N values in the map at once, without validating that\nthe values are unique.

\n

Returns an array of length N with the results of each query. None will be returned if\nany of the keys are missing.

\n

For a safe alternative see get_many_mut.

\n
§Safety
\n

Calling this method with overlapping keys is undefined behavior even if the resulting\nreferences are not used.

\n
§Examples
\n
#![feature(map_many_mut)]\nuse std::collections::HashMap;\n\nlet mut libraries = HashMap::new();\nlibraries.insert(\"Bodleian Library\".to_string(), 1602);\nlibraries.insert(\"Athenæum\".to_string(), 1807);\nlibraries.insert(\"Herzogin-Anna-Amalia-Bibliothek\".to_string(), 1691);\nlibraries.insert(\"Library of Congress\".to_string(), 1800);\n\nlet got = libraries.get_many_mut([\n    \"Athenæum\",\n    \"Library of Congress\",\n]);\nassert_eq!(\n    got,\n    Some([\n        &mut 1807,\n        &mut 1800,\n    ]),\n);\n\n// Missing keys result in None\nlet got = libraries.get_many_mut([\n    \"Athenæum\",\n    \"New York Public Library\",\n]);\nassert_eq!(got, None);
\n
1.0.0 · source

pub fn contains_key<Q>(&self, k: &Q) -> bool
where\n K: Borrow<Q>,\n Q: Hash + Eq + ?Sized,

Returns true if the map contains a value for the specified key.

\n

The key may be any borrowed form of the map’s key type, but\nHash and Eq on the borrowed form must match those for\nthe key type.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet mut map = HashMap::new();\nmap.insert(1, \"a\");\nassert_eq!(map.contains_key(&1), true);\nassert_eq!(map.contains_key(&2), false);
\n
1.0.0 · source

pub fn get_mut<Q>(&mut self, k: &Q) -> Option<&mut V>
where\n K: Borrow<Q>,\n Q: Hash + Eq + ?Sized,

Returns a mutable reference to the value corresponding to the key.

\n

The key may be any borrowed form of the map’s key type, but\nHash and Eq on the borrowed form must match those for\nthe key type.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet mut map = HashMap::new();\nmap.insert(1, \"a\");\nif let Some(x) = map.get_mut(&1) {\n    *x = \"b\";\n}\nassert_eq!(map[&1], \"b\");
\n
1.0.0 · source

pub fn insert(&mut self, k: K, v: V) -> Option<V>

Inserts a key-value pair into the map.

\n

If the map did not have this key present, None is returned.

\n

If the map did have this key present, the value is updated, and the old\nvalue is returned. The key is not updated, though; this matters for\ntypes that can be == without being identical. See the module-level\ndocumentation for more.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet mut map = HashMap::new();\nassert_eq!(map.insert(37, \"a\"), None);\nassert_eq!(map.is_empty(), false);\n\nmap.insert(37, \"b\");\nassert_eq!(map.insert(37, \"c\"), Some(\"b\"));\nassert_eq!(map[&37], \"c\");
\n
source

pub fn try_insert(\n &mut self,\n key: K,\n value: V,\n) -> Result<&mut V, OccupiedError<'_, K, V>>

🔬This is a nightly-only experimental API. (map_try_insert)

Tries to insert a key-value pair into the map, and returns\na mutable reference to the value in the entry.

\n

If the map already had this key present, nothing is updated, and\nan error containing the occupied entry and the value is returned.

\n
§Examples
\n

Basic usage:

\n\n
#![feature(map_try_insert)]\n\nuse std::collections::HashMap;\n\nlet mut map = HashMap::new();\nassert_eq!(map.try_insert(37, \"a\").unwrap(), &\"a\");\n\nlet err = map.try_insert(37, \"b\").unwrap_err();\nassert_eq!(err.entry.key(), &37);\nassert_eq!(err.entry.get(), &\"a\");\nassert_eq!(err.value, \"b\");
\n
1.0.0 · source

pub fn remove<Q>(&mut self, k: &Q) -> Option<V>
where\n K: Borrow<Q>,\n Q: Hash + Eq + ?Sized,

Removes a key from the map, returning the value at the key if the key\nwas previously in the map.

\n

The key may be any borrowed form of the map’s key type, but\nHash and Eq on the borrowed form must match those for\nthe key type.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet mut map = HashMap::new();\nmap.insert(1, \"a\");\nassert_eq!(map.remove(&1), Some(\"a\"));\nassert_eq!(map.remove(&1), None);
\n
1.27.0 · source

pub fn remove_entry<Q>(&mut self, k: &Q) -> Option<(K, V)>
where\n K: Borrow<Q>,\n Q: Hash + Eq + ?Sized,

Removes a key from the map, returning the stored key and value if the\nkey was previously in the map.

\n

The key may be any borrowed form of the map’s key type, but\nHash and Eq on the borrowed form must match those for\nthe key type.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet mut map = HashMap::new();\nmap.insert(1, \"a\");\nassert_eq!(map.remove_entry(&1), Some((1, \"a\")));\nassert_eq!(map.remove(&1), None);
\n
",0,"avm_server::CallRequests","avm_server::CallResults"],["
1.0.0 · source§

impl<K, Q, V, S> Index<&Q> for HashMap<K, V, S>
where\n K: Eq + Hash + Borrow<Q>,\n Q: Eq + Hash + ?Sized,\n S: BuildHasher,

source§

fn index(&self, key: &Q) -> &V

Returns a reference to the value corresponding to the supplied key.

\n
§Panics
\n

Panics if the key is not present in the HashMap.

\n
§

type Output = V

The returned type after indexing.
","Index<&Q>","avm_server::CallRequests","avm_server::CallResults"],["
source§

impl<'de, K, V, S, E> IntoDeserializer<'de, E> for HashMap<K, V, S>
where\n K: IntoDeserializer<'de, E> + Eq + Hash,\n V: IntoDeserializer<'de, E>,\n S: BuildHasher,\n E: Error,

§

type Deserializer = MapDeserializer<'de, <HashMap<K, V, S> as IntoIterator>::IntoIter, E>

The type of the deserializer being converted into.
source§

fn into_deserializer(\n self,\n) -> <HashMap<K, V, S> as IntoDeserializer<'de, E>>::Deserializer

Convert this value into a deserializer.
","IntoDeserializer<'de, E>","avm_server::CallRequests","avm_server::CallResults"],["
1.0.0 · source§

impl<K, V, S> IntoIterator for HashMap<K, V, S>

source§

fn into_iter(self) -> IntoIter<K, V>

Creates a consuming iterator, that is, one that moves each key-value\npair out of the map in arbitrary order. The map cannot be used after\ncalling this.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet map = HashMap::from([\n    (\"a\", 1),\n    (\"b\", 2),\n    (\"c\", 3),\n]);\n\n// Not possible with .iter()\nlet vec: Vec<(&str, i32)> = map.into_iter().collect();
\n
§

type Item = (K, V)

The type of the elements being iterated over.
§

type IntoIter = IntoIter<K, V>

Which kind of iterator are we turning this into?
","IntoIterator","avm_server::CallRequests","avm_server::CallResults"],["
§

impl<K, V, S> IntoParallelIterator for HashMap<K, V, S>
where\n K: Hash + Eq + Send,\n V: Send,\n S: BuildHasher,

§

type Item = <HashMap<K, V, S> as IntoIterator>::Item

The type of item that the parallel iterator will produce.
§

type Iter = IntoIter<K, V>

The parallel iterator type that will be created.
§

fn into_par_iter(self) -> <HashMap<K, V, S> as IntoParallelIterator>::Iter

Converts self into a parallel iterator. Read more
","IntoParallelIterator","avm_server::CallRequests","avm_server::CallResults"],["
§

impl<'a, K, V, S> ParallelExtend<(&'a K, &'a V)> for HashMap<K, V, S>
where\n K: 'a + Copy + Eq + Hash + Send + Sync,\n V: 'a + Copy + Send + Sync,\n S: BuildHasher + Send,

Extends a hash map with copied items from a parallel iterator.

\n
§

fn par_extend<I>(&mut self, par_iter: I)
where\n I: IntoParallelIterator<Item = (&'a K, &'a V)>,

Extends an instance of the collection with the elements drawn\nfrom the parallel iterator par_iter. Read more
","ParallelExtend<(&'a K, &'a V)>","avm_server::CallRequests","avm_server::CallResults"],["
§

impl<K, V, S> ParallelExtend<(K, V)> for HashMap<K, V, S>
where\n K: Eq + Hash + Send,\n V: Send,\n S: BuildHasher + Send,

Extends a hash map with items from a parallel iterator.

\n
§

fn par_extend<I>(&mut self, par_iter: I)
where\n I: IntoParallelIterator<Item = (K, V)>,

Extends an instance of the collection with the elements drawn\nfrom the parallel iterator par_iter. Read more
","ParallelExtend<(K, V)>","avm_server::CallRequests","avm_server::CallResults"],["
§

impl<K, V, AK, AV> PartialEq<ArchivedHashMap<AK, AV>> for HashMap<K, V>
where\n K: Hash + Eq + Borrow<AK>,\n AK: Hash + Eq,\n AV: PartialEq<V>,

§

fn eq(&self, other: &ArchivedHashMap<AK, AV>) -> bool

This method tests for self and other values to be equal, and is used\nby ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always\nsufficient, and should not be overridden without very good reason.
","PartialEq>","avm_server::CallRequests","avm_server::CallResults"],["
1.0.0 · source§

impl<K, V, S> PartialEq for HashMap<K, V, S>
where\n K: Eq + Hash,\n V: PartialEq,\n S: BuildHasher,

source§

fn eq(&self, other: &HashMap<K, V, S>) -> bool

This method tests for self and other values to be equal, and is used\nby ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always\nsufficient, and should not be overridden without very good reason.
","PartialEq","avm_server::CallRequests","avm_server::CallResults"],["
§

impl<K, V, S, RandomState> Serialize<S> for HashMap<K, V, RandomState>
where\n K: Serialize<S> + Hash + Eq,\n <K as Archive>::Archived: Hash + Eq,\n V: Serialize<S>,\n S: Serializer + ScratchSpace + ?Sized,

§

fn serialize(\n &self,\n serializer: &mut S,\n) -> Result<<HashMap<K, V, RandomState> as Archive>::Resolver, <S as Fallible>::Error>

Writes the dependencies for the object and returns a resolver that can create the archived\ntype.
","Serialize","avm_server::CallRequests","avm_server::CallResults"],["
source§

impl<K, V, H> Serialize for HashMap<K, V, H>
where\n K: Serialize,\n V: Serialize,

source§

fn serialize<S>(\n &self,\n serializer: S,\n) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error>
where\n S: Serializer,

Serialize this value into the given Serde serializer. Read more
","Serialize","avm_server::CallRequests","avm_server::CallResults"],["
source§

impl<K, KAs, V, VAs> SerializeAs<[(K, V)]> for HashMap<KAs, VAs>
where\n KAs: SerializeAs<K>,\n VAs: SerializeAs<V>,

source§

fn serialize_as<S>(\n source: &[(K, V)],\n serializer: S,\n) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error>
where\n S: Serializer,

Serialize this value into the given Serde serializer.
","SerializeAs<[(K, V)]>","avm_server::CallRequests","avm_server::CallResults"],["
source§

impl<K, KAs, V, VAs, const N: usize> SerializeAs<[(K, V); N]> for HashMap<KAs, VAs>
where\n KAs: SerializeAs<K>,\n VAs: SerializeAs<V>,

source§

fn serialize_as<S>(\n source: &[(K, V); N],\n serializer: S,\n) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error>
where\n S: Serializer,

Serialize this value into the given Serde serializer.
","SerializeAs<[(K, V); N]>","avm_server::CallRequests","avm_server::CallResults"],["
source§

impl<K, KAs, V, VAs> SerializeAs<BTreeSet<(K, V)>> for HashMap<KAs, VAs>
where\n KAs: SerializeAs<K>,\n VAs: SerializeAs<V>,

source§

fn serialize_as<S>(\n source: &BTreeSet<(K, V)>,\n serializer: S,\n) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error>
where\n S: Serializer,

Serialize this value into the given Serde serializer.
","SerializeAs>","avm_server::CallRequests","avm_server::CallResults"],["
source§

impl<K, KAs, V, VAs> SerializeAs<BinaryHeap<(K, V)>> for HashMap<KAs, VAs>
where\n KAs: SerializeAs<K>,\n VAs: SerializeAs<V>,

source§

fn serialize_as<S>(\n source: &BinaryHeap<(K, V)>,\n serializer: S,\n) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error>
where\n S: Serializer,

Serialize this value into the given Serde serializer.
","SerializeAs>","avm_server::CallRequests","avm_server::CallResults"],["
source§

impl<K, KAs, V, VAs> SerializeAs<Box<[(K, V)]>> for HashMap<KAs, VAs>
where\n KAs: SerializeAs<K>,\n VAs: SerializeAs<V>,

source§

fn serialize_as<S>(\n source: &Box<[(K, V)]>,\n serializer: S,\n) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error>
where\n S: Serializer,

Serialize this value into the given Serde serializer.
","SerializeAs>","avm_server::CallRequests","avm_server::CallResults"],["
source§

impl<K, KU, V, VU, H> SerializeAs<HashMap<K, V, H>> for HashMap<KU, VU, H>
where\n KU: SerializeAs<K>,\n VU: SerializeAs<V>,

source§

fn serialize_as<S>(\n source: &HashMap<K, V, H>,\n serializer: S,\n) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error>
where\n S: Serializer,

Serialize this value into the given Serde serializer.
","SerializeAs>","avm_server::CallRequests","avm_server::CallResults"],["
source§

impl<K, KAs, V, VAs, H> SerializeAs<HashSet<(K, V), H>> for HashMap<KAs, VAs>
where\n KAs: SerializeAs<K>,\n VAs: SerializeAs<V>,

source§

fn serialize_as<S>(\n source: &HashSet<(K, V), H>,\n serializer: S,\n) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error>
where\n S: Serializer,

Serialize this value into the given Serde serializer.
","SerializeAs>","avm_server::CallRequests","avm_server::CallResults"],["
source§

impl<K, KAs, V, VAs> SerializeAs<LinkedList<(K, V)>> for HashMap<KAs, VAs>
where\n KAs: SerializeAs<K>,\n VAs: SerializeAs<V>,

source§

fn serialize_as<S>(\n source: &LinkedList<(K, V)>,\n serializer: S,\n) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error>
where\n S: Serializer,

Serialize this value into the given Serde serializer.
","SerializeAs>","avm_server::CallRequests","avm_server::CallResults"],["
source§

impl<K, KAs, V, VAs> SerializeAs<Option<(K, V)>> for HashMap<KAs, VAs>
where\n KAs: SerializeAs<K>,\n VAs: SerializeAs<V>,

source§

fn serialize_as<S>(\n source: &Option<(K, V)>,\n serializer: S,\n) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error>
where\n S: Serializer,

Serialize this value into the given Serde serializer.
","SerializeAs>","avm_server::CallRequests","avm_server::CallResults"],["
source§

impl<K, KAs, V, VAs> SerializeAs<Vec<(K, V)>> for HashMap<KAs, VAs>
where\n KAs: SerializeAs<K>,\n VAs: SerializeAs<V>,

source§

fn serialize_as<S>(\n source: &Vec<(K, V)>,\n serializer: S,\n) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error>
where\n S: Serializer,

Serialize this value into the given Serde serializer.
","SerializeAs>","avm_server::CallRequests","avm_server::CallResults"],["
source§

impl<K, KAs, V, VAs> SerializeAs<VecDeque<(K, V)>> for HashMap<KAs, VAs>
where\n KAs: SerializeAs<K>,\n VAs: SerializeAs<V>,

source§

fn serialize_as<S>(\n source: &VecDeque<(K, V)>,\n serializer: S,\n) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error>
where\n S: Serializer,

Serialize this value into the given Serde serializer.
","SerializeAs>","avm_server::CallRequests","avm_server::CallResults"],["
1.0.0 · source§

impl<K, V, S> Eq for HashMap<K, V, S>
where\n K: Eq + Hash,\n V: Eq,\n S: BuildHasher,

","Eq","avm_server::CallRequests","avm_server::CallResults"],["
1.36.0 · source§

impl<K, V, S> UnwindSafe for HashMap<K, V, S>
where\n K: UnwindSafe,\n V: UnwindSafe,\n S: UnwindSafe,

","UnwindSafe","avm_server::CallRequests","avm_server::CallResults"]] +};if (window.register_type_impls) {window.register_type_impls(type_impls);} else {window.pending_type_impls = type_impls;}})() \ No newline at end of file diff --git a/type.impl/std/primitive.str.js b/type.impl/std/primitive.str.js new file mode 100644 index 00000000..aa5057de --- /dev/null +++ b/type.impl/std/primitive.str.js @@ -0,0 +1,3 @@ +(function() {var type_impls = { +"air_interpreter_cid":[["
§

impl ArchivePointee for str

§

type ArchivedMetadata = <usize as Archive>::Archived

The archived version of the pointer metadata for this type.
§

fn pointer_metadata(\n archived: &<str as ArchivePointee>::ArchivedMetadata,\n) -> <str as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
","ArchivePointee","air_interpreter_cid::CidRef"],["
§

impl ArchiveUnsized for str

str

\n
§

type Archived = str

The archived counterpart of this type. Unlike Archive, it may be unsized. Read more
§

type MetadataResolver = ()

The resolver for the metadata of this type. Read more
§

unsafe fn resolve_metadata(\n &self,\n _: usize,\n _: <str as ArchiveUnsized>::MetadataResolver,\n out: *mut <<str as ArchiveUnsized>::Archived as ArchivePointee>::ArchivedMetadata,\n)

Creates the archived version of the metadata for this value at the given position and writes\nit to the given output. Read more
§

unsafe fn resolve_unsized(\n &self,\n from: usize,\n to: usize,\n resolver: Self::MetadataResolver,\n out: *mut RelPtr<Self::Archived, <isize as Archive>::Archived>,\n)

Resolves a relative pointer to this value with the given from and to and writes it to\nthe given output. Read more
","ArchiveUnsized","air_interpreter_cid::CidRef"],["
1.51.0 · source§

impl AsMut<str> for str

source§

fn as_mut(&mut self) -> &mut str

Converts this type into a mutable reference of the (usually inferred) input type.
","AsMut","air_interpreter_cid::CidRef"],["
1.0.0 · source§

impl AsRef<[u8]> for str

source§

fn as_ref(&self) -> &[u8]

Converts this type into a shared reference of the (usually inferred) input type.
","AsRef<[u8]>","air_interpreter_cid::CidRef"],["
1.0.0 · source§

impl AsRef<OsStr> for str

source§

fn as_ref(&self) -> &OsStr

Converts this type into a shared reference of the (usually inferred) input type.
","AsRef","air_interpreter_cid::CidRef"],["
1.0.0 · source§

impl AsRef<Path> for str

source§

fn as_ref(&self) -> &Path

Converts this type into a shared reference of the (usually inferred) input type.
","AsRef","air_interpreter_cid::CidRef"],["
1.0.0 · source§

impl AsRef<str> for str

source§

fn as_ref(&self) -> &str

Converts this type into a shared reference of the (usually inferred) input type.
","AsRef","air_interpreter_cid::CidRef"],["
1.0.0 · source§

impl AsciiExt for str

§

type Owned = String

👎Deprecated since 1.26.0: use inherent methods instead
Container type for copied ASCII characters.
source§

fn is_ascii(&self) -> bool

👎Deprecated since 1.26.0: use inherent methods instead
Checks if the value is within the ASCII range. Read more
source§

fn to_ascii_uppercase(&self) -> <str as AsciiExt>::Owned

👎Deprecated since 1.26.0: use inherent methods instead
Makes a copy of the value in its ASCII upper case equivalent. Read more
source§

fn to_ascii_lowercase(&self) -> <str as AsciiExt>::Owned

👎Deprecated since 1.26.0: use inherent methods instead
Makes a copy of the value in its ASCII lower case equivalent. Read more
source§

fn eq_ignore_ascii_case(&self, o: &str) -> bool

👎Deprecated since 1.26.0: use inherent methods instead
Checks that two values are an ASCII case-insensitive match. Read more
source§

fn make_ascii_uppercase(&mut self)

👎Deprecated since 1.26.0: use inherent methods instead
Converts this type to its ASCII upper case equivalent in-place. Read more
source§

fn make_ascii_lowercase(&mut self)

👎Deprecated since 1.26.0: use inherent methods instead
Converts this type to its ASCII lower case equivalent in-place. Read more
","AsciiExt","air_interpreter_cid::CidRef"],["
§

impl CallHasher for str

§

fn get_hash<H, B>(value: &H, build_hasher: &B) -> u64
where\n H: Hash + ?Sized,\n B: BuildHasher,

","CallHasher","air_interpreter_cid::CidRef"],["
§

impl<C> CheckBytes<C> for str
where\n C: ?Sized,

§

type Error = StrCheckError

The error that may result from checking the type.
§

unsafe fn check_bytes<'a>(\n value: *const str,\n _: &mut C,\n) -> Result<&'a str, <str as CheckBytes<C>>::Error>

Checks whether the given pointer points to a valid value within the\ngiven context. Read more
","CheckBytes","air_interpreter_cid::CidRef"],["
1.0.0 · source§

impl Debug for str

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
","Debug","air_interpreter_cid::CidRef"],["
1.0.0 · source§

impl Display for str

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
","Display","air_interpreter_cid::CidRef"],["
1.0.0 · source§

impl Hash for str

source§

fn hash<H>(&self, state: &mut H)
where\n H: Hasher,

Feeds this value into the given Hasher. Read more
","Hash","air_interpreter_cid::CidRef"],["
1.0.0 · source§

impl<I> Index<I> for str
where\n I: SliceIndex<str>,

§

type Output = <I as SliceIndex<str>>::Output

The returned type after indexing.
source§

fn index(&self, index: I) -> &<I as SliceIndex<str>>::Output

Performs the indexing (container[index]) operation. Read more
","Index","air_interpreter_cid::CidRef"],["
1.0.0 · source§

impl<I> IndexMut<I> for str
where\n I: SliceIndex<str>,

source§

fn index_mut(&mut self, index: I) -> &mut <I as SliceIndex<str>>::Output

Performs the mutable indexing (container[index]) operation. Read more
","IndexMut","air_interpreter_cid::CidRef"],["
§

impl LayoutRaw for str

§

fn layout_raw(\n metadata: <str as Pointee>::Metadata,\n) -> Result<Layout, LayoutError>

Gets the layout of the type.
","LayoutRaw","air_interpreter_cid::CidRef"],["
1.0.0 · source§

impl Ord for str

Implements ordering of strings.

\n

Strings are ordered lexicographically by their byte values. This orders Unicode code\npoints based on their positions in the code charts. This is not necessarily the same as\n“alphabetical” order, which varies by language and locale. Sorting strings according to\nculturally-accepted standards requires locale-specific data that is outside the scope of\nthe str type.

\n
source§

fn cmp(&self, other: &str) -> Ordering

This method returns an Ordering between self and other. Read more
","Ord","air_interpreter_cid::CidRef"],["
§

impl PartialEq<ArchivedString> for str

§

fn eq(&self, other: &ArchivedString) -> bool

This method tests for self and other values to be equal, and is used\nby ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always\nsufficient, and should not be overridden without very good reason.
","PartialEq","air_interpreter_cid::CidRef"],["
source§

impl<const CAP: usize> PartialEq<ArrayString<CAP>> for str

source§

fn eq(&self, rhs: &ArrayString<CAP>) -> bool

This method tests for self and other values to be equal, and is used\nby ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always\nsufficient, and should not be overridden without very good reason.
","PartialEq>","air_interpreter_cid::CidRef"],["
1.0.0 · source§

impl<'a, 'b> PartialEq<Cow<'a, str>> for str

source§

fn eq(&self, other: &Cow<'a, str>) -> bool

This method tests for self and other values to be equal, and is used\nby ==.
source§

fn ne(&self, other: &Cow<'a, str>) -> bool

This method tests for !=. The default implementation is almost always\nsufficient, and should not be overridden without very good reason.
","PartialEq>","air_interpreter_cid::CidRef"],["
1.0.0 · source§

impl PartialEq<OsStr> for str

source§

fn eq(&self, other: &OsStr) -> bool

This method tests for self and other values to be equal, and is used\nby ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always\nsufficient, and should not be overridden without very good reason.
","PartialEq","air_interpreter_cid::CidRef"],["
1.0.0 · source§

impl PartialEq<OsString> for str

source§

fn eq(&self, other: &OsString) -> bool

This method tests for self and other values to be equal, and is used\nby ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always\nsufficient, and should not be overridden without very good reason.
","PartialEq","air_interpreter_cid::CidRef"],["
1.0.0 · source§

impl<'a, 'b> PartialEq<String> for str

source§

fn eq(&self, other: &String) -> bool

This method tests for self and other values to be equal, and is used\nby ==.
source§

fn ne(&self, other: &String) -> bool

This method tests for !=. The default implementation is almost always\nsufficient, and should not be overridden without very good reason.
","PartialEq","air_interpreter_cid::CidRef"],["
source§

impl PartialEq<Value> for str

source§

fn eq(&self, other: &Value) -> bool

This method tests for self and other values to be equal, and is used\nby ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always\nsufficient, and should not be overridden without very good reason.
","PartialEq","air_interpreter_cid::CidRef"],["
1.0.0 · source§

impl PartialEq for str

source§

fn eq(&self, other: &str) -> bool

This method tests for self and other values to be equal, and is used\nby ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always\nsufficient, and should not be overridden without very good reason.
","PartialEq","air_interpreter_cid::CidRef"],["
§

impl PartialOrd<ArchivedString> for str

§

fn partial_cmp(&self, other: &ArchivedString) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · source§

fn lt(&self, other: &Rhs) -> bool

This method tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · source§

fn le(&self, other: &Rhs) -> bool

This method tests less than or equal to (for self and other) and is used by the <=\noperator. Read more
1.0.0 · source§

fn gt(&self, other: &Rhs) -> bool

This method tests greater than (for self and other) and is used by the > operator. Read more
1.0.0 · source§

fn ge(&self, other: &Rhs) -> bool

This method tests greater than or equal to (for self and other) and is used by the >=\noperator. Read more
","PartialOrd","air_interpreter_cid::CidRef"],["
source§

impl<const CAP: usize> PartialOrd<ArrayString<CAP>> for str

source§

fn partial_cmp(&self, rhs: &ArrayString<CAP>) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
source§

fn lt(&self, rhs: &ArrayString<CAP>) -> bool

This method tests less than (for self and other) and is used by the < operator. Read more
source§

fn le(&self, rhs: &ArrayString<CAP>) -> bool

This method tests less than or equal to (for self and other) and is used by the <=\noperator. Read more
source§

fn gt(&self, rhs: &ArrayString<CAP>) -> bool

This method tests greater than (for self and other) and is used by the > operator. Read more
source§

fn ge(&self, rhs: &ArrayString<CAP>) -> bool

This method tests greater than or equal to (for self and other) and is used by the >=\noperator. Read more
","PartialOrd>","air_interpreter_cid::CidRef"],["
1.0.0 · source§

impl PartialOrd for str

Implements comparison operations on strings.

\n

Strings are compared lexicographically by their byte values. This compares Unicode code\npoints based on their positions in the code charts. This is not necessarily the same as\n“alphabetical” order, which varies by language and locale. Comparing strings according to\nculturally-accepted standards requires locale-specific data that is outside the scope of\nthe str type.

\n
source§

fn partial_cmp(&self, other: &str) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · source§

fn lt(&self, other: &Rhs) -> bool

This method tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · source§

fn le(&self, other: &Rhs) -> bool

This method tests less than or equal to (for self and other) and is used by the <=\noperator. Read more
1.0.0 · source§

fn gt(&self, other: &Rhs) -> bool

This method tests greater than (for self and other) and is used by the > operator. Read more
1.0.0 · source§

fn ge(&self, other: &Rhs) -> bool

This method tests greater than or equal to (for self and other) and is used by the >=\noperator. Read more
","PartialOrd","air_interpreter_cid::CidRef"],["
§

impl Pointee for str

§

type Metadata = usize

The type for metadata in pointers and references to Self.
","Pointee","air_interpreter_cid::CidRef"],["
source§

impl Serialize for str

source§

fn serialize<S>(\n &self,\n serializer: S,\n) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error>
where\n S: Serializer,

Serialize this value into the given Serde serializer. Read more
","Serialize","air_interpreter_cid::CidRef"],["
§

impl<S> SerializeUnsized<S> for str
where\n S: Serializer + ?Sized,

§

fn serialize_unsized(\n &self,\n serializer: &mut S,\n) -> Result<usize, <S as Fallible>::Error>

Writes the object and returns the position of the archived type.
§

fn serialize_metadata(\n &self,\n _: &mut S,\n) -> Result<<str as ArchiveUnsized>::MetadataResolver, <S as Fallible>::Error>

Serializes the metadata for the given type.
","SerializeUnsized","air_interpreter_cid::CidRef"],["
1.0.0 · source§

impl ToOwned for str

§

type Owned = String

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> String

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut String)

Uses borrowed data to replace owned data, usually by cloning. Read more
","ToOwned","air_interpreter_cid::CidRef"],["
1.0.0 · source§

impl ToSocketAddrs for str

§

type Iter = IntoIter<SocketAddr>

Returned iterator over socket addresses which this type may correspond\nto.
source§

fn to_socket_addrs(&self) -> Result<IntoIter<SocketAddr>, Error>

Converts this object to an iterator of resolved SocketAddrs. Read more
","ToSocketAddrs","air_interpreter_cid::CidRef"],["
source§

impl str

Methods for string slices.

\n
1.20.0 · source

pub fn into_boxed_bytes(self: Box<str>) -> Box<[u8]>

Converts a Box<str> into a Box<[u8]> without copying or allocating.

\n
§Examples
\n
let s = \"this is a string\";\nlet boxed_str = s.to_owned().into_boxed_str();\nlet boxed_bytes = boxed_str.into_boxed_bytes();\nassert_eq!(*boxed_bytes, *s.as_bytes());
\n
1.0.0 · source

pub fn replace<'a, P>(&'a self, from: P, to: &str) -> String
where\n P: Pattern<'a>,

Replaces all matches of a pattern with another string.

\n

replace creates a new String, and copies the data from this string slice into it.\nWhile doing so, it attempts to find matches of a pattern. If it finds any, it\nreplaces them with the replacement string slice.

\n
§Examples
\n

Basic usage:

\n\n
let s = \"this is old\";\n\nassert_eq!(\"this is new\", s.replace(\"old\", \"new\"));\nassert_eq!(\"than an old\", s.replace(\"is\", \"an\"));
\n

When the pattern doesn’t match, it returns this string slice as String:

\n\n
let s = \"this is old\";\nassert_eq!(s, s.replace(\"cookie monster\", \"little lamb\"));
\n
1.16.0 · source

pub fn replacen<'a, P>(&'a self, pat: P, to: &str, count: usize) -> String
where\n P: Pattern<'a>,

Replaces first N matches of a pattern with another string.

\n

replacen creates a new String, and copies the data from this string slice into it.\nWhile doing so, it attempts to find matches of a pattern. If it finds any, it\nreplaces them with the replacement string slice at most count times.

\n
§Examples
\n

Basic usage:

\n\n
let s = \"foo foo 123 foo\";\nassert_eq!(\"new new 123 foo\", s.replacen(\"foo\", \"new\", 2));\nassert_eq!(\"faa fao 123 foo\", s.replacen('o', \"a\", 3));\nassert_eq!(\"foo foo new23 foo\", s.replacen(char::is_numeric, \"new\", 1));
\n

When the pattern doesn’t match, it returns this string slice as String:

\n\n
let s = \"this is old\";\nassert_eq!(s, s.replacen(\"cookie monster\", \"little lamb\", 10));
\n
1.2.0 · source

pub fn to_lowercase(&self) -> String

Returns the lowercase equivalent of this string slice, as a new String.

\n

‘Lowercase’ is defined according to the terms of the Unicode Derived Core Property\nLowercase.

\n

Since some characters can expand into multiple characters when changing\nthe case, this function returns a String instead of modifying the\nparameter in-place.

\n
§Examples
\n

Basic usage:

\n\n
let s = \"HELLO\";\n\nassert_eq!(\"hello\", s.to_lowercase());
\n

A tricky example, with sigma:

\n\n
let sigma = \"Σ\";\n\nassert_eq!(\"σ\", sigma.to_lowercase());\n\n// but at the end of a word, it's ς, not σ:\nlet odysseus = \"ὈΔΥΣΣΕΎΣ\";\n\nassert_eq!(\"ὀδυσσεύς\", odysseus.to_lowercase());
\n

Languages without case are not changed:

\n\n
let new_year = \"农历新年\";\n\nassert_eq!(new_year, new_year.to_lowercase());
\n
1.2.0 · source

pub fn to_uppercase(&self) -> String

Returns the uppercase equivalent of this string slice, as a new String.

\n

‘Uppercase’ is defined according to the terms of the Unicode Derived Core Property\nUppercase.

\n

Since some characters can expand into multiple characters when changing\nthe case, this function returns a String instead of modifying the\nparameter in-place.

\n
§Examples
\n

Basic usage:

\n\n
let s = \"hello\";\n\nassert_eq!(\"HELLO\", s.to_uppercase());
\n

Scripts without case are not changed:

\n\n
let new_year = \"农历新年\";\n\nassert_eq!(new_year, new_year.to_uppercase());
\n

One character can become multiple:

\n\n
let s = \"tschüß\";\n\nassert_eq!(\"TSCHÜSS\", s.to_uppercase());
\n
1.4.0 · source

pub fn into_string(self: Box<str>) -> String

Converts a Box<str> into a String without copying or allocating.

\n
§Examples
\n
let string = String::from(\"birthday gift\");\nlet boxed_str = string.clone().into_boxed_str();\n\nassert_eq!(boxed_str.into_string(), string);
\n
1.16.0 · source

pub fn repeat(&self, n: usize) -> String

Creates a new String by repeating a string n times.

\n
§Panics
\n

This function will panic if the capacity would overflow.

\n
§Examples
\n

Basic usage:

\n\n
assert_eq!(\"abc\".repeat(4), String::from(\"abcabcabcabc\"));
\n

A panic upon overflow:

\n\n
// this will panic at runtime\nlet huge = \"0123456789abcdef\".repeat(usize::MAX);
\n
1.23.0 · source

pub fn to_ascii_uppercase(&self) -> String

Returns a copy of this string where each character is mapped to its\nASCII upper case equivalent.

\n

ASCII letters ‘a’ to ‘z’ are mapped to ‘A’ to ‘Z’,\nbut non-ASCII letters are unchanged.

\n

To uppercase the value in-place, use make_ascii_uppercase.

\n

To uppercase ASCII characters in addition to non-ASCII characters, use\nto_uppercase.

\n
§Examples
\n
let s = \"Grüße, Jürgen ❤\";\n\nassert_eq!(\"GRüßE, JüRGEN ❤\", s.to_ascii_uppercase());
\n
1.23.0 · source

pub fn to_ascii_lowercase(&self) -> String

Returns a copy of this string where each character is mapped to its\nASCII lower case equivalent.

\n

ASCII letters ‘A’ to ‘Z’ are mapped to ‘a’ to ‘z’,\nbut non-ASCII letters are unchanged.

\n

To lowercase the value in-place, use make_ascii_lowercase.

\n

To lowercase ASCII characters in addition to non-ASCII characters, use\nto_lowercase.

\n
§Examples
\n
let s = \"Grüße, Jürgen ❤\";\n\nassert_eq!(\"grüße, jürgen ❤\", s.to_ascii_lowercase());
\n
",0,"air_interpreter_cid::CidRef"],["
source§

impl str

1.0.0 (const: 1.39.0) · source

pub const fn len(&self) -> usize

Returns the length of self.

\n

This length is in bytes, not chars or graphemes. In other words,\nit might not be what a human considers the length of the string.

\n
§Examples
\n
let len = \"foo\".len();\nassert_eq!(3, len);\n\nassert_eq!(\"ƒoo\".len(), 4); // fancy f!\nassert_eq!(\"ƒoo\".chars().count(), 3);
\n
1.0.0 (const: 1.39.0) · source

pub const fn is_empty(&self) -> bool

Returns true if self has a length of zero bytes.

\n
§Examples
\n
let s = \"\";\nassert!(s.is_empty());\n\nlet s = \"not empty\";\nassert!(!s.is_empty());
\n
1.9.0 · source

pub fn is_char_boundary(&self, index: usize) -> bool

Checks that index-th byte is the first byte in a UTF-8 code point\nsequence or the end of the string.

\n

The start and end of the string (when index == self.len()) are\nconsidered to be boundaries.

\n

Returns false if index is greater than self.len().

\n
§Examples
\n
let s = \"Löwe 老虎 Léopard\";\nassert!(s.is_char_boundary(0));\n// start of `老`\nassert!(s.is_char_boundary(6));\nassert!(s.is_char_boundary(s.len()));\n\n// second byte of `ö`\nassert!(!s.is_char_boundary(2));\n\n// third byte of `老`\nassert!(!s.is_char_boundary(8));
\n
source

pub fn floor_char_boundary(&self, index: usize) -> usize

🔬This is a nightly-only experimental API. (round_char_boundary)

Finds the closest x not exceeding index where is_char_boundary(x) is true.

\n

This method can help you truncate a string so that it’s still valid UTF-8, but doesn’t\nexceed a given number of bytes. Note that this is done purely at the character level\nand can still visually split graphemes, even though the underlying characters aren’t\nsplit. For example, the emoji 🧑‍🔬 (scientist) could be split so that the string only\nincludes 🧑 (person) instead.

\n
§Examples
\n
#![feature(round_char_boundary)]\nlet s = \"❤️🧡💛💚💙💜\";\nassert_eq!(s.len(), 26);\nassert!(!s.is_char_boundary(13));\n\nlet closest = s.floor_char_boundary(13);\nassert_eq!(closest, 10);\nassert_eq!(&s[..closest], \"❤️🧡\");
\n
source

pub fn ceil_char_boundary(&self, index: usize) -> usize

🔬This is a nightly-only experimental API. (round_char_boundary)

Finds the closest x not below index where is_char_boundary(x) is true.

\n

If index is greater than the length of the string, this returns the length of the string.

\n

This method is the natural complement to floor_char_boundary. See that method\nfor more details.

\n
§Examples
\n
#![feature(round_char_boundary)]\nlet s = \"❤️🧡💛💚💙💜\";\nassert_eq!(s.len(), 26);\nassert!(!s.is_char_boundary(13));\n\nlet closest = s.ceil_char_boundary(13);\nassert_eq!(closest, 14);\nassert_eq!(&s[..closest], \"❤️🧡💛\");
\n
1.0.0 (const: 1.39.0) · source

pub const fn as_bytes(&self) -> &[u8]

Converts a string slice to a byte slice. To convert the byte slice back\ninto a string slice, use the from_utf8 function.

\n
§Examples
\n
let bytes = \"bors\".as_bytes();\nassert_eq!(b\"bors\", bytes);
\n
1.20.0 · source

pub unsafe fn as_bytes_mut(&mut self) -> &mut [u8]

Converts a mutable string slice to a mutable byte slice.

\n
§Safety
\n

The caller must ensure that the content of the slice is valid UTF-8\nbefore the borrow ends and the underlying str is used.

\n

Use of a str whose contents are not valid UTF-8 is undefined behavior.

\n
§Examples
\n

Basic usage:

\n\n
let mut s = String::from(\"Hello\");\nlet bytes = unsafe { s.as_bytes_mut() };\n\nassert_eq!(b\"Hello\", bytes);
\n

Mutability:

\n\n
let mut s = String::from(\"🗻∈🌏\");\n\nunsafe {\n    let bytes = s.as_bytes_mut();\n\n    bytes[0] = 0xF0;\n    bytes[1] = 0x9F;\n    bytes[2] = 0x8D;\n    bytes[3] = 0x94;\n}\n\nassert_eq!(\"🍔∈🌏\", s);
\n
1.0.0 (const: 1.32.0) · source

pub const fn as_ptr(&self) -> *const u8

Converts a string slice to a raw pointer.

\n

As string slices are a slice of bytes, the raw pointer points to a\nu8. This pointer will be pointing to the first byte of the string\nslice.

\n

The caller must ensure that the returned pointer is never written to.\nIf you need to mutate the contents of the string slice, use as_mut_ptr.

\n
§Examples
\n
let s = \"Hello\";\nlet ptr = s.as_ptr();
\n
1.36.0 · source

pub fn as_mut_ptr(&mut self) -> *mut u8

Converts a mutable string slice to a raw pointer.

\n

As string slices are a slice of bytes, the raw pointer points to a\nu8. This pointer will be pointing to the first byte of the string\nslice.

\n

It is your responsibility to make sure that the string slice only gets\nmodified in a way that it remains valid UTF-8.

\n
1.20.0 · source

pub fn get<I>(&self, i: I) -> Option<&<I as SliceIndex<str>>::Output>
where\n I: SliceIndex<str>,

Returns a subslice of str.

\n

This is the non-panicking alternative to indexing the str. Returns\nNone whenever equivalent indexing operation would panic.

\n
§Examples
\n
let v = String::from(\"🗻∈🌏\");\n\nassert_eq!(Some(\"🗻\"), v.get(0..4));\n\n// indices not on UTF-8 sequence boundaries\nassert!(v.get(1..).is_none());\nassert!(v.get(..8).is_none());\n\n// out of bounds\nassert!(v.get(..42).is_none());
\n
1.20.0 · source

pub fn get_mut<I>(\n &mut self,\n i: I,\n) -> Option<&mut <I as SliceIndex<str>>::Output>
where\n I: SliceIndex<str>,

Returns a mutable subslice of str.

\n

This is the non-panicking alternative to indexing the str. Returns\nNone whenever equivalent indexing operation would panic.

\n
§Examples
\n
let mut v = String::from(\"hello\");\n// correct length\nassert!(v.get_mut(0..5).is_some());\n// out of bounds\nassert!(v.get_mut(..42).is_none());\nassert_eq!(Some(\"he\"), v.get_mut(0..2).map(|v| &*v));\n\nassert_eq!(\"hello\", v);\n{\n    let s = v.get_mut(0..2);\n    let s = s.map(|s| {\n        s.make_ascii_uppercase();\n        &*s\n    });\n    assert_eq!(Some(\"HE\"), s);\n}\nassert_eq!(\"HEllo\", v);
\n
1.20.0 · source

pub unsafe fn get_unchecked<I>(&self, i: I) -> &<I as SliceIndex<str>>::Output
where\n I: SliceIndex<str>,

Returns an unchecked subslice of str.

\n

This is the unchecked alternative to indexing the str.

\n
§Safety
\n

Callers of this function are responsible that these preconditions are\nsatisfied:

\n
    \n
  • The starting index must not exceed the ending index;
  • \n
  • Indexes must be within bounds of the original slice;
  • \n
  • Indexes must lie on UTF-8 sequence boundaries.
  • \n
\n

Failing that, the returned string slice may reference invalid memory or\nviolate the invariants communicated by the str type.

\n
§Examples
\n
let v = \"🗻∈🌏\";\nunsafe {\n    assert_eq!(\"🗻\", v.get_unchecked(0..4));\n    assert_eq!(\"∈\", v.get_unchecked(4..7));\n    assert_eq!(\"🌏\", v.get_unchecked(7..11));\n}
\n
1.20.0 · source

pub unsafe fn get_unchecked_mut<I>(\n &mut self,\n i: I,\n) -> &mut <I as SliceIndex<str>>::Output
where\n I: SliceIndex<str>,

Returns a mutable, unchecked subslice of str.

\n

This is the unchecked alternative to indexing the str.

\n
§Safety
\n

Callers of this function are responsible that these preconditions are\nsatisfied:

\n
    \n
  • The starting index must not exceed the ending index;
  • \n
  • Indexes must be within bounds of the original slice;
  • \n
  • Indexes must lie on UTF-8 sequence boundaries.
  • \n
\n

Failing that, the returned string slice may reference invalid memory or\nviolate the invariants communicated by the str type.

\n
§Examples
\n
let mut v = String::from(\"🗻∈🌏\");\nunsafe {\n    assert_eq!(\"🗻\", v.get_unchecked_mut(0..4));\n    assert_eq!(\"∈\", v.get_unchecked_mut(4..7));\n    assert_eq!(\"🌏\", v.get_unchecked_mut(7..11));\n}
\n
1.0.0 · source

pub unsafe fn slice_unchecked(&self, begin: usize, end: usize) -> &str

👎Deprecated since 1.29.0: use get_unchecked(begin..end) instead

Creates a string slice from another string slice, bypassing safety\nchecks.

\n

This is generally not recommended, use with caution! For a safe\nalternative see str and Index.

\n

This new slice goes from begin to end, including begin but\nexcluding end.

\n

To get a mutable string slice instead, see the\nslice_mut_unchecked method.

\n
§Safety
\n

Callers of this function are responsible that three preconditions are\nsatisfied:

\n
    \n
  • begin must not exceed end.
  • \n
  • begin and end must be byte positions within the string slice.
  • \n
  • begin and end must lie on UTF-8 sequence boundaries.
  • \n
\n
§Examples
\n
let s = \"Löwe 老虎 Léopard\";\n\nunsafe {\n    assert_eq!(\"Löwe 老虎 Léopard\", s.slice_unchecked(0, 21));\n}\n\nlet s = \"Hello, world!\";\n\nunsafe {\n    assert_eq!(\"world\", s.slice_unchecked(7, 12));\n}
\n
1.5.0 · source

pub unsafe fn slice_mut_unchecked(\n &mut self,\n begin: usize,\n end: usize,\n) -> &mut str

👎Deprecated since 1.29.0: use get_unchecked_mut(begin..end) instead

Creates a string slice from another string slice, bypassing safety\nchecks.\nThis is generally not recommended, use with caution! For a safe\nalternative see str and IndexMut.

\n

This new slice goes from begin to end, including begin but\nexcluding end.

\n

To get an immutable string slice instead, see the\nslice_unchecked method.

\n
§Safety
\n

Callers of this function are responsible that three preconditions are\nsatisfied:

\n
    \n
  • begin must not exceed end.
  • \n
  • begin and end must be byte positions within the string slice.
  • \n
  • begin and end must lie on UTF-8 sequence boundaries.
  • \n
\n
1.4.0 · source

pub fn split_at(&self, mid: usize) -> (&str, &str)

Divide one string slice into two at an index.

\n

The argument, mid, should be a byte offset from the start of the\nstring. It must also be on the boundary of a UTF-8 code point.

\n

The two slices returned go from the start of the string slice to mid,\nand from mid to the end of the string slice.

\n

To get mutable string slices instead, see the split_at_mut\nmethod.

\n
§Panics
\n

Panics if mid is not on a UTF-8 code point boundary, or if it is past\nthe end of the last code point of the string slice. For a non-panicking\nalternative see split_at_checked.

\n
§Examples
\n
let s = \"Per Martin-Löf\";\n\nlet (first, last) = s.split_at(3);\n\nassert_eq!(\"Per\", first);\nassert_eq!(\" Martin-Löf\", last);
\n
1.4.0 · source

pub fn split_at_mut(&mut self, mid: usize) -> (&mut str, &mut str)

Divide one mutable string slice into two at an index.

\n

The argument, mid, should be a byte offset from the start of the\nstring. It must also be on the boundary of a UTF-8 code point.

\n

The two slices returned go from the start of the string slice to mid,\nand from mid to the end of the string slice.

\n

To get immutable string slices instead, see the split_at method.

\n
§Panics
\n

Panics if mid is not on a UTF-8 code point boundary, or if it is past\nthe end of the last code point of the string slice. For a non-panicking\nalternative see split_at_mut_checked.

\n
§Examples
\n
let mut s = \"Per Martin-Löf\".to_string();\n{\n    let (first, last) = s.split_at_mut(3);\n    first.make_ascii_uppercase();\n    assert_eq!(\"PER\", first);\n    assert_eq!(\" Martin-Löf\", last);\n}\nassert_eq!(\"PER Martin-Löf\", s);
\n
1.80.0 · source

pub fn split_at_checked(&self, mid: usize) -> Option<(&str, &str)>

Divide one string slice into two at an index.

\n

The argument, mid, should be a valid byte offset from the start of the\nstring. It must also be on the boundary of a UTF-8 code point. The\nmethod returns None if that’s not the case.

\n

The two slices returned go from the start of the string slice to mid,\nand from mid to the end of the string slice.

\n

To get mutable string slices instead, see the split_at_mut_checked\nmethod.

\n
§Examples
\n
let s = \"Per Martin-Löf\";\n\nlet (first, last) = s.split_at_checked(3).unwrap();\nassert_eq!(\"Per\", first);\nassert_eq!(\" Martin-Löf\", last);\n\nassert_eq!(None, s.split_at_checked(13));  // Inside “ö”\nassert_eq!(None, s.split_at_checked(16));  // Beyond the string length
\n
1.80.0 · source

pub fn split_at_mut_checked(\n &mut self,\n mid: usize,\n) -> Option<(&mut str, &mut str)>

Divide one mutable string slice into two at an index.

\n

The argument, mid, should be a valid byte offset from the start of the\nstring. It must also be on the boundary of a UTF-8 code point. The\nmethod returns None if that’s not the case.

\n

The two slices returned go from the start of the string slice to mid,\nand from mid to the end of the string slice.

\n

To get immutable string slices instead, see the split_at_checked method.

\n
§Examples
\n
let mut s = \"Per Martin-Löf\".to_string();\nif let Some((first, last)) = s.split_at_mut_checked(3) {\n    first.make_ascii_uppercase();\n    assert_eq!(\"PER\", first);\n    assert_eq!(\" Martin-Löf\", last);\n}\nassert_eq!(\"PER Martin-Löf\", s);\n\nassert_eq!(None, s.split_at_mut_checked(13));  // Inside “ö”\nassert_eq!(None, s.split_at_mut_checked(16));  // Beyond the string length
\n
1.0.0 · source

pub fn chars(&self) -> Chars<'_>

Returns an iterator over the chars of a string slice.

\n

As a string slice consists of valid UTF-8, we can iterate through a\nstring slice by char. This method returns such an iterator.

\n

It’s important to remember that char represents a Unicode Scalar\nValue, and might not match your idea of what a ‘character’ is. Iteration\nover grapheme clusters may be what you actually want. This functionality\nis not provided by Rust’s standard library, check crates.io instead.

\n
§Examples
\n

Basic usage:

\n\n
let word = \"goodbye\";\n\nlet count = word.chars().count();\nassert_eq!(7, count);\n\nlet mut chars = word.chars();\n\nassert_eq!(Some('g'), chars.next());\nassert_eq!(Some('o'), chars.next());\nassert_eq!(Some('o'), chars.next());\nassert_eq!(Some('d'), chars.next());\nassert_eq!(Some('b'), chars.next());\nassert_eq!(Some('y'), chars.next());\nassert_eq!(Some('e'), chars.next());\n\nassert_eq!(None, chars.next());
\n

Remember, chars might not match your intuition about characters:

\n\n
let y = \"y̆\";\n\nlet mut chars = y.chars();\n\nassert_eq!(Some('y'), chars.next()); // not 'y̆'\nassert_eq!(Some('\\u{0306}'), chars.next());\n\nassert_eq!(None, chars.next());
\n
1.0.0 · source

pub fn char_indices(&self) -> CharIndices<'_>

Returns an iterator over the chars of a string slice, and their\npositions.

\n

As a string slice consists of valid UTF-8, we can iterate through a\nstring slice by char. This method returns an iterator of both\nthese chars, as well as their byte positions.

\n

The iterator yields tuples. The position is first, the char is\nsecond.

\n
§Examples
\n

Basic usage:

\n\n
let word = \"goodbye\";\n\nlet count = word.char_indices().count();\nassert_eq!(7, count);\n\nlet mut char_indices = word.char_indices();\n\nassert_eq!(Some((0, 'g')), char_indices.next());\nassert_eq!(Some((1, 'o')), char_indices.next());\nassert_eq!(Some((2, 'o')), char_indices.next());\nassert_eq!(Some((3, 'd')), char_indices.next());\nassert_eq!(Some((4, 'b')), char_indices.next());\nassert_eq!(Some((5, 'y')), char_indices.next());\nassert_eq!(Some((6, 'e')), char_indices.next());\n\nassert_eq!(None, char_indices.next());
\n

Remember, chars might not match your intuition about characters:

\n\n
let yes = \"y̆es\";\n\nlet mut char_indices = yes.char_indices();\n\nassert_eq!(Some((0, 'y')), char_indices.next()); // not (0, 'y̆')\nassert_eq!(Some((1, '\\u{0306}')), char_indices.next());\n\n// note the 3 here - the previous character took up two bytes\nassert_eq!(Some((3, 'e')), char_indices.next());\nassert_eq!(Some((4, 's')), char_indices.next());\n\nassert_eq!(None, char_indices.next());
\n
1.0.0 · source

pub fn bytes(&self) -> Bytes<'_>

An iterator over the bytes of a string slice.

\n

As a string slice consists of a sequence of bytes, we can iterate\nthrough a string slice by byte. This method returns such an iterator.

\n
§Examples
\n
let mut bytes = \"bors\".bytes();\n\nassert_eq!(Some(b'b'), bytes.next());\nassert_eq!(Some(b'o'), bytes.next());\nassert_eq!(Some(b'r'), bytes.next());\nassert_eq!(Some(b's'), bytes.next());\n\nassert_eq!(None, bytes.next());
\n
1.1.0 · source

pub fn split_whitespace(&self) -> SplitWhitespace<'_>

Splits a string slice by whitespace.

\n

The iterator returned will return string slices that are sub-slices of\nthe original string slice, separated by any amount of whitespace.

\n

‘Whitespace’ is defined according to the terms of the Unicode Derived\nCore Property White_Space. If you only want to split on ASCII whitespace\ninstead, use split_ascii_whitespace.

\n
§Examples
\n

Basic usage:

\n\n
let mut iter = \"A few words\".split_whitespace();\n\nassert_eq!(Some(\"A\"), iter.next());\nassert_eq!(Some(\"few\"), iter.next());\nassert_eq!(Some(\"words\"), iter.next());\n\nassert_eq!(None, iter.next());
\n

All kinds of whitespace are considered:

\n\n
let mut iter = \" Mary   had\\ta\\u{2009}little  \\n\\t lamb\".split_whitespace();\nassert_eq!(Some(\"Mary\"), iter.next());\nassert_eq!(Some(\"had\"), iter.next());\nassert_eq!(Some(\"a\"), iter.next());\nassert_eq!(Some(\"little\"), iter.next());\nassert_eq!(Some(\"lamb\"), iter.next());\n\nassert_eq!(None, iter.next());
\n

If the string is empty or all whitespace, the iterator yields no string slices:

\n\n
assert_eq!(\"\".split_whitespace().next(), None);\nassert_eq!(\"   \".split_whitespace().next(), None);
\n
1.34.0 · source

pub fn split_ascii_whitespace(&self) -> SplitAsciiWhitespace<'_>

Splits a string slice by ASCII whitespace.

\n

The iterator returned will return string slices that are sub-slices of\nthe original string slice, separated by any amount of ASCII whitespace.

\n

To split by Unicode Whitespace instead, use split_whitespace.

\n
§Examples
\n

Basic usage:

\n\n
let mut iter = \"A few words\".split_ascii_whitespace();\n\nassert_eq!(Some(\"A\"), iter.next());\nassert_eq!(Some(\"few\"), iter.next());\nassert_eq!(Some(\"words\"), iter.next());\n\nassert_eq!(None, iter.next());
\n

All kinds of ASCII whitespace are considered:

\n\n
let mut iter = \" Mary   had\\ta little  \\n\\t lamb\".split_ascii_whitespace();\nassert_eq!(Some(\"Mary\"), iter.next());\nassert_eq!(Some(\"had\"), iter.next());\nassert_eq!(Some(\"a\"), iter.next());\nassert_eq!(Some(\"little\"), iter.next());\nassert_eq!(Some(\"lamb\"), iter.next());\n\nassert_eq!(None, iter.next());
\n

If the string is empty or all ASCII whitespace, the iterator yields no string slices:

\n\n
assert_eq!(\"\".split_ascii_whitespace().next(), None);\nassert_eq!(\"   \".split_ascii_whitespace().next(), None);
\n
1.0.0 · source

pub fn lines(&self) -> Lines<'_>

An iterator over the lines of a string, as string slices.

\n

Lines are split at line endings that are either newlines (\\n) or\nsequences of a carriage return followed by a line feed (\\r\\n).

\n

Line terminators are not included in the lines returned by the iterator.

\n

Note that any carriage return (\\r) not immediately followed by a\nline feed (\\n) does not split a line. These carriage returns are\nthereby included in the produced lines.

\n

The final line ending is optional. A string that ends with a final line\nending will return the same lines as an otherwise identical string\nwithout a final line ending.

\n
§Examples
\n

Basic usage:

\n\n
let text = \"foo\\r\\nbar\\n\\nbaz\\r\";\nlet mut lines = text.lines();\n\nassert_eq!(Some(\"foo\"), lines.next());\nassert_eq!(Some(\"bar\"), lines.next());\nassert_eq!(Some(\"\"), lines.next());\n// Trailing carriage return is included in the last line\nassert_eq!(Some(\"baz\\r\"), lines.next());\n\nassert_eq!(None, lines.next());
\n

The final line does not require any ending:

\n\n
let text = \"foo\\nbar\\n\\r\\nbaz\";\nlet mut lines = text.lines();\n\nassert_eq!(Some(\"foo\"), lines.next());\nassert_eq!(Some(\"bar\"), lines.next());\nassert_eq!(Some(\"\"), lines.next());\nassert_eq!(Some(\"baz\"), lines.next());\n\nassert_eq!(None, lines.next());
\n
1.0.0 · source

pub fn lines_any(&self) -> LinesAny<'_>

👎Deprecated since 1.4.0: use lines() instead now

An iterator over the lines of a string.

\n
1.8.0 · source

pub fn encode_utf16(&self) -> EncodeUtf16<'_>

Returns an iterator of u16 over the string encoded as UTF-16.

\n
§Examples
\n
let text = \"Zażółć gęślą jaźń\";\n\nlet utf8_len = text.len();\nlet utf16_len = text.encode_utf16().count();\n\nassert!(utf16_len <= utf8_len);
\n
1.0.0 · source

pub fn contains<'a, P>(&'a self, pat: P) -> bool
where\n P: Pattern<'a>,

Returns true if the given pattern matches a sub-slice of\nthis string slice.

\n

Returns false if it does not.

\n

The pattern can be a &str, char, a slice of chars, or a\nfunction or closure that determines if a character matches.

\n
§Examples
\n
let bananas = \"bananas\";\n\nassert!(bananas.contains(\"nana\"));\nassert!(!bananas.contains(\"apples\"));
\n
1.0.0 · source

pub fn starts_with<'a, P>(&'a self, pat: P) -> bool
where\n P: Pattern<'a>,

Returns true if the given pattern matches a prefix of this\nstring slice.

\n

Returns false if it does not.

\n

The pattern can be a &str, in which case this function will return true if\nthe &str is a prefix of this string slice.

\n

The pattern can also be a char, a slice of chars, or a\nfunction or closure that determines if a character matches.\nThese will only be checked against the first character of this string slice.\nLook at the second example below regarding behavior for slices of chars.

\n
§Examples
\n
let bananas = \"bananas\";\n\nassert!(bananas.starts_with(\"bana\"));\nassert!(!bananas.starts_with(\"nana\"));
\n\n
let bananas = \"bananas\";\n\n// Note that both of these assert successfully.\nassert!(bananas.starts_with(&['b', 'a', 'n', 'a']));\nassert!(bananas.starts_with(&['a', 'b', 'c', 'd']));
\n
1.0.0 · source

pub fn ends_with<'a, P>(&'a self, pat: P) -> bool
where\n P: Pattern<'a>,\n <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>,

Returns true if the given pattern matches a suffix of this\nstring slice.

\n

Returns false if it does not.

\n

The pattern can be a &str, char, a slice of chars, or a\nfunction or closure that determines if a character matches.

\n
§Examples
\n
let bananas = \"bananas\";\n\nassert!(bananas.ends_with(\"anas\"));\nassert!(!bananas.ends_with(\"nana\"));
\n
1.0.0 · source

pub fn find<'a, P>(&'a self, pat: P) -> Option<usize>
where\n P: Pattern<'a>,

Returns the byte index of the first character of this string slice that\nmatches the pattern.

\n

Returns None if the pattern doesn’t match.

\n

The pattern can be a &str, char, a slice of chars, or a\nfunction or closure that determines if a character matches.

\n
§Examples
\n

Simple patterns:

\n\n
let s = \"Löwe 老虎 Léopard Gepardi\";\n\nassert_eq!(s.find('L'), Some(0));\nassert_eq!(s.find('é'), Some(14));\nassert_eq!(s.find(\"pard\"), Some(17));
\n

More complex patterns using point-free style and closures:

\n\n
let s = \"Löwe 老虎 Léopard\";\n\nassert_eq!(s.find(char::is_whitespace), Some(5));\nassert_eq!(s.find(char::is_lowercase), Some(1));\nassert_eq!(s.find(|c: char| c.is_whitespace() || c.is_lowercase()), Some(1));\nassert_eq!(s.find(|c: char| (c < 'o') && (c > 'a')), Some(4));
\n

Not finding the pattern:

\n\n
let s = \"Löwe 老虎 Léopard\";\nlet x: &[_] = &['1', '2'];\n\nassert_eq!(s.find(x), None);
\n
1.0.0 · source

pub fn rfind<'a, P>(&'a self, pat: P) -> Option<usize>
where\n P: Pattern<'a>,\n <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>,

Returns the byte index for the first character of the last match of the pattern in\nthis string slice.

\n

Returns None if the pattern doesn’t match.

\n

The pattern can be a &str, char, a slice of chars, or a\nfunction or closure that determines if a character matches.

\n
§Examples
\n

Simple patterns:

\n\n
let s = \"Löwe 老虎 Léopard Gepardi\";\n\nassert_eq!(s.rfind('L'), Some(13));\nassert_eq!(s.rfind('é'), Some(14));\nassert_eq!(s.rfind(\"pard\"), Some(24));
\n

More complex patterns with closures:

\n\n
let s = \"Löwe 老虎 Léopard\";\n\nassert_eq!(s.rfind(char::is_whitespace), Some(12));\nassert_eq!(s.rfind(char::is_lowercase), Some(20));
\n

Not finding the pattern:

\n\n
let s = \"Löwe 老虎 Léopard\";\nlet x: &[_] = &['1', '2'];\n\nassert_eq!(s.rfind(x), None);
\n
1.0.0 · source

pub fn split<'a, P>(&'a self, pat: P) -> Split<'a, P>
where\n P: Pattern<'a>,

An iterator over substrings of this string slice, separated by\ncharacters matched by a pattern.

\n

The pattern can be a &str, char, a slice of chars, or a\nfunction or closure that determines if a character matches.

\n
§Iterator behavior
\n

The returned iterator will be a DoubleEndedIterator if the pattern\nallows a reverse search and forward/reverse search yields the same\nelements. This is true for, e.g., char, but not for &str.

\n

If the pattern allows a reverse search but its results might differ\nfrom a forward search, the rsplit method can be used.

\n
§Examples
\n

Simple patterns:

\n\n
let v: Vec<&str> = \"Mary had a little lamb\".split(' ').collect();\nassert_eq!(v, [\"Mary\", \"had\", \"a\", \"little\", \"lamb\"]);\n\nlet v: Vec<&str> = \"\".split('X').collect();\nassert_eq!(v, [\"\"]);\n\nlet v: Vec<&str> = \"lionXXtigerXleopard\".split('X').collect();\nassert_eq!(v, [\"lion\", \"\", \"tiger\", \"leopard\"]);\n\nlet v: Vec<&str> = \"lion::tiger::leopard\".split(\"::\").collect();\nassert_eq!(v, [\"lion\", \"tiger\", \"leopard\"]);\n\nlet v: Vec<&str> = \"abc1def2ghi\".split(char::is_numeric).collect();\nassert_eq!(v, [\"abc\", \"def\", \"ghi\"]);\n\nlet v: Vec<&str> = \"lionXtigerXleopard\".split(char::is_uppercase).collect();\nassert_eq!(v, [\"lion\", \"tiger\", \"leopard\"]);
\n

If the pattern is a slice of chars, split on each occurrence of any of the characters:

\n\n
let v: Vec<&str> = \"2020-11-03 23:59\".split(&['-', ' ', ':', '@'][..]).collect();\nassert_eq!(v, [\"2020\", \"11\", \"03\", \"23\", \"59\"]);
\n

A more complex pattern, using a closure:

\n\n
let v: Vec<&str> = \"abc1defXghi\".split(|c| c == '1' || c == 'X').collect();\nassert_eq!(v, [\"abc\", \"def\", \"ghi\"]);
\n

If a string contains multiple contiguous separators, you will end up\nwith empty strings in the output:

\n\n
let x = \"||||a||b|c\".to_string();\nlet d: Vec<_> = x.split('|').collect();\n\nassert_eq!(d, &[\"\", \"\", \"\", \"\", \"a\", \"\", \"b\", \"c\"]);
\n

Contiguous separators are separated by the empty string.

\n\n
let x = \"(///)\".to_string();\nlet d: Vec<_> = x.split('/').collect();\n\nassert_eq!(d, &[\"(\", \"\", \"\", \")\"]);
\n

Separators at the start or end of a string are neighbored\nby empty strings.

\n\n
let d: Vec<_> = \"010\".split(\"0\").collect();\nassert_eq!(d, &[\"\", \"1\", \"\"]);
\n

When the empty string is used as a separator, it separates\nevery character in the string, along with the beginning\nand end of the string.

\n\n
let f: Vec<_> = \"rust\".split(\"\").collect();\nassert_eq!(f, &[\"\", \"r\", \"u\", \"s\", \"t\", \"\"]);
\n

Contiguous separators can lead to possibly surprising behavior\nwhen whitespace is used as the separator. This code is correct:

\n\n
let x = \"    a  b c\".to_string();\nlet d: Vec<_> = x.split(' ').collect();\n\nassert_eq!(d, &[\"\", \"\", \"\", \"\", \"a\", \"\", \"b\", \"c\"]);
\n

It does not give you:

\n\n
assert_eq!(d, &[\"a\", \"b\", \"c\"]);
\n

Use split_whitespace for this behavior.

\n
1.51.0 · source

pub fn split_inclusive<'a, P>(&'a self, pat: P) -> SplitInclusive<'a, P>
where\n P: Pattern<'a>,

An iterator over substrings of this string slice, separated by\ncharacters matched by a pattern. Differs from the iterator produced by\nsplit in that split_inclusive leaves the matched part as the\nterminator of the substring.

\n

The pattern can be a &str, char, a slice of chars, or a\nfunction or closure that determines if a character matches.

\n
§Examples
\n
let v: Vec<&str> = \"Mary had a little lamb\\nlittle lamb\\nlittle lamb.\"\n    .split_inclusive('\\n').collect();\nassert_eq!(v, [\"Mary had a little lamb\\n\", \"little lamb\\n\", \"little lamb.\"]);
\n

If the last element of the string is matched,\nthat element will be considered the terminator of the preceding substring.\nThat substring will be the last item returned by the iterator.

\n\n
let v: Vec<&str> = \"Mary had a little lamb\\nlittle lamb\\nlittle lamb.\\n\"\n    .split_inclusive('\\n').collect();\nassert_eq!(v, [\"Mary had a little lamb\\n\", \"little lamb\\n\", \"little lamb.\\n\"]);
\n
1.0.0 · source

pub fn rsplit<'a, P>(&'a self, pat: P) -> RSplit<'a, P>
where\n P: Pattern<'a>,\n <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>,

An iterator over substrings of the given string slice, separated by\ncharacters matched by a pattern and yielded in reverse order.

\n

The pattern can be a &str, char, a slice of chars, or a\nfunction or closure that determines if a character matches.

\n
§Iterator behavior
\n

The returned iterator requires that the pattern supports a reverse\nsearch, and it will be a DoubleEndedIterator if a forward/reverse\nsearch yields the same elements.

\n

For iterating from the front, the split method can be used.

\n
§Examples
\n

Simple patterns:

\n\n
let v: Vec<&str> = \"Mary had a little lamb\".rsplit(' ').collect();\nassert_eq!(v, [\"lamb\", \"little\", \"a\", \"had\", \"Mary\"]);\n\nlet v: Vec<&str> = \"\".rsplit('X').collect();\nassert_eq!(v, [\"\"]);\n\nlet v: Vec<&str> = \"lionXXtigerXleopard\".rsplit('X').collect();\nassert_eq!(v, [\"leopard\", \"tiger\", \"\", \"lion\"]);\n\nlet v: Vec<&str> = \"lion::tiger::leopard\".rsplit(\"::\").collect();\nassert_eq!(v, [\"leopard\", \"tiger\", \"lion\"]);
\n

A more complex pattern, using a closure:

\n\n
let v: Vec<&str> = \"abc1defXghi\".rsplit(|c| c == '1' || c == 'X').collect();\nassert_eq!(v, [\"ghi\", \"def\", \"abc\"]);
\n
1.0.0 · source

pub fn split_terminator<'a, P>(&'a self, pat: P) -> SplitTerminator<'a, P>
where\n P: Pattern<'a>,

An iterator over substrings of the given string slice, separated by\ncharacters matched by a pattern.

\n

The pattern can be a &str, char, a slice of chars, or a\nfunction or closure that determines if a character matches.

\n

Equivalent to split, except that the trailing substring\nis skipped if empty.

\n

This method can be used for string data that is terminated,\nrather than separated by a pattern.

\n
§Iterator behavior
\n

The returned iterator will be a DoubleEndedIterator if the pattern\nallows a reverse search and forward/reverse search yields the same\nelements. This is true for, e.g., char, but not for &str.

\n

If the pattern allows a reverse search but its results might differ\nfrom a forward search, the rsplit_terminator method can be used.

\n
§Examples
\n
let v: Vec<&str> = \"A.B.\".split_terminator('.').collect();\nassert_eq!(v, [\"A\", \"B\"]);\n\nlet v: Vec<&str> = \"A..B..\".split_terminator(\".\").collect();\nassert_eq!(v, [\"A\", \"\", \"B\", \"\"]);\n\nlet v: Vec<&str> = \"A.B:C.D\".split_terminator(&['.', ':'][..]).collect();\nassert_eq!(v, [\"A\", \"B\", \"C\", \"D\"]);
\n
1.0.0 · source

pub fn rsplit_terminator<'a, P>(&'a self, pat: P) -> RSplitTerminator<'a, P>
where\n P: Pattern<'a>,\n <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>,

An iterator over substrings of self, separated by characters\nmatched by a pattern and yielded in reverse order.

\n

The pattern can be a &str, char, a slice of chars, or a\nfunction or closure that determines if a character matches.

\n

Equivalent to split, except that the trailing substring is\nskipped if empty.

\n

This method can be used for string data that is terminated,\nrather than separated by a pattern.

\n
§Iterator behavior
\n

The returned iterator requires that the pattern supports a\nreverse search, and it will be double ended if a forward/reverse\nsearch yields the same elements.

\n

For iterating from the front, the split_terminator method can be\nused.

\n
§Examples
\n
let v: Vec<&str> = \"A.B.\".rsplit_terminator('.').collect();\nassert_eq!(v, [\"B\", \"A\"]);\n\nlet v: Vec<&str> = \"A..B..\".rsplit_terminator(\".\").collect();\nassert_eq!(v, [\"\", \"B\", \"\", \"A\"]);\n\nlet v: Vec<&str> = \"A.B:C.D\".rsplit_terminator(&['.', ':'][..]).collect();\nassert_eq!(v, [\"D\", \"C\", \"B\", \"A\"]);
\n
1.0.0 · source

pub fn splitn<'a, P>(&'a self, n: usize, pat: P) -> SplitN<'a, P>
where\n P: Pattern<'a>,

An iterator over substrings of the given string slice, separated by a\npattern, restricted to returning at most n items.

\n

If n substrings are returned, the last substring (the nth substring)\nwill contain the remainder of the string.

\n

The pattern can be a &str, char, a slice of chars, or a\nfunction or closure that determines if a character matches.

\n
§Iterator behavior
\n

The returned iterator will not be double ended, because it is\nnot efficient to support.

\n

If the pattern allows a reverse search, the rsplitn method can be\nused.

\n
§Examples
\n

Simple patterns:

\n\n
let v: Vec<&str> = \"Mary had a little lambda\".splitn(3, ' ').collect();\nassert_eq!(v, [\"Mary\", \"had\", \"a little lambda\"]);\n\nlet v: Vec<&str> = \"lionXXtigerXleopard\".splitn(3, \"X\").collect();\nassert_eq!(v, [\"lion\", \"\", \"tigerXleopard\"]);\n\nlet v: Vec<&str> = \"abcXdef\".splitn(1, 'X').collect();\nassert_eq!(v, [\"abcXdef\"]);\n\nlet v: Vec<&str> = \"\".splitn(1, 'X').collect();\nassert_eq!(v, [\"\"]);
\n

A more complex pattern, using a closure:

\n\n
let v: Vec<&str> = \"abc1defXghi\".splitn(2, |c| c == '1' || c == 'X').collect();\nassert_eq!(v, [\"abc\", \"defXghi\"]);
\n
1.0.0 · source

pub fn rsplitn<'a, P>(&'a self, n: usize, pat: P) -> RSplitN<'a, P>
where\n P: Pattern<'a>,\n <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>,

An iterator over substrings of this string slice, separated by a\npattern, starting from the end of the string, restricted to returning\nat most n items.

\n

If n substrings are returned, the last substring (the nth substring)\nwill contain the remainder of the string.

\n

The pattern can be a &str, char, a slice of chars, or a\nfunction or closure that determines if a character matches.

\n
§Iterator behavior
\n

The returned iterator will not be double ended, because it is not\nefficient to support.

\n

For splitting from the front, the splitn method can be used.

\n
§Examples
\n

Simple patterns:

\n\n
let v: Vec<&str> = \"Mary had a little lamb\".rsplitn(3, ' ').collect();\nassert_eq!(v, [\"lamb\", \"little\", \"Mary had a\"]);\n\nlet v: Vec<&str> = \"lionXXtigerXleopard\".rsplitn(3, 'X').collect();\nassert_eq!(v, [\"leopard\", \"tiger\", \"lionX\"]);\n\nlet v: Vec<&str> = \"lion::tiger::leopard\".rsplitn(2, \"::\").collect();\nassert_eq!(v, [\"leopard\", \"lion::tiger\"]);
\n

A more complex pattern, using a closure:

\n\n
let v: Vec<&str> = \"abc1defXghi\".rsplitn(2, |c| c == '1' || c == 'X').collect();\nassert_eq!(v, [\"ghi\", \"abc1def\"]);
\n
1.52.0 · source

pub fn split_once<'a, P>(&'a self, delimiter: P) -> Option<(&'a str, &'a str)>
where\n P: Pattern<'a>,

Splits the string on the first occurrence of the specified delimiter and\nreturns prefix before delimiter and suffix after delimiter.

\n
§Examples
\n
assert_eq!(\"cfg\".split_once('='), None);\nassert_eq!(\"cfg=\".split_once('='), Some((\"cfg\", \"\")));\nassert_eq!(\"cfg=foo\".split_once('='), Some((\"cfg\", \"foo\")));\nassert_eq!(\"cfg=foo=bar\".split_once('='), Some((\"cfg\", \"foo=bar\")));
\n
1.52.0 · source

pub fn rsplit_once<'a, P>(&'a self, delimiter: P) -> Option<(&'a str, &'a str)>
where\n P: Pattern<'a>,\n <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>,

Splits the string on the last occurrence of the specified delimiter and\nreturns prefix before delimiter and suffix after delimiter.

\n
§Examples
\n
assert_eq!(\"cfg\".rsplit_once('='), None);\nassert_eq!(\"cfg=foo\".rsplit_once('='), Some((\"cfg\", \"foo\")));\nassert_eq!(\"cfg=foo=bar\".rsplit_once('='), Some((\"cfg=foo\", \"bar\")));
\n
1.2.0 · source

pub fn matches<'a, P>(&'a self, pat: P) -> Matches<'a, P>
where\n P: Pattern<'a>,

An iterator over the disjoint matches of a pattern within the given string\nslice.

\n

The pattern can be a &str, char, a slice of chars, or a\nfunction or closure that determines if a character matches.

\n
§Iterator behavior
\n

The returned iterator will be a DoubleEndedIterator if the pattern\nallows a reverse search and forward/reverse search yields the same\nelements. This is true for, e.g., char, but not for &str.

\n

If the pattern allows a reverse search but its results might differ\nfrom a forward search, the rmatches method can be used.

\n
§Examples
\n
let v: Vec<&str> = \"abcXXXabcYYYabc\".matches(\"abc\").collect();\nassert_eq!(v, [\"abc\", \"abc\", \"abc\"]);\n\nlet v: Vec<&str> = \"1abc2abc3\".matches(char::is_numeric).collect();\nassert_eq!(v, [\"1\", \"2\", \"3\"]);
\n
1.2.0 · source

pub fn rmatches<'a, P>(&'a self, pat: P) -> RMatches<'a, P>
where\n P: Pattern<'a>,\n <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>,

An iterator over the disjoint matches of a pattern within this string slice,\nyielded in reverse order.

\n

The pattern can be a &str, char, a slice of chars, or a\nfunction or closure that determines if a character matches.

\n
§Iterator behavior
\n

The returned iterator requires that the pattern supports a reverse\nsearch, and it will be a DoubleEndedIterator if a forward/reverse\nsearch yields the same elements.

\n

For iterating from the front, the matches method can be used.

\n
§Examples
\n
let v: Vec<&str> = \"abcXXXabcYYYabc\".rmatches(\"abc\").collect();\nassert_eq!(v, [\"abc\", \"abc\", \"abc\"]);\n\nlet v: Vec<&str> = \"1abc2abc3\".rmatches(char::is_numeric).collect();\nassert_eq!(v, [\"3\", \"2\", \"1\"]);
\n
1.5.0 · source

pub fn match_indices<'a, P>(&'a self, pat: P) -> MatchIndices<'a, P>
where\n P: Pattern<'a>,

An iterator over the disjoint matches of a pattern within this string\nslice as well as the index that the match starts at.

\n

For matches of pat within self that overlap, only the indices\ncorresponding to the first match are returned.

\n

The pattern can be a &str, char, a slice of chars, or a\nfunction or closure that determines if a character matches.

\n
§Iterator behavior
\n

The returned iterator will be a DoubleEndedIterator if the pattern\nallows a reverse search and forward/reverse search yields the same\nelements. This is true for, e.g., char, but not for &str.

\n

If the pattern allows a reverse search but its results might differ\nfrom a forward search, the rmatch_indices method can be used.

\n
§Examples
\n
let v: Vec<_> = \"abcXXXabcYYYabc\".match_indices(\"abc\").collect();\nassert_eq!(v, [(0, \"abc\"), (6, \"abc\"), (12, \"abc\")]);\n\nlet v: Vec<_> = \"1abcabc2\".match_indices(\"abc\").collect();\nassert_eq!(v, [(1, \"abc\"), (4, \"abc\")]);\n\nlet v: Vec<_> = \"ababa\".match_indices(\"aba\").collect();\nassert_eq!(v, [(0, \"aba\")]); // only the first `aba`
\n
1.5.0 · source

pub fn rmatch_indices<'a, P>(&'a self, pat: P) -> RMatchIndices<'a, P>
where\n P: Pattern<'a>,\n <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>,

An iterator over the disjoint matches of a pattern within self,\nyielded in reverse order along with the index of the match.

\n

For matches of pat within self that overlap, only the indices\ncorresponding to the last match are returned.

\n

The pattern can be a &str, char, a slice of chars, or a\nfunction or closure that determines if a character matches.

\n
§Iterator behavior
\n

The returned iterator requires that the pattern supports a reverse\nsearch, and it will be a DoubleEndedIterator if a forward/reverse\nsearch yields the same elements.

\n

For iterating from the front, the match_indices method can be used.

\n
§Examples
\n
let v: Vec<_> = \"abcXXXabcYYYabc\".rmatch_indices(\"abc\").collect();\nassert_eq!(v, [(12, \"abc\"), (6, \"abc\"), (0, \"abc\")]);\n\nlet v: Vec<_> = \"1abcabc2\".rmatch_indices(\"abc\").collect();\nassert_eq!(v, [(4, \"abc\"), (1, \"abc\")]);\n\nlet v: Vec<_> = \"ababa\".rmatch_indices(\"aba\").collect();\nassert_eq!(v, [(2, \"aba\")]); // only the last `aba`
\n
1.0.0 · source

pub fn trim(&self) -> &str

Returns a string slice with leading and trailing whitespace removed.

\n

‘Whitespace’ is defined according to the terms of the Unicode Derived\nCore Property White_Space, which includes newlines.

\n
§Examples
\n
let s = \"\\n Hello\\tworld\\t\\n\";\n\nassert_eq!(\"Hello\\tworld\", s.trim());
\n
1.30.0 · source

pub fn trim_start(&self) -> &str

Returns a string slice with leading whitespace removed.

\n

‘Whitespace’ is defined according to the terms of the Unicode Derived\nCore Property White_Space, which includes newlines.

\n
§Text directionality
\n

A string is a sequence of bytes. start in this context means the first\nposition of that byte string; for a left-to-right language like English or\nRussian, this will be left side, and for right-to-left languages like\nArabic or Hebrew, this will be the right side.

\n
§Examples
\n

Basic usage:

\n\n
let s = \"\\n Hello\\tworld\\t\\n\";\nassert_eq!(\"Hello\\tworld\\t\\n\", s.trim_start());
\n

Directionality:

\n\n
let s = \"  English  \";\nassert!(Some('E') == s.trim_start().chars().next());\n\nlet s = \"  עברית  \";\nassert!(Some('ע') == s.trim_start().chars().next());
\n
1.30.0 · source

pub fn trim_end(&self) -> &str

Returns a string slice with trailing whitespace removed.

\n

‘Whitespace’ is defined according to the terms of the Unicode Derived\nCore Property White_Space, which includes newlines.

\n
§Text directionality
\n

A string is a sequence of bytes. end in this context means the last\nposition of that byte string; for a left-to-right language like English or\nRussian, this will be right side, and for right-to-left languages like\nArabic or Hebrew, this will be the left side.

\n
§Examples
\n

Basic usage:

\n\n
let s = \"\\n Hello\\tworld\\t\\n\";\nassert_eq!(\"\\n Hello\\tworld\", s.trim_end());
\n

Directionality:

\n\n
let s = \"  English  \";\nassert!(Some('h') == s.trim_end().chars().rev().next());\n\nlet s = \"  עברית  \";\nassert!(Some('ת') == s.trim_end().chars().rev().next());
\n
1.0.0 · source

pub fn trim_left(&self) -> &str

👎Deprecated since 1.33.0: superseded by trim_start

Returns a string slice with leading whitespace removed.

\n

‘Whitespace’ is defined according to the terms of the Unicode Derived\nCore Property White_Space.

\n
§Text directionality
\n

A string is a sequence of bytes. ‘Left’ in this context means the first\nposition of that byte string; for a language like Arabic or Hebrew\nwhich are ‘right to left’ rather than ‘left to right’, this will be\nthe right side, not the left.

\n
§Examples
\n

Basic usage:

\n\n
let s = \" Hello\\tworld\\t\";\n\nassert_eq!(\"Hello\\tworld\\t\", s.trim_left());
\n

Directionality:

\n\n
let s = \"  English\";\nassert!(Some('E') == s.trim_left().chars().next());\n\nlet s = \"  עברית\";\nassert!(Some('ע') == s.trim_left().chars().next());
\n
1.0.0 · source

pub fn trim_right(&self) -> &str

👎Deprecated since 1.33.0: superseded by trim_end

Returns a string slice with trailing whitespace removed.

\n

‘Whitespace’ is defined according to the terms of the Unicode Derived\nCore Property White_Space.

\n
§Text directionality
\n

A string is a sequence of bytes. ‘Right’ in this context means the last\nposition of that byte string; for a language like Arabic or Hebrew\nwhich are ‘right to left’ rather than ‘left to right’, this will be\nthe left side, not the right.

\n
§Examples
\n

Basic usage:

\n\n
let s = \" Hello\\tworld\\t\";\n\nassert_eq!(\" Hello\\tworld\", s.trim_right());
\n

Directionality:

\n\n
let s = \"English  \";\nassert!(Some('h') == s.trim_right().chars().rev().next());\n\nlet s = \"עברית  \";\nassert!(Some('ת') == s.trim_right().chars().rev().next());
\n
1.0.0 · source

pub fn trim_matches<'a, P>(&'a self, pat: P) -> &'a str
where\n P: Pattern<'a>,\n <P as Pattern<'a>>::Searcher: DoubleEndedSearcher<'a>,

Returns a string slice with all prefixes and suffixes that match a\npattern repeatedly removed.

\n

The pattern can be a char, a slice of chars, or a function\nor closure that determines if a character matches.

\n
§Examples
\n

Simple patterns:

\n\n
assert_eq!(\"11foo1bar11\".trim_matches('1'), \"foo1bar\");\nassert_eq!(\"123foo1bar123\".trim_matches(char::is_numeric), \"foo1bar\");\n\nlet x: &[_] = &['1', '2'];\nassert_eq!(\"12foo1bar12\".trim_matches(x), \"foo1bar\");
\n

A more complex pattern, using a closure:

\n\n
assert_eq!(\"1foo1barXX\".trim_matches(|c| c == '1' || c == 'X'), \"foo1bar\");
\n
1.30.0 · source

pub fn trim_start_matches<'a, P>(&'a self, pat: P) -> &'a str
where\n P: Pattern<'a>,

Returns a string slice with all prefixes that match a pattern\nrepeatedly removed.

\n

The pattern can be a &str, char, a slice of chars, or a\nfunction or closure that determines if a character matches.

\n
§Text directionality
\n

A string is a sequence of bytes. start in this context means the first\nposition of that byte string; for a left-to-right language like English or\nRussian, this will be left side, and for right-to-left languages like\nArabic or Hebrew, this will be the right side.

\n
§Examples
\n
assert_eq!(\"11foo1bar11\".trim_start_matches('1'), \"foo1bar11\");\nassert_eq!(\"123foo1bar123\".trim_start_matches(char::is_numeric), \"foo1bar123\");\n\nlet x: &[_] = &['1', '2'];\nassert_eq!(\"12foo1bar12\".trim_start_matches(x), \"foo1bar12\");
\n
1.45.0 · source

pub fn strip_prefix<'a, P>(&'a self, prefix: P) -> Option<&'a str>
where\n P: Pattern<'a>,

Returns a string slice with the prefix removed.

\n

If the string starts with the pattern prefix, returns the substring after the prefix,\nwrapped in Some. Unlike trim_start_matches, this method removes the prefix exactly once.

\n

If the string does not start with prefix, returns None.

\n

The pattern can be a &str, char, a slice of chars, or a\nfunction or closure that determines if a character matches.

\n
§Examples
\n
assert_eq!(\"foo:bar\".strip_prefix(\"foo:\"), Some(\"bar\"));\nassert_eq!(\"foo:bar\".strip_prefix(\"bar\"), None);\nassert_eq!(\"foofoo\".strip_prefix(\"foo\"), Some(\"foo\"));
\n
1.45.0 · source

pub fn strip_suffix<'a, P>(&'a self, suffix: P) -> Option<&'a str>
where\n P: Pattern<'a>,\n <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>,

Returns a string slice with the suffix removed.

\n

If the string ends with the pattern suffix, returns the substring before the suffix,\nwrapped in Some. Unlike trim_end_matches, this method removes the suffix exactly once.

\n

If the string does not end with suffix, returns None.

\n

The pattern can be a &str, char, a slice of chars, or a\nfunction or closure that determines if a character matches.

\n
§Examples
\n
assert_eq!(\"bar:foo\".strip_suffix(\":foo\"), Some(\"bar\"));\nassert_eq!(\"bar:foo\".strip_suffix(\"bar\"), None);\nassert_eq!(\"foofoo\".strip_suffix(\"foo\"), Some(\"foo\"));
\n
1.30.0 · source

pub fn trim_end_matches<'a, P>(&'a self, pat: P) -> &'a str
where\n P: Pattern<'a>,\n <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>,

Returns a string slice with all suffixes that match a pattern\nrepeatedly removed.

\n

The pattern can be a &str, char, a slice of chars, or a\nfunction or closure that determines if a character matches.

\n
§Text directionality
\n

A string is a sequence of bytes. end in this context means the last\nposition of that byte string; for a left-to-right language like English or\nRussian, this will be right side, and for right-to-left languages like\nArabic or Hebrew, this will be the left side.

\n
§Examples
\n

Simple patterns:

\n\n
assert_eq!(\"11foo1bar11\".trim_end_matches('1'), \"11foo1bar\");\nassert_eq!(\"123foo1bar123\".trim_end_matches(char::is_numeric), \"123foo1bar\");\n\nlet x: &[_] = &['1', '2'];\nassert_eq!(\"12foo1bar12\".trim_end_matches(x), \"12foo1bar\");
\n

A more complex pattern, using a closure:

\n\n
assert_eq!(\"1fooX\".trim_end_matches(|c| c == '1' || c == 'X'), \"1foo\");
\n
1.0.0 · source

pub fn trim_left_matches<'a, P>(&'a self, pat: P) -> &'a str
where\n P: Pattern<'a>,

👎Deprecated since 1.33.0: superseded by trim_start_matches

Returns a string slice with all prefixes that match a pattern\nrepeatedly removed.

\n

The pattern can be a &str, char, a slice of chars, or a\nfunction or closure that determines if a character matches.

\n
§Text directionality
\n

A string is a sequence of bytes. ‘Left’ in this context means the first\nposition of that byte string; for a language like Arabic or Hebrew\nwhich are ‘right to left’ rather than ‘left to right’, this will be\nthe right side, not the left.

\n
§Examples
\n
assert_eq!(\"11foo1bar11\".trim_left_matches('1'), \"foo1bar11\");\nassert_eq!(\"123foo1bar123\".trim_left_matches(char::is_numeric), \"foo1bar123\");\n\nlet x: &[_] = &['1', '2'];\nassert_eq!(\"12foo1bar12\".trim_left_matches(x), \"foo1bar12\");
\n
1.0.0 · source

pub fn trim_right_matches<'a, P>(&'a self, pat: P) -> &'a str
where\n P: Pattern<'a>,\n <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>,

👎Deprecated since 1.33.0: superseded by trim_end_matches

Returns a string slice with all suffixes that match a pattern\nrepeatedly removed.

\n

The pattern can be a &str, char, a slice of chars, or a\nfunction or closure that determines if a character matches.

\n
§Text directionality
\n

A string is a sequence of bytes. ‘Right’ in this context means the last\nposition of that byte string; for a language like Arabic or Hebrew\nwhich are ‘right to left’ rather than ‘left to right’, this will be\nthe left side, not the right.

\n
§Examples
\n

Simple patterns:

\n\n
assert_eq!(\"11foo1bar11\".trim_right_matches('1'), \"11foo1bar\");\nassert_eq!(\"123foo1bar123\".trim_right_matches(char::is_numeric), \"123foo1bar\");\n\nlet x: &[_] = &['1', '2'];\nassert_eq!(\"12foo1bar12\".trim_right_matches(x), \"12foo1bar\");
\n

A more complex pattern, using a closure:

\n\n
assert_eq!(\"1fooX\".trim_right_matches(|c| c == '1' || c == 'X'), \"1foo\");
\n
1.0.0 · source

pub fn parse<F>(&self) -> Result<F, <F as FromStr>::Err>
where\n F: FromStr,

Parses this string slice into another type.

\n

Because parse is so general, it can cause problems with type\ninference. As such, parse is one of the few times you’ll see\nthe syntax affectionately known as the ‘turbofish’: ::<>. This\nhelps the inference algorithm understand specifically which type\nyou’re trying to parse into.

\n

parse can parse into any type that implements the FromStr trait.

\n
§Errors
\n

Will return Err if it’s not possible to parse this string slice into\nthe desired type.

\n
§Examples
\n

Basic usage

\n\n
let four: u32 = \"4\".parse().unwrap();\n\nassert_eq!(4, four);
\n

Using the ‘turbofish’ instead of annotating four:

\n\n
let four = \"4\".parse::<u32>();\n\nassert_eq!(Ok(4), four);
\n

Failing to parse:

\n\n
let nope = \"j\".parse::<u32>();\n\nassert!(nope.is_err());
\n
1.23.0 (const: 1.74.0) · source

pub const fn is_ascii(&self) -> bool

Checks if all characters in this string are within the ASCII range.

\n
§Examples
\n
let ascii = \"hello!\\n\";\nlet non_ascii = \"Grüße, Jürgen ❤\";\n\nassert!(ascii.is_ascii());\nassert!(!non_ascii.is_ascii());
\n
source

pub const fn as_ascii(&self) -> Option<&[AsciiChar]>

🔬This is a nightly-only experimental API. (ascii_char)

If this string slice is_ascii, returns it as a slice\nof ASCII characters, otherwise returns None.

\n
1.23.0 · source

pub fn eq_ignore_ascii_case(&self, other: &str) -> bool

Checks that two strings are an ASCII case-insensitive match.

\n

Same as to_ascii_lowercase(a) == to_ascii_lowercase(b),\nbut without allocating and copying temporaries.

\n
§Examples
\n
assert!(\"Ferris\".eq_ignore_ascii_case(\"FERRIS\"));\nassert!(\"Ferrös\".eq_ignore_ascii_case(\"FERRöS\"));\nassert!(!\"Ferrös\".eq_ignore_ascii_case(\"FERRÖS\"));
\n
1.23.0 · source

pub fn make_ascii_uppercase(&mut self)

Converts this string to its ASCII upper case equivalent in-place.

\n

ASCII letters ‘a’ to ‘z’ are mapped to ‘A’ to ‘Z’,\nbut non-ASCII letters are unchanged.

\n

To return a new uppercased value without modifying the existing one, use\nto_ascii_uppercase().

\n
§Examples
\n
let mut s = String::from(\"Grüße, Jürgen ❤\");\n\ns.make_ascii_uppercase();\n\nassert_eq!(\"GRüßE, JüRGEN ❤\", s);
\n
1.23.0 · source

pub fn make_ascii_lowercase(&mut self)

Converts this string to its ASCII lower case equivalent in-place.

\n

ASCII letters ‘A’ to ‘Z’ are mapped to ‘a’ to ‘z’,\nbut non-ASCII letters are unchanged.

\n

To return a new lowercased value without modifying the existing one, use\nto_ascii_lowercase().

\n
§Examples
\n
let mut s = String::from(\"GRÜßE, JÜRGEN ❤\");\n\ns.make_ascii_lowercase();\n\nassert_eq!(\"grÜße, jÜrgen ❤\", s);
\n
1.80.0 (const: 1.80.0) · source

pub const fn trim_ascii_start(&self) -> &str

Returns a string slice with leading ASCII whitespace removed.

\n

‘Whitespace’ refers to the definition used by\nu8::is_ascii_whitespace.

\n
§Examples
\n
assert_eq!(\" \\t \\u{3000}hello world\\n\".trim_ascii_start(), \"\\u{3000}hello world\\n\");\nassert_eq!(\"  \".trim_ascii_start(), \"\");\nassert_eq!(\"\".trim_ascii_start(), \"\");
\n
1.80.0 (const: 1.80.0) · source

pub const fn trim_ascii_end(&self) -> &str

Returns a string slice with trailing ASCII whitespace removed.

\n

‘Whitespace’ refers to the definition used by\nu8::is_ascii_whitespace.

\n
§Examples
\n
assert_eq!(\"\\r hello world\\u{3000}\\n \".trim_ascii_end(), \"\\r hello world\\u{3000}\");\nassert_eq!(\"  \".trim_ascii_end(), \"\");\nassert_eq!(\"\".trim_ascii_end(), \"\");
\n
1.80.0 (const: 1.80.0) · source

pub const fn trim_ascii(&self) -> &str

Returns a string slice with leading and trailing ASCII whitespace\nremoved.

\n

‘Whitespace’ refers to the definition used by\nu8::is_ascii_whitespace.

\n
§Examples
\n
assert_eq!(\"\\r hello world\\n \".trim_ascii(), \"hello world\");\nassert_eq!(\"  \".trim_ascii(), \"\");\nassert_eq!(\"\".trim_ascii(), \"\");
\n
1.34.0 · source

pub fn escape_debug(&self) -> EscapeDebug<'_>

Return an iterator that escapes each char in self with char::escape_debug.

\n

Note: only extended grapheme codepoints that begin the string will be\nescaped.

\n
§Examples
\n

As an iterator:

\n\n
for c in \"❤\\n!\".escape_debug() {\n    print!(\"{c}\");\n}\nprintln!();
\n

Using println! directly:

\n\n
println!(\"{}\", \"❤\\n!\".escape_debug());
\n

Both are equivalent to:

\n\n
println!(\"❤\\\\n!\");
\n

Using to_string:

\n\n
assert_eq!(\"❤\\n!\".escape_debug().to_string(), \"❤\\\\n!\");
\n
1.34.0 · source

pub fn escape_default(&self) -> EscapeDefault<'_>

Return an iterator that escapes each char in self with char::escape_default.

\n
§Examples
\n

As an iterator:

\n\n
for c in \"❤\\n!\".escape_default() {\n    print!(\"{c}\");\n}\nprintln!();
\n

Using println! directly:

\n\n
println!(\"{}\", \"❤\\n!\".escape_default());
\n

Both are equivalent to:

\n\n
println!(\"\\\\u{{2764}}\\\\n!\");
\n

Using to_string:

\n\n
assert_eq!(\"❤\\n!\".escape_default().to_string(), \"\\\\u{2764}\\\\n!\");
\n
1.34.0 · source

pub fn escape_unicode(&self) -> EscapeUnicode<'_>

Return an iterator that escapes each char in self with char::escape_unicode.

\n
§Examples
\n

As an iterator:

\n\n
for c in \"❤\\n!\".escape_unicode() {\n    print!(\"{c}\");\n}\nprintln!();
\n

Using println! directly:

\n\n
println!(\"{}\", \"❤\\n!\".escape_unicode());
\n

Both are equivalent to:

\n\n
println!(\"\\\\u{{2764}}\\\\u{{a}}\\\\u{{21}}\");
\n

Using to_string:

\n\n
assert_eq!(\"❤\\n!\".escape_unicode().to_string(), \"\\\\u{2764}\\\\u{a}\\\\u{21}\");
\n
",0,"air_interpreter_cid::CidRef"],["
source§

impl ConstParamTy for str

","ConstParamTy","air_interpreter_cid::CidRef"],["
1.0.0 · source§

impl Eq for str

","Eq","air_interpreter_cid::CidRef"],["
source§

impl Index for str

","Index","air_interpreter_cid::CidRef"],["
source§

impl StructuralPartialEq for str

","StructuralPartialEq","air_interpreter_cid::CidRef"]] +};if (window.register_type_impls) {window.register_type_impls(type_impls);} else {window.pending_type_impls = type_impls;}})() \ No newline at end of file diff --git a/type.impl/std/primitive.u32.js b/type.impl/std/primitive.u32.js new file mode 100644 index 00000000..9640abd0 --- /dev/null +++ b/type.impl/std/primitive.u32.js @@ -0,0 +1,6 @@ +(function() {var type_impls = { +"air":[], +"air_interpreter_data":[], +"air_interpreter_sede":[], +"air_test_utils":[] +};if (window.register_type_impls) {window.register_type_impls(type_impls);} else {window.pending_type_impls = type_impls;}})() \ No newline at end of file