lliquidlink 1.0.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- lliquidlink-1.0.0/.github/FUNDING.yml +15 -0
- lliquidlink-1.0.0/.github/workflows/release.yml +77 -0
- lliquidlink-1.0.0/.gitignore +135 -0
- lliquidlink-1.0.0/CHANGELOG.md +7 -0
- lliquidlink-1.0.0/CSharp/LLiquidLink/Converters/EnumConverter.cs +31 -0
- lliquidlink-1.0.0/CSharp/LLiquidLink/Converters/JsonSerializerChain.cs +128 -0
- lliquidlink-1.0.0/CSharp/LLiquidLink/Converters/ObjectPrimitiveConverter.cs +26 -0
- lliquidlink-1.0.0/CSharp/LLiquidLink/Converters/PreObjectConverter.cs +50 -0
- lliquidlink-1.0.0/CSharp/LLiquidLink/Converters/RpcJsonConverter.cs +98 -0
- lliquidlink-1.0.0/CSharp/LLiquidLink/Converters/TypeConverter.cs +32 -0
- lliquidlink-1.0.0/CSharp/LLiquidLink/Core/Logger.cs +31 -0
- lliquidlink-1.0.0/CSharp/LLiquidLink/Core/ObjectRegistry.cs +75 -0
- lliquidlink-1.0.0/CSharp/LLiquidLink/Core/TypeResolver.cs +107 -0
- lliquidlink-1.0.0/CSharp/LLiquidLink/Models/Schema.cs +47 -0
- lliquidlink-1.0.0/CSharp/LLiquidLink/RpcOptions.cs +8 -0
- lliquidlink-1.0.0/CSharp/LLiquidLink/RpcRegistrar.cs +512 -0
- lliquidlink-1.0.0/CSharp/LLiquidLink/Server.cs +252 -0
- lliquidlink-1.0.0/CSharp/LLiquidLink/Transports/IMainThreadDispatcher.cs +18 -0
- lliquidlink-1.0.0/CSharp/LLiquidLink/Transports/ITransportServer.cs +33 -0
- lliquidlink-1.0.0/CSharp/LLiquidLink/Transports/JsonRpcFraming.cs +64 -0
- lliquidlink-1.0.0/CSharp/LLiquidLink/Transports/JsonRpcProtocol.cs +86 -0
- lliquidlink-1.0.0/CSharp/LLiquidLink/Transports/RpcBus.cs +386 -0
- lliquidlink-1.0.0/CSharp/LLiquidLink/Transports/StdioTransport.cs +178 -0
- lliquidlink-1.0.0/CSharp/UniLiquidLink/Converters/JsonUtilityConverter.cs +41 -0
- lliquidlink-1.0.0/CSharp/UniLiquidLink/Unity/InstanceObjectConverter.cs +63 -0
- lliquidlink-1.0.0/CSharp/UniLiquidLink/Unity/MainThreadDispatcher.cs +32 -0
- lliquidlink-1.0.0/CSharp/UniLiquidLink/Unity/UniLiquidLinkServer.cs +201 -0
- lliquidlink-1.0.0/CSharp/UniLiquidLink/Unity/UniLiquidLinkServerServer.AddConverters.cs +19 -0
- lliquidlink-1.0.0/CSharp/UniLiquidLink/Unity/UniLiquidLinkServerServer.AddFallbackConverters.cs +15 -0
- lliquidlink-1.0.0/CSharp/UniLiquidLink/Unity/UnityObjectConverter.cs +9 -0
- lliquidlink-1.0.0/Docs/ClassDiagram.md +359 -0
- lliquidlink-1.0.0/Docs/LLiquidLinkPythonAPI.md +303 -0
- lliquidlink-1.0.0/Docs/Server.md +474 -0
- lliquidlink-1.0.0/Docs/UniLiquidLinkServer.md +475 -0
- lliquidlink-1.0.0/LICENSE +21 -0
- lliquidlink-1.0.0/PKG-INFO +176 -0
- lliquidlink-1.0.0/Python/lliquidlink/__init__.py +9 -0
- lliquidlink-1.0.0/Python/lliquidlink/client/__init__.py +51 -0
- lliquidlink-1.0.0/Python/lliquidlink/client/_client.py +138 -0
- lliquidlink-1.0.0/Python/lliquidlink/client/_event.py +26 -0
- lliquidlink-1.0.0/Python/lliquidlink/client/_proxy.py +92 -0
- lliquidlink-1.0.0/Python/lliquidlink/client/_schema.py +40 -0
- lliquidlink-1.0.0/Python/lliquidlink/client/_serialization.py +26 -0
- lliquidlink-1.0.0/Python/lliquidlink/client/_transports.py +97 -0
- lliquidlink-1.0.0/Python/lliquidlink/client/models.py +17 -0
- lliquidlink-1.0.0/Python/lliquidlink/core/__init__.py +20 -0
- lliquidlink-1.0.0/Python/lliquidlink/core/_rpc.py +178 -0
- lliquidlink-1.0.0/Python/lliquidlink/server/__init__.py +29 -0
- lliquidlink-1.0.0/Python/lliquidlink/server/__main__.py +2 -0
- lliquidlink-1.0.0/Python/lliquidlink/server/_transport.py +95 -0
- lliquidlink-1.0.0/Python/lliquidlink/server/ipc_bridge.py +36 -0
- lliquidlink-1.0.0/Python/lliquidlink/server/resolver.py +204 -0
- lliquidlink-1.0.0/Python/lliquidlink/server/server.py +135 -0
- lliquidlink-1.0.0/README.ja.md +149 -0
- lliquidlink-1.0.0/README.md +159 -0
- lliquidlink-1.0.0/Samples/AllFeaturesTour/AllFeaturesTourServer.cs +197 -0
- lliquidlink-1.0.0/Samples/AllFeaturesTour/AllFeaturesTourServerReload.cs +39 -0
- lliquidlink-1.0.0/Samples/AllFeaturesTour/AllFeaturesTourServerWindow.cs +52 -0
- lliquidlink-1.0.0/Samples/AllFeaturesTour/all_features_tour.py +130 -0
- lliquidlink-1.0.0/Samples/AllFeaturesTour/run_middleware_server.py +31 -0
- lliquidlink-1.0.0/Samples/CubeDemo/CubeDemoServer.cs +68 -0
- lliquidlink-1.0.0/Samples/CubeDemo/CubeDemoServerReload.cs +39 -0
- lliquidlink-1.0.0/Samples/CubeDemo/CubeDemoServerWindow.cs +52 -0
- lliquidlink-1.0.0/Samples/CubeDemo/create_and_rotate_cube.py +35 -0
- lliquidlink-1.0.0/Samples/CubeDemo/run_middleware_server.py +31 -0
- lliquidlink-1.0.0/Tests/CSharp/ConverterTests.cs +219 -0
- lliquidlink-1.0.0/Tests/CSharp/GoldenFiles/.gitkeep +0 -0
- lliquidlink-1.0.0/Tests/CSharp/GoldenFiles/golden_find.json +1 -0
- lliquidlink-1.0.0/Tests/CSharp/GoldenFiles/golden_resolve_chain_chained_step.json +1 -0
- lliquidlink-1.0.0/Tests/CSharp/GoldenFiles/golden_resolve_chain_get_transform.json +1 -0
- lliquidlink-1.0.0/Tests/CSharp/GoldenFiles/golden_resolve_chain_rotate.json +1 -0
- lliquidlink-1.0.0/Tests/CSharp/GoldenFiles/golden_resolve_chain_set_position.json +1 -0
- lliquidlink-1.0.0/Tests/CSharp/GoldenFiles/golden_sample_method_int.json +1 -0
- lliquidlink-1.0.0/Tests/CSharp/GoldenFiles/golden_sample_vector3.json +1 -0
- lliquidlink-1.0.0/Tests/CSharp/GoldenFiles/golden_unknown_method_error.json +1 -0
- lliquidlink-1.0.0/Tests/CSharp/JsonRpcProtocolTests.cs +53 -0
- lliquidlink-1.0.0/Tests/CSharp/JsonSerializerChainTests.cs +218 -0
- lliquidlink-1.0.0/Tests/CSharp/JsonUtilityConverterTests.cs +132 -0
- lliquidlink-1.0.0/Tests/CSharp/ObjectRegistryTests.cs +86 -0
- lliquidlink-1.0.0/Tests/CSharp/RpcBusDispatchTests.cs +102 -0
- lliquidlink-1.0.0/Tests/CSharp/RpcBusSerializationTests.cs +157 -0
- lliquidlink-1.0.0/Tests/CSharp/RpcIntegrationTests.cs +141 -0
- lliquidlink-1.0.0/Tests/CSharp/RpcRegistrarAllTests.cs +451 -0
- lliquidlink-1.0.0/Tests/CSharp/TypeResolverTests.cs +77 -0
- lliquidlink-1.0.0/Tests/CSharp/golden/handle_call_unknown_method_response.json +5 -0
- lliquidlink-1.0.0/Tests/CSharp/golden/handle_getproperty_missing_object_response.json +5 -0
- lliquidlink-1.0.0/Tests/CSharp/golden/handle_invoke_missing_object_response.json +5 -0
- lliquidlink-1.0.0/Tests/CSharp/golden/handle_resolvechain_missing_object_response.json +5 -0
- lliquidlink-1.0.0/Tests/CSharp/golden/parse_value_multiple_types.json +10 -0
- lliquidlink-1.0.0/Tests/CSharp/golden/serialize_result_primitives.json +8 -0
- lliquidlink-1.0.0/Tests/CSharp/golden/serialize_result_unity_object.json +6 -0
- lliquidlink-1.0.0/Tests/CSharpUtils/GenerateRpcGolden.cs +101 -0
- lliquidlink-1.0.0/Tests/CSharpUtils/IntegrationTestServerReload.cs +38 -0
- lliquidlink-1.0.0/Tests/CSharpUtils/IntegrationTestServerWindow.cs +52 -0
- lliquidlink-1.0.0/Tests/CSharpUtils/ListLogger.cs +38 -0
- lliquidlink-1.0.0/Tests/CSharpUtils/NullTransport.cs +28 -0
- lliquidlink-1.0.0/Tests/CSharpUtils/RpcTestContext.cs +95 -0
- lliquidlink-1.0.0/Tests/CSharpUtils/Sample2.txt +213 -0
- lliquidlink-1.0.0/Tests/CSharpUtils/SetupIntegrationTest.cs +76 -0
- lliquidlink-1.0.0/Tests/CSharpUtils/UEAssert.cs +84 -0
- lliquidlink-1.0.0/Tests/CSharpUtils/UniLiquidLinkIntegrationTest.cs +206 -0
- lliquidlink-1.0.0/Tests/CSharpUtils/UniLiquidLinkServerTestHelper.cs +48 -0
- lliquidlink-1.0.0/Tests/Python/conftest.py +40 -0
- lliquidlink-1.0.0/Tests/Python/generate_integration_golden.py +28 -0
- lliquidlink-1.0.0/Tests/Python/generate_test_integration.py +75 -0
- lliquidlink-1.0.0/Tests/Python/golden/add_abbreviated_namespaces.json +4 -0
- lliquidlink-1.0.0/Tests/Python/golden/call_unknown_method.json +1 -0
- lliquidlink-1.0.0/Tests/Python/golden/chained_game_object.json +4 -0
- lliquidlink-1.0.0/Tests/Python/golden/find_test_game_object.json +4 -0
- lliquidlink-1.0.0/Tests/Python/golden/find_test_object.json +4 -0
- lliquidlink-1.0.0/Tests/Python/golden/get_transform.json +4 -0
- lliquidlink-1.0.0/Tests/Python/golden/load_asset_database.json +4 -0
- lliquidlink-1.0.0/Tests/Python/golden/load_asset_with_type.json +4 -0
- lliquidlink-1.0.0/Tests/Python/golden/nested_static_class.json +1 -0
- lliquidlink-1.0.0/Tests/Python/golden/object_method.json +4 -0
- lliquidlink-1.0.0/Tests/Python/golden/object_overload.json +10 -0
- lliquidlink-1.0.0/Tests/Python/golden/object_properties.json +8 -0
- lliquidlink-1.0.0/Tests/Python/golden/rotate.json +1 -0
- lliquidlink-1.0.0/Tests/Python/golden/sample_enum.json +4 -0
- lliquidlink-1.0.0/Tests/Python/golden/sample_game_object.json +4 -0
- lliquidlink-1.0.0/Tests/Python/golden/sample_game_object_array.json +10 -0
- lliquidlink-1.0.0/Tests/Python/golden/sample_game_object_dict.json +10 -0
- lliquidlink-1.0.0/Tests/Python/golden/sample_game_object_list.json +10 -0
- lliquidlink-1.0.0/Tests/Python/golden/sample_method_int.json +1 -0
- lliquidlink-1.0.0/Tests/Python/golden/sample_method_int_str.json +1 -0
- lliquidlink-1.0.0/Tests/Python/golden/sample_primitive_object_bool.json +1 -0
- lliquidlink-1.0.0/Tests/Python/golden/sample_primitive_object_int.json +1 -0
- lliquidlink-1.0.0/Tests/Python/golden/sample_primitive_object_string.json +1 -0
- lliquidlink-1.0.0/Tests/Python/golden/sample_vector3.json +5 -0
- lliquidlink-1.0.0/Tests/Python/golden/sample_vector3_array.json +12 -0
- lliquidlink-1.0.0/Tests/Python/golden/sample_vector3_dict.json +12 -0
- lliquidlink-1.0.0/Tests/Python/golden/sample_vector3_list.json +12 -0
- lliquidlink-1.0.0/Tests/Python/golden/set_abbreviated_classes.json +1 -0
- lliquidlink-1.0.0/Tests/Python/golden/set_abbreviated_classes_find.json +4 -0
- lliquidlink-1.0.0/Tests/Python/golden/set_transform_position.json +5 -0
- lliquidlink-1.0.0/Tests/Python/golden/transform_position.json +5 -0
- lliquidlink-1.0.0/Tests/Python/golden/transform_rotate.json +1 -0
- lliquidlink-1.0.0/Tests/Python/integration_client.py +198 -0
- lliquidlink-1.0.0/Tests/Python/test_client_tcp.py +141 -0
- lliquidlink-1.0.0/Tests/Python/test_event.py +51 -0
- lliquidlink-1.0.0/Tests/Python/test_integration.py +141 -0
- lliquidlink-1.0.0/Tests/Python/test_rpc_peer.py +82 -0
- lliquidlink-1.0.0/Tests/Python/test_serialize_list.py +56 -0
- lliquidlink-1.0.0/Tests/Python/test_server.py +502 -0
- lliquidlink-1.0.0/Tests/Python/test_stdio.py +49 -0
- lliquidlink-1.0.0/UniLiquidLink.asmdef +18 -0
- lliquidlink-1.0.0/pyproject.toml +40 -0
- lliquidlink-1.0.0/tools/convert_j2_block_comments.py +76 -0
- lliquidlink-1.0.0/tools/generate_class_diagram.py +475 -0
- lliquidlink-1.0.0/tools/generate_common.py +45 -0
- lliquidlink-1.0.0/tools/generate_converters.py +33 -0
- lliquidlink-1.0.0/tools/generate_converters_csv.py +12 -0
- lliquidlink-1.0.0/tools/generate_docs.py +312 -0
- lliquidlink-1.0.0/tools/generate_fallback_converters.py +36 -0
- lliquidlink-1.0.0/tools/generate_python_docs.py +317 -0
- lliquidlink-1.0.0/tools/generate_schema.py +327 -0
- lliquidlink-1.0.0/tools/kill_port.py +59 -0
- lliquidlink-1.0.0/tools/make.py +20 -0
- lliquidlink-1.0.0/tools/plantuml_pandoc_filter.py +41 -0
- lliquidlink-1.0.0/tools/schema/__init__.py +2 -0
- lliquidlink-1.0.0/tools/schema/codegen.py +152 -0
- lliquidlink-1.0.0/tools/schema/converters.py +50 -0
- lliquidlink-1.0.0/tools/schema/fallback_converters.py +47 -0
- lliquidlink-1.0.0/tools/schema_def.py +62 -0
- lliquidlink-1.0.0/tools/templates/add_chain_converters.cs.j2 +21 -0
- lliquidlink-1.0.0/tools/templates/add_converters.cs.j2 +22 -0
- lliquidlink-1.0.0/tools/templates/fallback_converter.cs.j2 +57 -0
- lliquidlink-1.0.0/tools/templates/rpc_converter.cs.j2 +111 -0
- lliquidlink-1.0.0/tools/unity_mcp_server.py +168 -0
- lliquidlink-1.0.0/tools/unity_server.py +17 -0
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# These are supported funding model platforms
|
|
2
|
+
|
|
3
|
+
github: hide00310 # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
|
|
4
|
+
patreon: # Replace with a single Patreon username
|
|
5
|
+
open_collective: # Replace with a single Open Collective username
|
|
6
|
+
ko_fi: # Replace with a single Ko-fi username
|
|
7
|
+
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
|
|
8
|
+
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
|
|
9
|
+
liberapay: # Replace with a single Liberapay username
|
|
10
|
+
issuehunt: # Replace with a single IssueHunt username
|
|
11
|
+
lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry
|
|
12
|
+
polar: # Replace with a single Polar username
|
|
13
|
+
buy_me_a_coffee: # Replace with a single Buy Me a Coffee username
|
|
14
|
+
thanks_dev: # Replace with a single thanks.dev username
|
|
15
|
+
custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
name: Release
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [main]
|
|
8
|
+
|
|
9
|
+
permissions:
|
|
10
|
+
contents: read
|
|
11
|
+
|
|
12
|
+
jobs:
|
|
13
|
+
test:
|
|
14
|
+
runs-on: ubuntu-latest
|
|
15
|
+
steps:
|
|
16
|
+
- uses: actions/checkout@v4
|
|
17
|
+
|
|
18
|
+
- uses: actions/setup-python@v5
|
|
19
|
+
with:
|
|
20
|
+
python-version: "3.13"
|
|
21
|
+
|
|
22
|
+
- name: Install package with test dependencies
|
|
23
|
+
run: pip install .[test]
|
|
24
|
+
|
|
25
|
+
- name: Run unit tests (Unity-independent only)
|
|
26
|
+
# test_integration.py requires a running Unity Editor with the
|
|
27
|
+
# Integration Test Server started, so it cannot run in CI.
|
|
28
|
+
run: pytest --ignore=Tests/Python/test_integration.py
|
|
29
|
+
|
|
30
|
+
release:
|
|
31
|
+
needs: test
|
|
32
|
+
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
|
|
33
|
+
runs-on: ubuntu-latest
|
|
34
|
+
permissions:
|
|
35
|
+
contents: write
|
|
36
|
+
outputs:
|
|
37
|
+
released: ${{ steps.release.outputs.released }}
|
|
38
|
+
steps:
|
|
39
|
+
- uses: actions/checkout@v4
|
|
40
|
+
with:
|
|
41
|
+
fetch-depth: 0
|
|
42
|
+
|
|
43
|
+
- uses: actions/setup-python@v5
|
|
44
|
+
with:
|
|
45
|
+
python-version: "3.13"
|
|
46
|
+
|
|
47
|
+
- name: Install python-semantic-release
|
|
48
|
+
run: pip install python-semantic-release
|
|
49
|
+
|
|
50
|
+
- name: Release
|
|
51
|
+
id: release
|
|
52
|
+
env:
|
|
53
|
+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
54
|
+
run: semantic-release version --commit --tag --push --vcs-release
|
|
55
|
+
|
|
56
|
+
- name: Upload build artifacts
|
|
57
|
+
if: steps.release.outputs.released == 'true'
|
|
58
|
+
uses: actions/upload-artifact@v4
|
|
59
|
+
with:
|
|
60
|
+
name: dist
|
|
61
|
+
path: dist/
|
|
62
|
+
|
|
63
|
+
pypi-publish:
|
|
64
|
+
needs: release
|
|
65
|
+
if: needs.release.outputs.released == 'true'
|
|
66
|
+
runs-on: ubuntu-latest
|
|
67
|
+
environment: pypi
|
|
68
|
+
permissions:
|
|
69
|
+
id-token: write
|
|
70
|
+
steps:
|
|
71
|
+
- uses: actions/download-artifact@v4
|
|
72
|
+
with:
|
|
73
|
+
name: dist
|
|
74
|
+
path: dist/
|
|
75
|
+
|
|
76
|
+
- name: Publish to PyPI
|
|
77
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
# This .gitignore file should be placed at the root of your Unity project directory
|
|
2
|
+
#
|
|
3
|
+
# Get latest from https://github.com/github/gitignore/blob/main/Unity.gitignore
|
|
4
|
+
#
|
|
5
|
+
/[Ll]ibrary/
|
|
6
|
+
/[Tt]emp/
|
|
7
|
+
/[Oo]bj/
|
|
8
|
+
/[Bb]uild/
|
|
9
|
+
/[Bb]uilds/
|
|
10
|
+
/[Ll]ogs/
|
|
11
|
+
/[Uu]ser[Ss]ettings/
|
|
12
|
+
|
|
13
|
+
# MemoryCaptures can get excessive in size.
|
|
14
|
+
# They also could contain extremely sensitive data
|
|
15
|
+
/[Mm]emoryCaptures/
|
|
16
|
+
|
|
17
|
+
# Recordings can get excessive in size
|
|
18
|
+
/[Rr]ecordings/
|
|
19
|
+
|
|
20
|
+
# This .gitignore file should be placed at the root of your Unity project directory
|
|
21
|
+
#
|
|
22
|
+
# Get latest from https://github.com/github/gitignore/blob/main/Unity.gitignore
|
|
23
|
+
#
|
|
24
|
+
# Recommended: add any editor/OS/tool-specific ignore rules from the Global/ templates as needed.
|
|
25
|
+
# See: https://github.com/github/gitignore/tree/main/Global
|
|
26
|
+
#
|
|
27
|
+
.utmp/
|
|
28
|
+
/[Ll]ibrary/
|
|
29
|
+
/[Tt]emp/
|
|
30
|
+
/[Oo]bj/
|
|
31
|
+
/[Bb]uild/
|
|
32
|
+
/[Bb]uilds/
|
|
33
|
+
/[Ll]ogs/
|
|
34
|
+
/[Uu]ser[Ss]ettings/
|
|
35
|
+
*.log
|
|
36
|
+
|
|
37
|
+
# By default unity supports Blender asset imports, *.blend1 blender files do not need to be commited to version control.
|
|
38
|
+
*.blend1
|
|
39
|
+
*.blend1.meta
|
|
40
|
+
|
|
41
|
+
# MemoryCaptures can get excessive in size.
|
|
42
|
+
# They also could contain extremely sensitive data
|
|
43
|
+
/[Mm]emoryCaptures/
|
|
44
|
+
|
|
45
|
+
# Recordings can get excessive in size
|
|
46
|
+
/[Rr]ecordings/
|
|
47
|
+
|
|
48
|
+
# Uncomment this line if you wish to ignore the asset store tools plugin
|
|
49
|
+
# /[Aa]ssets/AssetStoreTools*
|
|
50
|
+
|
|
51
|
+
# Autogenerated Jetbrains Rider plugin
|
|
52
|
+
/[Aa]ssets/Plugins/Editor/JetBrains*
|
|
53
|
+
# Jetbrains Rider personal-layer settings
|
|
54
|
+
*.DotSettings.user
|
|
55
|
+
|
|
56
|
+
# Visual Studio cache directory
|
|
57
|
+
.vs/
|
|
58
|
+
|
|
59
|
+
# Gradle cache directory
|
|
60
|
+
.gradle/
|
|
61
|
+
|
|
62
|
+
# Autogenerated VS/MD/Consulo solution and project files
|
|
63
|
+
ExportedObj/
|
|
64
|
+
.consulo/
|
|
65
|
+
*.csproj
|
|
66
|
+
*.unityproj
|
|
67
|
+
*.sln
|
|
68
|
+
*.slnx
|
|
69
|
+
*.suo
|
|
70
|
+
*.tmp
|
|
71
|
+
*.user
|
|
72
|
+
*.userprefs
|
|
73
|
+
*.pidb
|
|
74
|
+
*.booproj
|
|
75
|
+
*.svd
|
|
76
|
+
*.pdb
|
|
77
|
+
*.mdb
|
|
78
|
+
*.opendb
|
|
79
|
+
*.VC.db
|
|
80
|
+
|
|
81
|
+
# Unity3D generated meta files
|
|
82
|
+
*.pidb.meta
|
|
83
|
+
*.pdb.meta
|
|
84
|
+
*.mdb.meta
|
|
85
|
+
|
|
86
|
+
# Unity3D generated file on crash reports
|
|
87
|
+
sysinfo.txt
|
|
88
|
+
|
|
89
|
+
# Mono auto generated files
|
|
90
|
+
mono_crash.*
|
|
91
|
+
|
|
92
|
+
# Builds
|
|
93
|
+
*.apk
|
|
94
|
+
*.aab
|
|
95
|
+
*.unitypackage
|
|
96
|
+
*.unitypackage.meta
|
|
97
|
+
*.app
|
|
98
|
+
|
|
99
|
+
# Crashlytics generated file
|
|
100
|
+
crashlytics-build.properties
|
|
101
|
+
|
|
102
|
+
# TestRunner generated files
|
|
103
|
+
InitTestScene*.unity*
|
|
104
|
+
|
|
105
|
+
# Addressables default ignores, before user customizations
|
|
106
|
+
/ServerData
|
|
107
|
+
/[Aa]ssets/StreamingAssets/aa*
|
|
108
|
+
/[Aa]ssets/AddressableAssetsData/link.xml*
|
|
109
|
+
/[Aa]ssets/Addressables_Temp*
|
|
110
|
+
# By default, Addressables content builds will generate addressables_content_state.bin
|
|
111
|
+
# files in platform-specific subfolders, for example:
|
|
112
|
+
# /Assets/AddressableAssetsData/OSX/addressables_content_state.bin
|
|
113
|
+
/[Aa]ssets/AddressableAssetsData/*/*.bin*
|
|
114
|
+
|
|
115
|
+
# Visual Scripting auto-generated files
|
|
116
|
+
/[Aa]ssets/Unity.VisualScripting.Generated/VisualScripting.Flow/UnitOptions.db
|
|
117
|
+
/[Aa]ssets/Unity.VisualScripting.Generated/VisualScripting.Flow/UnitOptions.db.meta
|
|
118
|
+
/[Aa]ssets/Unity.VisualScripting.Generated/VisualScripting.Core/Property Providers
|
|
119
|
+
/[Aa]ssets/Unity.VisualScripting.Generated/VisualScripting.Core/Property Providers.meta
|
|
120
|
+
|
|
121
|
+
# Auto-generated scenes by play mode tests
|
|
122
|
+
/[Aa]ssets/[Ii]nit[Tt]est[Ss]cene*.unity*
|
|
123
|
+
|
|
124
|
+
# Auto-generated cache in Assets folder
|
|
125
|
+
/[Aa]ssets/[Ss]ceneDependencyCache*
|
|
126
|
+
|
|
127
|
+
*.meta
|
|
128
|
+
|
|
129
|
+
# Python
|
|
130
|
+
__pycache__/
|
|
131
|
+
/dist/
|
|
132
|
+
*.egg-info/
|
|
133
|
+
|
|
134
|
+
*.csv
|
|
135
|
+
*.html
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
using System;
|
|
2
|
+
using System.Text.Json;
|
|
3
|
+
|
|
4
|
+
namespace LLiquidLink
|
|
5
|
+
{
|
|
6
|
+
|
|
7
|
+
public class EnumConverter : RpcJsonConverter<System.Enum, RpcEnum>
|
|
8
|
+
{
|
|
9
|
+
|
|
10
|
+
public override bool CanConvert(Type typeToConvert)
|
|
11
|
+
{
|
|
12
|
+
return typeToConvert.IsEnum;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
public override System.Enum Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
|
|
16
|
+
{
|
|
17
|
+
if (reader.TokenType == JsonTokenType.Null)
|
|
18
|
+
{
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
var rpcObj = JsonSerializer.Deserialize<RpcEnum>(ref reader, DtoOptions);
|
|
22
|
+
return rpcObj == null ? null : (System.Enum)Enum.Parse(typeToConvert, rpcObj.value);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
public override void Write(Utf8JsonWriter writer, System.Enum value, JsonSerializerOptions options)
|
|
26
|
+
{
|
|
27
|
+
if (value == null) { writer.WriteNullValue(); return; }
|
|
28
|
+
JsonSerializer.Serialize(writer, new RpcEnum { value = value.ToString() }, DtoOptions);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
using System;
|
|
2
|
+
using System.Runtime.Serialization;
|
|
3
|
+
using System.Text.Json;
|
|
4
|
+
|
|
5
|
+
namespace LLiquidLink
|
|
6
|
+
{
|
|
7
|
+
/// <summary>
|
|
8
|
+
/// Thrown when deserialization yields a raw <see cref="JsonElement"/> instead of a converted value,
|
|
9
|
+
/// meaning no stage actually produced a real CLR value for the target type.
|
|
10
|
+
/// </summary>
|
|
11
|
+
public class JsonElementLeakException : Exception
|
|
12
|
+
{
|
|
13
|
+
public JsonElementLeakException()
|
|
14
|
+
{
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
public JsonElementLeakException(string message) : base(message)
|
|
18
|
+
{
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
public JsonElementLeakException(string message, Exception innerException) : base(message, innerException)
|
|
22
|
+
{
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
protected JsonElementLeakException(SerializationInfo info, StreamingContext context) : base(info, context)
|
|
26
|
+
{
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/// <summary>
|
|
31
|
+
/// Holds the pre/main/fallback <see cref="JsonSerializerOptions"/> stages and runs
|
|
32
|
+
/// (de)serialization through them in order, returning the first stage's success.
|
|
33
|
+
/// </summary>
|
|
34
|
+
public class JsonSerializerChain
|
|
35
|
+
{
|
|
36
|
+
struct Stage
|
|
37
|
+
{
|
|
38
|
+
public JsonSerializerOptions Options;
|
|
39
|
+
public bool NullIsFailure;
|
|
40
|
+
public bool ReadExceptionIsFatal;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
readonly Stage[] _stages;
|
|
44
|
+
|
|
45
|
+
/// <summary>Options for the pre stage (tried first; only succeeds for types with an explicit converter).</summary>
|
|
46
|
+
public JsonSerializerOptions Pre { get; }
|
|
47
|
+
|
|
48
|
+
/// <summary>Options for the main stage (the general-purpose serializer).</summary>
|
|
49
|
+
public JsonSerializerOptions Main { get; }
|
|
50
|
+
|
|
51
|
+
/// <summary>Options for the fallback stage (tried when main fails, e.g. Unity value types via JsonUtility).</summary>
|
|
52
|
+
public JsonSerializerOptions Fallback { get; }
|
|
53
|
+
|
|
54
|
+
/// <summary>Build a chain from the three stage options.</summary>
|
|
55
|
+
/// <param name="pre">Pre-stage options.</param>
|
|
56
|
+
/// <param name="main">Main-stage options.</param>
|
|
57
|
+
/// <param name="fallback">Fallback-stage options.</param>
|
|
58
|
+
public JsonSerializerChain(JsonSerializerOptions pre, JsonSerializerOptions main, JsonSerializerOptions fallback)
|
|
59
|
+
{
|
|
60
|
+
Pre = pre;
|
|
61
|
+
Main = main;
|
|
62
|
+
Fallback = fallback;
|
|
63
|
+
|
|
64
|
+
// Pre: a null result counts as failure (falls through to main); any exception is swallowed.
|
|
65
|
+
// Main: a null result is a valid success; RpcJsonConverterReadException is fatal (propagates,
|
|
66
|
+
// does not fall through to fallback) so registry/orgType mismatches surface as real errors.
|
|
67
|
+
// Fallback: last stage, runs unconditionally as the final attempt.
|
|
68
|
+
_stages = new Stage[]
|
|
69
|
+
{
|
|
70
|
+
new Stage { Options = pre, NullIsFailure = true, ReadExceptionIsFatal = false },
|
|
71
|
+
new Stage { Options = main, NullIsFailure = false, ReadExceptionIsFatal = true },
|
|
72
|
+
new Stage { Options = fallback, NullIsFailure = false, ReadExceptionIsFatal = false },
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/// <summary>Deserialize <paramref name="rawJson"/> to <paramref name="type"/>, trying each stage in order.</summary>
|
|
77
|
+
/// <param name="rawJson">Raw JSON text to deserialize.</param>
|
|
78
|
+
/// <param name="type">Target .NET type.</param>
|
|
79
|
+
/// <returns>The deserialized value from the first successful stage.</returns>
|
|
80
|
+
/// <exception cref="JsonElementLeakException">
|
|
81
|
+
/// Thrown when <paramref name="type"/> is not <see cref="JsonElement"/> itself but no stage converted
|
|
82
|
+
/// the value, leaving a raw <see cref="JsonElement"/> as the result.
|
|
83
|
+
/// </exception>
|
|
84
|
+
public object Deserialize(string rawJson, Type type)
|
|
85
|
+
{
|
|
86
|
+
object ret = Run(opts => JsonSerializer.Deserialize(rawJson, type, opts));
|
|
87
|
+
return type != typeof(JsonElement) && ret is JsonElement
|
|
88
|
+
? throw new JsonElementLeakException(string.Format(
|
|
89
|
+
"Deserialize to {0} yielded a raw JsonElement instead of a converted value " +
|
|
90
|
+
"(no stage produced a real CLR value). raw={1}", type.FullName, rawJson))
|
|
91
|
+
: ret;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/// <summary>Serialize <paramref name="value"/> to a <see cref="JsonElement"/>, trying each stage in order.</summary>
|
|
95
|
+
/// <param name="value">Object to serialize.</param>
|
|
96
|
+
/// <param name="type">Runtime type of <paramref name="value"/>.</param>
|
|
97
|
+
/// <returns>The serialized element from the first successful stage.</returns>
|
|
98
|
+
public object SerializeToElement(object value, Type type)
|
|
99
|
+
{
|
|
100
|
+
return Run(opts => JsonSerializer.SerializeToElement(value, type, opts));
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
object Run(Func<JsonSerializerOptions, object> op)
|
|
104
|
+
{
|
|
105
|
+
for (int i = 0; i < _stages.Length; i++)
|
|
106
|
+
{
|
|
107
|
+
Stage stage = _stages[i];
|
|
108
|
+
bool isLast = i == _stages.Length - 1;
|
|
109
|
+
try
|
|
110
|
+
{
|
|
111
|
+
object ret = op(stage.Options);
|
|
112
|
+
if (ret != null || !stage.NullIsFailure || isLast)
|
|
113
|
+
{
|
|
114
|
+
return ret;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
catch (RpcJsonConverterReadException) when (stage.ReadExceptionIsFatal && !isLast)
|
|
118
|
+
{
|
|
119
|
+
throw;
|
|
120
|
+
}
|
|
121
|
+
catch (Exception) when (!isLast)
|
|
122
|
+
{
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return null;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
using System;
|
|
2
|
+
using System.Text.Json;
|
|
3
|
+
|
|
4
|
+
namespace LLiquidLink
|
|
5
|
+
{
|
|
6
|
+
|
|
7
|
+
public class ObjectPrimitiveConverter : RpcJsonConverter<object, object>
|
|
8
|
+
{
|
|
9
|
+
|
|
10
|
+
public override bool CanConvert(Type typeToConvert)
|
|
11
|
+
{
|
|
12
|
+
return typeToConvert == typeof(object);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
public override object Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
|
|
16
|
+
{
|
|
17
|
+
return reader.TokenType == JsonTokenType.Null ? null : JsonPrimitiveHelper.ReadRaw(ref reader);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
public override void Write(Utf8JsonWriter writer, object value, JsonSerializerOptions options)
|
|
21
|
+
{
|
|
22
|
+
if (value == null) { writer.WriteNullValue(); return; }
|
|
23
|
+
JsonPrimitiveHelper.WriteRaw(writer, value);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
using System;
|
|
2
|
+
using System.Text.Json;
|
|
3
|
+
|
|
4
|
+
namespace LLiquidLink
|
|
5
|
+
{
|
|
6
|
+
|
|
7
|
+
public class PreObjectConverter : RpcJsonConverter<object, RpcUnityObject>
|
|
8
|
+
{
|
|
9
|
+
readonly ObjectRegistry _registry;
|
|
10
|
+
|
|
11
|
+
public PreObjectConverter(ObjectRegistry registry)
|
|
12
|
+
{
|
|
13
|
+
_registry = registry;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
public override bool CanConvert(Type typeToConvert)
|
|
17
|
+
{
|
|
18
|
+
return typeToConvert == typeof(object);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
public override object Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
|
|
22
|
+
{
|
|
23
|
+
if (reader.TokenType == JsonTokenType.Null)
|
|
24
|
+
{
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
var rpcObj = JsonSerializer.Deserialize<RpcUnityObject>(ref reader, DtoOptions);
|
|
28
|
+
if (rpcObj == null)
|
|
29
|
+
{
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
var ret = _registry.GetObject(rpcObj.instanceId);
|
|
34
|
+
if (ret == null)
|
|
35
|
+
{
|
|
36
|
+
throw new ArgumentException($"Object {rpcObj.instanceId} not found");
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
return rpcObj.orgType != ret.GetType().FullName
|
|
40
|
+
? throw new RpcJsonConverterReadException($"Object {rpcObj.orgType} != {ret.GetType().FullName}")
|
|
41
|
+
: ret;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
public override void Write(Utf8JsonWriter writer, object value, JsonSerializerOptions options)
|
|
45
|
+
{
|
|
46
|
+
if (value == null) { writer.WriteNullValue(); return; }
|
|
47
|
+
throw new NotSupportedException();
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
using System;
|
|
2
|
+
using System.Runtime.Serialization;
|
|
3
|
+
using System.Text.Json;
|
|
4
|
+
using System.Text.Json.Serialization;
|
|
5
|
+
|
|
6
|
+
namespace LLiquidLink
|
|
7
|
+
{
|
|
8
|
+
/// <summary>
|
|
9
|
+
/// Base class for JSON converters that translate between an original .NET type
|
|
10
|
+
/// and an RPC-wire DTO type.
|
|
11
|
+
/// </summary>
|
|
12
|
+
/// <typeparam name="TOrg">The original .NET type (e.g. <c>UnityEngine.Object</c>).</typeparam>
|
|
13
|
+
/// <typeparam name="TRpc">The RPC wire DTO type (e.g. <c>RpcUnityObject</c>).</typeparam>
|
|
14
|
+
public abstract class RpcJsonConverter<TOrg, TRpc> : JsonConverter<TOrg>
|
|
15
|
+
where TOrg : class
|
|
16
|
+
where TRpc : class
|
|
17
|
+
{
|
|
18
|
+
/// <summary>Fully qualified name of the RPC DTO type used as a discriminator on the wire.</summary>
|
|
19
|
+
public string rpcTypeName => typeof(TRpc).FullName;
|
|
20
|
+
|
|
21
|
+
/// <summary>The original .NET type this converter handles.</summary>
|
|
22
|
+
public Type orgType => typeof(TOrg);
|
|
23
|
+
|
|
24
|
+
/// <summary>
|
|
25
|
+
/// Options used to (de)serialize the wire DTO itself, independent of whichever
|
|
26
|
+
/// JsonSerializerOptions instance (main/pre/fallback) hosts this converter. The DTO
|
|
27
|
+
/// types only contain primitive fields, so no custom converters or resolvers are needed;
|
|
28
|
+
/// reusing the runtime-supplied options here would break under a restricted resolver
|
|
29
|
+
/// (e.g. the pre-chain's ConverterOnlyResolver) that requires every type it resolves
|
|
30
|
+
/// to have its own registered converter.
|
|
31
|
+
/// </summary>
|
|
32
|
+
protected static readonly JsonSerializerOptions DtoOptions =
|
|
33
|
+
new JsonSerializerOptions { UnmappedMemberHandling = JsonUnmappedMemberHandling.Disallow };
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/// <summary>Shared helpers for reading/writing JSON primitives directly (no wrapper DTO).</summary>
|
|
37
|
+
internal static class JsonPrimitiveHelper
|
|
38
|
+
{
|
|
39
|
+
/// <summary>True for CLR primitive-ish types that should bypass the Unity-object registry envelope.</summary>
|
|
40
|
+
public static bool IsPrimitive(object value)
|
|
41
|
+
{
|
|
42
|
+
return value is string or bool
|
|
43
|
+
or int or long or short
|
|
44
|
+
or double or float or decimal;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/// <summary>Read the current JSON token directly as a boxed CLR primitive.</summary>
|
|
48
|
+
public static object ReadRaw(ref Utf8JsonReader reader)
|
|
49
|
+
{
|
|
50
|
+
switch (reader.TokenType)
|
|
51
|
+
{
|
|
52
|
+
case JsonTokenType.String: return reader.GetString();
|
|
53
|
+
case JsonTokenType.True: return true;
|
|
54
|
+
case JsonTokenType.False: return false;
|
|
55
|
+
case JsonTokenType.Number:
|
|
56
|
+
return reader.TryGetInt64(out long l) ? (object)l : reader.GetDouble();
|
|
57
|
+
default:
|
|
58
|
+
throw new NotSupportedException("Unsupported primitive token: " + reader.TokenType);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/// <summary>Write a boxed CLR primitive directly as its native JSON token.</summary>
|
|
63
|
+
public static void WriteRaw(Utf8JsonWriter writer, object value)
|
|
64
|
+
{
|
|
65
|
+
switch (value)
|
|
66
|
+
{
|
|
67
|
+
case string s: writer.WriteStringValue(s); break;
|
|
68
|
+
case bool b: writer.WriteBooleanValue(b); break;
|
|
69
|
+
case int i: writer.WriteNumberValue(i); break;
|
|
70
|
+
case long l: writer.WriteNumberValue(l); break;
|
|
71
|
+
case short sh: writer.WriteNumberValue(sh); break;
|
|
72
|
+
case double d: writer.WriteNumberValue(d); break;
|
|
73
|
+
case float f: writer.WriteNumberValue(f); break;
|
|
74
|
+
case decimal m: writer.WriteNumberValue(m); break;
|
|
75
|
+
default: throw new NotSupportedException("Unsupported primitive value: " + value.GetType());
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
public class RpcJsonConverterReadException : Exception
|
|
81
|
+
{
|
|
82
|
+
public RpcJsonConverterReadException()
|
|
83
|
+
{
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
public RpcJsonConverterReadException(string message) : base(message)
|
|
87
|
+
{
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
public RpcJsonConverterReadException(string message, Exception innerException) : base(message, innerException)
|
|
91
|
+
{
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
protected RpcJsonConverterReadException(SerializationInfo info, StreamingContext context) : base(info, context)
|
|
95
|
+
{
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
using System;
|
|
2
|
+
using System.Text.Json;
|
|
3
|
+
|
|
4
|
+
namespace LLiquidLink
|
|
5
|
+
{
|
|
6
|
+
|
|
7
|
+
public class TypeConverter : RpcJsonConverter<Type, RpcType>
|
|
8
|
+
{
|
|
9
|
+
readonly TypeResolver _resolver;
|
|
10
|
+
|
|
11
|
+
public TypeConverter(TypeResolver resolver)
|
|
12
|
+
{
|
|
13
|
+
_resolver = resolver;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
public override Type Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
|
|
17
|
+
{
|
|
18
|
+
if (reader.TokenType == JsonTokenType.Null)
|
|
19
|
+
{
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
var rpcObj = JsonSerializer.Deserialize<RpcType>(ref reader, DtoOptions);
|
|
23
|
+
return rpcObj == null ? null : _resolver.Resolve(rpcObj.value);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
public override void Write(Utf8JsonWriter writer, Type value, JsonSerializerOptions options)
|
|
27
|
+
{
|
|
28
|
+
if (value == null) { writer.WriteNullValue(); return; }
|
|
29
|
+
JsonSerializer.Serialize(writer, new RpcType { value = value.FullName }, DtoOptions);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
namespace LLiquidLink.Logger
|
|
2
|
+
{
|
|
3
|
+
|
|
4
|
+
/// <summary>Severity levels for the built-in logger.</summary>
|
|
5
|
+
public enum LogLevel { Debug = 0, Info = 1, None = 2 }
|
|
6
|
+
|
|
7
|
+
/// <summary>Logging interface for Server diagnostic output.</summary>
|
|
8
|
+
public interface ILogger
|
|
9
|
+
{
|
|
10
|
+
/// <summary>Minimum severity level; messages below this level are suppressed.</summary>
|
|
11
|
+
LogLevel MinLevel { get; set; }
|
|
12
|
+
|
|
13
|
+
/// <summary>Log an informational message.</summary>
|
|
14
|
+
/// <param name="msg">Message text.</param>
|
|
15
|
+
void Info(string msg);
|
|
16
|
+
|
|
17
|
+
/// <summary>Log a debug-level message.</summary>
|
|
18
|
+
/// <param name="msg">Message text.</param>
|
|
19
|
+
void Debug(string msg);
|
|
20
|
+
|
|
21
|
+
/// <summary>Log a formatted informational message.</summary>
|
|
22
|
+
/// <param name="format">Format string.</param>
|
|
23
|
+
/// <param name="args">Format arguments.</param>
|
|
24
|
+
void InfoFormat(string format, params object[] args);
|
|
25
|
+
|
|
26
|
+
/// <summary>Log a formatted debug-level message.</summary>
|
|
27
|
+
/// <param name="format">Format string.</param>
|
|
28
|
+
/// <param name="args">Format arguments.</param>
|
|
29
|
+
void DebugFormat(string format, params object[] args);
|
|
30
|
+
}
|
|
31
|
+
}
|