diff --git a/src/Elastic.Clients.Elasticsearch/Common/ElasticsearchClientProductRegistration.cs b/src/Elastic.Clients.Elasticsearch/Common/ElasticsearchClientProductRegistration.cs
index 8008c36bf01..892863d09d2 100644
--- a/src/Elastic.Clients.Elasticsearch/Common/ElasticsearchClientProductRegistration.cs
+++ b/src/Elastic.Clients.Elasticsearch/Common/ElasticsearchClientProductRegistration.cs
@@ -3,6 +3,7 @@
// See the LICENSE file in the project root for more information.
using System;
+using System.Diagnostics.CodeAnalysis;
using Elastic.Transport;
using Elastic.Transport.Products.Elasticsearch;
@@ -28,7 +29,7 @@ public override bool HttpStatusCodeClassifier(HttpMethod method, int statusCode)
/// Makes the low level transport aware of Elastic.Clients.Elasticsearch's
/// so that it can peek in to its exposed error when reporting failures.
///
- public override bool TryGetServerErrorReason(TResponse response, out string? reason)
+ public override bool TryGetServerErrorReason(TResponse response, [NotNullWhen(returnValue: true)] out string? reason)
{
if (response is not ElasticsearchResponseBase r)
return base.TryGetServerErrorReason(response, out reason);
diff --git a/src/Elastic.Clients.Elasticsearch/CrossPlatform/NullableAttributes.cs b/src/Elastic.Clients.Elasticsearch/CrossPlatform/NullableAttributes.cs
new file mode 100644
index 00000000000..99e09498c04
--- /dev/null
+++ b/src/Elastic.Clients.Elasticsearch/CrossPlatform/NullableAttributes.cs
@@ -0,0 +1,143 @@
+// Licensed to Elasticsearch B.V under one or more agreements.
+// Elasticsearch B.V licenses this file to you under the Apache 2.0 License.
+// See the LICENSE file in the project root for more information.
+
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License.
+
+#define INTERNAL_NULLABLE_ATTRIBUTES
+
+#pragma warning disable SA1402 // File may only contain a single type
+#pragma warning disable SA1649 // File name should match first type name
+
+#if !NETCOREAPP3_1_OR_GREATER && !NETSTANDARD2_1_OR_GREATER || NET461
+namespace System.Diagnostics.CodeAnalysis
+{
+ /// Specifies that null is allowed as an input even if the corresponding type disallows it.
+ [AttributeUsage(AttributeTargets.Field | AttributeTargets.Parameter | AttributeTargets.Property, Inherited = false)]
+#if INTERNAL_NULLABLE_ATTRIBUTES
+ internal
+#else
+ public
+#endif
+ sealed class AllowNullAttribute : Attribute
+ { }
+
+ /// Specifies that null is disallowed as an input even if the corresponding type allows it.
+ [AttributeUsage(AttributeTargets.Field | AttributeTargets.Parameter | AttributeTargets.Property, Inherited = false)]
+#if INTERNAL_NULLABLE_ATTRIBUTES
+ internal
+#else
+ public
+#endif
+ sealed class DisallowNullAttribute : Attribute
+ { }
+
+ /// Specifies that an output may be null even if the corresponding type disallows it.
+ [AttributeUsage(AttributeTargets.Field | AttributeTargets.Parameter | AttributeTargets.Property | AttributeTargets.ReturnValue, Inherited = false)]
+#if INTERNAL_NULLABLE_ATTRIBUTES
+ internal
+#else
+ public
+#endif
+ sealed class MaybeNullAttribute : Attribute
+ { }
+
+ /// Specifies that an output will not be null even if the corresponding type allows it.
+ [AttributeUsage(AttributeTargets.Field | AttributeTargets.Parameter | AttributeTargets.Property | AttributeTargets.ReturnValue, Inherited = false)]
+#if INTERNAL_NULLABLE_ATTRIBUTES
+ internal
+#else
+ public
+#endif
+ sealed class NotNullAttribute : Attribute
+ { }
+
+ /// Specifies that when a method returns , the parameter may be null even if the corresponding type disallows it.
+ [AttributeUsage(AttributeTargets.Parameter, Inherited = false)]
+#if INTERNAL_NULLABLE_ATTRIBUTES
+ internal
+#else
+ public
+#endif
+ sealed class MaybeNullWhenAttribute : Attribute
+ {
+ /// Initializes the attribute with the specified return value condition.
+ ///
+ /// The return value condition. If the method returns this value, the associated parameter may be null.
+ ///
+ public MaybeNullWhenAttribute(bool returnValue) => ReturnValue = returnValue;
+
+ /// Gets the return value condition.
+ public bool ReturnValue { get; }
+ }
+
+ /// Specifies that when a method returns , the parameter will not be null even if the corresponding type allows it.
+ [AttributeUsage(AttributeTargets.Parameter, Inherited = false)]
+#if INTERNAL_NULLABLE_ATTRIBUTES
+ internal
+#else
+ public
+#endif
+ sealed class NotNullWhenAttribute : Attribute
+ {
+ /// Initializes the attribute with the specified return value condition.
+ ///
+ /// The return value condition. If the method returns this value, the associated parameter will not be null.
+ ///
+ public NotNullWhenAttribute(bool returnValue) => ReturnValue = returnValue;
+
+ /// Gets the return value condition.
+ public bool ReturnValue { get; }
+ }
+
+ /// Specifies that the output will be non-null if the named parameter is non-null.
+ [AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Property | AttributeTargets.ReturnValue, AllowMultiple = true, Inherited = false)]
+#if INTERNAL_NULLABLE_ATTRIBUTES
+ internal
+#else
+ public
+#endif
+ sealed class NotNullIfNotNullAttribute : Attribute
+ {
+ /// Initializes the attribute with the associated parameter name.
+ ///
+ /// The associated parameter name. The output will be non-null if the argument to the parameter specified is non-null.
+ ///
+ public NotNullIfNotNullAttribute(string parameterName) => ParameterName = parameterName;
+
+ /// Gets the associated parameter name.
+ public string ParameterName { get; }
+ }
+
+ /// Applied to a method that will never return under any circumstance.
+ [AttributeUsage(AttributeTargets.Method, Inherited = false)]
+#if INTERNAL_NULLABLE_ATTRIBUTES
+ internal
+#else
+ public
+#endif
+ sealed class DoesNotReturnAttribute : Attribute
+ { }
+
+ /// Specifies that the method will not return if the associated Boolean parameter is passed the specified value.
+ [AttributeUsage(AttributeTargets.Parameter, Inherited = false)]
+#if INTERNAL_NULLABLE_ATTRIBUTES
+ internal
+#else
+ public
+#endif
+ sealed class DoesNotReturnIfAttribute : Attribute
+ {
+ /// Initializes the attribute with the specified parameter value.
+ ///
+ /// The condition parameter value. Code after the method will be considered unreachable by diagnostics if the argument to
+ /// the associated parameter matches this value.
+ ///
+ public DoesNotReturnIfAttribute(bool parameterValue) => ParameterValue = parameterValue;
+
+ /// Gets the condition parameter value.
+ public bool ParameterValue { get; }
+ }
+}
+#endif
diff --git a/src/Elastic.Clients.Elasticsearch/Types/SourceConfig.cs b/src/Elastic.Clients.Elasticsearch/Types/SourceConfig.cs
index ec5d007ffb0..637d9f46a7d 100644
--- a/src/Elastic.Clients.Elasticsearch/Types/SourceConfig.cs
+++ b/src/Elastic.Clients.Elasticsearch/Types/SourceConfig.cs
@@ -3,6 +3,7 @@
// See the LICENSE file in the project root for more information.
using System;
+using System.Diagnostics.CodeAnalysis;
using System.Text.Json;
using System.Text.Json.Serialization;
@@ -15,8 +16,7 @@ public partial class SourceConfig
public bool HasSourceFilterValue => Tag == 1;
- // TODO - Not null when
- public bool TryGetBool(out bool? value)
+ public bool TryGetBool([NotNullWhen(returnValue: true)] out bool? value)
{
if (Tag == 0)
{
@@ -28,7 +28,7 @@ public bool TryGetBool(out bool? value)
return false;
}
- public bool TryGetSourceFilter(out SourceFilter? value)
+ public bool TryGetSourceFilter([NotNullWhen(returnValue: true)] out SourceFilter? value)
{
if (Tag == 1)
{