style: NapProto

This commit is contained in:
手瓜一十雪 2024-10-12 21:35:49 +08:00
parent 938a84a460
commit a2c4498694

View File

@ -1,5 +1,5 @@
import {MessageType, RepeatType, ScalarType} from '@protobuf-ts/runtime'; import { MessageType, RepeatType, ScalarType } from '@protobuf-ts/runtime';
import {PartialFieldInfo} from "@protobuf-ts/runtime/build/types/reflection-info"; import { PartialFieldInfo } from "@protobuf-ts/runtime/build/types/reflection-info";
type LowerCamelCase<S extends string> = CamelCaseHelper<S, false, true>; type LowerCamelCase<S extends string> = CamelCaseHelper<S, false, true>;
@ -9,23 +9,23 @@ type CamelCaseHelper<
IsFirstChar extends boolean IsFirstChar extends boolean
> = S extends `${infer F}${infer R}` > = S extends `${infer F}${infer R}`
? F extends '_' ? F extends '_'
? CamelCaseHelper<R, true, false> ? CamelCaseHelper<R, true, false>
: F extends `${number}` : F extends `${number}`
? `${F}${CamelCaseHelper<R, true, false>}` ? `${F}${CamelCaseHelper<R, true, false>}`
: CapNext extends true : CapNext extends true
? `${Uppercase<F>}${CamelCaseHelper<R, false, false>}` ? `${Uppercase<F>}${CamelCaseHelper<R, false, false>}`
: IsFirstChar extends true : IsFirstChar extends true
? `${Lowercase<F>}${CamelCaseHelper<R, false, false>}` ? `${Lowercase<F>}${CamelCaseHelper<R, false, false>}`
: `${F}${CamelCaseHelper<R, false, false>}` : `${F}${CamelCaseHelper<R, false, false>}`
: ''; : '';
type ScalarTypeToTsType<T extends ScalarType> = type ScalarTypeToTsType<T extends ScalarType> =
T extends ScalarType.DOUBLE | ScalarType.FLOAT | ScalarType.INT32 | ScalarType.FIXED32 | ScalarType.UINT32 | ScalarType.SFIXED32 | ScalarType.SINT32 ? number : T extends ScalarType.DOUBLE | ScalarType.FLOAT | ScalarType.INT32 | ScalarType.FIXED32 | ScalarType.UINT32 | ScalarType.SFIXED32 | ScalarType.SINT32 ? number :
T extends ScalarType.INT64 | ScalarType.UINT64 | ScalarType.FIXED64 | ScalarType.SFIXED64 | ScalarType.SINT64 ? bigint : T extends ScalarType.INT64 | ScalarType.UINT64 | ScalarType.FIXED64 | ScalarType.SFIXED64 | ScalarType.SINT64 ? bigint :
T extends ScalarType.BOOL ? boolean : T extends ScalarType.BOOL ? boolean :
T extends ScalarType.STRING ? string : T extends ScalarType.STRING ? string :
T extends ScalarType.BYTES ? Uint8Array : T extends ScalarType.BYTES ? Uint8Array :
never; never;
interface BaseProtoFieldType<T, O extends boolean, R extends O extends true ? false : boolean> { interface BaseProtoFieldType<T, O extends boolean, R extends O extends true ? false : boolean> {
kind: 'scalar' | 'message'; kind: 'scalar' | 'message';
@ -55,25 +55,25 @@ function ProtoField<T extends ScalarType, O extends boolean = false, R extends O
function ProtoField<T extends () => ProtoMessageType, O extends boolean = false, R extends O extends true ? false : boolean = false>(no: number, type: T, repeated?: R, optional?: O): MessageProtoFieldType<T, O, R>; function ProtoField<T extends () => ProtoMessageType, O extends boolean = false, R extends O extends true ? false : boolean = false>(no: number, type: T, repeated?: R, optional?: O): MessageProtoFieldType<T, O, R>;
function ProtoField(no: number, type: ScalarType | (() => ProtoMessageType), repeated?: boolean, optional?: boolean): ProtoFieldType { function ProtoField(no: number, type: ScalarType | (() => ProtoMessageType), repeated?: boolean, optional?: boolean): ProtoFieldType {
if (typeof type === 'function') { if (typeof type === 'function') {
return {kind: 'message', no: no, type: type, repeated: repeated ?? false, optional: optional ?? false}; return { kind: 'message', no: no, type: type, repeated: repeated ?? false, optional: optional ?? false };
} else { } else {
return {kind: 'scalar', no: no, type: type, repeated: repeated ?? false, optional: optional ?? false}; return { kind: 'scalar', no: no, type: type, repeated: repeated ?? false, optional: optional ?? false };
} }
} }
type ProtoFieldReturnType<T> = T extends ScalarProtoFieldType<infer S, infer R, infer O> type ProtoFieldReturnType<T> = T extends ScalarProtoFieldType<infer S, infer R, infer O>
? ScalarTypeToTsType<S> ? ScalarTypeToTsType<S>
: T extends MessageProtoFieldType<infer S, infer R, infer O> : T extends MessageProtoFieldType<infer S, infer R, infer O>
? ProtoStructType<ReturnType<S>> ? ProtoStructType<ReturnType<S>>
: never; : never;
type RequiredFieldsType<T> = { type RequiredFieldsType<T> = {
[K in keyof T as T[K] extends { [K in keyof T as T[K] extends {
optional: true optional: true
} | MessageProtoFieldType<any, any, any> ? never : LowerCamelCase<K & string>] } | MessageProtoFieldType<any, any, any> ? never : LowerCamelCase<K & string>]
: T[K] extends { repeated: true } : T[K] extends { repeated: true }
? ProtoFieldReturnType<T[K]>[] ? ProtoFieldReturnType<T[K]>[]
: ProtoFieldReturnType<T[K]> : ProtoFieldReturnType<T[K]>
}; };
type OptionalFieldsType<T> = { type OptionalFieldsType<T> = {
@ -81,8 +81,8 @@ type OptionalFieldsType<T> = {
optional: true optional: true
} | MessageProtoFieldType<any, any, any> ? LowerCamelCase<K & string> : never]?: } | MessageProtoFieldType<any, any, any> ? LowerCamelCase<K & string> : never]?:
T[K] extends { repeated: true } T[K] extends { repeated: true }
? ProtoFieldReturnType<T[K]>[] ? ProtoFieldReturnType<T[K]>[]
: ProtoFieldReturnType<T[K]> : ProtoFieldReturnType<T[K]>
}; };
type ProtoStructType<T> = RequiredFieldsType<T> & OptionalFieldsType<T>; type ProtoStructType<T> = RequiredFieldsType<T> & OptionalFieldsType<T>;
@ -99,17 +99,18 @@ class NapProtoMsg<T extends ProtoMessageType> {
this._field = Object.keys(fields).map(key => { this._field = Object.keys(fields).map(key => {
const field = fields[key]; const field = fields[key];
if (field.kind === 'scalar') { if (field.kind === 'scalar') {
const repeatType = field.repeated
? [ScalarType.STRING, ScalarType.BYTES].includes(field.type)
? RepeatType.UNPACKED
: RepeatType.PACKED
: RepeatType.NO;
return { return {
no: field.no, no: field.no,
name: key, name: key,
kind: 'scalar', kind: 'scalar',
T: field.type, T: field.type,
opt: field.optional, opt: field.optional,
repeat: field.repeated repeat: repeatType,
? [ScalarType.STRING, ScalarType.BYTES].includes(field.type)
? RepeatType.UNPACKED
: RepeatType.PACKED
: RepeatType.NO,
}; };
} else if (field.kind === 'message') { } else if (field.kind === 'message') {
const rt = NapProtoMsgCache.get(field.type()) ?? (() => { const rt = NapProtoMsgCache.get(field.type()) ?? (() => {