Skip to content

Commit 5cee96e

Browse files
committed
Env config
1 parent 6f27e45 commit 5cee96e

9 files changed

Lines changed: 5657 additions & 20 deletions

File tree

src/Temporalio/Bridge/Cargo.lock

Lines changed: 4003 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/Temporalio/Bridge/EnvConfig.cs

Lines changed: 469 additions & 0 deletions
Large diffs are not rendered by default.

src/Temporalio/Bridge/Interop/Interop.cs

Lines changed: 38 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@
33

44
namespace Temporalio.Bridge.Interop
55
{
6-
internal enum TemporalCoreForwardedLogLevel
6+
[NativeTypeName("unsigned int")]
7+
internal enum TemporalCoreForwardedLogLevel : uint
78
{
89
Trace = 0,
910
Debug,
@@ -12,15 +13,17 @@ internal enum TemporalCoreForwardedLogLevel
1213
Error,
1314
}
1415

15-
internal enum TemporalCoreMetricAttributeValueType
16+
[NativeTypeName("unsigned int")]
17+
internal enum TemporalCoreMetricAttributeValueType : uint
1618
{
1719
String = 1,
1820
Int,
1921
Float,
2022
Bool,
2123
}
2224

23-
internal enum TemporalCoreMetricKind
25+
[NativeTypeName("unsigned int")]
26+
internal enum TemporalCoreMetricKind : uint
2427
{
2528
CounterInteger = 1,
2629
HistogramInteger,
@@ -30,19 +33,22 @@ internal enum TemporalCoreMetricKind
3033
GaugeFloat,
3134
}
3235

33-
internal enum TemporalCoreOpenTelemetryMetricTemporality
36+
[NativeTypeName("unsigned int")]
37+
internal enum TemporalCoreOpenTelemetryMetricTemporality : uint
3438
{
3539
Cumulative = 1,
3640
Delta,
3741
}
3842

39-
internal enum TemporalCoreOpenTelemetryProtocol
43+
[NativeTypeName("unsigned int")]
44+
internal enum TemporalCoreOpenTelemetryProtocol : uint
4045
{
4146
Grpc = 1,
4247
Http,
4348
}
4449

45-
internal enum TemporalCoreRpcService
50+
[NativeTypeName("unsigned int")]
51+
internal enum TemporalCoreRpcService : uint
4652
{
4753
Workflow = 1,
4854
Operator,
@@ -51,7 +57,8 @@ internal enum TemporalCoreRpcService
5157
Health,
5258
}
5359

54-
internal enum TemporalCoreSlotKindType
60+
[NativeTypeName("unsigned int")]
61+
internal enum TemporalCoreSlotKindType : uint
5562
{
5663
WorkflowSlotKindType,
5764
ActivitySlotKindType,
@@ -245,6 +252,9 @@ internal unsafe partial struct TemporalCoreRpcCallOptions
245252
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
246253
internal unsafe delegate void TemporalCoreClientRpcCallCallback(void* user_data, [NativeTypeName("const struct TemporalCoreByteArray *")] TemporalCoreByteArray* success, [NativeTypeName("uint32_t")] uint status_code, [NativeTypeName("const struct TemporalCoreByteArray *")] TemporalCoreByteArray* failure_message, [NativeTypeName("const struct TemporalCoreByteArray *")] TemporalCoreByteArray* failure_details);
247254

255+
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
256+
internal unsafe delegate void TemporalCoreClientConfigCallback(void* user_data, [NativeTypeName("const struct TemporalCoreByteArray *")] TemporalCoreByteArray* success, [NativeTypeName("const struct TemporalCoreByteArray *")] TemporalCoreByteArray* fail);
257+
248258
[StructLayout(LayoutKind.Explicit)]
249259
internal partial struct TemporalCoreMetricAttributeValue
250260
{
@@ -585,7 +595,8 @@ internal partial struct TemporalCoreLegacyBuildIdBasedStrategy
585595
public TemporalCoreByteArrayRef build_id;
586596
}
587597

588-
internal enum TemporalCoreWorkerVersioningStrategy_Tag
598+
[NativeTypeName("unsigned int")]
599+
internal enum TemporalCoreWorkerVersioningStrategy_Tag : uint
589600
{
590601
None,
591602
DeploymentBased,
@@ -596,7 +607,7 @@ internal unsafe partial struct TemporalCoreWorkerVersioningStrategy
596607
{
597608
public TemporalCoreWorkerVersioningStrategy_Tag tag;
598609

599-
[NativeTypeName("__AnonymousRecord_temporal-sdk-core-c-bridge_L421_C3")]
610+
[NativeTypeName("__AnonymousRecord_temporal-sdk-core-c-bridge_L431_C3")]
600611
public _Anonymous_e__Union Anonymous;
601612

602613
internal ref TemporalCoreWorkerVersioningNone none
@@ -636,15 +647,15 @@ internal ref TemporalCoreLegacyBuildIdBasedStrategy legacy_build_id_based
636647
internal unsafe partial struct _Anonymous_e__Union
637648
{
638649
[FieldOffset(0)]
639-
[NativeTypeName("__AnonymousRecord_temporal-sdk-core-c-bridge_L422_C5")]
650+
[NativeTypeName("__AnonymousRecord_temporal-sdk-core-c-bridge_L432_C5")]
640651
public _Anonymous1_1_e__Struct Anonymous1_1;
641652

642653
[FieldOffset(0)]
643-
[NativeTypeName("__AnonymousRecord_temporal-sdk-core-c-bridge_L425_C5")]
654+
[NativeTypeName("__AnonymousRecord_temporal-sdk-core-c-bridge_L435_C5")]
644655
public _Anonymous2_1_e__Struct Anonymous2_1;
645656

646657
[FieldOffset(0)]
647-
[NativeTypeName("__AnonymousRecord_temporal-sdk-core-c-bridge_L428_C5")]
658+
[NativeTypeName("__AnonymousRecord_temporal-sdk-core-c-bridge_L438_C5")]
648659
public _Anonymous3_1_e__Struct Anonymous3_1;
649660

650661
internal partial struct _Anonymous1_1_e__Struct
@@ -725,7 +736,8 @@ internal unsafe partial struct TemporalCoreSlotReserveCtx
725736
[return: NativeTypeName("uintptr_t")]
726737
internal unsafe delegate UIntPtr TemporalCoreCustomTryReserveSlotCallback([NativeTypeName("const struct TemporalCoreSlotReserveCtx *")] TemporalCoreSlotReserveCtx* ctx);
727738

728-
internal enum TemporalCoreSlotInfo_Tag
739+
[NativeTypeName("unsigned int")]
740+
internal enum TemporalCoreSlotInfo_Tag : uint
729741
{
730742
WorkflowSlotInfo,
731743
ActivitySlotInfo,
@@ -767,7 +779,7 @@ internal unsafe partial struct TemporalCoreSlotInfo
767779
{
768780
public TemporalCoreSlotInfo_Tag tag;
769781

770-
[NativeTypeName("__AnonymousRecord_temporal-sdk-core-c-bridge_L496_C3")]
782+
[NativeTypeName("__AnonymousRecord_temporal-sdk-core-c-bridge_L506_C3")]
771783
public _Anonymous_e__Union Anonymous;
772784

773785
internal ref TemporalCoreWorkflowSlotInfo_Body workflow_slot_info
@@ -885,7 +897,8 @@ internal unsafe partial struct TemporalCoreCustomSlotSupplierCallbacksImpl
885897
public TemporalCoreCustomSlotSupplierCallbacks* _0;
886898
}
887899

888-
internal enum TemporalCoreSlotSupplier_Tag
900+
[NativeTypeName("unsigned int")]
901+
internal enum TemporalCoreSlotSupplier_Tag : uint
889902
{
890903
FixedSize,
891904
ResourceBased,
@@ -896,7 +909,7 @@ internal unsafe partial struct TemporalCoreSlotSupplier
896909
{
897910
public TemporalCoreSlotSupplier_Tag tag;
898911

899-
[NativeTypeName("__AnonymousRecord_temporal-sdk-core-c-bridge_L547_C3")]
912+
[NativeTypeName("__AnonymousRecord_temporal-sdk-core-c-bridge_L557_C3")]
900913
public _Anonymous_e__Union Anonymous;
901914

902915
internal ref TemporalCoreFixedSizeSlotSupplier fixed_size
@@ -936,15 +949,15 @@ internal ref TemporalCoreCustomSlotSupplierCallbacksImpl custom
936949
internal unsafe partial struct _Anonymous_e__Union
937950
{
938951
[FieldOffset(0)]
939-
[NativeTypeName("__AnonymousRecord_temporal-sdk-core-c-bridge_L548_C5")]
952+
[NativeTypeName("__AnonymousRecord_temporal-sdk-core-c-bridge_L558_C5")]
940953
public _Anonymous1_1_e__Struct Anonymous1_1;
941954

942955
[FieldOffset(0)]
943-
[NativeTypeName("__AnonymousRecord_temporal-sdk-core-c-bridge_L551_C5")]
956+
[NativeTypeName("__AnonymousRecord_temporal-sdk-core-c-bridge_L561_C5")]
944957
public _Anonymous2_1_e__Struct Anonymous2_1;
945958

946959
[FieldOffset(0)]
947-
[NativeTypeName("__AnonymousRecord_temporal-sdk-core-c-bridge_L554_C5")]
960+
[NativeTypeName("__AnonymousRecord_temporal-sdk-core-c-bridge_L564_C5")]
948961
public _Anonymous3_1_e__Struct Anonymous3_1;
949962

950963
internal partial struct _Anonymous1_1_e__Struct
@@ -1120,6 +1133,12 @@ internal static unsafe partial class Methods
11201133
[DllImport("temporal_sdk_core_c_bridge", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
11211134
public static extern void temporal_core_client_rpc_call([NativeTypeName("struct TemporalCoreClient *")] TemporalCoreClient* client, [NativeTypeName("const struct TemporalCoreRpcCallOptions *")] TemporalCoreRpcCallOptions* options, void* user_data, [NativeTypeName("TemporalCoreClientRpcCallCallback")] IntPtr callback);
11221135

1136+
[DllImport("temporal_sdk_core_c_bridge", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
1137+
public static extern void temporal_core_client_config_load([NativeTypeName("const char *")] sbyte* path, [NativeTypeName("struct TemporalCoreByteArrayRef")] TemporalCoreByteArrayRef data, [NativeTypeName("bool")] byte disable_file, [NativeTypeName("bool")] byte config_file_strict, [NativeTypeName("struct TemporalCoreByteArrayRef")] TemporalCoreByteArrayRef env_vars, void* user_data, [NativeTypeName("TemporalCoreClientConfigCallback")] IntPtr callback);
1138+
1139+
[DllImport("temporal_sdk_core_c_bridge", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
1140+
public static extern void temporal_core_client_config_profile_load([NativeTypeName("const char *")] sbyte* profile, [NativeTypeName("const char *")] sbyte* path, [NativeTypeName("struct TemporalCoreByteArrayRef")] TemporalCoreByteArrayRef data, [NativeTypeName("bool")] byte disable_file, [NativeTypeName("bool")] byte disable_env, [NativeTypeName("bool")] byte config_file_strict, [NativeTypeName("struct TemporalCoreByteArrayRef")] TemporalCoreByteArrayRef env_vars, void* user_data, [NativeTypeName("TemporalCoreClientConfigCallback")] IntPtr callback);
1141+
11231142
[DllImport("temporal_sdk_core_c_bridge", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
11241143
[return: NativeTypeName("struct TemporalCoreMetricMeter *")]
11251144
public static extern TemporalCoreMetricMeter* temporal_core_metric_meter_new([NativeTypeName("struct TemporalCoreRuntime *")] TemporalCoreRuntime* runtime);

src/Temporalio/Bridge/sdk-core

Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Text.Json;
5+
6+
namespace Temporalio.Client.Configuration
7+
{
8+
/// <summary>
9+
/// Represents the overall client configuration.
10+
/// </summary>
11+
public sealed class ClientConfig : ICloneable
12+
{
13+
/// <summary>
14+
/// Initializes a new instance of the <see cref="ClientConfig"/> class.
15+
/// </summary>
16+
/// <param name="profiles">The configuration profiles.</param>
17+
public ClientConfig(IReadOnlyDictionary<string, ClientConfigProfile> profiles)
18+
{
19+
Profiles = profiles ?? new Dictionary<string, ClientConfigProfile>();
20+
}
21+
22+
/// <summary>
23+
/// Gets the configuration profiles.
24+
/// </summary>
25+
public IReadOnlyDictionary<string, ClientConfigProfile> Profiles { get; private set; }
26+
27+
/// <summary>
28+
/// Load client configuration from environment variables and configuration files.
29+
/// </summary>
30+
/// <param name="configSource">The data source to load from.</param>
31+
/// <param name="disableFile">If true, do not load from file (only from environment).</param>
32+
/// <param name="configFileStrict">If true, fail if configuration file is invalid.</param>
33+
/// <param name="overrideEnvVars">Environment variables to use, or null to use system environment.</param>
34+
/// <returns>Loaded configuration data.</returns>
35+
public static ClientConfig Load(
36+
DataSource? configSource = null,
37+
bool disableFile = false,
38+
bool configFileStrict = false,
39+
Dictionary<string, string>? overrideEnvVars = null)
40+
{
41+
var runtime = Runtime.TemporalRuntime.Default.Runtime;
42+
var profiles = Bridge.EnvConfig.LoadClientConfig(
43+
runtime,
44+
configSource ?? DataSource.FromDefault(),
45+
disableFile,
46+
configFileStrict,
47+
overrideEnvVars);
48+
return new ClientConfig(profiles);
49+
}
50+
51+
/// <summary>
52+
/// Load client connection options directly from configuration.
53+
/// </summary>
54+
/// <param name="profile">Name of the profile to load. If null, "default" is used.</param>
55+
/// <param name="configSource">The data source to load from.</param>
56+
/// <param name="disableFile">If true, do not load from file (only from environment).</param>
57+
/// <param name="disableEnv">If true, disable environment variable overrides.</param>
58+
/// <param name="configFileStrict">If true, fail if configuration file is invalid.</param>
59+
/// <param name="overrideEnvVars">Environment variables to use, or null to use system environment.</param>
60+
/// <returns>Client connection options.</returns>
61+
public static TemporalClientConnectOptions LoadClientConnectOptions(
62+
string? profile = null,
63+
DataSource? configSource = null,
64+
bool disableFile = false,
65+
bool disableEnv = false,
66+
bool configFileStrict = false,
67+
Dictionary<string, string>? overrideEnvVars = null)
68+
{
69+
var profileName = profile ?? "default";
70+
var clientProfile = ClientConfigProfile.Load(
71+
profileName,
72+
configSource,
73+
disableFile,
74+
disableEnv,
75+
configFileStrict,
76+
overrideEnvVars);
77+
return clientProfile.ToConnectionOptions();
78+
}
79+
80+
/// <summary>
81+
/// Deserialize client configuration from JSON.
82+
/// </summary>
83+
/// <param name="json">JSON string to deserialize.</param>
84+
/// <param name="options">Optional JSON serializer options.</param>
85+
/// <returns>Client configuration instance.</returns>
86+
public static ClientConfig FromJson(string json, JsonSerializerOptions? options = null)
87+
{
88+
return JsonSerializer.Deserialize<ClientConfig>(json, options ?? GetDefaultJsonOptions())
89+
?? throw new JsonException("Failed to deserialize ClientConfig from JSON.");
90+
}
91+
92+
/// <summary>
93+
/// Serialize this client configuration to JSON.
94+
/// </summary>
95+
/// <param name="options">Optional JSON serializer options.</param>
96+
/// <returns>JSON string representation.</returns>
97+
public string ToJson(JsonSerializerOptions? options = null)
98+
{
99+
return JsonSerializer.Serialize(this, options ?? GetDefaultJsonOptions());
100+
}
101+
102+
/// <inheritdoc />
103+
public object Clone()
104+
{
105+
var newConfig = (ClientConfig)MemberwiseClone();
106+
var clonedProfiles = new Dictionary<string, ClientConfigProfile>();
107+
foreach (var kvp in Profiles)
108+
{
109+
clonedProfiles[kvp.Key] = (ClientConfigProfile)kvp.Value.Clone();
110+
}
111+
newConfig.Profiles = clonedProfiles;
112+
return newConfig;
113+
}
114+
115+
private static JsonSerializerOptions GetDefaultJsonOptions()
116+
{
117+
return new JsonSerializerOptions
118+
{
119+
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
120+
WriteIndented = true,
121+
};
122+
}
123+
}
124+
}

0 commit comments

Comments
 (0)