tgstation-server 6.19.0
The /tg/station 13 server suite
Loading...
Searching...
No Matches
QueryContextExtensions.cs
Go to the documentation of this file.
1using System;
2using System.Linq.Expressions;
3
4using GreenDonut.Data;
5
7
9{
14 {
21 public static QueryContext<AuthorityResponse<TResult>> AuthorityResponseWrap<TResult>(this QueryContext<TResult> queryContext)
22 {
23 ArgumentNullException.ThrowIfNull(queryContext);
24
25 Expression<Func<AuthorityResponse<TResult>, TResult>> responseToResult = response => response.Result!;
26
27 var authorityParameter = Expression.Parameter(typeof(AuthorityResponse<TResult>), "authorityResponse");
28 var resultFromAuthority = Expression.Invoke(
29 responseToResult,
30 authorityParameter);
31
32 // we don't need to do much
33 Expression<Func<AuthorityResponse<TResult>, AuthorityResponse<TResult>>>? selector = null;
34 if (queryContext.Selector != null)
35 {
36 var innerInvoke = Expression.Invoke(
37 queryContext.Selector,
38 resultFromAuthority);
39
40 var outerInvoke = Expression.Invoke(
41 AuthorityResponse<TResult>.MappingExpression,
42 innerInvoke);
43
44 selector = Expression.Lambda<Func<AuthorityResponse<TResult>, AuthorityResponse<TResult>>>(
45 outerInvoke,
46 authorityParameter);
47 }
48
49 Expression<Func<AuthorityResponse<TResult>, bool>>? predicate = null;
50 if (queryContext.Predicate != null)
51 {
52 predicate = Expression.Lambda<Func<AuthorityResponse<TResult>, bool>>(
53 Expression.Invoke(
54 queryContext.Predicate,
55 resultFromAuthority),
56 authorityParameter);
57 }
58
59 if (queryContext.Sorting?.Operations.Length > 0)
60 {
61 throw new NotImplementedException();
62 }
63
64 return new QueryContext<AuthorityResponse<TResult>>(
65 selector,
66 predicate);
67 }
68
75 public static QueryContext<TResult> AuthorityResponseUnwrap<TResult>(this QueryContext<AuthorityResponse<TResult>> queryContext)
76 {
77 ArgumentNullException.ThrowIfNull(queryContext);
78
79 // assuming we were wrapped with AuthorityResponseWrap. This is hacky but it works
80 // UNLESS it was compiled down, in which case we are D-O-N-E-FUCKED
81 Expression<Func<TResult, TResult>>? selector = null;
82 if (queryContext.Selector != null)
83 {
84 selector = (Expression<Func<TResult, TResult>>?)((InvocationExpression)((InvocationExpression)queryContext.Selector.Body).Arguments[0]).Expression;
85 }
86
87 Expression<Func<TResult, bool>>? predicate = null;
88 if (queryContext.Predicate != null)
89 {
90 predicate = (Expression<Func<TResult, bool>>?)((InvocationExpression)queryContext.Predicate.Body).Expression;
91 }
92
93 if (queryContext.Sorting?.Operations.Length > 0)
94 {
95 throw new NotImplementedException();
96 }
97
98 return new QueryContext<TResult>(
99 selector,
100 predicate);
101 }
102 }
103}
static QueryContext< AuthorityResponse< TResult > > AuthorityResponseWrap< TResult >(this QueryContext< TResult > queryContext)
Translate a given queryContext into one with the target wrapped in an AuthorityResponse<TResult>.
static QueryContext< TResult > AuthorityResponseUnwrap< TResult >(this QueryContext< AuthorityResponse< TResult > > queryContext)
Unwrap a given queryContext that was built from one resulting from AuthorityResponseWrap<TResult>(Qu...